TL;DR
- 손쉽게 무료로 Github에 코드를 올리자마자 자동으로 배포되는 CI/CD 구축이 가능하다.
- Private Key, 비밀번호 등을 안전하게 관리할 수 있다.
- AWS, Azure, Oracle Cloud, Docker Hub 등과의 통합도 가능하다.
Github Actions
Github Actions은 Github에서 제공하는 자동화 도구입니다.
Github에서 제공하는 가상 머신에서 소스코드 테스트와 빌드를 포함하여 다양한 작업을 할 수 있습니다.
아래는 사용 예제입니다.
- 소스코드 빌드, 테스트
- 완성된 코드 배포
- Docker 이미지 빌드, 배포
- 빌드된 패키지를 개인 저장소(Nexus, CodeArtifact 등)로 게시
- 오랜 기간 활동 없는 이슈를 자동으로 종료 처리
배포 시나리오
만약 sakd.uk의 API 서버 배포를 수동으로 수행한다면 이런 작업을 수행하게 될 것입니다.
- Github에서 최신의 소스코드를 업데이트 받는다.
- Gradle 등 빌드 도구로 테스트와 빌드를 수행한다.
- 정상적으로 완료가 되면 Dockerfile을 이용하여 Docker 이미지로 빌드한다.
- Docker Hub에 Push한다.
- 완료되면 사용 중인 Kubernetes로 접속하여 Rollout 명령을 내린다.
- 완료되면 Pod의 상태를 조회한다.
Github Actions를 활용하면 master 브랜치로 병합할 때마다 이 작업이 자동으로 수행되도록 할 수 있습니다.
예시
아래는 예제로 작성한 .github/workflows/deploy.yml
파일입니다.
# github repository actions 페이지에 나타날 이름
name: 운영 환경 배포
# event trigger
on:
push:
branches: ['master'] # master 브랜치에 Push 되었을 때 실행한다.
permissions:
contents: read
jobs:
# Build 단계
Build:
runs-on: ubuntu-latest
# node-version 과 같이 배열로 돼있으면, 순회하면서 작업이 반복 실행된다.
# 응용해서 runs-on에 여러 OS에서 돌릴 수도 있다.
strategy:
matrix:
node-version: [14.x] # 템플릿 기본값: [10.x, 12.x, 14.x]
steps:
- uses: actions/checkout@v3
- name: Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
# 환경 설정 파일 생성 - config.js
- name: make config.js
run: |
cd ./src # src 폴더로 이동
touch ./config.js # config.js 생성
echo "${{ secrets.CONFIG_JS }}" | base64 --decode > ./config.js
shell: bash
# QEMU 설치
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
# Docker Buildx 설치
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
# Docker Hub 로그인
- name: Login to Docker hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Docker Build & Push
- name: Docker build & push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/my_web:latest
platforms: |
linux/amd64
linux/arm64
linux/arm/v7
# 배포 단계
Deploy:
runs-on: ubuntu-latest
needs: Build # Build가 완료되면 수행한다.
steps:
- name: Deploy
uses: appleboy/ssh-action@master
id: deploy-prod
if: contains(github.ref, 'main')
with:
host: ${{ secrets.HOST_PROD }}
username: ubuntu
key: ${{ secrets.PRIVATE_KEY }}
envs: GITHUB_SHA
script: |
sudo docker ps
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/my_web
sudo docker run -d -p 8082:8082 ${{ secrets.DOCKER_USERNAME }}/my_web
sudo docker image prune -f
수행되는 작업
읽어보면 바로 이해될 정도로 굉장히 직관적인 형식입니다.
이 중 몇 가지 주목할 점을 짚어봅니다.
on.push.branches (l5 ~ 7)
수행할 조건을 지정합니다.
이 옵션을 지정하면 master
브랜치와 develop
브랜치에 수행할 작업을 각각 다르기 지정할 수 있습니다.
예를 들면 master
브랜치인 경우 위에서와 같이 빌드, 배포 단계가 수행되지만,
develop
브랜치인 경우 빌드 테스트만 하도록 설정할 수 있습니다.
환경 설정 파일 생성 - config.js (l31 ~ 37)
환경설정 파일엔 API 키와 같이 보안에 민감한 정보가 포함된 경우가 많습니다.
이런 민감한 정보는 Git Repository에 올려서 관리하는 것은 그렇게 추천되는 방법은 아닙니다.
Github Actions에서는 비밀 정보를 별도로 관리할 수 있도록 저장공간을 제공해줍니다.
자세한 내용은 링크에서 확인할 수 있습니다.
위 make config.js
단계는 base64 형식으로 저장된 config.js 파일을 불러와서 디코딩 후 저장하는 코드입니다.
Docker Hub 로그인 (l47 ~ 52)
AWS, Docker등 잘 알려진 서비스는 Github Actions를 활용할 수 있도록 미리 Action을 만들어 두었습니다.
위 docker/login-action
은 이 Marketplace 페이지에서 확인할 수 있습니다.
물론 직접 VM에서 CLI 도구를 실행하여도 충분히 Docker 로그인을 수행할 수 있지만,
Marketplace에 등록된 Action을 활용하면 더 간편하게 작업 수행을 할 수 있습니다.
Docker Build & Push (l54 ~ 64)
platforms
옵션을 지정하면 여러 플랫폼에 맞는 이미지를 생성할 수 있습니다.
호스트 머신의 아키텍쳐에 미리 대응해 둘 수 있으므로 편리합니다.
jobs.Deploy.needs (l69)
Job을 분리해두면 모니터링과 실패 후 재실행 하기에 좋습니다.
이미지와 같이 각각의 단계가 그래프 형태로 표시됩니다.
덕분에 수행해야 할 작업이 많을 때에는 추적을 더 간편하게 할 수 있습니다.
또한, 작업을 수행하다 중간에 실패한 경우, 실패한 Job부터 다시 수행할 수 있습니다.
예를 들어 Build까지는 성공했지만 EC2 인증 정보가 변경되어 배포에 실패했다면,
Build 단계를 생략하고 Deploy 단계만 수행하여 재작업 시간을 단축할 수 있습니다.
결론
시중에 Jenkins, Travis CI 등 검증된 CI/CD 도구들이 많이 있습니다.
Github Actions를 활용하면 빌드, 테스트 및 배포 파이프라인을 자동화 할 수 있습니다.
이미 이름만 들어도 알만한 기업들도 활용하고 있죠.
별도의 환경 구축이 필요 없고, 워크플로우를 정의하기가 간단하여 개인 프로젝트에 활용하기에도 좋습니다.
참고 문서
- Github Actions 설명서 - Github Docs (https://docs.github.com/ko/actions)
- Github Actions과 Docker을 활용한 CI/CD 구축 - 짱제이의 코딩짱 도전기 (https://velog.io/@leeeeeyeon/Github-Actions과-Docker을-활용한-CICD-구축)
- 깃허브 액션으로 CI/CD 구현하기- 요즘IT (https://yozm.wishket.com/magazine/detail/2197/)