[CI/CD] GitHub Action을 이용한 CI 설정하기
GitHub Action이란?
GitHub 저장소(repository) 안에서 코드 변경(push, pull request 등)이나 수동 실행(workflow_dispatch), 예약 실행(schedule) 같은 다양한 이벤트를 트리거로 하여 정해진 작업(workflow)을 자동으로 수행할 수 있도록 지원하는 GitHub 내장형 자동화 기능입니다. 사용자는 YAML 파일을 이용해 빌드, 테스트, 배포, 린트 검사, 문서 생성 등 필요한 작업을 정의할 수 있으며, 이러한 작업들은 하나 이상의 Job으로 구성되고, 각 Job은 여러 Step(명령 실행 또는 외부 Action 호출)으로 이루어져 독립적으로 혹은 서로 의존 관계를 갖고 실행될 수 있습니다. GitHub Actions는 GitHub와 완벽하게 통합되어 있어, 코드와 CI/CD 파이프라인을 한 곳에서 관리할 수 있습니다.
또한, Actions 마켓플레이스(GitHub Marketplace)에서 수천 개의 오픈소스 Action들을 가져와 조합하여 쉽게 복잡한 자동화를 구성할 수 있다는 장점도 가지고 있습니다.
시작하기 전에 테스트용 GitHub Repo 생성
필자는 CI 환경을 구축하기 위해 GitHub Action을 사용하였고 CD 환경은 ArgoCD를 사용하여 구축하였습니다. 그래서 myapp repo에 GitHub Action을 설정하여 이미지를 빌드하고 DockerHub에 이미지를 push하여 빌드된 이미지 정보를 myapp-deploy repo에 commit 하는 방법을 이용하여 CI/CD 환경을 구축하였습니다.
이번 실습에서는 GitHub Action을 사용하여 DockerHub에 이미지를 push하고, myapp-deploy repo에 commit 하는 방법을 익히는 방법에 대하여 알아보겠습니다.
GitHub Repo에 각자 자신의 코드를 작성하였고, GitHub Repo에 Dockerfile이 존재한다는 가정하에 실습을 진행하겠습니다.
필자는 go언어 개발자이기 때문에 아래와 같이 myapp repo를 작성하였습니다.
.
├── Dockerfile
├── go.mod
├── main.go
└── README.md
이번 실습 목표
- GitHub Action을 사용하여 DockerHub에 이미지를 build하고 push 하는 방법을 익힌다.
- GitHub Action을 사용하여 DockerHub에 이미지를 push한 후, myapp-deploy repository에 commit 하는 방법을 익힌다.
이번 실습 구성도
DockerHub Token 생성
Account Settings -> Personal access tokens -> New Access Token
생성된 token은 복사하여 저장합니다. 나중에 다시 확인할 수 없기 때문에 꼭 복사하여 저장합니다.
GitHub Token 생성
Settings -> Developer settings -> Personal access tokens -> Tokens(classic) -> Generate new token
Note : token 이름 설정
Expiration : No expiration
Token check list
- repo 모두 선택
- write:packages
- read:packages
생성된 token은 복사하여 저장합니다. 나중에 다시 확인할 수 없기 때문에 꼭 복사하여 저장합니다.
GitHub Action 시작하기
Secret 설정
Secret을 설정하는 이유는 외부에 노출되어서는 안 되는 민감한 정보(예: 비밀번호, API 키, Access Token)를 안전하게 암호화하여 저장하고 GitHub Actions 워크플로우 실행 중에만 제한적으로 사용할 수 있도록 함으로써 코드 저장소에 중요한 정보를 직접 노출시키지 않고도 필요한 인증 및 보안 작업을 자동화할 수 있는 기능입니다.
Secret을 설정하는 방법은 아래와 같습니다.
GitHub Repo -> Settings -> Secrets and variables -> Actions -> New repository 에서 총 3개의 secret을 설정합니다.
- DOCKER_USERNAME : DockerHub username
- DOCKER_PASSWORD : DockerHub token
- GH_TOKEN : github token
GitHub Action 설정
GitHub Repo -> Actions에서 원하는 workflow를 선택하여 생성합니다. 필자는 Docker Image를 선택하여 작업을 시작하였습니다.
GitHub Action Workflow를 설정하는 방법은 아래와 같습니다.
name: Docker Image CI
on:
push:
# 모든 브랜치에 push 이벤트 발생 시 실행
branches: [ "**" ]
jobs:
build:
# ubuntu-latest 환경에서 Action 실행
runs-on: ubuntu-latest
# 환경변수 설정
env:
DEPLOY_REPO: 깃헙계정/myapp-deploy
IMAGE_REPO: ${{ secrets.DOCKER_USERNAME }}/myapp
steps:
# 소스코드 체크아웃
- name: Checkout source code
uses: actions/checkout@v4
# DockerHub 로그인
- name: Docker login to DockerHub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
# 브랜치를 이용하여 이미지 태그 결정
# 특수문자(-_.) 제외하고 다 -로 변환
# main 브랜치는 latest 태그 사용
# 나머지 브랜치는 브랜치명 그대로 태그
- name: Determine image tag
id: vars
run: |
BRANCH_NAME=${GITHUB_REF#refs/heads/}
SAFE_BRANCH_NAME=$(echo $BRANCH_NAME | sed 's#[^a-zA-Z0-9_.-]#-#g')
if [ "$BRANCH_NAME" = "main" ]; then
echo "tag=latest" >> $GITHUB_OUTPUT
else
echo "tag=$SAFE_BRANCH_NAME" >> $GITHUB_OUTPUT
fi
# 이미지 빌드
- name: Build the Docker image
run: docker build --platform linux/amd64 -t ${{ env.IMAGE_REPO }}:${{ steps.vars.outputs.tag }} .
# 이미지 푸시
- name: Push Docker image to DockerHub
run: docker push ${{ env.IMAGE_REPO }}:${{ steps.vars.outputs.tag }}
# myapp-deploy repository 체크아웃
- name: Checkout myapp-deploy repository
uses: actions/checkout@v4
with:
repository: ${{ env.DEPLOY_REPO }}
token: ${{ secrets.GH_TOKEN }}
ref: main
# myapp-deploy repository에 이미지 정보 업데이트
# 커밋 (변경사항이 없으면 에러를 무시)
- name: Update image.txt with new image info
run: |
echo "${{ env.IMAGE_REPO }}:${{ steps.vars.outputs.tag }}" > image.txt
git config --global user.name "github-actions"
git config --global user.email "github-actions@github.com"
git add image.txt
git commit -m "Update image to ${{ env.IMAGE_REPO }}:${{ steps.vars.outputs.tag }}" || echo "No changes to commit"
git push
GitHub Action 테스트
GitHub Action이 정상적으로 동작하는지 확인하기 위해서는 myapp repository에 코드를 수정하여 commit하면 됩니다.
GitHub Repo에 Actions 탭을 클릭하면 아래와 같이 Action이 실행되는 것을 확인할 수 있으며 실패 시 로그를 확인하여 문제를 해결할 수 있으며, 이메일을 통해 실패 알림을 받을 수 있습니다.
GitHub Action 결과 확인
GitHub Action이 성공적으로 실행되면 DockerHub에 이미지가 push된 것을 확인할 수 있으며, myapp-deploy repository에 image.txt 파일이 생성된 것을 확인하여 정상적으로 동작하였음을 확인할 수 있습니다.
참고문서
https://docs.github.com/ko/actions
GitHub Actions 설명서 - GitHub Docs
GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완
docs.github.com