3

I have teamcity agent installed via docker image

How can I add some software to this agent via brew?

Alex Klimashevsky
  • 2,457
  • 3
  • 26
  • 58

1 Answers1

6

Dockerized Teamcity agents, most probably, would require to extend basic image and use appropriate package manages.

For instance, we use teamcity-minimal-agent image, based on Ubuntu OS.

Below is an example of extended Dockerfile that contains installation instructions of some basic tools and extra packages our software needs as well as docker client to run "docker in docker".

In addition, it runs steps to sync an OS user id and buildagent user id, used to run an agent.

# Custom Dockerfile

FROM jetbrains/teamcity-minimal-agent:2019.2

ARG user_id
ARG docker_group_id
ENV USER_ID=${user_id}

# Set correct environment variables.
ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND noninteractive

# Install basic tools
RUN apt-get update && \
    apt-get -y --no-install-recommends install \
    dirmngr \
    gpg-agent \
    software-properties-common \
    apt-transport-https \
    wget \
    zip \
    git


# Add key and docker repository
ENV DOCKER_VERSION 18.03.1~ce~3-0~ubuntu
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
RUN echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list

# Install necessary software
RUN apt-get update
RUN apt-get -y --no-install-recommends install \
    docker-ce=${DOCKER_VERSION} \
    rsync openssh-client vim python python-dev \
    bzip2 nodejs dnsutils sudo

# Install pip and packages
RUN curl -sS 'https://bootstrap.pypa.io/get-pip.py' | python
RUN pip install \
    pep8 \
    requests

# Access and signature for github repositories
COPY <my-gpg-file>.gpg /var/tmp/<my-gpg-file>.gpg

# Pass OS user's id and export it to use in subcontainers
RUN groupmod -g ${USER_ID} buildagent && \
    usermod -g ${USER_ID} -G docker buildagent

# Sync docker group id between OS and container
RUN groupmod -g ${docker_group_id} docker

USER buildagent

RUN gpg --allow-secret-key-import --import /var/tmp/<my-gpg-file>.gpg

RUN git config --global user.email "admin@example.com" && \
    git config --global user.name "Teamcity Bot" && \
    git config --global user.signingkey <my-gpg-key>

USER root

Docker-compose makes it much easer to run. Find an example below. It allows to run a docker container in the agent docker container, known as "docker in docker".

# Docker-compose to run containers
#
# Build images: DOCKER_GROUP_ID=$(getent group docker | cut -d: -f3) USER_ID=$(id -u) docker-compose build
# Start containers: docker-compose up -d
#
version: '2.2'

services:
  teamcity-server:
    hostname: "teamcity-server"
    container_name: "teamcity-server"
    build: "."
    volumes:
      - "/data/teamcity:/data/teamcity:rw"
    environment:
      TEAMCITY_SERVER_MEM_OPTS: -Xmx1g -XX:ReservedCodeCacheSize=350m
      TEAMCITY_LOGS: /opt/teamcity/logs
      TEAMCITY_DIST: /opt/teamcity
      TEAMCITY_DATA_PATH: /opt/teamcity/data
    ports:
      - "443:443"
      - "80:80"
    restart: "always"

  teamcity-agent:
    hostname: "teamcity-agent-01"
    container_name: "teamcity-agent-01"
    build:
      context: "./teamcity-agent"
      args:
        user_id: "${USER_ID}"
        docker_group_id: "${DOCKER_GROUP_ID}"
    image: "teamcity-agent"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/var/lib/docker:/var/lib/docker"
      - "/opt/share/.composer:/home/buildagent/.composer:rw"
      - "/opt/agents:/opt/agents:rw"
    environment:
      - "SERVER_URL=https://<teamcity-url>"
      - "AWS_DEFAULT_REGION=ap-southeast-1"
      - "AGENT_NAME=teamcity-agent-01"
      - "RUN_AS_BUILDAGENT=true"
    privileged: true
    restart: "always"
    cpus: 1
    mem_limit: 1g

These examples can be much simplified too.

antonbormotov
  • 1,821
  • 2
  • 20
  • 32