배포는 귀찮은 일입니다. Production 배포는 급하게 고쳐야 할 버그가 아니면 한 번씩 진행되지만 코드 변경이 잦은 development 배포는 자주 이루어집니다. 코드 변경이 있을 때마다 서버 업데이트를 진행 해야하는데 이는 상당히 귀찮은 일입니다. 이 고민을 덜기 위해 개발자들은 CI/CD 프로그램을 가지고 빌드와 배포를 자동화하여 뚝딱 처리합니다. 최근 진행했던 프로젝트에서 Github Actions을 가지고 자동 배포를 구성했습니다. 첫 자동 배포를 구성해보았는데 어떻게 자동 배포를 구성했는지에 대해 공유하는 시간을 갖도록 하겠습니다.
Jenkins, Circle CI 등 여러 CI/CD 프로그램이 있지만 이번 프로젝트를 진행하면서 Github Actions을 골랐습니다. 기존에 Jenkins만 써봐서 다른 CI/CD 프로그램은 어떤지 궁금하기도 하고 Github와 궁합이 좋아보이는 Github Actions을 써보기로 결정했습니다. 본격적으로 Github Actions을 쓰기 전에 우리는 왜 Github Actions 즉, CI/CD를 쓰는 것 일까요? 필자는 서버 배포를 위해 다음과 같은 과정을 거쳤습니다.
git pullyarn && yarn build or npm i && npm run buildscp 이용yarn start or npm run start이 작업이 한 두번은 괜찮지만 하루에 여러 번 한다면 끔찍합니다. 로컬에서 코드 받아오고 빌드하고 파일 옮기기 서버에 접속해서 실행하고... 썩 유쾌한 일이 아닙니다. 위 작업들이 반복되는 작업임을 깨달으면 자연스럽게 자동화해서 처리하고 싶은 생각이 듭니다. 이 때 바로 코드 최신화, 빌드, 배포 자동화를 도와주는 CI/CD 프로그램 중 하나가 Github Actions입니다.
Github Actions은 Github repository의 최상단 .github/workflow 디렉터리 위치의 .yml 파일 내용을 실행합니다. .yml 파일의 내용에 따라 어떤 브랜치에 어떤 행동을(push, pr) 하면 어떤 일(steps)을 할지 정의합니다. 다음의 예시를 보면서 하나 씩 살펴봅시다.
name: Github Actions Example
on:
push:
branches: [ develop ]
jobs:
Github Actions Job:
runs-on: ubuntu-18.04
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Create ENV File
run: |
touch .env
echo "${{ secrets.DEV_ENV }}" >> .env
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Build
run: |
npm i
CI= npm run build
- name: Compress
run: tar -zcvf test.tar.gz build
- name: Upload to S3
run: |
aws s3 mv --region ap-northeast-2 \\
test.tar.gz \\
${{ secrets.S3_DEV_FRONT_LOCATION }}/test.tar.gz
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
port: ${{ secrets.PORT }}
key: ${{ secrets.KEY }}
script: |
./deploy_front.sh
제가 생각하는 Github Actions의 가장 큰 특징은 Jenkins의 pipeline 처럼 자동화 과정이 steps으로 나뉘어져 있다는 것입니다. 현재 위의 예시에서는 Checkout, Configure AWS Credentials, Crete ENV File, Setup Node, Build, Compress, Upload to S3, Deploy 8개의 step이 있습니다. 각 step은 name으로 나뉘어지고 그 안에 uses, with, run 같은 속성으로 어떤 동작을 할지 정의합니다. 다시 돌아와서 첫 번째 코드부터 살펴보도록 하겠습니다.
Github Actions workflow 이름 정하기
name: Github Actions Example
develop 브랜치에 push를 하면
on:
push:
branches: [ develop ]
Github Actions Job이라는 job 이름으로 Ubuntu 18.04 환경에서 최대 10분 동안
jobs:
Github Actions Job:
runs-on: ubuntu-18.04
timeout-minutes: 10
이런 step들을 진행해라