💡 백엔드 서버 개발이 어느정도 완료된 이후, 나는 CI/CD를 통한 배포 자동화를 구축하려고 했다.
서버 개발이 완료되지 않았는데도 왜?
비즈니스 코드가 변경되면 매번 다시 빌드하고.. 원격 서버의 서버를 중지하고..
.jar
파일을 원격 서버에 옮기고.. 기다리고..
백엔드 서버 개발이 마무리 되지는 않았지만, CI/CD를 구축해보자!
라는 생각과 함께 스크립트를 짜보기 시작했다.우선, 어떤 서비스를 사용할까?
- Github Action
- Jenkins
- Travis CI
후보는 위 세 서비스를 고려했다.
하지만, Travis CI는 유료이고, Jenkins는 CI/CD를 처음 시도하거나 설정이 미숙한 사용자에겐 어렵다는 글들이 많았다.
따라서, 때마침 Github에 프로젝트 소스코드를 업로드하고 있고, 개발한 코드를 Push하거나 Merge하면 자동으로 빌드해주고 사용법도 비교적 쉬운 Github Action을 선택했다.
스크립트는 학습하며 작성했고, 다음 포스팅을 대부분 참고하였다.
Github Actions로 CI/CD 구축하기 #1 (EC2, S3 생성 및 설정)
실패의 흔적들..
이젠, CD가 문제!
.yml
들은?현재 내 프로젝트에는
.yml
들이 꽤 많이 존재한다.
💡 따라서, 배포 자동화를 구축한다고 해도 Github내에 소스코드가 없으면 EC2에서 애플리케이션이 돌아가질 않는다!
.yml
들이 있으니 애플리케이션이 실행되지를 않았던 것.따라서, 나는
.yml
들을 Github Secret에 넣고, 변수를 통해 가져와서 실행시키기로 했다.
Base64
로 인코딩 후 업로드해야 한다.Base64
로 인코딩 후, 빌드 될때 같이 생성해서 업로드하는 방법을 택해보았다. - name: run docker-compose
run: |
mkdir ./src/main/resources
cd ./src/main/resources
touch ./docker-compose.yml
echo "${{ secrets.DOCKER_COMPOSE }}" >> ./docker-compose.yml
cat ./docker-compose.yml
- name: make application.yml
run: |
cd ./src/main/resources
touch ./application.yml
echo "${{ secrets.APPLICATION }}" >> ./application.yml
cat ./application.yml
- name: make application-chatgpt.yml
run: |
cd ./src/main/resources
touch ./application-chatgpt.yml
echo "${{ secrets.APPLICATION_CHATGPT }}" >> ./application-chatgpt.yml
cat ./application-chatgpt.yml
- name: make application-iamport.yml
run: |
cd ./src/main/resources
touch ./application-iamport.yml
echo "${{ secrets.APPLICATION_IAMPORT }}" >> ./application-iamport.yml
cat ./application-iamport.yml
하지만, 여기서 문제가 발생!
@Value
를 통해 넣은 설정값들이 제대로 주입이 되지 않는다고 했다.💡 문제는, Github Secret를 통해 넣을 때는
Base64
로 인코딩을 했지만, 원격서버에.yml
을 만들어 줄때는 디코딩을 다시 하지 않았던 것!
.yml
들을 살펴보니 죄다 알아볼 수 없는 Base64
로 인코딩이 되어 있었다.따라서,
Base64
로 인코딩 되어있는.yml
들을 다시 디코딩 시켜 문제 해결!
- name: run docker-compose
run: |
mkdir ./src/main/resources
cd ./src/main/resources
touch ./docker-compose.yml
echo ${{ secrets.DOCKER_COMPOSE }} | base64 --decode >> ./docker-compose.yml
- name: make application.yml
run: |
cd ./src/main/resources
touch ./application.yml
echo ${{ secrets.APPLICATION }} | base64 --decode >> ./application.yml
- name: make application-chatgpt.yml
run: |
cd ./src/main/resources
touch ./application-chatgpt.yml
echo ${{ secrets.APPLICATION_CHATGPT }} | base64 --decode >> ./application-chatgpt.yml
- name: make application-iamport.yml
run: |
cd ./src/main/resources
touch ./application-iamport.yml
echo ${{ secrets.APPLICATION_IAMPORT }} | base64 --decode >> ./application-iamport.yml
결과적으로, 정상적으로 빌드되고, 애플리케이션이 실행되어 CI/CD 구축에 성공!
코드가 필요한 분들을 위해 필자가 작성한 스크립트를 첨부한다.
글을 읽다가 첨부하면 좋을 내용이 있어 정리해보았습니다.
1. CI 스크립트를 작성하다 여러 실패한 부분들에 있어서, 어느 실수를 했고 어떻게 고쳤는지도 들어가면 좋을 것 같아요.
2. github secrets는 왜 인코딩을 해서 넣고, 디코딩해서 받는지도 찾아보면 좋을 것 같아요.
관련된 공식 문서 링크를 남겨봅니다!(https://docs.github.com/en/actions/security-guides/encrypted-secrets)
3.