본문 바로가기
devops

GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (4) - Teamcity 설치

by jiseok.woo 2022. 8. 2.
반응형

 

 

 

 

다음 차례로 Teamcity를 설치해보자.

 

Teamcity는 Server와 Agent로 나뉜다.

Server는 그냥 Teamcity 그 본체라고 보면될거고 Agent는 CI/CD 구성시 빌드를 수행하고 결과를 리포팅해주는 친구다.

여러 사람들이 동시다발적으로 빌드를 돌리거나 할 경우 Agent가 많을수록 병렬처리되는 수가 Agent 수만큼 증가한다 보면 된다.

참고로 Teamcity 무료 라이선스로는 100개의 빌드와 3개의 에이전트 까지만 사용이 가능하다.

 

 

GitLab 설치와 동일하게 docker hub에서 사용할 이미지를 확인하고 ec2 인스턴스에 접속해 docker 설치 및 docker-compose 파일 작성하는 방향으로 진행해보자.

 

 

 


Teamcity 설치하기 with Docker

 

 

1. Docker Hub에서 teamcity이미지 확인

docker hub에 접속해 teamcity를 검색해보자. 여러 이미지들이 검색되겠지만 진짜 쓸 이미지는 Jetbrains사에서 push한 이미지다.

 

 

이전 포스팅에서 GitLab 이미지 확인했던 방식대로 teamcity-server와 teamcity-agent의 태그를 확인해보자.

 

  • teamcity-server:2022.04.2

  • teamcity-agent:2022.04.2-linux-sudo

Agent는 docker를 실행시킬 예정인데 이때 sudo 권한이 필요하다. -linux-sudo 가 postfix로 붙은 이미지가 바로 그때 사용하는 이미지이다. 자세한 내용은 dockerhub를 참고하자.

https://hub.docker.com/r/jetbrains/teamcity-agent

 

Docker Hub

 

hub.docker.com

 

 

2. Teamcity Server 설치

2.1. EC2 인스턴스 접속

이전 포스팅에서 확인했던 대로 Teamcity Server, Agent를 설치할 EC2 인스턴스에 접속해보자.

습관처럼 처음 접속하는 인스턴스니까 apt update & upgrade 진행하자.

sudo apt update && sudo apt upgrade -y

 

커널 업데이트 될거니까 리부팅해주고..

 

2.2. Docker 설치

상세한 내용은 이전 포스팅에 써두었으니 다 생략하고 바로 docker, docker-compose 설치해주자.

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt update
sudo apt-get install -y ca-certificates url gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose

 

2.3. docker-compose.yml 파일 작성

  • ubuntu 계정 홈 디렉토리에 teamcity-server 폴더 생성
  • 아래와 같이 docker-compose.yml 작성
mkdir teamcity-server && cd teamcity-server
services:
  teamcity:
    image: jetbrains/teamcity-server:2022.04.2
    container_name: teamcity
    restart: always
    ports:
      - 8111:8111
    volumes:
      - ./data:/data/teamcity_server/datadir
      - ./logs:/opt/teamcity/logs

 

위 docker-compose 파일은 docker hub에 기재되어 있는 내용을 기반으로 작성했으니 참고하자.

포트나 볼륨은 입맛에 맞게 수정해서 쓰면 된다.

https://hub.docker.com/r/jetbrains/teamcity-server/

 

Docker Hub

 

hub.docker.com

 

2.4. docker 실행

이제 잘 만들어진 docker-compose를 올려주자.

sudo docker-compose -p teamcity-server up -d
ubuntu@ip-172-31-55-180:~/teamcity-server$ sudo docker ps
CONTAINER ID   IMAGE                                 COMMAND              CREATED          STATUS                        PORTS     NAMES
611e610e9dae   jetbrains/teamcity-server:2022.04.2   "/run-services.sh"   11 seconds ago   Restarting (1) 1 second ago             teamcity
ubuntu@ip-172-31-55-180:~/teamcity-server$

 

뭐지 docker 상태를 보니 계속 재시작되고있다. compose 파일 잘못썼나..? 로그를 한번 봐보자.

ubuntu@ip-172-31-55-180:~/teamcity-server$ sudo docker logs teamcity
/run-services.sh
/services/check-server-volumes.sh

>>> Permission problem: TEAMCITY_DATA_PATH '/data/teamcity_server/datadir' is not a writeable directory
>>> Permission problem: TEAMCITY_LOGS '/opt/teamcity/logs' is not a writeable directory

    Looks like some mandatory directories are not writable (see above).
    TeamCity container is running under 'tcuser' (1000/1000) user.

    A quick workaround: pass '-u 0' parameter to 'docker run' command to start it under 'root' user.
    The proper fix: run 'chown -R 1000:1000' on the corresponding volume(s), this can take noticeable time.

    If the problem persists after the permission fix, please check that the corresponding volume(s)
    are not used by stale stopped Docker containers ("docker container prune" command may help).

 

로그를 보니 datadir, logs 폴더에 대한 권한문제인듯하다.

