관리 메뉴

CS

Github Actions: CI/CD, 작업 자동화 본문

기타

Github Actions: CI/CD, 작업 자동화

vcxz 2023. 6. 1. 16:40

 

Github에는 Actions라는 기능이 있습니다.

CI/CD를 위한 서비스라고 할 수 있는데, CI/CD (지속적 통합과 지속적 배포)는 쉽게 말해 여러 명이 함께 코드를 작성하고 테스트하고 배포하는 일련의 과정을 최적화 및 자동화하여 빠르게 진행할 수 있도록 하는 것을 말합니다.

Github는 애초에 리포지토리 기능을 통해 여러 명이 함께 코드를 작성할 수 있으니 이를 자동으로 실행할 수 있으면 적절한 CI/CD를 할 수 있겠죠. 그를 위한 게 Actions입니다.

 

Actions는 Github 리포지토리에 의해 트리거되는 만큼 리포지토리가 있어야 됩니다. 그 외에 필요한 것이나 비용은 없는 것 같습니다.

 

 

사용 방법

기본

Github 페이지의 리포지토리 화면에서 Actions 탭을 클릭하면 Actions 페이지로 들어갑니다.

해당 리포지토리에서 Actions을 한번도 사용하지 않았으면 바로 새로운 워크플로를 생성하는 페이지로 들어갑니다.

워크플로는 yml 파일로 설정합니다. 스스로 처음부터 만들 수도 있지만, 기본적인 부분이 쓰여 있는 템플릿을 선택하는 게 편한 것 같습니다. Actions를 처음 쓰는 사람을 위한 'Simple workflow'라는 템플릿이 있습니다. 이를 통해 워크플로의 기본적인 구문을 알아보겠습니다. 'Configure' 버튼을 클릭하면 워크플로 파일을 수정하는 창으로 넘어갑니다.

워크플로 파일은 {리포지토리}/.github/workflows 경로에 저장됩니다. 워크플로 파일은 여기에 저장해야 되는 것 같습니다.

워크플로 구문 문서입니다.

 

 

Simple workflow의 워크플로 파일(yml)을 위에서부터 하나하나 보도록 하겠습니다.

name: CI

가장 위에는 워크플로의 이름이 있습니다.

 

# 언제 워크플로를 실행할 것인가
on:
  # "main" 브렌치에 push가 있을 때
  push:
    branches: [ "main" ]
  # "main" 브렌치에 pull이 요청될 때
  pull_request:
    branches: [ "main" ]

  # 이걸 기재하면 Actions에서 수동으로 워크플로를 실행할 수 있다
  workflow_dispatch:

on은 언제 워크플로를 실행할 것인지를 정할 때 씁니다.

보통 리포지토리의 상태를 변경하는 push나 pull 등에 트리거시키거나, 특정 시간에 실행되도록 하는 것 같습니다.

특정 시간에 실행되도록 하려면 schedule을 써야 합니다. 이 파일에는 없으니 따로 적어보면

on:
  schedule:
  # cron 형식을 사용해야 함
  - cron: "0 * * * *"

매일 0시에 실행한다는 내용입니다. Github Actions는 UTC를 기반합니다. 그러면 대한민국 시간으로 9시겠죠.

 

# 작업에 대한 설정
jobs:
  # 작업 이름 "build"
  build:
    # 작업을 실행할 환경. 우분투 최신 버전
    runs-on: ubuntu-latest

    # 작업의 내용. 위에서부터 실행됨
    steps:
      - uses: actions/checkout@v3

      - name: Run a one-line script
        run: echo Hello, world!

      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.

jobs는 작업 내용을 설정할 때 씁니다.

작업 환경을 설정하고, steps에서 실제로 어떤 작업을 수행할지 기재합니다. 보통 리눅스를 기반으로 하기 때문에 리눅스 명령어를 써야 합니다.

 

uses는 Actions의 주요한 기능으로, 미리 만들어진 명령어 뭉치('action'이라고 함)를 사용하는 것입니다. 남이 만든 것도 사용할 수 있습니다.

