github actions에서 reusable workflow사용하기

Inhye Jeong·2022년 6월 23일
0

Github Actions

목록 보기
1/1

github actions로 workflow를 작성하다보면 변수(ex. 도메인, 버킷명 등..)만 바뀌고 대부분의 내용은 비슷한 경우가 많다. 따라서 변경사항이 발생하면 여러 개의 파일을 수정하고, 꼭 한 두 개씩 빼먹어서 다시 PR을 올리게 된다.
이럴 때 반복되는 workflow를 분리할 수 있는 Reusing workflow에 대해서 정리한다. (composition도 있으나 필요에 따라 적용한다. 이 내용은 3-3의 이미지 출처를 참고하면된다.)

1. 용어정리

1-1. caller & called

  • called는 말 그대로 호출되는 쪽인데, shared되는 workflow라고 보면된다.

  • caller는 말그대로 호출하는 쪽이다. called(shared)를 호출해서 사용하는 workflow이다.

    실제 작업시에는 다른 이름의 yml로 작성하는 것이 좋겠지만, 이번 글에선 빠른 이해를 위해 caller, called(or shared)로 작성한다.

2. workflow 작성

2-1. called.yml

여러 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-2. caller.yml 작성

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

3. 트러블 슈팅 및 새롭게 알게된것

3-1. caller.yml에서 Unexpected value 'uses'에러

내가 가장 애를 먹었던건 caller.yml을 작성하는 것이었는데, 그 이유는 reusing workflow를 호출하는 job에서 runs-on세팅을 해서 아래와 같은 github actions 에러를 만나게 됐다.

  • 호출부에서는 넘길 inputssecrets정보만 넘기고, 호출하는 것이고
  • 실제 command를 실행하는 환경에서 runs-on세팅을 하면 된다.
Unexpected value 'uses'
Unexpected value 'with'

3-2. secret을 하나하나 보내지않고 inherit으로 pass한다.

secretsjobs.<job_id>.secrets.inherit을 사용하여 secrets정보를 넘길 수 있다. called.yml에서 jobs.<job_id>.environment 설정을 해서 secrets을 사용하면된다.

3-3. jobs.<job_id>.with은 jobs.<job_id>.steps[*].with 와 다르다.

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idwith

reusing workflow 도큐먼트를 대충보고 적용하면 비슷한 key때문에 동작하지 않는 workflow를 만날 수 있을 것이다. jobwith, uses를 사용해서 reusing workflow를 호출할 수 있는 것이지, 현재까지는 steps에서 호출할 수 있는 방법은 없다. steps에서 필요한 동작이라면 composition을 사용해야한다.

3-3. reusing worflow의 limitation

또한 reusing workflow에서도 모든 기능을 지원하는것은 아니고 limitation이 있으니, 요구사항에 맞게 필요한 workflow를 선택해야한다.
나 같은 경우는 같은 repositiory에 중복된 workflow를 분리하는 것이었기 때문에 secrets 공유가 필요했다.

4. 정리

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)

아무튼 유용한 기능이 나와서 오랜만에 신나게 적용하고 정리해봤다!

profile
Frontend Engineer in @KakaoStyle

0개의 댓글