※ Watch Out ※
이 블로그의 실습 관련된 포스팅은 대부분 제가 직접 진행하면서 작성된 내용이라 중간중간 오류가 있고 그 오류를 해결하는 trouble shooting 과정이 포함되어 있습니다. 그대로 따라하시면 제가 경험한 오류를 함께 경험하실수도 있습니다.
그리고 편의상 존칭 없이 친구한테 말하듯 기술하고 있으니 참고 부탁드립니다.
자이제 Teamcity와 GitLab 연동이 되었으니 Teamcity 빌드를 구성해보자.
먼저 예전에 그렸던 인프라 구성도를 잠깐 다시 꺼내보면...
구상중인 CI/CD 동작 과정은 다음과 같다.
- IDE에서 소스코드 작성
- GitLab repository로 commit
- Teamcity에서 Commit 인지 후 Agent에 빌드 수행 요청
- Agent에서 빌드
- 테스트 수행 (프로젝트 내 TestCase)
- docker image 생성
- docker image push
- web 서버에서 docker image pull
위 과정 에서 Agent 빌드 과정을 Teamcity에서 다음 2가지 빌드로 구성해보려 한다.
- Build
- 프로젝트 내부에 정의된 Test Case 수행
- docker image 생성 및 repository에 push
- Deploy
- WAS에 접속해 docker image pull 및 컨테이너 실행
먼저 Build의 테스트까지는 이전 포스팅에서 이미 설정을 해두었다.
(참고로 현재 진행중인 프로젝트는 Django 공식 document에 있는 poll 프로젝트를 그대로 복붙해 만든 프로젝트고 TestCase도 포함되어 있다.)
이제 테스트가 정상 수행되면 docker image를 만들어 push하는 스텝을 추가해보자.
현재 Build 의 스텝은 아래와 같다.
docker image를 push하고 pull 하기 위해 repository가 필요한데 별도로 구축하지 않고 DockerHub를 사용할 예정이다.
Docker hub에 접속해 repository를 만들어보자.
Docker Repository 생성
docker hub에 로그인하고 repositories 메뉴를 클릭하면 다음과 같은 화면이 나온다. Create repository를 클릭해 저장소를 만들자.
프로젝트 이름과 동일하게 django-tutorial로 저장소 이름을 정했다.
저장소가 생성되면 아래와 같이 push할때 명령 샘플을 볼 수 있다. 우리는 저 명령을 이용해 teamcity에서 생성한 docker image를 docker hub로 push할거다.
Dockerfile 작성
자, 다음으로 docker image를 만들기 위한 Dockerfile을 프로젝트에 다음과 같이 추가해보자.
FROM python:3.9.13
ENV HOME /root
WORKDIR ${HOME}
USER root
ADD . ${HOME}
RUN pip install -r requirements.txt
RUN python manage.py migrate
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "python manage.py runserver 0.0.0.0:8080"]
Dockerfile 내용은 단순하니 별도 설명은 생략하겠다.
이제 IDE에서 commit을 해보자.
조금 기다려보면 teamcity에서 자동으로 Build 단계를 수행하는것을 볼 수 있다.
상세 내용을 잠깐 구경해보면 Change에서 해당 Commit 내용을 간략히 볼수있고
빌드 진행 로그도 볼 수 있다.
자, 그럼 원래로 돌아와 빌드 스텝을 추가해보자.
Teamcity Build Step 추가 - docker build
Teamcity로 돌아와 아래와 같이 build step을 추가하자.
- Runner type : Docker
- Docker command : build
- Dockerfile source : File
- Path to file : Dockerfile (오른쪽 트리메뉴에서 선택 가능)
- Image platform : Linux
- Image name:tag : davidwoo21/django-tutorial:latest (docker hub에서 복붙)
맨 아래 Show advanced options를 클릭해보면 추가 옵션을 지정할 수 있는데,
이전 step이 성공적으로 끝난 경우에만 이 빌드 스텝을 실행한다던지 하는 실행 옵션을 지정할 수 있다.
나는 이전 Step이 성공적으로 끝난 경우에만 진행하도록 설정해야겠다.
저장하면 아래와 같이 구성이 된다.
테스트해보면 오류 없이 잘 수행되는 것을 확인할 수 있다.
Teamcity Build Step 추가 - docker push
다음으로 이전 스텝에서 생성한 docker image를 dockerhub로 push하는 스텝을 추가해보자.
아까와 동일하게 Add build step!
- Runner type : Docker
- Docker command : push
- Image name:tag : davidwoo21/django-tutorial:latest (이전 스텝에서 사용한 이미지 이름)
마찬가지로 run으로 빌드를 돌려보자.
push하다 오류가 난다. 생각해보니 docker hub 계정 정보도 입력안했는데.. 당연히 오류가 나는게 맞는거같네..
GitLab 연동시 Connection을 추가했던 것 처럼 Docker Registry Connection을 추가하자.
Administration > Projects > Root Project > Connections
추가가 완료되면 Build 설정으로 가서 좌측 메뉴의 Build Features에서 아래와 같이 Docker Support를 추가하자.
Docker Support를 클릭하고 Add registry를 클릭하면 조금전 추가한 Docker Registry Connection을 선택할 수 있다.
추가하고 저장하면 아래와 같이 Docker Support가 추가된다.
다시 Run으로 빌드를 돌려보면 오류 없이 정상적으로 빌드가 수행된다.
docker hub로 접속해 해당 repository를 확인해보면 아래와 같이 새로운 tag가 추가되어 있다!!
Teamcity Build 추가 - Deploy
이제 다음으로 Deploy Build를 추가해보자.
아래와 같이 메인 화면에서 프로젝트 오른쪽의 + 버튼을 클릭해 New Configuration을 클릭하자.
새로운 Build를 추가하는데 이번엔 Manually를 선택하자.
이전 Build는 gitlab에서 소스를 가져왔지만 이번 Deploy는 소스없이 docker 만 사용할거기 때문이다.
아래와 같이 입력 후 추가하자.
- Parent project : Django Tutorial (자동이다.)
- Name : Deploy
- Build configuration ID : 자동완성 그대로 쓰자.
- Build Configuration Type : Deployment (deploy 목적이니까)
저장하고 아래 화면으로 넘어와 Build Features를 추가해보자.
먼저 간략히 설명하면 이번 스텝에서는 WAS 인스턴스에 SSH로 접속해 docker image를 pull하고 새 image로 도커 컨테이너를 다시 띄우는 과정을 수행하도록 설정할거다.
아래 메뉴로 접속해 AWS EC2 인스턴스에 접속하기 위한 key를 업로드해주자. (기존에 사용하던 EC2 SSH key)
Administration > Projects > Root Project > SSH Keys
아래와 같이 키를 업로드하고 저장해주자.
그리고 다시 Deploy 빌드 설정으로 돌아와 아래와 같이 빌드 스텝을 추가해주자.
- Runner type : SSH Exec
- Target : 웹서버 인스턴스 사설 IP
- Username : ubuntu (EC2 인스턴스는 ubuntu 계정이 기본이다)
- Select key : 조금전에 업로드한 키 선택
- Commands : 일단 docker image pull 되는지 확인해 보기위해 아래와 같이 입력
sudo docker pull davidwoo21/django-tutorial:latest
저장한 뒤에 deploy 버튼을 눌러 테스트해보자.
잘 된다!!!
그러면 commands를 수정해서 실제로 동작하게 할 명령어를 추가해주자.
sudo docker pull davidwoo21/django-tutorial:latest
sudo docker stop webapp
sudo docker rm webapp
sudo docker run --name=webapp -p 8080:8080 --restart=always -d davidwoo21/django-tutorial
설명해보자면 최신 docker image를 pull 해오고 기존에 떠있는 docker 컨테이너를 종료/삭제 그리고 다시 docker 컨테이너 구동의 절차이다. (서비스 중단은 고려하지 않았다.)
마찬가지로 deploy 버튼을 클릭해 테스트해보자.
정상적으로 실행되었으니 아마 웹서버에 django가 실행중일거다. 웹서버 공인IP로 접근해보자.
음.. 이건 장고 오류니까 스킵하고 어쨋든 정상적으로 컨테이너가 동작하고 있음을 확인할 수 있다.
그러면 마지막으로 deploy에 대한 Trigger를 설정해보자.
지금 상태는 Trigger가 없으니 Teamcity 웹에서 deploy를 실행하지 않는 한 빌드가 동작하지 않을거다.
아래와 같이 Trigger를 추가해주자.
- Finish Build Trigger
- Build configuration : 이전 build 선택
- Trigger after successful build only : 이전 빌드 성공일경우에만 실행
- Branch filter : 아직 브랜치를 나누지 않았으니 그대로 두자.
자, 그럼 아까 장고 프로젝트에서 발생된 오류를 수정해 commit해보자.
예상대로 동작하면 build 과정이 정상적으로 마무리되면 deploy가 자동으로 수행될거다.
먼저 Build가 잘 수행될거고....
Build가 정상적으로 완료되고 조금 뒤 Deploy가 자동으로 실행된다.
최종적으로 Deploy까지 정상적으로 완료되었다!!!!
그러면 이제 웹 접속해서 잘 적용 되었나 확인해보자.
초라하지만 테스트 페이지라 그렇다. 어쨋든 오류 수정된 내용이 잘 적용 되었다!!
이로써 진짜 기초적인 CI/CD 구축이 완료되었다!!!
앞으로는 이를 기반으로 개발용 브랜치는 테스트만 수행하고 main 브랜치에 변동이 있을 경우에만 빌드/배포를 수행하도록 하는 등의 응용을 해봐야지...
일단 끝.
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 배포 구성
'devops' 카테고리의 다른 글
GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (5) - GitLab Teamcity 연동 (0) | 2022.08.05 |
---|---|
GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (4) - Teamcity 설치 (0) | 2022.08.02 |
GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (3) - GitLab 설치 (0) | 2022.08.01 |
GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (2) - AWS EC2 구축 (0) | 2022.08.01 |
GitLab + Teamcity + Docker + AWS CI/CD 구축하기 (1) (0) | 2022.08.01 |
댓글