본문 바로가기
DevOps/CI-CD

Github Actions CI/CD 프로젝트 적용기

by wch_t 2024. 6. 8.

졸업 설계를 진행하면서 코드의 변경이 있을 때마다 aws 서버에서 변경된 코드에 대해 pull을 받고 배포해주는 과정이 반복되었다. 이러한 수고로움이 계속 되면서, 자동화 프로세스인 CI/CD에 관심이 갔고 공부하고 프로젝트에 적용하는 과정에서의 배움을 정리하였다.

 


 

1. CI/CD란?

CI(Continuous Integration)

지속적 통합, 자동으로 코드의 변경이 있을 때 메인 레포지토리에 통합하는 과정이다.

 

여기에서 중요한 점은 통합되기 전에

자동화 된 build, test를 통해 문제가 없는 코드인지 확인하는 것이다.

 

 

CD(Continous Deployment)

지속적 배포, 자동으로 CI가 완료된 코드를 서버에 배포하는 과정이다.

 

 


 

2. CI/CD를 지원하는 여러 tool들이 있는데 왜 Github Actions를 선택하였는지??

Jenkins, Buildkite, Github Actions, Bitbucket Pipelines, GitlLab CI/CD, Circle CI, Travis CI ...

 

1) 기존에 사용하고 있던 Github이라는 하나의 통일된 환경에서 CI/CD가 가능하다.

 

2) 다른 tool 들에 비해 학습 비용이 낮다.

 

3) CI/CD 실행하는 데 있어, 별도의 서버 구축이 필요없다.

 

 


 

3. Github Actions란?

Github Actions는 Github에서 제공하는 CI/CD 도구로,

적용하고자 하는 repository에서 `build, test, deploy`와 같은 workflow를 설정하고 자동화 할 수 있게 하는 기능을 제공한다.

 

 

workflow

: ./github/workflows/*.yml 에 저장되는 yaml 파일로, workflow의 정의와 구성을 담고 있다.

 

job

: workflow 내에서 실행되는 단위 작업

 

step

: 각 작업 내에서 실행되는 명령어(스크립트)

 

 

 


 

4. Error Diary

1) Permission denied (publickey).

EC2 인스턴스를 생성할 때, 만든 private key(개인 키)로 접근하면 된다.

 

이 때 접속이 안 되면

EC2_KEY에 저장되는 key-pair(비밀키)로부터 공개키를 생성하여, EC2 인스턴스 내에 저장된 공개키와 일치하는지 확인한다.

# 비밀키 → 공개키
ssh-keygen -f project-key-pair.pem -y
# EC2 인스턴스 공개키 확인
cd ~/.ssh
cat authorized_keys

 

 

 

 

 

2) Host key verification failed.

SSH 통신 시 주의할 점 참고.

https://wch-0625.tistory.com/160

 

 

 

3) process kill error

 

[문제 상황]

ssh -i kotrip-key-pair.pem -o StrictHostKeyChecking=no $EC2_USER@$EC2_HOST "nohup java -jar /home/***/project.jar > app.log 2>&1 &"

 

위의 코드를 실행하고, ec2 인스턴스 내에서 확인해보면 `project.jar`이 잘 실행되는 것은 확인할 수 있다.

하지만 재배포 할 때 이전에 실행된 프로세스를 kill 하고 재실행 되는 것이 아닌, 기존 project.jar이 그대로 동작한다.

 

이를 해결하기 위해 이전에 실행된 프로세스를 kill 하고 재실행 하는 코드를 작성해보자.

 

 

[해결 과정에서의 에러]

프로세스를 kill 하기 위해 작성한 여러 코드들에서 다음과 같은 에러를 만났다.

 

3-1) Process exited with status 143 from signal TERM

      - name: 2. ssh-action을 사용해 EC2에 접속하기
        # https://github.com/marketplace/actions/ssh-remote-commands
        uses: appleboy/ssh-action@v1.0.3

        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_KEY }}
          script_stop: true
          script: |
            pkill -f '.jar'
            nohup java -jar /home/ubuntu/project.jar > app.log 2>&1 &

 

 

3-2) Process completed with exit code 1.

ssh -i kotrip-key-pair.pem -o StrictHostKeyChecking=yes $EC2_USER@$EC2_HOST 'pkill -f .jar'

 

 

3-3) Process completed with exit code 1.

ssh -i kotrip-key-pair.pem -o StrictHostKeyChecking=yes $EC2_USER@$EC2_HOST "
  pgrep -f 'java -jar /home/***/project.jar' | xargs -r kill;
  nohup java -jar /home/***/project.jar > nohup.out 2>&1 &"

 

[해결]

ssh -i kotrip-key-pair.pem -o StrictHostKeyChecking=yes $EC2_USER@$EC2_HOST "pgrep java | xargs kill -9; nohup java -jar /home/${{ secrets.EC2_USERNAME }}/project.jar > app.log 2>&1 &"

 

따라서 다음과 같이 이전에 실행된 프로세스를 kill 하고, 새롭게 project.jar을 실행하면 된다.

 

 

 

4) Run Command Timeout

이 에러는 `.jar`파일을 정상적으로 실행했는데 timeout 에러가 나온 경우이다.

 

# X
nohup java -jar /home/ubuntu/project.jar 2>&1 &

# O
nohup java -jar /home/ubuntu/project.jar > app.log 2>&1 &

 

 

1번째 코드에서는 표준 출력과 표준 오류가 직접 로그로 출력된다.

이 때 Github Actions가 스크립트의 실행과 출력을 실시간으로 추적하면서 타임아웃이 발생한다.

 

2번째 코드에서는 표준 출력과 표준 오류 모두 app.log 파일로 리다이렉션 한다.

Github Actions 시스템이 프로세스의 진행 상태를 기다리지 않아도 되기 때문에, 명령어 실행 후 즉시 다음 단계로 넘어갈 수 있다.

 

'DevOps > CI-CD' 카테고리의 다른 글

Jenkins CI/CD 구축하기 2편 (with. Docker)  (0) 2024.09.05
Jenkins CI/CD 구축하기 1편 (with. Docker)  (0) 2024.09.03
SSH (Secure SHell) 이란?  (1) 2024.06.04