From 1665820f9724856848b76f8a34a2763c445b2ef5 Mon Sep 17 00:00:00 2001 From: Marshall Ku Date: Sun, 18 Feb 2024 18:40:19 +0900 Subject: [PATCH] Add post --- apps/blog/_posts/dev/reuse-github-actions.mdx | 219 ++++++++++++++++++ .../public/images/2024/02/ci-job-failed.png | Bin 0 -> 14222 bytes .../public/images/2024/02/reuse-workflow.png | Bin 0 -> 23386 bytes 3 files changed, 219 insertions(+) create mode 100644 apps/blog/_posts/dev/reuse-github-actions.mdx create mode 100644 apps/blog/public/images/2024/02/ci-job-failed.png create mode 100644 apps/blog/public/images/2024/02/reuse-workflow.png diff --git a/apps/blog/_posts/dev/reuse-github-actions.mdx b/apps/blog/_posts/dev/reuse-github-actions.mdx new file mode 100644 index 00000000..4836e008 --- /dev/null +++ b/apps/blog/_posts/dev/reuse-github-actions.mdx @@ -0,0 +1,219 @@ +--- +title: Github Actions 워크플로우 재사용하기 +description: Composite Action과 Reusable Workflow를 통해 인생 좀 더 편하게 살기 +date: + posted: 2024-02-18T09:41:19.729Z +tags: + - Github Actions +coverImage: /images/2024/02/reuse-workflow.png +ogImage: /images/2024/02/reuse-workflow.png +--- + +프로젝트를 진행하며 Github Actions를 사용하다 보면 비슷비슷한 형태의 workflow를 반복적으로 사용하는 경우가 많습니다. +Node.js 버전이 변경되거나, 더 나은 방법을 찾았을 때 등 상황에 repository를 돌아다니며 workflow를 수정하는 건 상당히 귀찮은 일입니다. + +이때 재사용할 수 있는 workflow를 만들어 한 군데서 workflow를 관리할 수 있습니다. +예시로, 저도 tag / release 생성, pnpm 환경 구성 등 workflow들을 [`actions`](https://github.com/marshallku/actions)라는 한 repository에서 관리하는 중입니다. + +## `workflow_call` + +### Workflow 생성 + +```yaml +name: Reusable Workflow + +on: + workflow_call: +``` + +`on`에 [`workflow_call`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_call)을 추가하면, 해당 workflow는 다른 workflow에서 호출할 수 있습니다. + +- top level의 `jobs.*.uses`에서**만** 사용할 수 있어, `steps` 중간에 사용할 수 없습니다. +- 네 단계의 nesting만 가능합니다. +- 한 workflow는 최대 20개의 reusable workflow를 호출할 수 있습니다. +- `env` context는 공유되지 않습니다. + +등의 [제약](https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations)이 있지만, `secret`도 사용할 수 있고, 기존에 사용하시던 workflow에 `workflow_call`만 추가하면 바로 사용해볼 수 있습니다. + +```yaml +name: Reusable workflow + +on: + workflow_call: + inputs: + message: + description: "A message to include in the greeting" + type: string + required: true + secrets: + url: + description: "The URL to post the message to" + required: true + +jobs: + run: + name: Send greeting message + runs-on: ubuntu-latest + steps: + - name: Send message + shell: bash + run: | + echo "${{ inputs.message }}" > message.txt + curl -X POST -d @message.txt ${{ secrets.url }} +``` + +위와 같이 `input` 뿐 아니라, `secrets`도 추가하실 수 있습니다. +yaml 파일에서 확인하실 수 있듯, 일반적인 workflow를 작성하는 것과 거의 동일합니다. + +### Workflow 호출 + +```yaml +jobs: + call-reusable-workflow: + name: Call reusable workflow + runs-on: ubuntu-latest + steps: + - name: Call reusable workflow + uses: ./.github/workflows/reusable-workflow.yml + with: + message: "Hello, world!" + secrets: + url: ${{ secrets.URL }} +``` + +`uses`에 호출할 workflow의 경로를 입력하면 해당 workflow를 호출할 수 있습니다. +다른 repository에서 호출하실 때는 `owner/repo/path/to/workflow.yml@ref` 형태로 입력하시면 됩니다. + +![failed to run job](/images/2024/02/ci-job-failed.png) + +일례로, 저는 제가 관리하는 repository들에 [CI 파이프라인](https://github.com/marshallku/marshallku-blog-cdn/blob/master/.github/workflows/ci.yml)을 추가해두고, 작업이 실패할 때마다 [Discord로 알림이 오게](https://github.com/marshallku/actions/blob/master/.github/workflows/send-notification.yml) 설정해두었습니다. +git push하고 얼마 지나지 않아 discord 알림이 오는 소리가 나면 식은땀이 조금 나면서 심장 박동이 빨라진다는 것만 제외하면, 정말 유용한 기능입니다. + +## `repository_dispatch` + +### Workflow 생성 + +[`repository_dispatch`](https://cli.github.com/manual/gh_api)를 사용하면, 외부에서도 workflow를 호출할 수 있습니다. + +```yaml +name: Reusable Workflow + +on: + workflow_dispatch: + repository_dispatch: + types: [my-event-type] + +jobs: + echo: + if: ${{ !github.event.client_payload.passed }} + runs-on: ubuntu-latest + steps: + - env: + MESSAGE: ${{ github.event.client_payload.message }} + run: echo "$MESSAGE" +``` + +기본적인 사용법은 `repository_dispatch`를 추가하고, `types`에 이벤트의 타입을 추가하면 됩니다. + +입력값을 전달하는 부분에 차이가 조금 있는데, `repository_dispatch`에서는 `client_payload` 파라미터를 통해 데이터를 전달할 수 있습니다. + +### Workflow 호출 + +```yaml +trigger: + runs-on: ubuntu-latest + steps: + - run: | + gh api /repos/$OWNER/$REPO/dispatches \ + --method POST \ + --field event_type=my-event-type \ + --field client_payload[passed]=false \ + --field client_payload[message]="Testing workflow" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +``` + +예제로는 [github api](https://cli.github.com/manual/gh_api)를 사용해 workflow에서 호출했지만, 외부에서 rest api 등을 사용해서도 호출할 수 있습니다([api 문서 참고](https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#create-a-repository-dispatch-event)). + +## Composite Action + +workflow를 만들다 보면, 알림 발송처럼 한 단계만을 위한 job도 많지만, pnpm 환경 구성처럼 여러 단계 중 일부가 반복되는 경우도 많습니다. +하지만 `workflow_call`은 상술한 것처럼 `steps` 중간에 사용할 수 없습니다. + +이때 사용할 수 있는 것이 [Composite Action](https://docs.github.com/en/actions/creating-actions/creating-a-composite-action)입니다. + +### Action 생성 + +```txt +. +├── .github +│ └── workflows +│ └── my-workflow.yml +└── my-action + └── action.yml +``` + +기존에 `.github/workflows`에 workflow를 작성하던 것과는 다르게, 폴더 내에 `action.yml`을 추가하셔야 합니다. + +```yaml +name: My composite action +description: My example composite action + +inputs: + name: + description: User name to greet + required: false + default: "Anonymous" + +outputs: + message: + description: Greeting message + value: ${{ steps.greeting.outputs.message }} + +runs: + using: composite + steps: + - name: Display greeting + id: greeting + shell: bash + run: | + message="Hello, ${{ inputs.name }}" + echo "message=$message" >> $GITHUB_OUTPUT + - run: echo "This script only runs if the condition is true" + shell: bash + if: ${{ inputs.name == 'Marshall' }} +``` + +작성 방식에 이젠 차이가 조금 생겼습니다. + +- `on` 조건이 없습니다. +- `using: composite`을 추가해야 합니다. +- 하나의 job만 실행할 수 있습니다. +- `shell`을 명시적으로 추가해야 합니다. + +다행히 조건문을 사용할 수 있긴 하지만, 하나의 job만 실행할 수 있기에 둘 이상의 job에 dependency가 있는 등 복잡한 workflow를 온전한 형태로 가져오기는 어렵습니다. + +### Action 호출 + +```yaml +greeting: + runs-on: ubuntu-latest + steps: + - uses: owner/repo/greeting@ref + id: greeting + with: + name: "Marshall" + - run: echo ${{ steps.greeting.outputs.message }} +``` + +다른 일반적인 action과 마찬가지로, `uses`에 호출할 action의 경로를 입력하면 됩니다. +`workflow_call`과는 다르게 step 중간에 사용할 수 있어, 훨씬 유연하게 사용할 수 있습니다. + +## 맺으며 + +개인적으로 새 프로젝트를 시작할 때마다 기존에 사용하던 bash script와 workflow들 복사하고, 업데이트할 일 생기면 repository 돌아다니며 수정하는 게 상당히 귀찮았는데, [위 방법들을 사용](https://github.com/marshallku/actions)하고부터 이런 잡무가 많이 줄었습니다. +`ref`를 `master`로 고정해두고 관리하고 있어 그리 안전하진 않을 수 있는데, 실수할 사람이 당장에는 저밖에 없으니 관리하는 공수를 줄이는 것만 생각했습니다. + +외부에서 호출할 일은 사실 그리 많지 않아 `repository_dispatch`는 한 프로젝트에밖에 사용해보지 않았고, `secrets`가 필요하면 reusable workflow를, 아니면 composite action을 사용하는 방식으로 구분해서 사용하고 있습니다. + +불필요하게 신경 쓸 것들을 줄이고 가벼운 마음으로 프로젝트를 진행하시는 데 도움이 되셨길 바라며, 이상으로 글을 마칩니다. diff --git a/apps/blog/public/images/2024/02/ci-job-failed.png b/apps/blog/public/images/2024/02/ci-job-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..c592ea32f19a6c2561b1e9864dbb3bc22613b0bf GIT binary patch literal 14222 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 literal 0 HcmV?d00001 diff --git a/apps/blog/public/images/2024/02/reuse-workflow.png b/apps/blog/public/images/2024/02/reuse-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ef6c4203d6a0eab922a95e33701b582006edd0 GIT binary patch literal 23386 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 W