GitHub Actions를 사용하여 CI용 워크플로를 만드는 방법

완료됨

여기에서는 GitHub Actions 및 CI용 워크플로에 대해 알아봅니다.

다음 방법에 대해 설명합니다.

  • 템플릿에서 워크플로 만들기
  • GitHub Actions 로그 이해
  • 여러 대상에 대해 테스트
  • 별도 빌드 및 테스트 작업
  • 빌드 아티팩트 저장 및 액세스
  • 검토할 때 PR 레이블 자동 지정

템플릿에서 워크플로 만들기

워크플로를 만들려면 템플릿을 사용하여 시작합니다. 템플릿에는 구현 중인 특정 유형의 자동화를 위한 일반적인 작업과 단계가 미리 구성되어 있습니다. 워크플로, 작업 및 단계에 익숙하지 않은 경우 GitHub Actions를 사용하여 개발 작업 자동화 모듈을 확인하세요.

리포지토리의 기본 페이지에서 작업 탭을 선택한 다음 새 워크플로을 선택합니다.

워크플로 선택 페이지에서 다양한 템플릿 중에서 선택할 수 있습니다. 한 가지 예는 Node.js 템플릿으로, 노드 종속성을 새로 설치하고 소스 코드를 빌드하고 다른 버전의 Node를 테스트 및 실행합니다. 또 다른 예는 Python 패키지 템플릿으로, python 종속성을 설치하고 Lint를 포함한 테스트를 여러 버전의 Python에서 실행합니다.

검색 상자에 Node.js를 입력합니다.

Screenshot showing GitHub Actions tab with the search box highlighted and containing the text 'Node.js'.

검색 결과의 Node.js 창에서 구성을 선택합니다.

Screenshot showing GitHub Actions tab with the Node.js pane highlighted and the Node.js template selected.

새로 만든 파일 node.js.yml에서 이 기본 Node.js 템플릿 워크플로를 볼 수 있습니다.

name: Node.js CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x, 16.x, 18.x]

    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

on: 특성을 확인합니다. 이 워크플로는 리포지토리에 대한 푸시에서와 기본 분기에 대한 끌어오기 요청이 만들어질 때 트리거됩니다.

이 워크플로에는 하나의 job이(가) 있습니다. 지금까지 수행한 작업을 검토하겠습니다.

runs-on: 특성은 운영 체제에 대해 ubuntu-latest에서 워크플로를 실행하도록 지정합니다. node-version: 특성은 노드 버전 14.x, 16.x 및 18.x에 각각 하나씩 세 개의 빌드가 있음을 지정합니다. 나중에 워크플로를 사용자 지정할 때 matrix 부분에 대해 자세히 설명합니다.

작업의 steps에서는 GitHub Actions actions/checkout@v3 작업을 사용하여 리포지토리에서 VM으로 코드를 가져오고, actions/setup-node@v3 작업을 사용하여 Node.js의 올바른 버전을 설정합니다. ${{ matrix.node-version }} 특성을 사용하여 세 가지 버전의 Node.js를 테스트하도록 지정합니다. 이 특성은 이전에 정의한 행렬을 참조합니다. cache 특성은 기본 디렉터리에서 캐싱을 위한 패키지 관리자를 지정합니다.

이 단계의 마지막 부분에서는 Node.js 프로젝트에서 사용되는 명령을 실행합니다. npm ci 명령은 package-lock.json 파일에서 종속성을 설치하고, npm run build --if-present 명령은 빌드 스크립트(있는 경우)를 실행하고, npm test 명령은 테스트 프레임워크를 실행합니다. 이 템플릿에는 빌드 단계와 테스트 단계가 모두 동일한 작업으로 포함되어 있습니다.

npm에 대한 자세한 내용은 npm 설명서를 참조하세요.

빌드에 대한 작업 로그

워크플로가 실행되면 발생한 내용과 오류 또는 테스트 실패에 대한 세부 정보가 포함된 로그가 생성됩니다.

오류가 발생하거나 테스트가 실패할 경우 로그에 녹색 ✔ 표시 대신 빨간색 ✖가 표시됩니다. 오류 또는 실패에 대한 세부 정보를 검사하여 발생한 상황을 조사할 수 있습니다.

 GitHub Actions log with details on a failed test.

연습에서는 로그의 세부 정보를 검사하여 실패한 테스트를 파악합니다. ‘작업’ 탭에서 로그에 액세스할 수 있습니다.

워크플로 템플릿 사용자 지정

이 모듈의 시작 부분에서는 팀에 맞게 CI를 설정해야 하는 시나리오를 설명했습니다. Node.js 템플릿은 시작할 때 유용하지만 팀의 요구 사항에 맞게 사용자 지정할 수 있습니다. 다양한 버전의 Node와 다양한 운영 체제를 대상으로 할 수 있습니다. 또한 빌드와 테스트 단계를 별도의 작업으로 지정하려고 합니다.

워크플로를 사용자 지정하는 방법을 살펴보겠습니다.

strategy:
  matrix:
    os: [ubuntu-latest, windows-latest]
    node-version: [16.x, 18.x]

여기에서는 여러 운영 체제 및 언어 버전에서 테스트하기 위해 빌드 행렬을 구성했습니다. 이 행렬은 각 Node 버전과 짝을 이루는 각 운영 체제당 하나씩 네 개의 빌드를 생성합니다.