본 파일에 있는 'actions/checkout@v3'는 거의 모든 워크플로에서 포함하는 액션으로, checkout을 수행합니다. 액션의 이름 형식은 '{리포지토리}@v{버전}'입니다. checkout은 Git 용어인데, 간단히 말하면 워크플로를 실행할 환경을 조성하기 위해 리포지토리에서 파일을 내려받는 것이라 할 수 있습니다. 자세한 정보는 Github Actions Checkout 페이지를 확인하세요.

다른 사람이 공유하는 액션은 Github Marketplace에서 찾을 수 있습니다.

 

 

워크플로 파일을 생성한 후 Actions 탭에 가서 해당 워크플로 이름을 클릭하였을 때, on에서 workflow_dispatch를 기재하였다면 'Run workflow'라는 버튼으로 워크플로를 수동 실행할 수 있습니다.

작업이 완료된 후 실행 기록을 보면, 실행 내용 및 출력물 등을 확인할 수 있습니다. 위에서 본 워크플로라면 'Hello, world!'와 'Add other actions to build, test, and deploy your project.'를 볼 수 있겠네요.

 

 

파이썬 사용 워크플로

워크플로에서 파이썬 파일을 실행하는 경우입니다. 템플릿 'Python package'나 'Python application'을 사용할 수 있습니다. 둘의 내용은 거의 같습니다. 다음은 해당 템플릿과 위의 Simple workflow의 차이점을 보겠습니다.

jobs:
  build:
	
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.8", "3.9", "3.10"]

strategy는 작업에 matrix를 사용할 때 이를 설정합니다. maxtrix를 쓰면 워크플로를 여러 환경에서 실행할 수 있습니다. 여기서는 파이썬 버전을 '3.8', '3.9', '3.10' 총 세 개 쓰겠다고 하므로, 워크플로를 한 번 실행하면 버전당 한 번씩 총 세 번 실행되게 됩니다. 파이썬 버전뿐만 아니라 OS 같은 다른 환경도 정할 수 있고, 모든 환경 조합으로 실행됩니다(파이썬 버전이 3개고 OS가 2개면 총 6번 실행됨).

fail-fast는 matrix별 실행에서 하나라도 실패할 경우 다른 matrix에서 실행하지 않고 작업을 실패한 것으로 처리하겠다는 설정입니다. 말 그대로 빠른 실패를 정하는 것입니다. 기본 값은 true입니다.

 

jobs:
  build:

    steps:
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}

'actions/setup-python@v3' 액션을 사용하는데, python을 사용하기 때문에 python을 설치해야 하기 때문입니다. steps에서 사용하는 withuses에 인자를 제공할 때 사용합니다. 'actions/setup-python@v3'에는 "python-version"이라는 인자가 필요하기 때문에 이를 제공합니다.

"${{ matrix.python-version }}"은 환경 변수를 사용한다는 의미입니다. "${{ context.변수명 }}" 형식으로 사용합니다. 여기서는 위에서 본 matrix의 파이썬 버전을 불러옵니다. 이런 걸 context 정보라고 하는데, 그 설명은 Github 문서 컨텍스트에서 확인하세요.

 

 

변수 및 secrets 사용

우선 변수는 Github 리포지토리에서 Settings 탭에 들어가 Security 탭의 'Secrets and variables'의 Actions에서 저장할 수 있습니다.

 

jobs:
  build:
    steps:
    
    - name: Connect to DB
      env:
        USERNAME: ${{ secrets.USERNAME }}
        PASSWORD: ${{ secrets.PASSWORD }}
        VAR: ${{ vars.VARIABLE }}
      run: |
        python3 ./connection.py "$USERNAME" "$PASSWORD" "$VAR"

워크플로에서 변수를 사용하려면 우선 env로 선언해야 합니다. env는 위처럼 특정 job 내에서만 사용할 수도 있고 가장 바깥 레벨로 선언하여 워크플로 전체에서 사용할 수도 있습니다.

변수나 secrets는 위의 matrix와 마찬가지로 context 정보 형식으로 사용하면 됩니다. 변수는 'vars', secrets는 'secrets'를 붙여 사용할 수 있습니다.