시작하며...
Ubuntu에서 Docker 이미지의 TeamCity를 설치하는 방법에 대해 알아본다.
작업환경
# OS Version
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.2 LTS
Release: 22.04
Codename: jammy
# Docker Version
$ docker --version
Docker version 24.0.2, build cb74dfc
# docker-compose Version
$ docker-compose --version
docker-compose version 1.29.2, build unknown
# nginx Version
$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)TeamCity 설치
설정파일 작성
1. 환경 변수용 .env파일 추가
각 설정 값은 본인의 환경에 맞게 수정한다.
.env
TEAMCITY_VERSION=2023.05
TEAMCITY_EXT_PORT=xxxx
MYSQL_DB_NAME=db_name
MYSQL_ROOT_PW=db_root_password
MYSQL_ROOT_HOST=host_ip
MYSQL_USER=db_user
MYSQL_PW=db_user_password
MYSQL_EXT_PORT=xxxxTEAMCITY_VERSION: TeamCity 버전TEAMCITY_EXT_PORT: TeamCity 접속용 포트MYSQL_DB_NAME: TeamCity DB 이름MYSQL_ROOT_PW: TeamCity DB root 계정 비밀번호MYSQL_ROOT_HOST: TeamCity DB root 계정 접속 허용 호스트MYSQL_USER: TeamCity DB 계정MYSQL_PW: TeamCity DB 계정 비밀번호MYSQL_EXT_PORT: TeamCity DB 접속용 포트
2. docker-compose.yml 파일을 작성한다.
docker-compose.yml
version: '3.7'
services:
teamcity-db:
container_name: teamcity-db
image: mysql
restart: always
volumes:
- ./db_data:/var/lib/mysql
- ./db_conf:/etc/mysql/conf.d:ro
- ./db_log:/var/log/mysql:ro
environment:
MYSQL_DATABASE: "${MYSQL_DB_NAME}"
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PW}"
MYSQL_ROOT_HOST: '${MYSQL_ROOT_HOST}'
MYSQL_USER: "${MYSQL_USER}"
MYSQL_PASSWORD: "${MYSQL_PW}"
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
ports:
- "${MYSQL_EXT_PORT}:3306"
teamcity:
container_name: teamcity
image: jetbrains/teamcity-server:${TEAMCITY_VERSION}
restart: always
ports:
- "${TEAMCITY_EXT_PORT}:8111"
volumes:
- ./teamcity_data:/data/teamcity_server/datadir
- ./teamcity_log:/opt/teamcity/logs
environment:
- TEAMCITY_HTTPS_PROXY_ENABLED=true
depends_on:
- teamcity-db
teamcity-agent-001:
container_name: teamcity-agent-001
image: jetbrains/teamcity-agent:${TEAMCITY_VERSION}-linux-sudo
restart: always
user: root
privileged: true
volumes:
- ./agents/agent-001/conf:/data/teamcity_agent/conf
environment:
- DOCKER_IN_DOCKER=start포스팅 완료 후 상단에
Incorrect proxy server configuration detected: Insecure Tomcat connector attributes와 같은 경고가 발생하여teamcity컨테이너의environment에TEAMCITY_HTTPS_PROXY_ENABLED=true를 추가하였다. Insecure Tomcat connector attributes: missing secure attributes를 참고하였다.
3. Agent용 설정 파일 추가
Agent용 설정 파일 경로 생성 및 설정파일 작성shell$ mkdir -p agents/agent-001/conf $ vi agents/agent-001/conf/buildAgent.propertiesAgent용 설정 파일 예시buildAgent.properties
propertiesname=Agent-001 ownPort=9090 serverUrl=https\://your.teamcity.domain workDir=../work tempDir=../temp systemDir=../system teamcity.docker.use.sudo=trueTeamCity는Agent3개까지 무료로 사용 할 수 있다. 필요한 만큼 agent 설정 파일을 작성한다.your.teamcity.domain은TeamCity서버의 도메인 주소를 입력한다.
4. 그 외 마운트용 경로 생성
# DB 설정 파일 경로 생성
$ mkdir -p db_conf
# DB 데이터 저장 경로 생성
$ mkdir -p db_data
# DB 로그 저장 경로 생성
$ mkdir -p db_log
# TeamCity 데이터 저장 경로 생성
$ mkdir -p teamcity_data
# TeamCity 로그 저장 경로 생성
$ mkdir -p teamcity_log5. 전체 디렉토리 구조는 다음과 같다.
$ tree .
.
├── agents
│ ├── agent-001
│ │ └── conf
│ │ └── buildAgent.properties
│ ├── agent-002
│ │ └── conf
│ │ └── buildAgent.properties
│ └── agent-003
│ └── conf
│ └── buildAgent.properties
├── db_conf
├── db_data
├── db_log
├── docker-compose.yml
├── teamcity_data
└── teamcity_log
12 directories, 4 filesTeamCity 설치
1. docker-compose를 이용하여 TeamCity를 설치한다.
$ docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use `docker stack deploy`.
Pulling teamcity-db (mysql:)...
latest: Pulling from library/mysql
e2c03c89dcad: Downloading [=====================> ] 19.2MB/44.88MB
68eb43837bf8: Download complete
# ...
Status: Downloaded newer image for jetbrains/teamcity-agent:2023.05-linux-sudo
Creating teamcity-db ... done
Creating teamcity-agent-001 ... done
Creating teamcity ... done외부 연결 설정
nginx를 이용하여 외부에서 접속 할 수 있도록 설정한다.certbot을 이용하여 SSL 인증서를 발급받아,/etc/nginx/ssl경로에 저장하였다.
1. 설정파일 추가
nginx설정 경로로 이동하여,teamcity설정 파일을 생성한다.shell$ cd /etc/nginx/sites-available $ vi teamcity.confnginx설정 파일 예시 teamcity.confnginxserver { listen 80; listen [::]:80; server_name your.teamcity.domain; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name your.teamcity.domain; ssl_certificate /etc/nginx/ssl/your.teamcity.domain.crt; ssl_certificate_key /etc/nginx/ssl/your.teamcity.domain.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:xxxx/; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $server_name:$server_port; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }your.teamcity.domain은TeamCity서버의 도메인 주소를 입력한다.xxxx는TeamCity서버의docker-compose.yml파일에서TEAMCITY_EXT_PORT에 입력한 포트 번호를 입력한다.ssl_certificate와ssl_certificate_key는certbot을 이용하여 발급받은 인증서 경로를 입력한다.proxy_set_header Connection "upgrade";는TeamCity에서websocket을 사용하기 위해 설정한다.
2. nginx 설정 파일 링크
nginx설정 파일 경로로 이동하여,teamcity설정 파일을 링크한다.shell$ cd /etc/nginx/sites-enabled $ ln -s /etc/nginx/sites-available/teamcity.conf teamcity.conf
3. nginx 재시작
nginx설정 문법 체크shell$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful문법체크를 통과하면
nginx를 재시작한다.nginx재시작shell$ sudo service nginx restart $ sudo service nginx status ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2023-07-09 15:46:03 KST; 5s ago Docs: man:nginx(8) # ...
TeamCity 초기 설정
TeamCity서버에 접속하여 초기 설정을 진행한다.
1. TeamCity 서버 접속

