GitHub Actions workflows를 어떻게 구성했는지에 앞서 이번 프로젝트에서 CI/CD 파이프라인을 왜 구축하는지에 대해서 간략하게 설명하겠다.
CI/CD 파이프라인을 구축하게 되면 개발이 완료된 후 유지보수 및 버전관리에 대한 자동화 배포가 가능해진다. 이번 프로젝트도 개발이 완료되고 난 후에도 파이프라인을 통해 지속적인 통합과 배포를 진행할 것이다.
하지만 이번 프로젝트에서 파이프라인을 구축한 가장 큰 이유는 개발자의 편리성을 향상시키기 위함이다.
- 개발단계에서 파이프라인을 구축해놓음으로써 개발자가 추가하거나, 변경/수정한 코드에 대해 자동적으로 배포가 된다. 이를 통해 개발 단계에서도 지속적인 통합과 배포가 가능해진다.
- 결론적으로 개발자는 자신이 개발한 코드를 Commit/Push 만 해도 배포환경에서 즉시 테스트가 가능해진다.
📒 이번 프로젝트에서는 개발 초기 단계에 파이프라인을 구축해놨었는데 Frontend, Backend 담당 팀원들이 매우 편리하다고 칭찬했던 것이 기억에 남는다.
GitHub Actions에 대한 설명은 해당 블로그에 포스팅 해두었다.
<파이프라인 아키텍처>
- GitHub Actions : Workflow의 자동화를 위한 CI/CD 툴
- Docker Hub: 빌드한 이미지를 저장하는 이미지 Repository
- Git Hub : 개발 코드 및 배포 코드 Repository
- ArgoCD : GitHub Actions에 의해 변경된 이미지를 적용하여 다시 배포
GitHub Actions의 Workflows를 구성하기에 앞서 두가지 사전작업이 필요하다.
1 . GitHub Actions가 Docker Hub에 접근하기 위한 권한 생성
2 . GitHub Actions가 ArgoCD가 연동중인 Git Repo에 접근하기 위한 권한 생성
1 . Docker Hub의 Account Settings -> Security 클릭
2 . 새로운 Token을 생성 후 Token값을 복사한다.
3 . GitHub에 Settings -> Secrets and Variables -> Actions 클릭
4 . 원하는 변수명으로 새로운 Secret 생성 및 위에서 복사한 Token값 입력
📒 처음에는 Frontend Repository, Backend Repository, AI Repository 각각에 Settings에 들어가 Secret을 등록해주었다. 하지만 이번 프로젝트는 Git Hub Organization을 생성하여 작업하고 있기 때문에 굳이 Repository마다 등록해줄 필요없다. 따라서 Organization 단위로 등록해주었는데 훨씬 편리했다.
1 . 계정을 눌러 Settings -> Developer Settings -> Personal access tokens -> Tokens 클릭
2 . 새로운 Token을 생성하고 Token 값을 복사한다.
3 . 다시 Organization으로 돌아와 위와 마찬가지로 Settings에서 Secret 값을 등록해준다 .
1 . 파이프라인 구축을 원하는 Repository에 들어가 Actions 클릭
2 . 원하는 Action들을 작성해 Workflows 구성
❓ Workflows 작성중 어떻게 빌드된 이미지를 구분할까 의문이 들었다.
❓ 어떻게 한줄의 코드로 빌드된 이미지에 각각 다른 태그를 붙일까?
<Workflows 전체적인 코드>
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
name: Build Image & Push DockerHub & Deploy EKS
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
# Github에 저장된 코드를 CI 서버로 내려받아 뒷 step에서 사용할 수 있도록 하는 과정
- name: Checkout
uses: actions/checkout@v2
# Github Secret과 local env 에 저장된 값 불러오기
- name: Configure DockerHub Credentials
uses: docker/login-action@v1
with:
username: ${{secrets.DOCKERHUB_USERNAME}}
password: ${{secrets.DOCKERHUB_TOKEN}}
- name: Build, tag, and push the image to DockerHub
id: build-image
env:
DOCKERHUB_ID: ${{secrets.DOCKERHUB_USERNAME}}
DOCKERHUB_REPOSITORY: daily-pt-frontend
IMAGE_TAG: ${{ github.run_number }}
run: |
docker build -t $DOCKERHUB_ID/$DOCKERHUB_REPOSITORY:$IMAGE_TAG .
docker tag $DOCKERHUB_ID/$DOCKERHUB_REPOSITORY:$IMAGE_TAG $DOCKERHUB_ID/$DOCKERHUB_REPOSITORY:$IMAGE_TAG
echo "Pushing image to DockerHub..."
docker push $DOCKERHUB_ID/$DOCKERHUB_REPOSITORY:$IMAGE_TAG
# kustomize 명령을 가져온다.
- name: Setup Kustomize
uses: imranismail/setup-kustomize@v1
- name: Checkout kustomize repository
uses: actions/checkout@v2
with:
# kubernetes 설정정보 저장소
repository: DailyPt/daily-pt-infra # k8s yaml 파일이 있는 repo
ref: main # branch 이름
# 다른 저장소에 push 하려면 Personal Access Token이 필요.
token: ${{ secrets.ACTION_TOKEN }}
path: daily-pt-infra # 최상위 경로로 repository와 동일하게 설정
# 새 이미지 버전으로 파일 수정
- name: Update Kubernetes object to new image
env:
DOCKERHUB_ID: ${{secrets.DOCKERHUB_USERNAME}}
DOCKERHUB_REPOSITORY: daily-pt-frontend
IMAGE_TAG: ${{ github.run_number }}
run: |
cd daily-pt-infra
sed -i "s|image:.*|image: $DOCKERHUB_ID\/$DOCKERHUB_REPOSITORY:$IMAGE_TAG|g" daily-pt-frontend-deployment.yaml
cat daily-pt-frontend-deployment.yaml
# 수정된 파일 commit & push
- name: Commit and push files
env:
IMAGE_TAG: ${{ github.run_number }}
run: |
cd daily-pt-infra
git config --global user.email "xman0120@naver.com"
git config --global user.name "suhwan12"
git commit -am "Update image tag $IMAGE_TAG"
git push -u origin main
<Backend Repository에 새로운 코드가 Push된 상황>
1 . Backend Repository의 변화를 감지하고 새로운 Action이 생성된다
2 . 해당 Action의 빌드 순서는 96번이다
3 . Action을 클릭해보면 현재 어떤 과정을 진행중인지 알 수 있다
4 . 시간이 지나면 빌드가 완료된다
5 . Docker Hub Repository에 96번째 태그를 가진 빌드된 이미지가 Push된 것을 볼 수 있다
6 . ArgoCD와 Sync를 맞추고 있는 Repository에 들어가보면
Backend Deployment yaml파일에 새로운 Commit이 발생하였다
7 . yaml파일에 들어가보면 파드를 구성하는 컨테이너 스펙의 이미지 부분에 96번째 태그를 가진 새로운 이미지로 교체된 것을 볼 수 있다.
8 . ArgoCD에 접속해보면 새로운 버전의 파드가 Deployment에 의해 Rolling Update로 배포된 것을 확인.