컨테이너 내부에서는 tcuser (1000/1000)이 기본 사용자로 동작하는데 compose 파일에서 로컬 볼륨 매핑한 폴더가 해당 user에게 권한이 없어서 오류가 나는것 같다.

중간부분에 chown으로 어떻게 조치하면 되는지도 친절하게 안내해주네. 내용대로 datadir, logs 폴더에 1000:1000에 대한 권한을 줘보자.

 

우선 현재 퍼미션 상태를 확인해보자.

ubuntu@ip-172-31-55-180:~/teamcity-server$ ll
total 20
drwxrwxr-x 4 ubuntu ubuntu 4096 Aug  2 00:21 ./
drwxr-x--- 5 ubuntu ubuntu 4096 Aug  2 00:21 ../
drwxr-xr-x 2 root   root   4096 Aug  2 00:20 data/
-rw-rw-r-- 1 ubuntu ubuntu  239 Aug  1 08:59 docker-compose.yml
drwxr-xr-x 2 root   root   4096 Aug  2 00:20 logs/

sudo로 compose를 실행해서 두 폴더 다 root 권한이다.

 

chown으로 조치해주자.

ubuntu@ip-172-31-55-180:~/teamcity-server$ sudo chown -R 1000:1000 data logs
ubuntu@ip-172-31-55-180:~/teamcity-server$ ll
total 20
drwxrwxr-x 4 ubuntu ubuntu 4096 Aug  2 00:21 ./
drwxr-x--- 5 ubuntu ubuntu 4096 Aug  2 00:21 ../
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug  2 00:20 data/
-rw-rw-r-- 1 ubuntu ubuntu  239 Aug  1 08:59 docker-compose.yml
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug  2 00:20 logs/

얼레..? chown을 1000:1000으로 주었는데 소유자/그룹이 ubuntu로 찍힌다. 서버에서 ubuntu 계정 uid가 1000이었나보네 굳.

docker-compose 파일에 restart: always 옵션을 주었으니 계속 재시작 되고 있을거다. 권한만 제대로 적용 된다면 바로 정상적으로 컨테이너가 떠있을거다.

 

ubuntu@ip-172-31-55-180:~/teamcity-server$ sudo docker ps
CONTAINER ID   IMAGE                                 COMMAND              CREATED         STATUS         PORTS                                       NAMES
611e610e9dae   jetbrains/teamcity-server:2022.04.2   "/run-services.sh"   9 minutes ago   Up 2 minutes   0.0.0.0:8111->8111/tcp, :::8111->8111/tcp   teamcity
ubuntu@ip-172-31-55-180:~/teamcity-server$

 

굳굳.

 

그럼 웹으로 접속 해보자.

 

 

2.5. Teamcity 웹 접속

teamcity의 기본 웹 포트는 8111이다. docker-compose.yml 설정시 포트를 그대로 사용하게 설정했기 때문에 ec2 ip 뒤에 8111을 붙여 접속해보자.

 

  • 데이터 디렉토리 확인 및 백업에서 복원할지 여부. 신규 설치니까 Proceed.

 

  • teamcity 내부에서 사용할 데이터베이스 설정. 외부 mysql 등에 연동해 사용할 수 있다. 난 그냥 기본 내부 DB로 설정.

 

  • 라이센스 동의.

 

  • administrator 계정을 생성해주자. 난그냥 admin으로 만들어야지.

 

  • Teamcity 초기 화면 접속. 드디어 Teamcity Server 설치 완료

 

 

 

3. Teamcity Agent 설치

2.1. EC2 인스턴스 접속

이전 포스팅에서 확인했던 대로 Teamcity Agent를 설치할 EC2 인스턴스에 접속해보자.

습관처럼 처음 접속하는 인스턴스니까 apt update & upgrade 진행하자.

sudo apt update && sudo apt upgrade -y

 

2.2. Docker 설치

docker, docker-compose 설치해주자.

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt update
sudo apt-get install -y ca-certificates url gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose

 

2.3. docker-compose.yml 파일 작성

  • ubuntu 계정 홈 디렉토리에 teamcity-agent 폴더 생성
  • 아래와 같이 docker-compose.yml 작성
