개발꿀팁
TeamCity로 CI/CD 적용하기
TeamCity로 CI/CD를 구현하게 되었다! TeamCity를 조금 더 이해하고 익히고자, 잊어버렸더라도 다시보면 한눈에 기억해낼 수 있도록 정리해보기로 했다
CI/CD와 TeamCity에 대해 알아보고 적용하는 방법까지 정리해보자!
1. CI / CD
- 애플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법 또는 전략
- 코드통합, 테스트, 릴리즈, 배포(Deployment)의 애플리케이션 라이프사이클 전체 과정을 자동화하고 모니터링 가능하도록 하는 것, 이러한 연속된 과정을 "CI/CD 파이프라인"이라고 부른다.
CI - 지속적 통합(Continuous Integration)
- 빌드 / 테스트 자동화과정
- 커밋할 때마다 빌드와 일련의 자동 테스트가 이루어져 동작을 확인하고 변경으로 인해 문제가 생기는 부분이 없도록 보장
CD - 지속적 배포(Continuous Deployment)
- 지속적인 서비스 제공(Continuous Delivery) 또는 지속적인 배포(Continuous Deployment)를 의미
- 코드 변경이 파이프라인의 이전 단계를 모두 성공적으로 통과하면 수동 개입 없이 해당 변경 사항이 프로덕션에 자동으로 배포
- 간단한 코드 변경이 정기적으로 마스터에 커밋되고, 자동화된 빌드 및 테스트 프로세스를 거치며 다양한 사전 프로덕션 환경으로 승격되며, 문제가 발견되지 않으면 최종적으로 배포
CI / CD가 필요한 이유
- 시장 출시 기간 단축, 위험감소, 검토 시간 단축, 코드 품질 개선, 프로덕션 환경으로 원활한 전환, 더 빠른 버그수정, 효율적 인프라, 진행상황에 대한 평가 가능, 더 긴말한 피드백 루프, 협업 및 커뮤니케이션, 창의력 극대화 등
- 자세한 내용은 젯브레인에서 작성한 문서를 참고해주세요 => https://www.jetbrains.com/ko-kr/teamcity/ci-cd-guide/benefits-of-ci-cd/
2. TeamCity란?
- TeamCity는 훌륭한 CI소프트웨어로, 자바기반으로 만들어져서 거의 모든 OS를 지원하며 무료사용으로도 어느정도 풍부한 기능을 사용할 수 있다.
- 왜 TeamCity를 사용하는지 찾아보니 많은 회사들이 Jenkins를 사용하고 있어 Jenkins와 많이 비교 되고 있는것 같다. TeamCity는 Jenkins와 비교했을때 상대적으로 UI/UX가 편하고 예쁘다고 한다! 또한 Container에 친화적이라 Docker와의 연동이 쉽다고 한다(참고)
- 다른 CI/CD 도구로는 Jenkins, 트래비스 등이 있다
3. TeamCity로 자동 배포하기 + 경험 한스푼 🥄
팀시티 빌드 과정
1. TeamCity 다운로드 (필자는 도커 이미지를 다운받아 이용하였다)
2. 프로젝트 구성, 빌드 및 테스트 -> Jetbrains에서 제공하는 튜토리얼(.NET, Gradle, Maven, Python)
- 튜토리얼을 따라하면 프로젝트 생성까지는 무난하게 성공!
3. 추가로 프로젝트에 맞게 Build Steps을 설정해주면 된다
내 프로젝트의 Build Steps
- Step1 : Clean build - 빌드 테스트
- Step2 : SSH Upload - 빌드 된 jar 파일을 TeamCity 작업 수행 디렉토리에서 내 서버로 Upload 나의경우는 jar파일을 tar파일로
- Step3 : SSH Exec - deploy.sh 실행(기존에 사용중이던 Docker 컨테이너 stop, 이미지, 컨테이너 삭제 -> tar파일 추출 -> Docker 이미지 빌드 -> 컨테이너 run)
Build Steps 상세내용
필자는 멀티모듈 프로젝트로 구성하여 3개의 jar파일을 빌드해야했다.
빌드테스트 후 2번째 단계에서 SSH Upload로 파일을 서버로 업로드 한 후 3~5번째 단계에서 SSH Exec로 각각의 프로젝트를 빌드 했다.
SSH Upload
다른 부분은 서버 상세 내용임으로 제외하고 가장 마지막 path to sources에 아래와 같이 적어주었다.
%teamcity.build.workingDir%/project/build/libs/project.jar => /path/project.tar
%teamcity.build.workingDir%는 TeamCity 빌드 에이전트가 현재 작업을 수행하는 디렉토리의 절대 경로를 나타내는 시스템 변수이다. 작업 디렉토리 경로는 동적으로 변하기 때문에 시스템 변수를 사용한다. 실제 디렉토리 경로는 빌드로그에서 확인할 수 있다.
여튼 작업디렉토리 안에서 jar파일을 찾아 tar로 묶어 서버로 upload한다는 내용이다.
SSH Exec
서버 상세 내용을 세팅하고 commands를 적어주면 된다.
cd path && . deploy.sh
path에 접근해서 deploy.sh를 실행하달라는 명령어이다.
프로젝트의 빌드 과정
- 초반에 Auth fail은 build steps입력과정에서 문제가 있어 발생했던 오류. 디테일한 설정들을 꼼꼼히 확인해야한다!
- 다음에는 Success가 뜨긴했지만 빌드가 되지 않았다🥲 그냥 build steps이 무난하게 진행 된다면 Success가 뜨는것 같다(당연한 이야기)
- Success가 떴는데도 서버 빌드가 안돼서 deploy.sh 파일도 살펴보고 Docker log도 확인해봤는데 yml파일 설정에 문제가 있어서 빌드가 안되었던것!
관리 브랜치 설정
- 추가적으로 VCS(Version Control Settings) Roots 에서 Edit으로 들어오면 팀시티에서 관리하는 브랜치를 설정할 수 있다!
- develop브랜치만을 관리하기 위해 'rdfs/heads/develop'으로 세팅했지만 defult값으로 'refs/heads/*'로 설정되어 있어 잘 확인해야한다.
- 처음에는 뭣모르고 세팅을 안해줬더니 꼬여서 문제가 생겼던적이 있었으니 웬만하면 설정해주길
4. 정리 및 느낀점
- 애매하게 알고 있던 CI/CD에 대해 공부해보고 정리를 해보는 좋은시간이었다
- 기술이나 도구 하나하나의 선택에는 이유가 따른다. 다른 CI/CD 도구들이 있음에도 TeamCity를 사용하는 이유를 잘생각해보고 다음에는 상황에 맞게 다른 도구도 내 판단과 선택으로 사용해보고싶다!
- 다 하고 나서 보면 손댈게 많이 없었는데도 하루종일 낑낑거려 성공했다! 이렇게 경험과 새로운 지식이 추가되었다!
< References >
https://oliveyoung.tech/blog/2022-05-03/How-to-Set-up-Build-Process-with-Teamcity/
https://seosh817.tistory.com/104
https://jojoldu.tistory.com/448
https://www.jetbrains.com/ko-kr/teamcity/tutorials/gradle-build-configure-test/
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
Java 'MultipartFile'에서 파일 이름 가져오기 문제와 해결방법, 유니코드 (0) | 2023.12.21 |
---|---|
AWS SDK for Java V1, V2 차이 / s3객체 업로드, 복사, 삭제 구현하기 (0) | 2023.06.26 |
Docker 알아보기! Dockerfile 만들기, 이미지와 컨테이너 빌드하기 (1) | 2022.09.16 |
SpringBoot 슬랙 Slack알림보내기 ChatPostMessageRequest (0) | 2022.06.15 |
SpringBoot SMTP서버를 활용한 메일 보내기 (0) | 2022.06.07 |