Skip to content

How do I install TeamCity server using Docker compose?

Hi. Today I’m going to show you how you can quickly start up a TeamCity server and run your first CI process in it.

This article is part of a series showing how to get started with popular CI/CD tools. In this article I will show you how to install a CI/CD tool and how to prepare the process of building and testing a simple Maven-based project.

What is TeamCity?

TeamCity is a continuous integration and delivery (CI/CD) server created by JetBrains, a company known for its developer tools such as Resharper or IntelliJ IDEA. The first version of the server was made available already in 2006 and is available both as a commercial and a free version. In the second case, we can use the free version also in commercial projects but we have a few restrictions, such as the maximum number of builds or agents.

What is Docker Compose?

To find out what Docker Compose is, go to the article: How to install Jenkins using Docker Compose?

Tools required

Before starting work, prepare the required tools. You can find a description of these tools on the website: How to install Jenkins using Docker Compose?

Preparations for the launch

We will start working on the installation by creating a dedicated directory where we will store TeamCity data and configuration.

> mkdir teamcity
> cd teamcity

In the next step, we will create three directories where the server and agent will save their configuration and logs.

> mkdir datadir
> mkdir logs
> mkdir agent_conf

In the next step, we still need to change the permissions of the above directories. This is because the server and agent is running in a container as a user without root privileges.

> sudo chown -R 1000:1000 datadir
> sudo chown -R 1000:1000 logs
> sudo chown -R 1000:1000 agent_conf

Installing TeamCity

In the next step, we create a docker-compose.yml file with the following contents:

version: "2.1"
services:
  server:
    image: jetbrains/teamcity-server:latest
    ports:
      - "8111:8111"
    volumes:
      - datadir:/data/teamcity_server/datadir
      - logs:/opt/teamcity/logs
  agent:
    image: jetbrains/teamcity-agent:latest
    volumes:
      - agent_conf:/data/teamcity_agent/conf
    environment:
      - SERVER_URL=http://server:8111

This configuration defines what containers we want to run. In our case it will be a TeamCity server along with one agent (a separate module to run CI/CD jobs). The most important configuration parameters are:

  • image – the docker image we want to use on our server
  • ports – a list of ports that we make available outside the container. In our configuration, we share ports 8111 (www portal)
  • container_name – the name of our container
  • volumes – specifies volumes that are used by the container. In our configuration, we have directories shared with the system (subdirectories in the teamcity directory).

Starting TeamCity

Launching containers is accomplished with the command:

> docker-compose up -d

Once started, we go to our TeamCity server available at: http://localhost:8111. After going to this address you should see the following screen:

Pierwszy ekran TeamCity
Pierwszy ekran TeamCity

Warning: it may take a few minutes to launch the portal for the first time.

Here we select Proceed and go to the next screen.

Ustawienie bazy danych dla TeamCity
Ustawienie bazy danych dla TeamCity

Here we select the default, internal HSQLDB database and proceed (Proceed).

Licencja
Licencja

On the next screen, approve the license agreement and proceed (Continue).

Tworzymy konto administratora
Tworzymy konto administratora

We have one more step left before launch: creating an administrator account. We enter the required details (username and password) and click on Create Account. Once the account is created, the following screen should appear:

Uruchomiony serwer TeamCity
Uruchomiony serwer TeamCity

Congratulations, the TeamCity server has been started correctly!

Agent Authorization

To work properly, the server needs build agents. These are separate applications that are responsible for actually running the build processes. TeamCity allows you to run agents on both Windows and Linux systems. In our case, we are using a Linux agent that will run within another Docker container.

While starting our system with docker-compose we started the server and one agent. This agent by default cannot connect to the server without additional authorization. To authorize the agent you need to go to the address:

http://localhost:8111/agents.html?tab=unauthorizedAgents .

Agenci
Agenci

On the above page we should see one agent that is connected but requires authorization. Here we click Authorize and confirm the selection on the next page.

Now we are ready to launch our first project.

Creating the first project

We now go to the projects page and create a new project:

http://localhost:8111/admin/createObjectMenu.html?projectId=_Root&showMode=createProjectMenu&autoExpand=createFromUrl&cameFromUrl=%2Foverview.html#createFromUrl

On the new page, enter https://github.com/czerniga/helloworld.git in the Repository URL and confirm the selection by clicking Proceed.

Tworzenie projektu
Tworzenie projektu

On the next page, confirm the default options and proceed (Proceed).

Dodawanie repozytorium GIT
Dodawanie repozytorium GIT

After importing the repository, the TeamCity server will offer the first step of our build process. We can validate the first step by clicking the Maven checkbox and then on Use selected.

Auto detekcja kroków
Auto detekcja kroków

Once approved, we will see our build process with the first step called “Maven”. This step contains the command that builds the project: mvn clean test. However, our goal is to change this command. We do this by selecting Edit in the “Maven” step.

On the new page we will see the exact configuration of the first step. Here we need to change the Goals option to: “clean package“. As shown in the screenshot below.

Zmiana pierwszego kroku
Zmiana pierwszego kroku

Confirm the change by clicking Save at the bottom of the page.

Now we will add a simple step that tests our project by running the jar file. We do this using the Add build step option.

In the second step, choose Runner type = Command Line. In Custom script, paste the following commands:

echo "Running tests"
java -cp target/helloworld-1.1.jar com.coveros.demo.helloworld.HelloWorld

As a result, the second step should have the following configuration:

Drugi krok
Drugi krok

Save the step by clicking Save.

After configuring the steps of our process, we can proceed to run our project for the first time. We do this by clicking on the Run button.

Kroki naszego procesu budowania
Kroki naszego procesu budowania

After a few moments, the project should be successful.

Pierwszy build
Pierwszy build

By clicking on the first build we can preview the entire log of the build and testing process (Build log tab).

Log z pierwszego budowania
Log z pierwszego budowania

We stop the container

The containers containing our service have been started with a switch causing them to run in the background. If you want to stop the portal you should execute the command:

docker-compose down

Summary

In this tutorial I showed how you can run TeamCity server along with one agent running in docker container. The configuration given here will save all server data in a directory on your computer/server. Therefore, the data will not be deleted when you stop or delete the containers. This also makes migrating to a new environment very easy (by copying directories).

Published inCI/CDDockerTutorial

4 Comments

  1. Maxim Maxim

    after start
    teamcity$ docker-compose up -d
    I received error:
    service “server” refers to undefined volume datadir: invalid compose project

  2. josh josh

    I have the same problem and I created that datadir directory

  3. Piotr Piotr

    Add this at the end of docker-compose.yml file:

    volumes:
    datadir:
    logs:
    agent_conf:

Leave a Reply

Your email address will not be published. Required fields are marked *