GitHub Actions 작업 종속성 (Job Dependencies)

GitBeginner
지금 연습하기

소개

실제 CI/CD 파이프라인에서 워크플로우는 단일 단계 목록인 경우가 거의 없습니다. 워크플로우는 종종 특정 순서로 실행되어야 하는 여러 개의 독립적인 "작업 (job)"으로 구성됩니다.

예를 들어, 코드를 컴파일하는 Build 작업과 서버에 코드를 푸시하는 Deploy 작업이 있을 수 있습니다. Build 작업이 실패했을 때 Deploy 작업이 실행되는 것을 원하지 않을 것이며, 배포에는 빌드된 아티팩트가 필요하므로 두 작업을 동시에 실행할 수도 없습니다.

이 랩에서는 워크플로우를 두 개의 별도 작업으로 분할하고 needs 키워드를 사용하여 종속성을 적용함으로써 배포 작업이 빌드 작업이 성공적으로 완료될 때까지 기다리도록 할 것입니다.

이 랩은 이전 랩에서 생성한 리포지토리를 기반으로 합니다. github-actions-demo 리포지토리로 작업하게 됩니다.

빌드 작업 정의 (Define a build job)

먼저, 집중적인 build 작업을 갖도록 기존 워크플로우를 정리하겠습니다. 명확성을 위해 이전 실습의 매트릭스 전략 (matrix strategy) 을 단순화하고, 작업 종속성 (job dependencies) 에 초점을 맞추기 위해 단일 버전으로 되돌아갑니다.

  1. github-actions-demo의 GitHub 저장소 페이지에서 녹색 Code 버튼을 클릭합니다.
  2. HTTPS 탭이 선택되었는지 확인하고 URL 을 복사합니다. URL 은 https://github.com/your-username/github-actions-demo.git과 유사해야 합니다.
  3. LabEx 환경에서 터미널을 엽니다. 기본 경로는 ~/project입니다.
  4. git clone 명령을 사용하여 저장소를 다운로드합니다. your-username을 실제 GitHub 사용자 이름으로 바꾸십시오.
cd ~/project
git clone https://github.com/your-username/github-actions-demo.git

예시 출력:

Cloning into 'github-actions-demo'...
remote: Enumerating objects: X, done.
remote: Counting objects: 100% (X/X), done.
remote: Total X (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (X/X), done.
  1. 복제된 저장소로 이동합니다:
cd ~/project/github-actions-demo
  1. WebIDE 편집기를 사용하여 새 워크플로우 파일 .github/workflows/job-dependencies.yml을 생성합니다. 파일 탐색기에서 왼쪽의 project/github-actions-demo/.github/workflows/ 아래에서 파일을 찾을 수 있습니다.

  2. 기본 워크플로우 구조를 생성하는 것으로 시작합니다. 워크플로우 이름과 트리거를 추가합니다:

name: Job Dependencies

on: [push]
  1. jobs 섹션을 추가하고 실행기 (runner) 와 함께 빌드 작업을 정의합니다:
jobs:
  build:
    runs-on: ubuntu-latest
  1. steps 섹션을 추가합니다. 먼저, 저장소 코드를 가져오기 위한 checkout 단계를 추가합니다:
steps:
  - uses: actions/checkout@v4
  1. Node.js 설정 단계를 추가합니다:
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: "20"
  1. 종속성을 설치하는 단계를 추가합니다:
- name: Install dependencies
  run: npm install
  1. 테스트를 실행하는 단계를 추가합니다:
- name: Run tests
  run: npm test
  1. 아티팩트 디렉터리 및 파일을 생성하는 빌드 단계를 추가합니다:
- name: Build project
  run: |
    mkdir dist
    echo "Build artifact created at $(date)" > dist/build.txt
  1. 마지막으로, 아티팩트 업로드 단계를 추가합니다. 이 단계는 다음 작업에서 사용할 수 있도록 빌드 출력을 저장하므로 매우 중요합니다:
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: dist-files
    path: dist

이제 완성된 파일은 다음과 같아야 합니다:

name: Job Dependencies

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm test
      - name: Build project
        run: |
          mkdir dist
          echo "Build artifact created at $(date)" > dist/build.txt
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: dist-files
          path: dist

설명

  • 단순화를 위해 matrix 전략을 제거했습니다.
  • Upload build artifact 단계를 유지했습니다. 다음 작업에서 이 파일들이 필요하므로 이 단계는 매우 중요합니다!

변경 사항을 저장하십시오 (Ctrl+S 또는 Cmd+S).

빌드 작업에 종속되는 배포 작업 정의 (Define a deploy job that needs build)

이제 build가 성공적으로 완료되었을 때만 실행되어야 하는 두 번째 작업인 deploy를 추가하겠습니다. 이는 needs: build를 사용하여 구현합니다.

  1. .github/workflows/job-dependencies.yml 파일의 끝에 다음 deploy 작업을 추가합니다. build 작업과 동일한 들여쓰기 수준에 있는지 확인하십시오.

  2. 먼저 러너 (runner) 와 의존성을 포함한 배포 작업 정의를 추가합니다.

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

needs: build 줄은 매우 중요합니다. 이는 GitHub Actions 에게 이 작업이 build 작업의 성공적인 완료에 의존한다는 것을 알려줍니다.

  1. steps 섹션을 추가합니다. 먼저, 아티팩트 (artifact) 를 다운로드하는 단계를 추가합니다.
steps:
  - name: Download artifact
    uses: actions/download-artifact@v4
    with:
      name: dist-files
      path: dist

이것은 build 작업에서 업로드된 아티팩트를 다운로드합니다. name은 업로드 단계에서 사용된 이름과 일치해야 합니다.

  1. 배포 단계를 추가합니다.
- name: Deploy project
  run: |
    echo "Deploying project..."
    ls -R dist
    echo "Deployment successful!"

이 단계는 다운로드된 파일을 나열함으로써 배포를 시뮬레이션합니다.

  1. 전체 파일 구조는 다음과 같아야 합니다.
name: Job Dependencies

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm test
      - name: Build project
        run: |
          mkdir dist
          echo "Build artifact created at $(date)" > dist/build.txt
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: dist-files
          path: dist

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Download artifact
        uses: actions/download-artifact@v4
        with:
          name: dist-files
          path: dist
      - name: Deploy project
        run: |
          echo "Deploying project..."
          ls -R dist
          echo "Deployment successful!"

설명 (Explanation)

  • needs: build: 이것이 핵심 줄입니다. GitHub Actions 에게 이 작업이 build 작업의 성공적인 완료에 의존한다고 알려줍니다.
  • uses: actions/download-artifact@v4: 작업들은 서로 다른 가상 머신 (virtual machines) 에서 실행되므로 파일 시스템을 공유하지 않습니다. build 작업에서 생성된 dist 폴더를 얻으려면, 이전에 업로드한 아티팩트를 다운로드해야 합니다.
  • name: dist-files: 업로드 단계에서 사용된 이름과 일치해야 합니다.

파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

커밋, 푸시 및 순차적 실행 확인 (Commit, push, and verify sequential execution)

이제 작업 (jobs) 이 올바른 순서로 실행되는지 확인해 보겠습니다.

  1. 저장소 디렉토리에 있는지 확인합니다:
cd ~/project/github-actions-demo
  1. 변경 사항을 스테이징합니다:
git add .
  1. 변경 사항을 커밋합니다:
git commit -m "Add deploy job with dependency on build"
  1. 변경 사항을 GitHub 의 원격 저장소에 푸시합니다:
git push

인증 참고 사항:
git push를 실행하면 WebIDE 가 자동으로 인증을 요청하는 팝업을 표시합니다. 다음의 상세 단계를 따르십시오:

  1. "The extension 'GitHub' wants to sign in using GitHub." 라는 메시지와 함께 팝업이 나타납니다. Allow를 클릭합니다.
  2. 새 알림이 나타납니다. **"Copy&Continue to GitHub"**를 클릭한 다음, 다음 프롬프트에서 **"Open"**을 클릭합니다.
  3. 열리는 브라우저 창에서 GitHub 계정에 로그인하고 복사된 인증 코드를 입력합니다. 인증을 확인하면 페이지가 자동으로 닫힙니다.
  4. 몇 초 기다리면 터미널에서 푸시 작업이 성공적으로 완료되는 것을 볼 수 있습니다.

개인 정보 보호 참고 사항: WebIDE 는 인증 목적으로 GitHub 계정에 대한 전체 액세스를 요청합니다. 개인 정보 보호에 대해 걱정할 필요가 없습니다. 현재 랩을 완료하면 LabEx VM 은 즉시 파기되며, 귀하의 자격 증명 및 인증 정보는 유지되지 않습니다.

이 인증 프로세스는 사용자 이름이나 Personal Access Token(개인 액세스 토큰) 의 수동 구성을 요구하지 않습니다.

GitHub 에서 확인

  1. 웹 브라우저에서 GitHub 의 저장소로 이동합니다.
  2. Actions 탭을 클릭합니다.
  3. 최신 워크플로우 실행 (workflow run) 을 클릭합니다.
  4. 시각화 그래프를 확인합니다. 두 개의 원 (작업) 이 선으로 연결된 것을 볼 수 있어야 합니다.
    • build 작업은 왼쪽에 있습니다.
    • deploy 작업은 오른쪽에 있습니다.
  5. 진행 상황을 관찰합니다. build가 녹색 (Success) 으로 바뀔 때까지 deploy가 "Pending" 또는 "Waiting" 상태로 유지되는 것을 알 수 있습니다.
  6. build가 완료되면 deploy가 시작됩니다.
  7. deploy 작업 로그를 클릭하여 "Deploying project..." 메시지와 다운로드된 아티팩트의 파일 목록을 확인합니다.
GitHub Actions job dependencies

요약

본 랩 (lab) 에서는 GitHub Actions 에서 다중 작업 (multi-job) 워크플로우를 오케스트레이션 (orchestrate) 하는 방법을 배웠습니다. 다음을 수행했습니다.

  1. 별도의 build 작업과 deploy 작업을 생성했습니다.
  2. needs 키워드를 사용하여 종속성을 정의함으로써 deploybuild 이후에만 실행되도록 보장했습니다.
  3. upload-artifactdownload-artifact를 사용하여 이 별도의 작업들 간에 데이터 (파일) 를 전달했습니다.

이 패턴은 한 번 빌드한 후 이전 단계가 성공했을 경우에만 여러 환경 (스테이징, 프로덕션) 에 배포하려는 경우 강력한 CI/CD 파이프라인을 구축하는 데 기본이 됩니다.