시드니랩

[CI/CD] Github Action 을 이용해서 이미지 자동 배포하기 본문

랩/CI CD

[CI/CD] Github Action 을 이용해서 이미지 자동 배포하기

시드니효상 2022. 8. 29. 23:14

 알면 정말 유용하고 편리한데, 생각보다 지인들이 많이 모르고 있는 기능이다. 바로 Github action을 이용해서 이미지를 자동 배포하는 기능이다. 이 포스트에서는 Google Cloud Platform 의 Artifact Registry 에 자동 배포하는법을 작성한다. 

 

 비즈니스 로직이 복잡하지 않은 서비스들은 개발자 입장에서는 서버리스로 배포하는 것이 편리하다. 아래 서비스는 간단한 REST API 서버인데, IaaS VM 인스턴스에 올리고, nginx, pm2 까지 설치하면서 로그 읽는 유지보수는 오래걸리고 굉장히 번거로운 과정이다. 그래서 나는 (요즘은) 도커를 사용해서 클라우드에 배포하고, 서버리스로 돌리는 형태를 좋아한다. 

 

 

아래 다이어그램을 보면 대략의 프로세스 플로우를 엿볼 수 있다. Github Action 을 이용해서 GCP Artifact Registry에 이미지 파일을 업로드 하고, CloudRun (GCP 서버리스 서비스) 으로 업로드된 이미지파일을 실행하면, 서버리스 서버가 완성된다!

 

cloudrun에 배포하는 심플한 과정

 

그럼 이제 한 단계씩 알아보도록 하자

 

 

 Github action이란, Github에서 제공하는 CI/CD 플랫폼이다. 이를 사용해서 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있으며, repository에 대한 모든 pull request를 빌드 및 테스트하는 workflow를 생성하거나 병합된 pull request를 프로덕션에 배포할 수 있다. 예를들어 테스트코드 실행, 자동배포, 코드 커스텀 포맷 확인등이 있다. 

 

보통 Repository 내의 /.github/workflows 에 yaml 파일을 작성함으로써 구현할 수 있다. 예를들어 아래 repository 에는 이미지 빌드를 하는 workflow 그리고 CI (테스팅..) 이 두개의 workflow 가 존재한다. 

 

Workflow 예시

 

위 두개의 yaml파일로 아래 두개의 Github action을 만들 수 있다. 

 

Workflow 예시

 

- Workflows

workflow는 하나 이상의 job으로 구성되고 event에 의해 트리거될 수 있는 자동화된 프로세스이다. 가장 최상위 개념으로 yaml 형태로 작성되고 Github Repository의 .github/workflows 폴더 아래에 저장된다. Repository에는 여러 workflow를 가질 수 있으며 각 workflow는 서로 다른 작업을 수행할 수 있다.

 

- events

event는 workflow 실행을 트리거하는 주체이다. 예를 들어, 누군가가 pull request를 생성하거나 issue를 열거나 특정 브랜치로 push하거는 등의 여러가지 외부 이벤트를 통해 실행될 수 있다.

 

- jobs

jobs은 여러 step으로 구성되고 가상 환경의 인스턴스에서 실행된다. 다른 job간의 dependency 를 가질 수도 있고 independent 하게 병렬실행도 가능하다.

 

그럼 실제 yaml파일을 구경해보자.

build-image.yaml 을 보면 아래와 같다.

 

- name : workflow 이름

- on.workflow_dispatch : workflow에서 사용할 수 있는 변수를 UI를 통해서 줄수 있다. 

on.workflow_dispatch 예시

예를들어 위는 prod라는 값의 변수를 workflow에 전달한다. 주로 옵션 사용시에 많이 쓰인다. 

 

- env: 아래 workflow jobs에서 사용할 환경변수 설정

 

jobs 예시

 

위에 workflow 는 하나의 job 으로 구성되어 있으며, 세부 사항은 아래와 같다. 

- name : job 이름 설정

- runs-on : 빌드하는 github 가상머신 OS 설정. ex. ubuntu-latest 

- timeout-minutes: 타임아웃 시간 설정 

- steps : 단계들을 정의하며 실제 Actions에서 아래와 같이 구현이 된다. 

uses : actions/checkout@v3 처럼 predefined되어있는 github action들을 사용할수도 있고, name 으로 커스텀 step을 만들 수도 있다. 

 

actions/checkout : 코드 내려받기 https://github.com/actions/checkout

actions/cache : 캐시 설정 https://www.npmjs.com/package/@actions/cache

 

predefined 되어있는 github action들을 사용하려면 위의 actions/cache에서 보듯이 key와 같은 사전에 정의된 parameter 들을 사용해야한다. 

 

jobs.steps

 

 

 

아래 step은 미리 정의된 action이 아닌 실제 이미지를 빌드하고 배포하는 step 이다. 

 

github actions가 실행되는 VM에서는 위에 run 에 정의된 shell command들이 실행이된다. 

 

docker buildx build 의 -t 타겟 옵션을 보면 GCP Artifact Registry의 URL 이 저장되어 있는것을 볼 수 있다. 

 

eval 은 BUILD_CACHE_ARGS 변수 값 reinterpret 때문에 사용되었다. 

 

이후 실행시 아래와 같이 빌드한 이미지가 GCP Artifcat Registry에 저장이 된다.

 

artifact registry

 

자세한 Workflow 문법은 여기를 참고하도록 하자. https://docs.github.com/en/actions/using-workflows/about-workflows 

 

About workflows - GitHub Docs

About workflows A workflow is a configurable automated process that will run one or more jobs. Workflows are defined by a YAML file checked in to your repository and will run when triggered by an event in your repository, or they can be triggered manually,

docs.github.com

 

 

참고 https://docs.github.com/en/actions/publishing-packages/publishing-docker-images

 

Publishing Docker images - GitHub Docs

Introduction This guide shows you how to create a workflow that performs a Docker build, and then publishes Docker images to Docker Hub or GitHub Packages. With a single workflow, you can publish images to a single registry or to multiple registries. Prere

docs.github.com

 

참고 https://velog.io/@koo8624/Docker-Buildx%EB%A1%9C-cross-platform-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%8C%EB%93%9C%ED%95%98%EA%B8%B0

Comments