Cloudapp 애플리케이션 CI/CD 파이프라인 구축

KIM HYUNMIN·2024년 10월 10일

쿠버네티스

목록 보기
13/16

1. 목표 설정

  • 이번 블로그에서는 애플리케이션의 개발부터 배포까지의 과정을 자동화하는 CI/CD 파이프라인을 구축해보겠습니다.
  • GitHub에 코드 변경 사항을 푸시하면, Docker Hub에 최신 이미지가 자동으로 빌드되고 푸시됩니다. 이후, Kubernetes 클러스터에서는 deployment.yml 파일을 통해 최신 이미지를 사용하여 애플리케이션이 자동으로 재배포되도록 설정할 것입니다.
  • 쉽게 말해, 애플리케이션 코드를 수정하고 GitHub에 푸시하는 것만으로도 Kubernetes 환경에 최신 이미지로 자동 배포가 이루어지게 하는 것이 목표입니다.

2. 자동화 구성 개요

  • 코드 저장소: GitHub
    코드 변경 사항이 반영되면, 자동으로 CI/CD 파이프라인이 트리거됩니다.
  • 이미지 빌드 및 푸시: Docker Hub
    GitHub Actions를 사용하여 Docker 이미지를 빌드하고 Docker Hub에 푸시합니다.
  • 자동 배포: Kubernetes
    Argo CD를 활용하여 Kubernetes 클러스터에서 deployment.yml 파일의 이미지를 최신 버전으로 업데이트하고 자동으로 배포합니다.

3. 세부 구현

우선 도커 허브 계정이 필요하므로
깃허브 접속 -> 코드 저장소 이동후 settings -> Secrets and variables -> Actions -> New repository secret -> DOCKER_PASSWORD,DOCKER_USERNAME 하고 각자 유저이름과 비밀번호 작성후 생성

.github/workflow/deploy.yml 생성 후 작성

name: Build and Push Docker Image

on:
  push:
    branches:
      - main  # main 브랜치에 푸시될 때 트리거

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Check out the repository
      uses: actions/checkout@v2

    - name: Set working directory  # 작업 디렉토리를 명시적으로 설정
      run: cd ${{ github.workspace }}

    - name: Verify nginx.docker.conf exists
      run: ls -l ${{ github.workspace }}/nginx.docker.conf


    - name: Log in to Docker Hub
      run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

    - name: Build the Docker image
      run: docker build --no-cache -f ./Dockerfile . -t khm0930/cloud_storage_web:${{ github.sha }}

    - name: Push the Docker image to Docker Hub
      run: docker push khm0930/cloud_storage_web:${{ github.sha }}

    - name: Set latest tag on Docker Hub
      run: docker tag khm0930/cloud_storage_web:${{ github.sha }} khm0930/cloud_storage_web:latest

    - name: Push latest tag to Docker Hub
      run: docker push khm0930/cloud_storage_web:latest


    - name: Check out Kubernetes deployment repo
      uses: actions/checkout@v2
      with:
        repository: khm0930/cloud_storge-Kubernetes-deployment
        token: ${{ secrets.K8S_DEPLOY_REPO_TOKEN }}
        path: kubernetes-deployment

    - name: Update Deployment YAML with new image
      run: |
        sed -i 's|khm0930/cloud_storage_web:.*|khm0930/cloud_storage_web:${{ github.sha }}|g' kubernetes-deployment/cloudstorge-deployment.yml
    - name: Commit and Push changes to deployment repo
      run: |
        cd kubernetes-deployment
        git config --global user.name "github-actions"
        git config --global user.email "actions@github.com"
        git add cloudstorge-deployment.yml
        git commit -m "Update deployment image to ${{ github.sha }}"
        git push https://x-access-token:${{ secrets.K8S_DEPLOY_REPO_TOKEN }}@github.com/khm0930/cloud_storge-Kubernetes-deployment.git

단계별 설명

1) 워크플로우 트리거 설정

on:
  push:
    branches:
      - main