mkdir teamcity-agent && cd teamcity-agent
services:
  teamcity-agent-01:
    image: jetbrains/teamcity-agent:2022.04.2-linux-sudo
    container_name: agent01
    restart: always
    user: root
    privileged: true
    ports:
      - 9090:9090
    environment:
      - SERVER_URL=http://172.31.55.180:8111
      - AGENT_NAME=agent01
      - DOCKER_IN_DOCKER=start

  teamcity-agent-02:
    image: jetbrains/teamcity-agent:2022.04.2-linux-sudo
    container_name: agent02
    restart: always
    user: root
    privileged: true
    ports:
      - 9091:9090
    environment:
      - SERVER_URL=http://172.31.55.180:8111
      - AGENT_NAME=agent02
      - DOCKER_IN_DOCKER=start

  teamcity-agent-03:
    image: jetbrains/teamcity-agent:2022.04.2-linux-sudo
    container_name: agent03
    restart: always
    user: root
    privileged: true
    ports:
      - 9092:9090
    environment:
      - SERVER_URL=http://172.31.55.180:8111
      - AGENT_NAME=agent03
      - DOCKER_IN_DOCKER=start

 

  • teamcity 무료 라이선스로는 3개의 agent까지 사용이 가능하므로 하다. 그래서 3개 agent를 컨테이너로 만들었다.
  • teamcity agent는 기본 포트로 9090포트를 사용한다. 근데 한 서버 내에서 3개의 컨테이너로 agent를 띄우게 되면 3개 컨테이너가 모두 9090 포트를 사용할 수는 없으니 agent02는 9091 포트를, agent03은 9092 포트를 매핑하도록 설정했다.
  • teamcity server url은 사설 IP로 설정했다. server, agent EC2 인스턴스 생성시 같은 subnet을 할당받도록 되었기 때문에 내부 통신하도록 하기 위함이다.
  • 컨테이너 내부에서 docker를 사용하려면 root 권한이 필요하기 때문에 user를 root로 지정했고 privileged 옵션을 주었다.

 

위 docker-compose 파일도 server와 마찬가지로 docker hub에 기재되어 있는 내용을 기반으로 작성했으니 참고하자.

https://hub.docker.com/r/jetbrains/teamcity-agent/

 

Docker Hub

 

hub.docker.com

 

 

2.4. docker 실행

이제 docker-compose를 올려주자.

sudo docker-compose -p teamcity-agent up -d
ubuntu@ip-172-31-54-116:~/teamcity-agent$ sudo docker ps
CONTAINER ID   IMAGE                                COMMAND              CREATED          STATUS          PORTS                                       NAMES
681035c25f4b   jetbrains/teamcity-agent:2022.04.2   "/run-services.sh"   29 seconds ago   Up 15 seconds   0.0.0.0:9091->9090/tcp, :::9091->9090/tcp   agent02
4051f0489053   jetbrains/teamcity-agent:2022.04.2   "/run-services.sh"   29 seconds ago   Up 15 seconds   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   agent01
dedbfa8ca0a9   jetbrains/teamcity-agent:2022.04.2   "/run-services.sh"   29 seconds ago   Up 15 seconds   0.0.0.0:9092->9090/tcp, :::9092->9090/tcp   agent03
ubuntu@ip-172-31-54-116:~/teamcity-agent$

 

 

2.5. 서비스 확인

컨테이너는 정상적으로 올라왔는데 teamciy에서 agent에 추가되지 않았다.

혹시나 하는 마음에 agent ec2 인스턴스에서 server 인스턴스 사설 IP로 붙어봤는데 붙어지질 않네...

ubuntu@ip-172-31-54-116:~/teamcity-agent$ telnet 172.31.55.180 8111
Trying 172.31.55.180...

 

2.6. trouble shooting

AWS Console에 접속해 상태를 하나하나 체크해보자.

  • teamcity-server 인스턴스 정보

  • teamcity-agent 인스턴스 정보

 

 

두 인스턴스가 같은 subnet인건 맞다. 그럼 같은 서브넷이어도 별도로 허용정책이 필요한가? AWS Console의 VPC 메뉴에서 확인해보면 해당 서브넷에 적용된 ACL은 all-permit이다. 그럼 결국 인스턴스 자체에 적용된 보안그룹에 정책이 추가되어야 하는 것 같다.

 

인스턴스에 동일 subnet에 대한 all permit 보안그룹 정책을 만들어 추가해보자.

 

  • AWS EC2 신규 보안그룹 생성 : 인바운드 규칙 - 모든 트래픽 / 소스 인스턴스들이 속한 Subnet 대역

  • 모든 인스턴스에 새로 생성한 vpc-all-permit 보안정책 적용
  • teamcity-agent 에서 server 8111 포트로 다시 접속 테스트

ubuntu@ip-172-31-54-116:~/teamcity-agent$ telnet 172.31.55.180 8111
Trying 172.31.55.180...
Connected to 172.31.55.180.
Escape character is '^]'.

 

굳.

 

 

teamcity 웹으로 접속해 agent가 잘 붙었는지 보자.

unauthorized로 3개 agent가 보인다. agent 선택 후 authroize를 클릭해 이 agent가 내새끼가 맞음을 인증해주자.

 

 

자. 이정도면 Teamcity Server 및 Teamcity Agent 기본설정은 된 것 같다.

 

다음 포스팅에서 Gitlab과 Teamcity를 연동해보고 실제 빌드 구성을 진행해보자.

 

 

 

끝.

 

 

 

2022.08.01 - [devops] - GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (1)

2022.08.01 - [devops] - GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (2) - AWS EC2 구축

2022.08.01 - [devops] - GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (3) - GitLab 설치

2022.08.02 - [devops] - GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (4) - Teamcity 설치

2022.08.05 - [devops] - GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (5) - GitLab Teamcity 연동

2022.08.05 - [devops] - GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (6) - Teamcity 배포 구성

 

 

 

반응형

댓글