CI/CD와 Github Action

용가리·2024년 12월 18일

반가부스비니다
Github Action에 대해 알아보겠습니다.
Github Action은 Github상에서 push, pull 등의 동작을 수행하면 자동으로 추가적인 동작을 수행하도록 하는 Github의 기능입니다.
많은 회사에서 CI/CD (Continuous Integration, Continuous Deployment)를 위해 Github Action을 사용합니다.

차근차근 알아가봅시다!!

CI/CD ?

큰 개념으로 살펴보면,
CI : 빌드, 테스트 자동화
CD : 배포 자동화
를 의미합니다.

CI

Continuous Integration의 약자로, 지속적인 통합을 의미합니다.
수정한 코드의 변경 사항에 대해 Build, Test를 진행한 후, OK를 받았다면 기존 코드를 변경하여 통합합니다.

CD

Continuous Deployment의 약자로, 지속적인 배포를 의미합니다.
작성한 코드가 신뢰 가능한 상태가 되면, 자동으로 배포될 수 있도록 하는 과정을 의미합니다.
CI 이후 CD를 진행합니다.
Dev / Staging / Main 브랜치에 Merge될 경우, 코드가 자동으로 서버에 배포됩니다.

모델을 배포할 때의 주의점

  1. Docker 이미지 관리
    Docker 이미지는 사이즈가 보통 큰 편입니다.
    그래서 주기적인 호스트 머신의 디스크 용량 관리가 필요합니다..
    주로 로그를 삭제하거나 클라우드로 보내는 등의 방법으로 해결합니다.

  2. 모델 버저닝
    모델 코드에 대한 확실한 버저닝이 중요합니다.
    어떤 버전의 모델이 현재 배포중이며, 과거에는 언제부터 언제까지 어떤 버전으로 배포되었는지, 롤백이 필요하다면 어떤 버전으로 재배포해야하는지 등을 확실히 알 수 있도록 해야합니다.

  3. 모델 아티팩트
    모델 아티팩트라 하면,, 간단히 설명하면 모델의 파라미터를 의미합니다.
    모델의 파라미터는 용량이 아주 크기에 이미지에 저장한다면 이미지의 크기가 아주 커질 수 있습니다.
    따라서 S3(AWS Cloud Storage Service)와 같은 클라우드 Storage에 저장하는 것이 권장됩니다.
    모델의 아티팩트 버전과 모델 버전이 다른 경우도 있으니 메타 정보 또한 확인이 필요하겠습니다.

Github Action

Github에서 출시한 기능으로, 소프트웨어 Workflow 자동화를 도와주는 도구입니다.

깃허브 액션에는 다양한 기능이 있는데, 주요 기능으로는

Test Code

특정 함수의 Return 값이 어떻게 나오는지 확인하는 Test Code를 수행합니다.
Return 값의 변수 타입이 int인지 등을 확인하거나, Unit Test, End to End Test 등을 수행할 수 있습니다.

배포

Prod, Staging, Dev 서버에 코드를 배포합니다.
FTP로 파일을 전송할 수 있고, Docker Image를 Push할 수도 있습니다.
Python뿐만이 아닌 다양한 언어를 통한 배포도 지원합니다.

Python, Shell 스크립트 실행

Github Repo에 저장된 스크립트를 일정 주기를 가지고 실행합니다.
Crontab의 대용으로도 사용될 수 있습니다.

Python이나 Shell 스크립트를 통해 데이터 수집을 주기적으로 수행하도록 할 수도 있습니다.

Github Tag, Release 자동 설정

Main 브랜치에 Merge될 경우에 특정 작업을 실행할 수 있습니다.
기존 버전에서 버전을 Up하거나 새로운 브랜치가 생성됐을 때 특정 작업을 실행하도록 할 수도 있습니다.

이외에도 다양한 Workflow를 만들 수 있습니다.
Shell 명령어에 대해 능숙할수록 다양한 기능구현이 가능할 듯 싶습니다.
굳이 능숙하지 않더라도
https://github.com/marketplace?type=actions
위 사이트에서 다른분들이 제작해 놓으신 github action들을 가져와 사용할 수도 있습니다.

