首页 > 解决方案 > 如何为 teamcity 代理安装附加软件?

问题描述

我通过 docker image 安装了 teamcity 代理

如何通过 brew 向该代理添加一些软件?

标签: teamcity

解决方案


Dockerized Teamcity 代理很可能需要扩展基本映像并使用适当的包管理。

例如,我们使用teamcity-minimal-agent基于 Ubuntu 操作系统的镜像。

下面是一个扩展示例,Dockerfile其中包含一些基本工具的安装说明和我们的软件需要的额外软件包以及运行“docker in docker”的 docker 客户端。

此外,它还运行同步操作系统用户 ID 和buildagent用户 ID 的步骤,用于运行代理。

# 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 使它运行起来更容易。在下面找到一个例子。它允许在代理 docker 容器中运行一个 docker 容器,称为“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

这些例子也可以大大简化。


推荐阅读