코드 깎는 PM

MLOps Series #8 - Github Actions 기반 CI/CD 본문

ML Ops/ML Ops Basic

MLOps Series #8 - Github Actions 기반 CI/CD

PM스터 2023. 2. 12. 03:00
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
링크: "https://link.coupang.com/a/bqfD0v

 

MLOps 도입 가이드:기업에서 머신러닝 모델을 가장 효율적으로 운영하는 방법

COUPANG

www.coupang.com


1. CI / CD란? 

  • CI/CD는 Continuous Integration / Continuous Delivery(or Deployment)의 줄임말이다.
  • 번역하면 지속적인 코드 통합 / 지속적인 서비스 제공 / 지속적인 배포를 의미한다. 
  • 이는 고객에게는 애플리케이션을 고객에게 자동화하여 빠르게 제공하는 방법이며, 
  • 개발/운영팀에게는 개발시 발생하는 '통합 지옥(Integration hell)'을 해결하기 위한 방법이다.
  • 결론적으로, CI/CD는 파이프라인으로 표현되는 실제 프로세스를 의미하며, 어플리케이션 개발에 지속적인 자동화 및 지속적인 모니터링을 추가하는 것을 의미한다.

출처: https://www.redhat.com/ko/topics/devops/what-is-ci-cd

1) CI (Continuous Integration)

  • 'CI'는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미한다. 
  • CI를 통해 어플리케이션에 변경이 발생하면 정기적으로 Build, Test 과정을 거쳐 Repository에 병합된다. 
  • 때문에 여러명의 개발자가 동시에 애플리케이션 개발 작업을 하는 경우에 충돌을 피할 수 있다. 

2) CD (Continuous Delivery & Deployment)

  • 'CD'는 서비스 제공(Continuous Delivery) 및/또는 지속적인 배포(Continuous Deployment)를 의미하며 이 두 용어는 상호 교환하여 사용된다.

(1) CD #1 - Continuous Delivery (지속적 제공)

  • 'CD'(Continuous Delivery - 지속적 제공)를 통해 변경사항이 버그 테스트를 거쳐 Repository에 자동적으로 업로드된다.
  • 이때, Repository에서 애플리케이션을 실시간으로 Production 환경에 배포할 수 있다. 

(2) CD #2 - Continuous Deployment (지속적 배포)

  • 'CD'(Continuous Deployment - 지속적 배포)는 개발자의 변경사항을 Repository에서 고객이 사용 가능한 Production환경까지 자동으로 Release 하는 것을 의미한다. 
  •  이는 수동 프로세스로 인한 업무 과중을 해결하여 지속적으로 빠르게 서비스를 제공할 수 있게 한다.

2. Github Actions란? 

  • Github Actions란 개발자들의 workflows를 자동화하기 위한 플랫폼이다. 
  • 단순 CI/CD 툴을 넘어서 workflow 자체를 자동화하기 위한 툴이다. 

1) Git이란? 

  • Git은 형상 관리 도구 중 하나로, 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 단에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템이다. 
  • Git은 프로젝트 폴더 내에서 작업을 기록하고, 버전 관리를 통해서 체계적인 개발이 가능하게 한다. 

2) Github이란? 

  • Github는 분산 버전 관리 툴인 깃(Git)을 사용하는 프로젝트를 지원하는 웹호스팅 서비스이다.
  • Github를 사용하면, 버전 관리, 협업, 배포 등의 작업을 수행할 수 있다. 

(1) Github 구성 요소

  • Users - 해당 Repository를 사용한 이용자들의 수
  • Contributors - 해당 Repository를 구성하는 데 기여한 사람들 
  • Release - 해당 Repository의 배포 버전 관리 

(2) Github Flow

출처: https://build5nines.com/introduction-to-git-version-control-workflow/

  1. Master/Main Branch에서 작업을 시작한다. 
  2. Create Branch를 통해서 Master Branch에 영향이 안 가게끔 새로운 Branch에서 작업을 진행한다.
  3. 개발 변경 사항들을 Commit 하며,
  4. Pull Request를 통해 Branch에 적용해 간다.
  5. 이후 Contributor들 간의 feedback을 통해 코드에 대해 논의하고 Issue를 통해 개선한다. 
  6. Issue들을 해결한 후에는 Build 하여 Test를 통해 오류 여부를 확인한다.
  7. 이상이 없는 경우 Master Branch에 merge 한다. 
  8. 최종적으로 Master Branch에 병합된 코드들을 Deploy 한다. 

(3) Detailed Flow

출처: FastCampus ML Ops

  • Issue 생성 (버그 확인)
    • Task 중요도 판단 
    • Task 재발 가능 여부 판단 
  • Pull Request (코드 병합) 
    • 버그 해결 여부 확인 
    • Merge 여부 결정
    • 검증 후 Master Branch로 merge 
  • 테스트 - 빌드 - 배포
    • Release notes 준비 
    • Version number 업데이트 

(4) Github Events 

  • Github Repository안에서 발생하는 모든 작업들을 Github Events라고 한다.
    • PR 생성
    • Contribution 생성
    • Issue 생성
    • PR 병합
    • 기타 애플리케이션 등

(5) Github Actions 