네 개 빌드는 각 빌드에 대한 모든 테스트와 더불어 많은 로그 정보를 생성합니다. 완전히 정렬하는 것이 어려울 수 있습니다. 다음 샘플에서는 전용 테스트 작업으로 테스트 단계를 이동하는 방법을 보여줍니다. 이 작업에서는 여러 대상에 대해 테스트합니다. 빌드 및 테스트 단계를 분리하면 로그를 더 쉽게 이해할 수 있습니다.

test:
  runs-on: ${{ matrix.os }}
  strategy:
    matrix:
      os: [ubuntu-latest, windows-latest]
      node-version: [16.x, 18.x]
  steps:
  - uses: actions/checkout@v3
  - name: Use Node.js ${{ matrix.node-version }}
    uses: actions/setup-node@v3
    with:
      node-version: ${{ matrix.node-version }}
  - name: npm install, and test
    run: |
      npm install
      npm test
    env:
      CI: true

아티팩트란?

워크플로에서 로그 항목 이외의 항목을 생성하는 경우 이 항목을 아티팩트라고 합니다. 예를 들어 Node.js 빌드에서는 배포할 수 있는 Docker 컨테이너를 생성합니다. actions/upload-artifact 작업을 사용하여 이 아티팩트, 즉 컨테이너를 스토리지에 업로드하고 나중에 actions/download-artifact 작업을 사용하여 스토리지에서 다운로드할 수 있습니다.

아티팩트를 저장하면 작업 간에 유지됩니다. 각 작업은 VM(가상 머신)의 새 인스턴스를 사용하므로 VM에 저장하여 아티팩트를 다시 사용할 수 없습니다. 아티팩트가 다른 작업에 필요한 경우 아티팩트를 작업의 스토리지에 업로드하고 다른 작업에 대해 다운로드할 수 있습니다.

아티팩트 스토리지

아티팩트는 GitHub의 스토리지 공간에 저장됩니다. 이 공간은 계정에 따라 퍼블릭 리포지토리에는 무료로 제공되고, 프라이빗 리포지토리에는 일정량만 무료로 제공됩니다. GitHub에서는 아티팩트를 90일 동안 저장합니다.

다음 워크플로 코드 조각에서는 actions/upload-artifact@main 작업에 path: 특성이 있습니다. 이 특성의 값은 아티팩트 저장 경로입니다. 여기에서는 public/을 지정하여 모든 항목을 디렉터리에 업로드합니다. 업로드하려는 파일이 하나뿐인 경우 public/mytext.txt와 같은 항목을 사용합니다.

  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: npm install and build webpack
        run: |
          npm install
          npm run build
      - uses: actions/upload-artifact@main
        with:
          name: webpack artifacts
          path: public/

테스트용 아티팩트를 다운로드하려면 빌드에서 아티팩트를 완료하여 업로드해야 합니다. 다음 코드에서는 테스트 작업이 빌드 작업에 종속되도록 지정합니다.

test:
    needs: build
    runs-on: ubuntu-latest

다음 워크플로 코드 조각에서는 아티팩트를 다운로드합니다. 이제 테스트 작업에서 아티팩트를 테스트에 사용할 수 있습니다.

steps:
    - uses: actions/checkout@v3
    - uses: actions/download-artifact@main
      with:
        name: webpack artifacts
        path: public

워크플로에서 아티팩트를 사용하는 방법에 관한 자세한 내용은 GitHub 설명서의 워크플로 데이터를 아티팩트로 저장을 참조하세요.

워크플로를 사용하여 GitHub에서 검토 자동화

지금까지 푸시 또는 끌어오기 요청과 같은 GitHub 이벤트에서 워크플로를 시작하는 방법을 설명했습니다. 일정에 따르거나 GitHub 외부의 일부 이벤트에 따라 워크플로를 실행할 수도 있습니다.

경우에 따라 사용자가 작업을 수행한 후에만 워크플로를 실행하려고 합니다. 예컨대, 검토자가 끌어오기 요청을 승인한 경우에만 워크플로를 실행할 수 있습니다. 이 시나리오의 경우 pull-request-review를 트리거할 수 있습니다.

수행 가능한 다른 작업으로 끌어오기 요청에 레이블을 추가하는 것이 있습니다. 이 경우 pullreminders/label-when-approved-action 작업을 사용합니다.

    steps:
     - name: Label when approved
       uses: pullreminders/label-when-approved-action@main
       env:
         APPROVALS: "1"
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         ADD_LABEL: "approved"

env:라는 블록을 확인합니다. 이 블록에서는 이 작업에 대한 환경 변수를 설정합니다. 예를 들어 필요한 승인자 수를 설정할 수 있습니다. 여기에서는 1입니다. 작업에서 레이블을 추가하여 리포지토리를 변경해야 하므로 secrets.GITHUB_TOKEN 인증 변수가 필요합니다. 마지막으로 추가할 레이블의 이름을 제공합니다.

레이블 추가는 병합과 같은 다른 워크플로를 시작하는 이벤트일 수 있습니다. 이 이벤트는 GitHub Actions를 사용한 지속적인 업데이트에 관한 다음 모듈에서 살펴보겠습니다.