얼마 전에 workflow_call로 GitHub Actions 워크플로우를 재사용하는 방법을 살펴봤는데 GitHub의 소개 글을 보면 재사용할 수 있는 워크플로우와 Composite 액션의 차이점을 비교하는 내용이 나온다.
Composite 액션을 통해서도 여러 액션을 하나의 액션으로 만든 뒤에 워크플로우에서 사용할 수 있으므로 각 프로젝트에서 같은 작업을 반복하지 않고 액션을 재사용할 수 있다. 액션으로 할 수 있는 부분과 안되는 부분을 파악 중이라서 그전에는 사용해 보지 않았기에 Composite 액션을 테스트했다.
Composite 액션 생성하기
가이드 문서가 잘 되어 있어서 가이드 문서를 따라 해 보니 동작을 대부분 이해해 볼 수 있었다.
Composite 액션은 워크플로우 재사용과는 다르므로 액션을 관리할 저장소가 따로 필요하다. Composite 액션을 위한 저장소를 만들고 프로젝트의 루트에 action.yml
이라는 파일로 아래 내용을 생성한다.
name: 'Hello World'
description: 'Greet someone'
inputs:
who-to-greet: # id of input
description: 'Who to greet'
required: true
default: 'World'
outputs:
random-number:
description: "Random number"
value: ${{ steps.random-number-generator.outputs.random-id }}
runs:
using: "composite"
steps:
- run: echo Hello ${{ inputs.who-to-greet }}.
shell: bash
- id: random-number-generator
run: echo "::set-output name=random-id::$(echo $RANDOM)"
shell: bash
- run: echo "${{ github.action_path }}" >> $GITHUB_PATH
shell: bash
- run: goodbye.sh
shell: bash
Composite 액션을 다른 곳에서 사용할 것이므로 inputs
와 outputs
를 정의했다. Composite 액션은 반드시 using: "composite"
를 선언해야 하고 steps
는 일반적인 액션을 작성하는 것과 크게 다르지 않다. 간단히 설명하면 입력으로 받은 값으로 Hello
문자열을 찍고 bash에서 랜덤숫자를 생성해서 아웃풋으로 설정하고 GitHub의 액션 경로를 저장하고 goodbye.sh
라는 쉘 파일을 실행한다. runs
의 자세한 설정은 문서를 참고하면 된다.
액션에서 마지막에 사용한 goodbye.sh
는 이 저장소에 있어야 하는 파일이므로 goodbye.sh
를 아래의 내용으로 생성한다.
echo "Goodbye"
Composite 액션 사용하기
Composite 액션은 다른 액션을 사용하는 것과 다를 게 없이 uses
를 이용해서 저장소와 ref를 지정해 주면 된다. 당연히 저장소에는 접근할 수 있어야 하므로 Public 저장소여야 한다.
name: Using Composite
on: [push]
jobs:
hello_world_job:
runs-on: ubuntu-latest
name: A job to say hello
steps:
- uses: actions/checkout@v3
- id: foo
uses: outsideris/actions-test@master
with:
who-to-greet: 'Mona the Octocat'
- run: echo random-number ${{ steps.foo.outputs.random-number }}
shell: bash
이 워크플로우를 실행하면 아래와 같이 결과를 볼 수 있다. 액션 내에 여러 스탭이 있지만 사용하는 쪽에서는 Composite 액션이 하나의 step으로 묶여서 보이게 된다.
Composite 액션을 로그를 더 자세히 보면 액션에서 출력한 랜덤 넘버가 제대로 전달된 걸 볼 수 있다. Composite 액션 내에서 사용한 github.action_path
도 Composite 액션이 정의된 저장소의 경로가 출력되었고 goodbye.sh
도 잘 실행되었다.
JavaScript 액션이나 Docker 컨테이너 액션처럼 유연하진 않지만 좀 더 간단한 액션은 쉽게 만들어서 사용할 수 있는 장점이 있다.
Compoiste 액션과 재사용할 수 있는 워크플로우의 차이점
GitHub의 소개 글을 보면 재사용할 수 있는 워크플로우와 Compoiste 액션이 장단점이 있지만 80%의 요구사항은 어느 쪽을 써도 되지만 둘의 차이점이 있으므로 이 차이점을 확실히 알아야 상황에 따라 선택해서 사용할 수 있다고 비교표를 보여주고 있다.
재사용할 수 있는 워크플로우 | Composite 액션 |
---|---|
다른 재사용할 수 있는 워크플로우를 호출 불가능 | Composite 액션을 10개까지 중첩 가능 |
시크릿 사용 가능 | 시크릿 사용 불가능 |
if: 조건 사용 가능 | if: 조건 사용 불가능 |
프로젝트에 일반적인 YAML로 저장 가능 | Composite 액션마다 개별 폴더 필요 |
여러 잡 사용 가능 | 여러 잡 사용 불가능 |
각 스텝이 실시간으로 로깅 | 여러 스텝이 있어도 하나의 스탭으로 로깅 |
Comments