[Project 1] github와 github Action을 통해 자동으로 CI/CD 파이프라인 구축해보기
1. 프로젝트의 목적
- github의 repository를 공유하고, 개발과 운영환경을 분리해 각각의 자동화 CI/CD 파이프라인을 구성합니다.
- 개발자는 개발한 소스코드를 github에 push하면서 지속적으로 코드 업데이트를 진행합니다.
- 자동화된 파이프라인을 통해 코드 업데이트시 자동으로 빌드가 진행됩니다.
- 새로 빌드된 이미지 정보를 통해서 운영자는 원하는 시점에 버튼 하나로 업그레이드를 진행할 수 있으며, 배포할 yaml을 github 상에서 코드로 관리하므로써 IaC(Infrastructure as a Code)의 이점을 누릴 수 있습니다.
2. 기술스텍
GIT, Github, Github Action / Docker, Kubernetes, ArgoCD
3. 프로젝트 설명
SETP 1 : 개발자는 로컬에서 개발된 소스코드를 지정된 repository에 배포합니다.
STEP 2 : 배포된 코드는 자동으로 github action에 의해서 trigger되어 빌드 및 테스트를 실행 후 이상 없으면 docker hub registry로 이미지를 배포합니다.
STEP 3 : 만들어진 docker hub 이미지를 통해서 ArgoCD를 활용해 새로운 버전의 이미지를 업데이트 합니다.
4. 세부 설명
4.1 Github Private Registry 구축 + Github Action 작성
- github에 private registry를 구축하고, github Action에 아래의 코드를 입력한다.
- 구축된 registry[공개를 위한 public 사용] (링크)
저장 디렉토리 : .github/workflows/deploy-image.yml
name: Build and Push Docker Image
on:
push:
branches:
- main
jobs:
build-and-push-image:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
push: true
tags: kingdom0220/nodejs:latest
- name : 해당 작업의 이름
- on : 작업할 branch 에 대한 내용
- jobs : 작업에 대한 세부 정보
Checkout Branch -> Docker Build -> DockerHub 접속 -> Registry Push
* 민감정보의 경우는 github setting에 값을 두고, 변수로 지정하였습니다.
4.2 Dockerfile을 비롯한 docker build를 위한 모든 코드 작성
dockerfile 저장 디렉토리 : dockerfile을 저장할 기본 디렉토리
server.js 파일 저장 디렉토리 : dockerfile을 저장할 기본 디렉토리
server.js는 기본적인 express 모듈을 활용한 웹서버입니다.
4.3 Github Action 테스트
- 코드에 대한 commit이 진행되면 자동으로 github action에서 테스트를 진행합니다.
성공적으로 빌드가 완료되면 아래처럼 초록색의 체크표시와 함께 모든 과정에 시간과 결과를 표시합니다.
이상 없이 docker hub에 이미지가 등록되었습니다.
4.4 ArgoCD 전용 github Repository 구축
- 개발과 운영환경 분리를 위해서 ArgoCD 전용 Repository를 구축합니다.
배포를 위한 yaml을 저장할 workspace 디렉토리를 구축하고 ArgoCD와 연결을 시켜둡니다.
- 구축된 registry
- 작업 디렉토리 : templates
- 배포를 위한 최소요소인 deployment와 service 템플릿을 구성하였습니다.
4.5 ArgoCD 구축
- ArgoCD 전용 서버를 통해서 kubernetes 상에 배포합니다.
(기본적으로 ArgoCD가 사용하는 기본 리소스 사용량이 높기 때문에 별도의 서버를 둘 수 있다면 분리하는게 좋습니다, 다만 실습을 위해서 구성된 kubernetes 클러스터 상에 배포를 진행합니다)
4.6 ArgoCD를 통한 자동 배포
- ArgoCD에서 작업을 create하여 1차 sync를 맞춰봅니다.
4.7 nodeport를 통한 오픈 확인
정상적으로 화면에 표시됨을 확인했습니다.