[GitHub-Action] workflow 기초 (2)
카테고리: github-action
태그: github-action
🎯목표
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_HOST와 POSTGRES_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

별도의 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 작업 이해
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기