출처: https://github.com/actions

  • Github Actions는 Github Events들이 발생하는 경우에 자동적으로 작업을 처리해 주는 기능을 수행한다. 
  • 즉, Event 발생을 감지하면 설정해 둔 workflow pipeline에 따라서 자동적으로 CI/CD를 포함한 workflow 작업을 수행해 주는 기능이다. 

출처: FastCampus ML Ops

  • 장점:
    • 1) 별도의 통합과정이 없이 같은 도구로 workflow과정을 관리할 수 있다. 
    • 2) 파이프라인 설치가 간편하다. 
    • 3) 개발자 중심의 도구로 개발되었다. 

3. Github Actions 실행

1) Build 

  1. Github Actions를 수행하기 위해서는 '당연히' Github의 Repository가 필요하다. 
  2. Repository를 생성한 후 Action에서 실행시킬 Application을 선택한다. 
  3. (임의명칭). yml파일을 생성한 후 build과정을 포함한 workflow file을 생성해 준다. 

(1) Github Actions 예시

name: Upload data

on:
  pull_request:

jobs:
  upload:
    runs-on: ubuntu-latest

    steps:
      - name: Save PR number
        env:
          PR_NUMBER: ${{ github.event.number }}
        run: |
          mkdir -p ./pr
          echo $PR_NUMBER > ./pr/pr_number
      - uses: actions/upload-artifact@v3
        with:
          name: pr_number
          path: pr/
  • 위의 코드는 Github Actions Docs에서 제공하는 예시 코드이다.
  • 하나 이상의 jobs를 설정할 수 있으며,
  • runs-on을 통해서 실행할 OS를 설정할 수 있다. 
  • steps를 통해서 실행할 작업들을 설정할 수 있다. 보다 구체적으로는 
    • 1) 명령어를 run 할 수 있으며,
    • 2) tasks를 설정할 수 있으며
    • 3) action을 run할 수 있다. 
  • uses는 action을 선택하는 과정이다.
    • uses에서 설정되는 actions들은 다음에 재사용되는 기능(action)들이다. 
  • run은 실행될 command를 작성하는 곳이다. 

(2) OS Strategy 설정

  • Github Actions는 OS별로 각기 다른 Build를 자동화할 수도 있다.
  • strategy기능을 활용하여 각 버전별로 build 할 Dependency를 할당하면, 작업을 병렬적으로 처리하며 각 OS별로 Build작업을 처리한다. 
    • 이때, 깃헙 액션에서 수행한 Build는 어디서 실행될까?
      • 모든 코드 실행은 깃헙에 의해서 관리되며 깃헙의 서버에서 수행됨
    • 또한, workflow의 각 job은 각각 새로운 가상환경을 만들어서 실행된다. 
name: Python application

on:
  push:
    branches: [ python-ci-workflow ]
  pull_request:
    branches: [ python-ci-workflow ]

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        python-version: ['3.6', '3.8']
        exclude:
          - os: macos-latest
            python-version: '3.8'
          - os: windows-latest
            python-version: '3.6'

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}
    - name: Display Python version
      run: python -c "import sys; print(sys.version)"

위의 코드에 따라 OS별로 병렬로 처리되고 있는 작업들

 


2) Push

  • Build 한 Job 중에 다른 Repository로 push를 하는 작업이 있는 경우, 이 또한 자동화할 수 있다. 
  • 아래는 Docker Image를 생성하여 Docker Hub에 push 하는 예시이다. 

(1) Dockerfile 작성

# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

(2) Dockerhub에서 Image 빌드

  • Dockerhub Repository 생성
  • Secrets 설정 
    • DOCKER_USERNAME 설정
    • DOCKER_PASSWORD 설정

(3) Dockerhub에 push하는 yaml 작성

  • name에서 작업을 인지할 수 있도록 작성
    • name: Build & push Docker image
  • Image repo와 함께 Image name을 명시
  • secrets를 포함한 추가 정보 작성
name: Python application

on:
  push:
    branches: [ python-ci-workflow ]
  pull_request:
    branches: [ python-ci-workflow ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: "3.8"
    - name: Display Python version
      run: python -c "import sys; print(sys.version)"
    - name: Build & push Docker image
      uses: mr-smithers-excellent/docker-build-push@v5
      with:
        image: 'Dockerhub repo'/'Docker Img name'
        tags: v3, latest
        registry: docker.io
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

4. 기타 명령어 모음

# git branch 설정
git checkout -b main

# cat은 결과물을 결합시키는 명령어이다. 
cat ~~ 

# echo는 linux환경에서 결과물을 console에 반환하게 한다. 
echo ~~

 

 

Reference:

https://www.redhat.com/ko/topics/devops/what-is-ci-cd

https://ko.wikipedia.org/wiki/%EA%B9%83_(% EC%86% 8C% ED%94%84% ED% 8A% B8% EC% 9B% A8% EC%96% B4) 

https://velog.io/@jini_eun/Github-Github%EB%9E%80-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC

https://ko.wikipedia.org/wiki/%EA%B9%83%ED%97%88%EB%B8%8C

https://build5nines.com/introduction-to-git-version-control-workflow/

https://github.com/actions

https://github.com/iterative/cml

https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows

https://docs.docker.com/language/python/build-images/

반응형
Comments