main 브랜치에 코드가 푸시될 때마다 이 워크플로우가 자동으로 실행됩니다. 이를 통해 코드 변경이 있을 때마다 최신 상태의 애플리케이션이 빌드 및 배포되도록 설정합니다.

2) 작업(job) 설정

jobs:
  build:
    runs-on: ubuntu-latest

이 워크플로우는 build라는 작업(job)으로 구성되어 있으며, ubuntu-latest 환경에서 실행됩니다.

3)작업 단계별 설명
3-1) 리포지토리 체크아웃

 - name: Checkout the repository
  uses: actions/checkout@v2

현재 리포지토리의 코드를 가져옵니다.
3-2) 작업 디렉토리 설정 및 nginx 설정 파일 검증

- name: Set working directory
  run: cd ${{ github.workspace }}
- name: Verify nginx.docker.conf exists
  run: ls -l ${{ github.workspace }}/nginx.docker.conf

3-3) Docker Hub 로그인

- name: Log in to Docker Hub
  run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

GitHub Secrets에 저장된 Docker Hub 자격 증명을 사용하여 로그인합니다.
3-4) Docker 이미지 빌드 및 푸시

- name: Build the Docker image
  run: docker build --no-cache -f ./Dockerfile -t khm0930/cloud_storage_web:${{ github.sha }} .

- name: Push the Docker image to Docker Hub
  run: docker push khm0930/cloud_storage_web:${{ github.sha }}

- name: Set latest tag on Docker Hub
  run: docker tag khm0930/cloud_storage_web:${{ github.sha }} khm0930/cloud_storage_web:latest

- name: Push latest tag to Docker Hub
  run: docker push khm0930/cloud_storage_web:latest
  • Dockerfile을 사용하여 애플리케이션 이미지를 빌드합니다. 이미지 태그로 github.sha를 사용하여 고유한 이미지 버전을 만듭니다.
  • 빌드된 이미지를 Docker Hub에 푸시하고, latest 태그도 설정하여 최신 이미지를 쉽게 참조할 수 있도록 합니다.
    3-5) Kubernetes 배포 리포지토리 업데이트
- name: Checkout Kubernetes deployment repo
  uses: actions/checkout@v2
  with:
    repository: khm0930/cloud_storge-Kubernetes-deployment
    token: ${{ secrets.K8S_DEPLOY_REPO_TOKEN }}
    path: kubernetes-deployment

deployment.yml 파일에서 Docker 이미지 태그를 새로 빌드된 이미지의 태그로 업데이트합니다.
3-6) 업데이트된 파일을 GitHub에 푸시

- name: Commit and Push changes to deployment repo
  run: |
    cd kubernetes-deployment
    git config --global user.name "github-actions"
    git config --global user.email "actions@github.com"
    git commit -am "Update deployment image to ${{ github.sha }}"
    git push https://x-access-token:${{ secrets.K8S_DEPLOY_REPO_TOKEN }}@github.com/khm0930/cloud_storge-Kubernetes-deployment.git

업데이트된 deployment.yml 파일을 배포 리포지토리에 커밋하고 푸시하여, Argo CD와 같은 GitOps 도구가 이를 자동으로 Kubernetes 클러스터에 반영할 수 있도록 합니다.

4) 워크플로우의 작동 방식 요약

  • 코드 변경 사항이 GitHub에 푸시되면 GitHub Actions가 자동으로 Docker 이미지를 빌드하고, Docker Hub에 최신 버전의 이미지를 푸시합니다.
  • Kubernetes 배포 리포지토리에 있는 deployment.yml 파일의 이미지 태그를 새로 푸시된 이미지로 업데이트합니다.
  • Argo CD로 Kubernetes 클러스터에 배포된 애플리케이션을 자동으로 최신 이미지로 업데이트합니다.

GitHub Action

DockerHub

Argo CD UI

이렇게 푸시 한번으로 자동으로 최신 이미지로 업데이트하여 배포되는 자동화 CI/CD를 구축하였습니다.

profile
Linux,Window,Network,docker,kubernets

0개의 댓글