[Trouble Shooting] CI/CD를 구축할 때, 업로드 되지 않은 yml들은?

윤진원·2023년 7월 7일
9

Trouble Shooting

목록 보기
2/2
post-thumbnail

문제 상황❗️

💡 백엔드 서버 개발이 어느정도 완료된 이후, 나는 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 생성 및 설정)

  • 도커를 이용하는 방법, AWS S3와 Code Deploy를 이용하는 방법등 방법이 많았지만, 나는 후자를 선택했다.
    • 도커에 익숙하지 않은 탓도 있었지만, AWS는 EC2를 이용해서 단순 배포만 해본 경험이 있어서 좀 더 경험하고, 학습해보고 싶었다.

실패의 흔적들..

  • 하지만, 생각보다 쉽지 않았고 대부분은 나의 바보같은 실수 때문에 실패했고, 결국은 CI 까지는 크게 어렵지 않게 성공했다!

이젠, CD가 문제!

  • 빌드 자동화는 시켰지만, CD를 통해 배포 자동화 구축은 아직이였다.
    • S3를 통해 소스 코드를 압축하고.. Code Deploy를 통해 자동적으로 변동이 생기면 배포가 되게하고..
    • 여기까지는 이해했다! 그런데 내 .yml 들은?

현재 내 프로젝트에는 .yml 들이 꽤 많이 존재한다.

  • OAuth를 위한 설정 파일.. JWT를 위한 설정 파일.. Slack 연동을 위한 설정 파일등..
    • 몇몇 설정 파일들은 존재하지 않으면 애플리케이션이 띄워지질 않는다!

💡 따라서, 배포 자동화를 구축한다고 해도 Github내에 소스코드가 없으면 EC2에서 애플리케이션이 돌아가질 않는다!

  • Github 내에서 업로드된 소스 코드를 기반으로 빌드하고, 압축하여 원격 서버로 이동시키기 때문에,
    • 업로드되지 않은 .yml 들이 있으니 애플리케이션이 실행되지를 않았던 것.

따라서, 나는 .yml 들을 Github Secret에 넣고, 변수를 통해 가져와서 실행시키기로 했다.

  • 서치를 통해 알게된 사실은, 보안을 위해 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
  • 처음엔 위와 같은 방식으로 스크립트 상에서 폴더를 만들고, 파일을 만들어서 그 안에 넣어서 원격서버에도 존재할 수 있게 했다.

하지만, 여기서 문제가 발생!

  • 빌드되고, S3 → Code Deploy를 통해 원격 서버로의 업로드는 잘되는데, 애플리케이션이 실행이 되지 않았다.

  • 에러 메시지를 자세히 보니, Redis 관련 빈이 띄워지지 않고, @Value 를 통해 넣은 설정값들이 제대로 주입이 되지 않는다고 했다.
    • 따라서, 이틀 정도는 이 문제를 해결하는데 애를 먹었지만..

문제 해결💡

💡 문제는, Github Secret를 통해 넣을 때는 Base64 로 인코딩을 했지만, 원격서버에 .yml 을 만들어 줄때는 디코딩을 다시 하지 않았던 것!

  • 혹시 몰라 EC2에서 생성된 .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 구축에 성공!


참고

코드가 필요한 분들을 위해 필자가 작성한 스크립트를 첨부한다.

profile
기억보단 기록을

4개의 댓글

comment-user-thumbnail
2023년 7월 8일

글을 읽다가 첨부하면 좋을 내용이 있어 정리해보았습니다.
1. CI 스크립트를 작성하다 여러 실패한 부분들에 있어서, 어느 실수를 했고 어떻게 고쳤는지도 들어가면 좋을 것 같아요.
2. github secrets는 왜 인코딩을 해서 넣고, 디코딩해서 받는지도 찾아보면 좋을 것 같아요.
관련된 공식 문서 링크를 남겨봅니다!(https://docs.github.com/en/actions/security-guides/encrypted-secrets)
3.

2개의 답글