다만 github action은 무료가 아닙니다.

결국 다른 서버를 띄워서 실행하기에 컴퓨팅 비용이 발생하는 것이지요.
하나의 Github Repo당 Workflow는 최대 20개까지 등록할 수 있습니다.
Workflow에 존재하는 Job은 최대 6시간동안만 실행할 수 있으며, 초과시 자동으로 중지됩니다.
또, 동시에 실행할 수 있는 Job 제한이 존재합니다.

이게 다 무료 컴퓨터만 있다면 채굴을 하는녀석들을 막기 위함이겠죠 ..? (아니면죄송합니다)

Github Action의 사용법

Github Action은 크게
Workflow
Event
Job
Step
Action
Runner

로 구성됩니다.
하나하나 살펴보겠습니다.

name: GitHub Actions Demo
on: [push]
jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v2
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."

위 코드가 .github/workflow에 존재하는 github action의 예시입니다.
(변성윤 마스터님의 코드를 가져왔습니다.)

하나하나 살펴봅시다.

Workflow

여러 Job으로 구성되고 특정 Event가 Trigger가 되는 자동화된 Process를 의미합니다.
Workflow 파일은 YAML로 작성되고, Github Repo에 .github/workflows 폴더에 저장됩니다.

Event

Workflow를 Trigger하는 특정 활동, 규칙을 의미합니다.

Event는 여러가지가 있을 수 있습니다.
특정 브랜치로 Push를 하는 경우라던가
특정 브랜치로 Pull Request하는 경우라던가
특정 시간대에 반복한다던가
다양합니다.

on: [push]

on: [push]라면, push가 Trigger가 되겠습니다.

Jobs

Runner에서 실행되는 Steps의 조합을 의미합니다.
Job이 여러개라면 병렬로 실행되지만, 순차적으로 실행할 수도 있습니다.
(의존 관계를 맺을 수 있다는 의미)

jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest

jobs들 중에서 job 하나의 이름을 Explore-GitHub-Actions로 지정하고,
ubuntu-latest 환경에서 실행하겠다는 의미입니다.

Steps

Steps는 Job에서 실행되는 개별 작업을 의미합니다.
Action을 실행하거나 쉘 커맨드를 실행하는 등의 동작입니다.
하나의 Job에서는 데이터를 공유할 수 있습니다.

run 뒤에 나오는 명령어들은 Shell 커맨드를 수행합니다.

Actions

Workflow의 제일 작은 단위를 의미합니다.
Job을 생성하기 위해 여러 Step을 묶은 개념입니다.
직접 만들 수도 있고, Marketplace의 Action을 사용할 수도 있습니다.

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

actions/checkout@v2는 리포지토리 코드를 클론하는 GitHub 제공 액션입니다.
runner 에서 코드를 테스트하거나 빌드할 수 있도록 준비합니다.

Runner

Workflow가 실행될 서버를 의미합니다.
Github-hosted Runner는 Github의 서버를 통해 Github Action을 수행합니다.
(성능 vCPU2, Memory 7GB, Storage 14GB)
Self-hosted Runner는 직접 서버를 호스팅해서 사용합니다.

'
'
'
이로서 CI/CD와 Github Action에 대한 설명을 마칩니다.
클라우드에 도커 이미지 레지스트리(저장소) 세팅을 마친 뒤 Github Action의 Trigger을 push로 두고 Docker Image Build, Push 과정을 Github Action workflow로 작성하면 CI/CD를 구현할 수 있습니다.

배포 과정도 자세히 보여드리고 싶은데 .. 제가 너무 서투릅니다.
잘 모르는데 글을 작성하다 보면 열시간 넘게 걸리겠네요.
제가 배포를 자유자재로 할 수 있을 때 잘알인 상태로 보여드리겠습니다.

많은 정보를 담지 못함에 아쉬움이 남네요.
감사합니다.. ㅠㅠ!!

0개의 댓글