https://your.teamcity.domain로 접속한다.your.teamcity.domain은TeamCity서버의 도메인 주소를 입력한다.
Proceed를 클릭하여 다음으로 이동한다. 기존 데이터를 복구 할 때는Restore from backup를 클릭하여 복구를 진행한다.
2. DB 연결 설정

Select the database type의 값을MySQL로 선택한다.- 별도로 DB 설정하지 않고,
Internal(HSQLDB)를 선택하여 사용할 수도 있다.
- 별도로 DB 설정하지 않고,
Download JDBC driver버튼을 클릭하여 DB 드라이버를 다운로드한다.- DB 접속 정보를 입력한다.
Database host[:port]의 값은teamcity-db를 입력한다.docker-compose.yml에서 설정한 DB의 컨테이너 이름이다.Database name의 값은.env파일의MYSQL_DB_NAME에 설정한 값을 입력한다.User name의 값은.env파일의MYSQL_USER에 설정한 값을 입력한다.Password의 값은.env파일의MYSQL_PW에 설정한 값을 입력한다.
- 필수값 입력 후 활성화 되는
Proceed버튼을 클릭하여 다음으로 이동한다.
3. 라이센스 동의
DB 생성 및 초기화가 완료되면, TeamCity 라이센스 동의 화면(License Agreement for JetBrains® TeamCity®)이 나타난다. 맨 하단으로 스크롤하여 Accept license agreement를 체크 후 활성화 되는 Continue 버튼을 클릭하여 다음으로 이동한다.
4. 관리자 계정 생성

- 생성 할 관리자의 ID/Password를 입력한다.
Create Account버튼을 클릭하여 관리자 계정을 생성한다.
TeamCity 설정
초기설정 완료 후
Agent설정 및 도메인, Email 알림 설정 방법에 대해 알아본다.
1. Agent 설정

- 상단 메뉴에서
Agents를 클릭한다. Unauthorized항목 하위의Agent를 클릭한다.docker-compose를 통해 추가된Agent-001이 목록이 표시된다. 이를 클릭한다.- 목록이 표시되지 않은 경우
Unauthorized왼편의>를 클릭하여 하위 목록을 표시한다.

Authorize...버튼을 클릭하여Authorize Agent-001다이얼로그를 표시한다.- 필요한 경우
Agent에 대한 설명을 기입한다. Authorize버튼을 클릭하여Agent를 인증한다.
2. 도메인 설정

- 상단 메뉴에서
Administration를 클릭한다. - 좌측 메뉴에서
Server Administration>Global Settings를 클릭한다. Server URL의 값을https://your.teamcity.domain으로 변경한다.your.teamcity.domain은TeamCity서버의 도메인 주소를 입력한다.
- 상단에 표시되는 몇가지 경고문은 이 설정이 완료되면 잠시 후 사라진다.
- 이때
nginx설정의proxy_set_header Connection "upgrade";가 필요하다.
- 이때
Save버튼을 클릭하여 저장한다.
3. Email 알림 설정

- 좌측 메뉴에서
Server Administration>Email Notifier를 클릭한다. - 자신의 SMTP 서버 정보를 입력한다. 참고로 Gmail(G-Suite)을 이용하는 경우 아래 값을 참고하여 입력한다.
SMTP host:smtp.gmail.comSMTP port:587Send email messages from:TeamCity에서 알림 메일 발송시 보내는 메일주소를 사용 할 메일 주소를 입력한다.SMTP login: 자신의 Gmail 계정을 입력한다.SMTP password: 자신의 Gmail 계정의 비밀번호를 입력한다.Secure connections:StartTLS를 선택한다.
- 하단의
Test Connection버튼을 클릭하여 설정이 정상적으로 되었는지 확인한다. Save버튼을 클릭하여 저장한다.
마치며...
여기까지 설정하면 TeamCity 사용을 위한 기본적인 설정이 완료 되었다. 다음 포스트에서는(언제일지 알 수 없지만...) TeamCity를 이용하여 CI/CD를 구성하는 방법에 대해 알아보도록 하겠다.