github actions로 workflow를 작성하다보면 변수(ex. 도메인, 버킷명 등..)만 바뀌고 대부분의 내용은 비슷한 경우가 많다. 따라서 변경사항이 발생하면 여러 개의 파일을 수정하고, 꼭 한 두 개씩 빼먹어서 다시 PR을 올리게 된다.
이럴 때 반복되는 workflow를 분리할 수 있는 Reusing workflow에 대해서 정리한다. (composition도 있으나 필요에 따라 적용한다. 이 내용은 3-3의 이미지 출처를 참고하면된다.)
called는 말 그대로 호출되는 쪽인데, shared되는 workflow라고 보면된다.
caller는 말그대로 호출하는 쪽이다. called(shared)를 호출해서 사용하는 workflow이다.
실제 작업시에는 다른 이름의 yml로 작성하는 것이 좋겠지만, 이번 글에선 빠른 이해를 위해 caller, called(or shared)로 작성한다.
여러 workflow에서 중복되는 부분을 called.yml
로 작성한다.
.github/worflow/called.yml
name: Reusable workflow example
on:
workflow_call:
inputs:
username:
required: true
type: string
jobs:
reusable_workflow_job:
name: deploy
runs-on: ubuntu-latest
steps:
- run: |
echo ${{ inputs.username }}
echo ${{ secrets.SECRET_TEST_KEY }} # github secrets
2-1.의 called.yml
을 호출하는 workflow
이다.
예를들면 a-caller.yml
, b-caller.yml
의 중복되는 부분을 called.yml
로 작성해서 아래처럼 호출하고, 그 외 중복되지 않는 작업은 각 파일에서 또 다른 job
으로 작성하면 된다.
아래 예시는 동일한 repo에 있는 yml을 사용하는 예시인데, public한 다른 repo의 yml을 호출할 수도 있고, 동일한 organization에 속한 경우 secrets을 공유할 수도 있다고 하니 필요에 따라 적용하면된다.
.github/worflow/caller.yml
name: Call a reusable workflow
on:
push:
branches:
- test-actions
jobs:
call-workflow-passing-data:
name: caller
uses: ./.github/workflows/called.yml
with:
username: hello
secrets: inherit
내가 가장 애를 먹었던건 caller.yml을 작성하는 것이었는데, 그 이유는 reusing workflow를 호출하는 job에서 runs-on
세팅을 해서 아래와 같은 github actions 에러를 만나게 됐다.
inputs
과 secrets
정보만 넘기고, 호출하는 것이고runs-on
세팅을 하면 된다.Unexpected value 'uses'
Unexpected value 'with'
secrets
도 jobs.<job_id>.secrets.inherit
을 사용하여 secrets
정보를 넘길 수 있다. called.yml
에서 jobs.<job_id>.environment
설정을 해서 secrets
을 사용하면된다.
https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idwith
reusing workflow 도큐먼트를 대충보고 적용하면 비슷한 key때문에 동작하지 않는 workflow를 만날 수 있을 것이다. job
의 with
, uses
를 사용해서 reusing workflow를 호출할 수 있는 것이지, 현재까지는 steps
에서 호출할 수 있는 방법은 없다. steps
에서 필요한 동작이라면 composition
을 사용해야한다.
또한 reusing workflow에서도 모든 기능을 지원하는것은 아니고 limitation이 있으니, 요구사항에 맞게 필요한 workflow를 선택해야한다.
나 같은 경우는 같은 repositiory에 중복된 workflow를 분리하는 것이었기 때문에 secrets 공유가 필요했다.
github actions의 기능이 점점 더 좋아지고 있다. "이게 필요한데 있을까?"하고 검색하면 왠만한 기능은 있는 것 같다. document가 양이 많아서 그렇지.. 정말 정리가 잘 되어있다.
단점은.. local testing인데 reusing workflow는 이 글을 작성하는 현재 아직 https://github.com/nektos/act 에서 지원해주지 않는다. ㅠㅠ
Error: reusable workflows are currently not supported (see https://github.com/nektos/act/issues/826 for updates)
아무튼 유용한 기능이 나와서 오랜만에 신나게 적용하고 정리해봤다!