Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

GitHub Actions의 Composite 액션 작성하기

얼마 전에 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 액션을 다른 곳에서 사용할 것이므로 inputsoutputs를 정의했다. 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으로 묶여서 보이게 된다.

GitHub Actions 워크플로우 실행 결과

Composite 액션을 로그를 더 자세히 보면 액션에서 출력한 랜덤 넘버가 제대로 전달된 걸 볼 수 있다. Composite 액션 내에서 사용한 github.action_path도 Composite 액션이 정의된 저장소의 경로가 출력되었고 goodbye.sh도 잘 실행되었다.

GitHub Actions 워크플로우 실행 결과

JavaScript 액션이나 Docker 컨테이너 액션처럼 유연하진 않지만 좀 더 간단한 액션은 쉽게 만들어서 사용할 수 있는 장점이 있다.

Compoiste 액션과 재사용할 수 있는 워크플로우의 차이점

GitHub의 소개 글을 보면 재사용할 수 있는 워크플로우와 Compoiste 액션이 장단점이 있지만 80%의 요구사항은 어느 쪽을 써도 되지만 둘의 차이점이 있으므로 이 차이점을 확실히 알아야 상황에 따라 선택해서 사용할 수 있다고 비교표를 보여주고 있다.

재사용할 수 있는 워크플로우 Composite 액션
다른 재사용할 수 있는 워크플로우를 호출 불가능 Composite 액션을 10개까지 중첩 가능
시크릿 사용 가능 시크릿 사용 불가능
if: 조건 사용 가능 if: 조건 사용 불가능
프로젝트에 일반적인 YAML로 저장 가능 Composite 액션마다 개별 폴더 필요
여러 잡 사용 가능 여러 잡 사용 불가능
각 스텝이 실시간으로 로깅 여러 스텝이 있어도 하나의 스탭으로 로깅


2022/04/23 17:10 2022/04/23 17:10