[GitHub-Action] workflow 기초 (2)

업데이트:     Updated:

카테고리:

태그:

🎯목표

workflow는 GitHub 커뮤니티에서 만든 action, 또는 사용자가 직접 정의한 action을 포함할 수 있습니다. 이번 포스트에서는 workflow file을 작성하는 방법에 대해 배워보도록 하겠습니다.

🔖Find action and Custom Action

workflow에서 사용되는 action은 다음의 위치에서 정의될 수 있습니다:

  • workflow 파일이 위치한 동일 리포지토리
  • 퍼블릭 리포지토리
  • Docker Hub에 published된 도커 컨테이너 이미지

GitHub Marketplace는 GitHub 커뮤니티에서 만든 action을 찾을 수 있는 중앙 저장소입니다. GitHub Marketplace page

동일 리포지토리에서 action 추가


사용할 action과 해당 action으로 구성된 workflow file이 동일 리포지토리에 위치한 경우 workflow file에 {owner}/{repo}@{ref} 또는 ./path/to/dir 경로를 통해 action을 참조할 수 있습니다.

# Example repository file structure:
|-- hello-world (repository)
|   |__ .github
|       └── workflows
|           └── my-first-workflow.yml
|       └── actions
|           |__ hello-world-action
|               └── action.yml
# Example workflow file:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # This step checks out a copy of your repository.
      - uses: actions/checkout@v3
      # This step references the directory that contains the action.
      - uses: ./.github/actions/hello-world-action

Note:

action.yml 파일은 action에 대한 메타데이터를 제공합니다. 자세한 내용은 Metadata syntax for GitHub ACtions를 참고하세요.

퍼블릭 리포지토리에서 action 추가


사용할 action이 해당 action으로 구성된 workflow file과 다른 리포지토리에 위치한 경우 workflow file에 {owner}/{repo}@{ref} 경로를 통해 action을 참조할 수 있습니다. 이때 action은 퍼블릭 리포지토리에 저장 되어있어야 합니다.

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: actions/setup-node@v3

Docker Hub에 게시된 container로 부터 action 추가


도커 허브에 게시된 도커 컨테이너 이미지에 action이 정의된 경우 workflow file에서 `docker://{image}:{tag} 경로를 통해 참조할 수 있습니다.

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: docker://alpine:3.8

Note:

workflow에서 참조한 Docker Hub내 이미지는 먼저 무결성 체크를 할 것을 권장드립니다.

특정 action 버전 접근


workflow file에서 특정한 action 버전을 지정하는 3가지 방법을 제공합니다.

  • tag
  • SHA(해시)
  • branch

Using tags

steps:
  - uses: actions/javascript-action@v1.0.1

Using SHAs

steps:
  - uses: actions/javascript-action@172239021f7ba04fe7327647b213799853a9eb89 

Note:

SHA 값은 약어가 아닌 전체 값을 사용해야 합니다.

Using branches

steps:
  - uses: actions/javascript-action@main

Note:

action에 대한 대상 브랜치를 지정하면 항상 해당 브랜치에 있는 최근 버전이 실행됩니다.

workflow 생성

workflow에서 변수 사용, 스크립트 실행, action 간에 데이터 및 아티팩트 공유와 같은 몇 가지 기술을 소개합니다.

변수 사용


GitHub actions에는 각 workflow run에 대한 기본 환경 변수가 포함됩니다. 만약 사용자 지정 환경 변수를 사용해야 하는 경우 workflow file에 해당 변수를 설정할 수 있습니다.

다음 예제는 POSTGRES_HOSTPOSTGRES_PORT 사용자 지정 환경 변수를 만들고 해당 변수를 node client.js 명령을 실행하는데 참조합니다.

jobs:
  example-job:
      steps:
        - name: Connect to PostgreSQL
          run: node client.js
          env:
            POSTGRES_HOST: postgres
            POSTGRES_PORT: 5432

자세한 내용은 환경 변수 사용을 참고고하세요.

스크립트 실행


action을 사용하여 할당된 runner에서 스크립트 파일 및 셸 명령을 실행할 수 있습니다. 다음 예제에서는 action에서 run 키워드를 사용하여 shell에서 npm install -g bats를 실행하는 방법을 보여줍니다.

jobs:
  example-job:
    steps:
      - run: npm install -g bats

스크립트 파일을 action으로 실행하려면 리포지토리에 스크립트를 저장하고 경로 및 셸을 지정하여 실행할 수 있습니다.

jobs:
  example-job:
    steps:
      - name: Run build script
        run: ./.github/scripts/build.sh
        shell: bash

jobs 간에 데이터 공유


동일한 workflow의 job간에 데이터를 공유하거나 나중에 참조하기 위해 파일을 저장하려는 경우 GitHub 아티팩트를 활용할 수 있습니다.

아티팩트는 코드를 빌드하고 테스트할 때 생성되는 파일일 수 있습니다. 예를 들어 바이너리 또는 패키지 파일, 테스트 결과, 스크린샷 또는 로그 파일이 아티팩트가 될 수 있습니다.

아티팩트는 아티팩트가 생성된 workflow run과 연결되며 다른 job에서 사용할 수 있습니다. 또한 동일한 workflow run 내에서 호출된 모든 action에는 해당 run의 결과로 생성된 아티팩트에 대한 쓰기 액세스 권한이 있습니다.

Note:

하나의 workflow에 정의된 여러 job은 서로 다른 runner 에서 구동이 되고 하나의 workflow는 하나의 workflow run과 연결됩니다.

다음 예제는 output.log 파일 아티팩트를 만들고 upload 합니다.

jobs:
  example-job:
    name: Save output
    steps:
      - shell: bash
        run: |
          expr 1 + 1 > output.log
      - name: Upload output file
        uses: actions/upload-artifact@v3
        with:
          name: output-log-file
          path: output.log

image

별도의 workflow run에서 아티팩트를 다운로드하려면 action/download-artifact action을 사용할 수 있습니다. 다음 예제는 output-log-file 아티팩트를 다운로드합니다.

jobs:
  example-job:
    steps:
      - name: Download a single artifact
        uses: actions/download-artifact@v3
        with:
          name: output-log-file

동일한 workflow run에서 업로드 작업이 완료될 때까지 다운로드 작업이 시작되지 않도록 하려면 needs: upload-job-name 인수를 지정해야 합니다.

📌출처

깃허브 액션 /GitHub 작업 알아보기 /GitHub 작업 이해


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

github-action 카테고리 내 다른 글 보러가기

댓글남기기