Try out TeamCity quickly with Docker
Teamcity is quite a nice continuous integration server from Jetbrains. The set up is not that easy though since you typically need to install the TeamCity server itself, and at least one agent which will perform the building itself.
Luckily, with Docker, you can set up TeamCity very easily on any PC, without the fuss of installing the server and the agent. The following docker-compose.yml configuration file will direct Docker to download appropriate images both for TC server and for TC agent and run them. Create a folder named teamcity and drop the docker-compose.yml file in there:
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
Then, create the following folders inside the teamcity folder which will store both the server and the agent persistent folders:
datadir
logs
agent_conf
If your host user doesn’t have uid of 1000, you’ll need to chown those to uid of 1000.
Now just start the containers with:
docker-compose up
Now you can direct your browser to http://localhost:8111 and configure TC to use the embedded database; then just head to agents and authorize the teamcity-agent so that TC server will trust it and will run the builds there.
Building Android APKs with TeamCity
Building an Android app requires the Android SDK to be preinstalled in the Agent itself. That can be done quite easily - we will extend the teamcity-agent docker image and add the SDK on top of that. In the teamcity folder above, create a folder named agent-android-docker and put the following Dockerfile there:
FROM jetbrains/teamcity-agent
ENV ANDROID_HOME "/sdk"
ENV SDK_HOME "/opt"
ENV PATH "$PATH:${ANDROID_HOME}/tools"
ENV DEBIAN_FRONTEND noninteractive
COPY sdk /sdk
RUN apt-get -qq update && \
apt-get install -qqy --no-install-recommends \
curl \
html2text \
libc6-i386 \
lib32stdc++6 \
lib32gcc1 \
lib32ncurses5 \
lib32z1 \
unzip \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN mkdir -p $ANDROID_HOME/licenses/ \
&& echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > $ANDROID_HOME/licenses/android-sdk-license \
&& echo "84831b9409646a918e30573bab4c9c91346d8abd" > $ANDROID_HOME/licenses/android-sdk-preview-license
ADD packages.txt /sdk
RUN mkdir -p /root/.android && \
touch /root/.android/repositories.cfg && \
${ANDROID_HOME}/tools/bin/sdkmanager --update && \
(while [ 1 ]; do sleep 5; echo y; done) | ${ANDROID_HOME}/tools/bin/sdkmanager --package_file=/sdk/packages.txt
RUN chmod -R a+rwx ${ANDROID_HOME}
You will also need the packages.txt along the Dockerfile itself, with the following contents:
add-ons;addon-google_apis-google-24
build-tools;25.0.3
extras;android;m2repository
extras;google;google_play_services
extras;google;m2repository
extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2
platform-tools
platforms;android-25
Then, download the Android SDK Tools for Linux (Not the whole Studio, just the SDK Tools; the download links are at the bottom of the page). As of the writing of this article, the direct link to the SDK Tools is this: https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip . Unpack the zip file to agent-android-docker/sdk, so that the contents of the sdk folder contain the folder tools.
To use this new Agent Image, we will simply direct the Docker Compose to build it - just modify the docker-compose.yml file and change it as follows:
version: '2'
services:
teamcity-server:
image: jetbrains/teamcity-server:2019.2
environment:
- TEAMCITY_SERVER_MEM_OPTS=-Xmx2g -XX:MaxPermSize=270m -XX:ReservedCodeCacheSize=350m
ports:
- "127.0.0.1:8111:8111"
volumes:
- ./server/datadir:/data/teamcity_server/datadir
- ./server/logs:/opt/teamcity/logs
teamcity-agent:
build: agent-android-docker
environment:
- SERVER_URL=http://teamcity-server:8111
volumes:
- ./agent/conf:/data/teamcity_agent/conf
Done - just run docker-compose up.