현재 프로젝트는 AWS EC2에서 배포중이며,

변경 사항 발생 시 SSH로 접속, Git pull 로 변경사항을 적용한 후 docker compose 파일을 실행하는 방식으로 반영하고 있다.

이 과정을 몇 번 하다보니, 해당 작업이 번거롭게 느껴져서 github 레포지토리에 push 되면

서비스 중인 서버에서 변경사항을 받아서 이를 적용하는 작업을 알아보게 되었다.

인터넷을 검색해보면, 보통 CI / CD를 docker hub를 통해 구현한 것을 많이 볼 수 있었는데,

그 방법은 나중에 적용하고, 연습 겸 원래 구상했던 방법으로 구현해 보기로 했다.

먼저, EC2 서버에 github 레포지토리가 연결되어 있어야 해당 작업이 가능한데,

내 경우에는, 처음 서비스를 배포할 때 git clone을 진행했으므로 연결이 이미 되어있는 상황이다.

Github Action은 레포지토리에서 설정 가능하고

공개되어서는 안되는 정보 (SSH 접속을 위한 Host IP 및 pem key 등) 이 포함되어있으므로,

별도로 등록한 후에 파일을 작성해야 번거롭지 않다.

Settings > Secrets and variables > Actions > Repository secrets

위 경로로 들어가면 프로젝트 구현 시 .env를 사용하는 것 처럼 저장한 변수를 Action 작성에 활용할 수 있다.

다음으로 Github > Actions 탭, New workflow 항목에 들어가 보면 사전에 세팅된 Action을 사용할 수 있다.

작성자가 참고한 파일은... 기억이 나지 않는다.

 

name: Deploy Backend to EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Deploy Backend Code
      uses: appleboy/ssh-action@v0.1.6
      with:
        host: ${{ secrets.SSH_HOST_NAME }}
        username: ${{ secrets.SSH_USER_NAME }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        port: ${{ secrets.SSH_PORT }}
        script: |
          cd Levup
          git pull
          cd backend
          docker-compose down
          docker-compose up -d  --build

name : workflow 이름을 지정

on > push > branches > main : github 레포지토리 main branch 에 push 되는 경우 이 파일을 실행한다.

jobs : 아래 작업을 수행

steps : 순차적으로 진행을 하는데, 작성자의 경우 하나의 작업만 수행할 예정이어서 하나밖에 없다.

uses: appleboy/ssh-action@v0.1.6  해당 액션을 사용할 것을 명시

with : 액션에 필요한 항목들을 불러오기

host, username, key, port : 이 부분이 ssh에 접속하기 위한 정보들이다. 

Github secrets 에 등록된 변수들은 ${{secrets.변수명}} 형태로 참조가 가능하다.

scripts: ssh에 접속한 것으로 간주했으니, 접속 이후에 어떤 행동을 할지 정의할 수 있다.

작성자의 경우, 프로젝트 폴더인 Levup으로 이동, 변경사항을 pull 한다.

(이곳에서 pull 하는 이유는, 레포지토리에 frontend 코드도 함께 저장되어있음)

그 후, backend 폴더로 이동하여 현재 실행중인 docker-compose 파일을 종료,

변경사항이 적용될 수 있도록 docker-compose 파일을 새로 시작한다.

이 때 -d --build 옵션이 없는 경우, 종료된 docker-compose 파일을 재실행 할 뿐이어서, 변경 사항이 반영되지 않는다.

새롭게 build 될 수 있도록 해당 옵션을 적용하면 main branch 에 push 되면 자동으로 서비스 서버에 적용된다.

Action workflow 화면

 

코드 push 후 해당 화면을 모니터링하면, 작업을 제대로 수행했는지, 오류가 발생했다면, 어디서 발생했는지 볼 수 있다.

'Etc > Github' 카테고리의 다른 글

Github Pull request 사용법  (0) 2023.03.21