Docker 빌드 Pipeline 구축

SangYeon Min·2024년 1월 3일
0

PROJECT-HEARUS-GOORM-KDT

목록 보기
7/10
post-thumbnail

이전까지는 별도로 서비스가 수정될때마다 EKS에 배포하기 위해 별도로 Docker image를 빌드해야 했기 때문에 많은 번거로움이 존재했다.

하지만 현 단계에서 위와 같이 Intra 개발자와 Application 개발자가 원활하게 협업할 수 있도록 Github Action을 통해 각 Application의 변경사항이 push 되었을 때 EKS에서 Docker Image를 불러올 수 있도록 파이프라인을 구축한다.

Github Action

Workflow 작성

mkdir -p .github/workflows

Github Action은 .github/workflows에 작성된 yaml 파일을 자동으로 인식해 실행시킨다.
따라서 위와 같이 프로젝트 최상위 디렉토리에서 mkdir 명령어를 통해 디렉터리를 생성한다.

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.ORG_JUDEMIN_DOCKERHUB_USERNAME }}
          password: ${{ secrets.ORG_JUDEMIN_DOCKERHUB_PASSWORD }}

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: judemin/hearus-front-vue:lastest

on 해당 Action이 수행될 조건을 의미한다. main branch에 push되었을 때 Action이 실행된다.
따라서 요청된 PR을 merge하거나 직접 push했을 때 trigger된다.
job 파이프라인을 구성하는 부분으로 step들로 각 파이프라인 동작을 정의한다.
Login to Dockerhub에서 Github Action의 secret을 사용할 것이기 때문에 이를 생성해주어야 한다.
원활한 프로젝트 관리를 위해 Organization의 secret을 생성한다.
환경변수를 정의하는 것과 유사하게 위와 같이 secret을 생성한다.
리포지토리에 PUSH하면 위와 같이 정상적으로 동작하는 것을 볼 수 있다.
또한 위와 같이 정상적으로 Dockerfile이 빌드되는 것을 로그로 확인할 수 있다.

캐싱 데이터 활용

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: judemin/hearus-front-vue:lastest
          # Github Action Cache
          cache-from: type=gha
          cache-to: type=gha,mode=max

Flask 서버의 경우 Built-in 라이브러리와 애초에 크기가 큰 가상환경에 진행되기 때문에 캐싱이 필수적으로 필요하다. 이미 buildx를 사용하고 있으므로 캐시 관련 컴포넌트를 추가해준다.
이후 Github Action 로그를 통해 빌드 과정이 CACHED되는 것을 확인할 수 있다.
또한 위 이미지와 같이 Vue에서도 빌드 시간이 단축되는 것을 확인할 수 있다.

Express와 Flask 서버 모두 동일하게 Github Action Workflow를 추가하면 파이프라인 구축이 완료된다.

Express Server

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.ORG_JUDEMIN_DOCKERHUB_USERNAME }}
          password: ${{ secrets.ORG_JUDEMIN_DOCKERHUB_PASSWORD }}

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: judemin/hearus-back-node:lastest
          # Github Action Cache
          cache-from: type=gha
          cache-to: type=gha,mode=max

Flask Server

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.ORG_JUDEMIN_DOCKERHUB_USERNAME }}
          password: ${{ secrets.ORG_JUDEMIN_DOCKERHUB_PASSWORD }}

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: judemin/hearus-flask-serving:lastest
          # Github Action Cache
          cache-from: type=gha
          cache-to: type=gha,mode=max

0개의 댓글