GitHub Action의 세가지 구성요소
GitHub Actions는 Workflow, Job, Step 세가지 구성요소로 이루어진다. Step은 Job에 포함되고, Job은 Workflow에 포함된다. 즉, Workflow가 가장 큰 작업 단위이고, 그 아래 Job이 있고, Job 아래에는 Step이 있다. 이를 그림으로 나타내면 아래와 같다.
이 세가지를 잘 활용하면, 많은 작업들을 자동화 할 수 있다. 이제 이들 각각이 무엇인지 알아보자.
Workflows
Workflow는 GitHub Repository에 들어가는 작업 단위이다. 보통 Repository의 /.github/workflows/ 경로에 존재하며, 확장자는 .yml 이다.
예를 들어 위의 그림에서는 first_action.yml이라는 Workflow 파일이 있다. 하지만 여기서 파일 이름인 first_aciton이 Workflow의 이름은 아니다. Workflow 파일 내부에는 name: [Workflow 이름] 이 있는데 여기서 Workflow의 이름을 설정한다.
# WorkFlow의 이름 설정
name: First workflow
Workflow는 어떤 이벤트에 따라 Workflow를 실행시킬지를 on: 키워드를 사용해 설정할 수 있다. 예를 들어 아래에서는 main 브랜치에 푸시가 일어나거나 pull request가 일어날 경우 Workflow가 실행된다.
# Workflow가 Trigger되는 이벤트 설정
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
또한 Workflow는 여러 job을 포함한다. 예를 들어 테스트 후 빌드를 돌리는 job을 아래와 같이 설정할 수 있다.
# job을 설정
jobs:
# test job
test:
# build job
build:
Jobs
Job은 병렬적으로 수행되거나 순차적으로 수행되어야 하는 작업의 단위이다. 기본 값은 병렬로 수행되는 것이다. 실행이 되기 위해서는 작업 환경의 정의가 필요한데, 이를 Runner라 부른다. Runner는 아래와 같이 runs-on: 을 통해 설정이 가능하다. 아래에서는 ubuntu-latest로 설정되어 있는데 이 키워드는 GitHub Action에서 제공하는 다양한 ubuntu runner 중 가장 최신 Runner이다.
jobs:
first-job:
#runs-on: job이 돌아갈 실행환경 설정
runs-on: ubuntu-latest
Job은 하나 혹은 그 이상의 Step을 포함한다.
Steps
Step은 Job이 포함되며, shell script나 Action을 실행한다. shell script는 terminal에서 수행하는 명령어의 집합이고, Action은 GitHub Action에서 미리 정의한 script이다. 커스텀 Action이나, 서드파티에서 제공하는 Action을 수행하는 것도 가능하다. 예를 들어 actions/checkout@v3 는 GitHub Actions에서 미리 정의한 Action으로 아래와 같이 포함될 수 있다.
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
Step은 무조건 순차적으로 수행되며, 특정 조건을 충족할 때만 수행하도록 할 수도 있다.