GitHub Actions 워크플로 구성
여기에서는 워크플로 파일 내의 몇 가지 공통 구성을 알아봅니다. 또한 이벤트 유형의 범주, 워크플로 비활성화 및 삭제, 보안 모범 사례에 적합한 특정 작업 버전 사용에 대해 살펴봅니다.
예약된 이벤트에서 실행할 워크플로 구성
앞서 설명한 바와 같이 GitHub에서 특정 활동이 발생할 때, GitHub 외부에서 이벤트가 발생할 때 또는 예약된 시간에 실행되도록 워크플로를 구성할 수 있습니다. schedule
이벤트를 사용하면 POSIX cron 구문을 통해 특정 UTC 시간에 실행되도록 워크플로를 트리거할 수 있습니다. 이 cron 구문에는 다섯 개의 *
필드가 있으며, 각 필드는 시간 단위를 나타냅니다.
예를 들어, 15분마다 워크플로를 실행하려는 경우 schedule
이벤트는 다음과 같습니다.
on:
schedule:
- cron: '*/15 * * * *'
매주 일요일 오전 3시에 워크플로를 실행하려는 경우에는 schedule
이벤트가 다음과 같습니다.
on:
schedule:
- cron: '0 3 * * SUN'
연산자를 사용하여 예약된 워크플로에서 값 범위를 지정하거나 전화를 걸 수도 있습니다. 예약된 워크플로를 실행할 수 있는 최단 간격은 5분마다 한 번이며, 기본값 또는 기본 분기의 최근 커밋에서 실행됩니다.
수동 이벤트에서 실행할 워크플로 구성
예약된 이벤트 외에도 workflow_dispatch
이벤트를 사용하여 워크플로를 수동으로 트리거할 수 있습니다. 이 이벤트를 사용하면 GitHub REST API를 사용하거나 GitHub의 리포지토리 내 작업 탭에서 워크플로 실행 단추를 선택하여 워크플로를 실행할 수 있습니다. workflow_dispatch
를 사용하면 워크플로를 실행할 분기를 선택하고 GitHub에서 UI의 양식 요소로 표시될 선택적 inputs
를 설정할 수 있습니다.
on:
workflow_dispatch:
inputs:
logLevel:
description: 'Log level'
required: true
default: 'warning'
tags:
description: 'Test scenario tags'
workflow_dispatch
외에도 GitHub API를 사용하여 repository_dispatch
(이)라는 웹후크 이벤트를 트리거할 수 있습니다. 이 이벤트를 사용하면 GitHub 외부에서 발생하는 활동에 대한 워크플로를 트리거할 수 있으며, 이 이벤트는 기본적으로 리포지토리에 대한 HTTP 요청으로 작동하여 작업 또는 웹후크에서 워크플로를 트리거하도록 GitHub에 요청합니다. 이 수동 이벤트를 사용하려면 두 가지 작업을 수행해야 합니다. 즉, 요청 본문에 웹후크 이벤트 이름이 있는 GitHub 엔드포인트 /repos/{owner}/{repo}/dispatches
에 POST
요청을 보내고 repository_dispatch
이벤트를 사용할 워크플로를 구성해야 합니다.
curl \
-X POST \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/octocat/hello-world/dispatches \
-d '{"event_type":"event_type"}'
on:
repository_dispatch:
types: [opened, deleted]
웹후크 이벤트에서 실행할 워크플로 구성
마지막으로, 특정 웹후크 이벤트가 GitHub에서 발생할 때 실행되도록 워크플로를 구성할 수 있습니다. 두 가지 이상의 웹후크 활동에서 대부분의 웹후크 이벤트를 트리거할 수 있으므로, 웹후크에 여러 활동이 있는 경우 워크플로를 트리거할 활동 유형을 지정할 수 있습니다. 예를 들면, rerequested
또는 requested_action
활동 유형에 한해 check_run
이벤트에 대한 워크플로를 실행할 수 있습니다.
on:
check_run:
types: [rerequested, requested_action]
조건부 키워드 사용
워크플로 파일 내에서 컨텍스트 정보에 액세스하고 식을 평가할 수 있습니다. 식은 일반적으로 워크플로 파일의 조건부 if
키워드와 함께 사용되어 단계의 실행 여부를 결정하지만, 지원되는 컨텍스트 및 식을 사용하여 조건부를 만들 수 있습니다. 워크플로에서 조건을 사용하는 경우 특정 구문 ${{ <expression> }}
을(를) 사용해야 함을 아는 것이 중요합니다. 이 구문은 GitHub에 식을 문자열로 처리하는 대신 계산하도록 지시합니다.
예를 들어 워크플로의 다음 단계를 진행하기 위해 if
조건을 사용하여 github.ref
(워크플로 실행을 트리거한 분기 또는 태그 참조)가 refs/heads/main
과 일치하는지 확인하는 워크플로는 다음과 같습니다.
name: CI
on: push
jobs:
prod-check:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
...
이 예제에서는 ${{ }}
이(가) 구문에서 누락되었습니다. if
조건의 경우처럼 일부 식에서는 식 구문을 생략할 수 있습니다. GitHub는 이러한 일반적인 식 중 일부를 자동으로 평가하지만, GitHub에서 자동으로 평가하는 식을 잊어버린 경우 언제든지 포함할 수 있습니다.
워크플로 구문과 식에 대한 자세한 내용은 GitHub Actions에 대한 워크플로 구문을 확인하세요.
워크플로를 사용하지 않도록 설정/삭제
리포지토리에 워크플로를 추가하면 워크플로를 일시적으로 사용하지 않도록 설정하려는 상황이 발생할 수 있습니다. GitHub 또는 GitHub REST API를 통해 리포지토리에서 파일을 삭제하지 않고도 워크플로가 트리거되지 않도록 중지할 수 있습니다. 워크플로를 다시 사용하도록 설정하려는 경우 동일한 방법을 사용하여 쉽게 수행할 수 있습니다.
다음과 같은 상황에서는 워크플로를 사용하지 않도록 설정하는 것이 유용할 수 있습니다.
- 워크플로에서 오류가 발생하여 외부 서비스에 부정적인 영향을 주는 요청이 너무 많이 발생하거나 잘못된 요청이 생성되는 경우
- 중요하지 않고 계정에서 너무 많은 시간을 사용하는 워크플로를 일시적으로 중지하려는 경우
- 다운된 서비스에 요청을 전송하는 워크플로를 일시 중지하려는 경우
- 포크에 대한 작업을 수행하고 있으며 여기에 포함되는 일부 워크플로(예: 예약된 워크플로)의 기능이 모두 필요하지 않은 경우
또한 작업 탭에서 또는 GitHub API 엔드포인트 DELETE /repos/{owner}/{repo}/actions/runs/{run_id}
를 사용하여 GitHub UI에서 진행 중인 워크플로 실행을 취소할 수 있습니다. 워크플로 실행을 취소하면 GitHub가 해당 실행 내의 작업과 단계를 모두 취소합니다.
조직의 템플릿 기반 워크플로 사용
조직 내에 여러 팀이 사용하는 워크플로가 있는 경우 각 리포지토리에 동일한 워크플로를 다시 만드는 대신 조직의 .github
리포지토리에 정의된 워크플로 템플릿을 사용하여 조직 전체에서 일관성을 향상시킬 수 있습니다. 조직 내 모든 구성원이 조직 템플릿 워크플로를 사용할 수 있으며, 해당 조직 내 모든 리포지토리에는 이러한 템플릿 워크플로에 대한 액세스 권한이 있습니다.
이러한 워크플로는 조직 내 리포지토리의 작업 탭으로 이동하고, 새 워크플로를 선택하며, ‘조직 이름으로 만든 워크플로’라는 조직의 워크플로 템플릿 섹션을 찾는 방법으로 확인할 수 있습니다. 예를 들어, Mona라는 조직에는 아래와 같은 템플릿 워크플로가 있습니다.
특정 작업 버전 사용
워크플로에서 작업을 참조할 때 작업 자체뿐만 아니라 해당 작업의 특정 버전을 참조하는 것이 좋습니다. 특정 버전을 참조하면 잠재적으로 워크플로를 중단할 수 있는 작업에 푸시된 예기치 않은 변경으로부터 보호할 수 있습니다. 특정 작업 버전을 참조할 수 있는 몇 가지 방법은 다음과 같습니다.
steps:
# Reference a specific commit
- uses: actions/setup-node@c46424eee26de4078d34105d3de3cc4992202b1e
# Reference the major version of a release
- uses: actions/setup-node@v1
# Reference a minor version of a release
- uses: actions/setup-node@v1.2
# Reference a branch
- uses: actions/setup-node@main
일부 참조가 다른 참조보다 안전합니다. 예를 들어, 특정 분기를 참조하면 해당 분기의 최신 변경 내용에서 관련 작업이 실행됩니다. 이 작업은 원할 수도 있고, 원하지 않을 수도 있습니다. 특정 버전 번호 또는 커밋 SHA 해시를 참조하면 실행 중인 작업의 버전에 대해 보다 구체적으로 알 수 있습니다. 안정성과 보안을 강화하려면 워크플로 내에서 릴리스된 작업의 커밋 SHA를 사용하는 것이 좋습니다.