GitHub Actions의 Composite 액션 작성하기
얼마 전에 workflow_call로 GitHub Actions 워크플로우를 재사용하는 방법을 살펴봤는데 GitHub의 소개 글을 보면 재사용할 수 있는 워크플로우와 Composite 액션의 차이점을 비교하는 내용이 나온다.
Composite 액션을 통해서도 여러 액션을 하나의 액션으로 만든 뒤에 워크플로우에서 사용할 수 있으므로 각 프로젝트에서 같은 작업을 반복하지 않고 액션을 재사용할 수 있다. 액션으로 할 수 있는 부분과 안되는 부분을 파악 중이라서 그전에는 사용해 보지 않았기에 Composite 액션을 테스트했다.
Composite 액션 생성하기
가이드 문서가 잘 되어 있어서 가이드 문서를 따라 해 보니 동작을 대부분 이해해 볼 수 있었다.
Composite 액션은 워크플로우 재사용과는 다르므로 액션을 관리할 저장소가 따로 필요하다. Composite 액션을 위한 저장소를 만들고 프로젝트의 루트에 action.yml이라는 파일로 아래 내용을 생성한다.
1name: 'Hello World'
2description: 'Greet someone'
3
4inputs:
5 who-to-greet: # id of input
6 description: 'Who to greet'
7 required: true
8 default: 'World'
9
10outputs:
11 random-number:
12 description: "Random number"
13 value: ${{ steps.random-number-generator.outputs.random-id }}
14
15runs:
16 using: "composite"
17 steps:
18 - run: echo Hello ${{ inputs.who-to-greet }}.
19 shell: bash
20 - id: random-number-generator
21 run: echo "::set-output name=random-id::$(echo $RANDOM)"
22 shell: bash
23 - run: echo "${{ github.action_path }}" >> $GITHUB_PATH
24 shell: bash
25 - run: goodbye.sh
26 shell: bash
Composite 액션을 다른 곳에서 사용할 것이므로 inputs와 outputs를 정의했다. Composite 액션은 반드시 using: "composite"를 선언해야 하고 steps는 일반적인 액션을 작성하는 것과 크게 다르지 않다. 간단히 설명하면 입력으로 받은 값으로 Hello 문자열을 찍고 bash에서 랜덤숫자를 생성해서 아웃풋으로 설정하고 GitHub의 액션 경로를 저장하고 goodbye.sh라는 쉘 파일을 실행한다. runs의 자세한 설정은 문서를 참고하면 된다.
액션에서 마지막에 사용한 goodbye.sh는 이 저장소에 있어야 하는 파일이므로 goodbye.sh를 아래의 내용으로 생성한다.
1echo "Goodbye"
Composite 액션 사용하기
Composite 액션은 다른 액션을 사용하는 것과 다를 게 없이 uses를 이용해서 저장소와 ref를 지정해 주면 된다. 당연히 저장소에는 접근할 수 있어야 하므로 Public 저장소여야 한다.
1name: Using Composite
2
3on: [push]
4
5jobs:
6 hello_world_job:
7 runs-on: ubuntu-latest
8 name: A job to say hello
9 steps:
10 - uses: actions/checkout@v3
11 - id: foo
12 uses: outsideris/actions-test@master
13 with:
14 who-to-greet: 'Mona the Octocat'
15 - run: echo random-number ${{ steps.foo.outputs.random-number }}
16 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