TeamCity 설치 - docker-compose

TeamCity 설치  - docker-compose

시작하며...

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=xxxx
  • TEAMCITY_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 컨테이너의 environmentTEAMCITY_HTTPS_PROXY_ENABLED=true를 추가하였다.
Insecure Tomcat connector attributes: missing secure attributes를 참고하였다.

3. Agent용 설정 파일 추가

  1. Agent용 설정 파일 경로 생성 및 설정파일 작성

    $ mkdir -p agents/agent-001/conf
    $ vi agents/agent-001/conf/buildAgent.properties
    
  2. Agent용 설정 파일 예시

    buildAgent.properties

    name=Agent-001
    ownPort=9090
    serverUrl=https\://your.teamcity.domain
    
    workDir=../work
    tempDir=../temp
    systemDir=../system
    
    teamcity.docker.use.sudo=true
    
    • TeamCityAgent 3개까지 무료로 사용 할 수 있다. 필요한 만큼 agent 설정 파일을 작성한다.
    • your.teamcity.domainTeamCity 서버의 도메인 주소를 입력한다.

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_log

5. 전체 디렉토리 구조는 다음과 같다.

$ 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 files

TeamCity 설치

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. 설정파일 추가

  1. nginx 설정 경로로 이동하여, teamcity 설정 파일을 생성한다.

    $ cd /etc/nginx/sites-available
    
    $ vi teamcity.conf
    
  2. nginx 설정 파일 예시
    teamcity.conf

    server {
    	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.domainTeamCity 서버의 도메인 주소를 입력한다.
    • xxxxTeamCity 서버의 docker-compose.yml 파일에서 TEAMCITY_EXT_PORT에 입력한 포트 번호를 입력한다.
    • ssl_certificatessl_certificate_keycertbot을 이용하여 발급받은 인증서 경로를 입력한다.
    • proxy_set_header Connection "upgrade";TeamCity에서 websocket을 사용하기 위해 설정한다.

2. nginx 설정 파일 링크

  1. nginx 설정 파일 경로로 이동하여, teamcity 설정 파일을 링크한다.
    $ cd /etc/nginx/sites-enabled
    
    $ ln -s /etc/nginx/sites-available/teamcity.conf teamcity.conf
    

3. nginx 재시작

  1. nginx 설정 문법 체크

    $ 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를 재시작한다.

  2. nginx 재시작

    $ 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 서버 접속

TeamCity First Start

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

2. DB 연결 설정

Database connection setup

  1. Select the database type의 값을 MySQL로 선택한다.
    • 별도로 DB 설정하지 않고, Internal(HSQLDB)를 선택하여 사용할 수도 있다.
  2. Download JDBC driver 버튼을 클릭하여 DB 드라이버를 다운로드한다.
  3. 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에 설정한 값을 입력한다.
  4. 필수값 입력 후 활성화 되는 Proceed 버튼을 클릭하여 다음으로 이동한다.

3. 라이센스 동의

DB 생성 및 초기화가 완료되면, TeamCity 라이센스 동의 화면(License Agreement for JetBrains® TeamCity®)이 나타난다.
맨 하단으로 스크롤하여 Accept license agreement를 체크 후 활성화 되는 Continue 버튼을 클릭하여 다음으로 이동한다.

4. 관리자 계정 생성

Create administrator account

  1. 생성 할 관리자의 ID/Password를 입력한다.
  2. Create Account 버튼을 클릭하여 관리자 계정을 생성한다.

TeamCity 설정

초기설정 완료 후 Agent 설정 및 도메인, Email 알림 설정 방법에 대해 알아본다.

1. Agent 설정

TeamCity Agent

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

Authorize Agent-001

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

2. 도메인 설정

TeamCity Administration

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

3. Email 알림 설정

TeamCity Administration

  1. 좌측 메뉴에서 Server Administration > Email Notifier를 클릭한다.
  2. 자신의 SMTP 서버 정보를 입력한다. 참고로 Gmail(G-Suite)을 이용하는 경우 아래 값을 참고하여 입력한다.
    • SMTP host : smtp.gmail.com
    • SMTP port : 587
    • Send email messages from : TeamCity에서 알림 메일 발송시 보내는 메일주소를 사용 할 메일 주소를 입력한다.
    • SMTP login : 자신의 Gmail 계정을 입력한다.
    • SMTP password : 자신의 Gmail 계정의 비밀번호를 입력한다.
    • Secure connections : StartTLS를 선택한다.
  3. 하단의 Test Connection 버튼을 클릭하여 설정이 정상적으로 되었는지 확인한다.
  4. Save 버튼을 클릭하여 저장한다.

마치며...

여기까지 설정하면 TeamCity 사용을 위한 기본적인 설정이 완료 되었다.
다음 포스트에서는(언제일지 알 수 없지만...) TeamCity를 이용하여 CI/CD를 구성하는 방법에 대해 알아보도록 하겠다.

Read more

sdkman

sdkman을 이용하여 SDK 관리하기

시작하며... Java 벤더가 여러개이고, 프로젝트 마다 사용하는 버전이 제각각인 상황에서, brew를 이용하여 SDK를 관리하고, jenv 등의 방법을 이용하여 관리하였다. 그러던 중 Spring Boot Up & Running책을 통해 SDKMAN을 알게 되어, 설치하여 사용해 보고 있는 중이다. 설치 방법 및 이용 방법에 대해 정리하고자 한다. sdkman이란? 1. sdkman은 Java, Scala, Groovy, Kotlin

By Ligno We