ホーム自己紹介ブログ
NO.98
DATE2023. 01. 03

GitHub ActionsとPull Requestを活用した、同期の自動化

あけまして、おめでとうございます。神社のおみくじで、人生はじめて大吉を引きました、silverbirder です。

普段の業務で、Figma のデザイントークンや API のスキーマファイル、i18n のメッセージファイルなどを、フロントエンドへ同期するコミュニケーションが不毛に感じています。そこで、GitHub Actions と Pull Request を活用して、同期コミュニケーションを削減する仕組みを紹介します。

目新しい情報はないかもしれませんが、同じお困りごとを持つ人へ助けになれば、幸いです。

GitHub Actions で使用するもの

今回紹介する仕組みの核となるのが GitHub Actions の repository-dispatch トリガーです。

リポジトリの REST API エンドポイント - GitHub ドキュメント
REST API を使って、GitHub 上のリポジトリを管理します。
docs.github.com

このトリガーは、GitHub API を経由して、GitHub Actions のワークフローを起動することができます。そのため、次のように 異なるリポジトリでの GitHub Actions ワークフローを連携できます。

efac2e9d6d0821370603fe52c9cac4017da30ca64df4949c264605124386e36d
efac2e9d6d0821370603fe52c9cac4017da30ca64df4949c264605124386e36d

repository-dispatch と create-pull-request は、次の GitHub Actions です。

https://github.com/peter-evans/repository-dispatch https://github.com/peter-evans/create-pull-request

  • respository-dispatch
    • repository-dispatch-event を dispatch する Action
  • create-pull-request
    • Pull Request を作成する Action

これらの GitHub Actions を使わずに gh などを使って代替できますが、便利なモノを使って楽をします。

GitHub リポジトリ以外からのトリガー

GitHub のリポジトリ(username/other)からトリガーだけでなく、他のサービスからでもトリガーできます。例えば、Google Sheets からだと、Google Apps Script から GitHub API を呼べばよいです。

207138540b3a001131d8bda0a09520285fb6b001d967242fbca20b8c8db88e0e
207138540b3a001131d8bda0a09520285fb6b001d967242fbca20b8c8db88e0e

他にも、Kibela の outgoing webhook を、Server が受けて、Server が GitHub API を呼び出す方法があります。

e3da40e838b6c83226e0337b3e7e920b1eadb09c1be118fa6ab9087d0a5e35ba
e3da40e838b6c83226e0337b3e7e920b1eadb09c1be118fa6ab9087d0a5e35ba

Server は、IFTTT や Zapier のようなサービスでも良いですし、自前のサーバーでも良いでしょう。

自動 commit

schema ファイルから、型を生成したい(yarn codegen)こともあると思います。そういうときは、次のフローを追加します。

84bd13ddb0d7a355068241f2f6a56fad73521f96b19930891ace4a223c2aeee0
84bd13ddb0d7a355068241f2f6a56fad73521f96b19930891ace4a223c2aeee0

git-auto-commit-action は、変更したファイルを git commit するだけの Action です。

GitHub - stefanzweifel/git-auto-commit-action: Automatically commit and push changed files back to GitHub with this GitHub Action for the 80% use case.
Automatically commit and push changed files back to GitHub with this GitHub Action for the 80% use case. - stefanzweifel/git-auto-commit-action
github.com

create-pull-request だけでも、自動 commit することができます。私は、次のケースで使用しました。

  • Figma のDesign Tokensで、Figma 上から Pull Request を作成する。
    • GitHub Actions で、style dictionary の build したものを commit したい
on:
  pull_request:
    types: [opened]
jobs:
  update:
    if: startsWith(github.head_ref, 'figma/')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
      - run: npm ci
      - run: npx style-dictionary build
      - uses: stefanzweifel/git-auto-commit-action@v4

Preview

Figma のデザイントークンや、i18n のメッセージファイルを更新したとき、Preview できる仕組みがあると、画面の確認ができて、良いです。

77341dff8054c17e4df812bd7d2bf51737cc4e3c3ce113168e878f8030b18a31
77341dff8054c17e4df812bd7d2bf51737cc4e3c3ce113168e878f8030b18a31

例えば、vercel や chromatic の preview です。

https://vercel.com/docs/concepts/deployments/preview-deployments https://www.chromatic.com/docs/review

サンプルコード

i18n のメッセージファイルをフロントエンドへ同期する GitHub Actions を、紹介します。

repositoryやること
username/frontendi18n のメッセージファイルを利用
username/messagei18n のメッセージファイルを管理
253d2d7c485f079449b9bf2b259f325d45156b1d538d78bda0c158049af50dfe
253d2d7c485f079449b9bf2b259f325d45156b1d538d78bda0c158049af50dfe
## <username/message>/.github/workflows/main.yml
on:
  push:
    branches:
      - main
    paths:
      - "i18n/**"
jobs:
  dispath:
    name: Setup
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: peter-evans/repository-dispatch@v1
        with:
          repository: username/frontend
          token: ${{ secrets.PAT }}
          event-type: create-pull-request-message
          client-payload: '{"ref": "${{ github.ref }}"}'
## <username/frontend>/.github/workflows/main.yml
on:
  repository_dispatch:
    types: [create-pull-request-message]
jobs:
  createPullRequest:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/checkout@v3
        with:
          repository: username/message
          ref: ${{ github.event.client_payload.ref }}
          path: "tmp/"
      - run: |
          mv tmp/message.json src/message.json
          rm -rf tmp
      - uses: actions/setup-node@v3
      - run: npm ci
      - run: yarn generate:message
      - uses: peter-evans/create-pull-request@v4

受け入れテストをマークダウンで管理

安心してマージできるように、受け入れテストを整備しておきましょう。

具体的には、cucumberで仕様書をMarkdown(MARKDOWN_WITH_GHERKIN)で管理します。

例えば、次のような仕様書です。

## Feature: Staying alive
 
This is about actually staying alive,
not the [Bee Gees song](https://www.youtube.com/watch?v=I_izvAbhExY).
 
## Rule: If you don't eat you die
 
![xkcd](https://res.cloudinary.com/silverbirder/image/upload/v1693363969/silver-birder.github.io/blog/lunch_2x.png)
 
`@important` `@essential`
 
### Scenario Outline: eating
 
- Given there are <start> cucumbers
- When I eat <eat> cucumbers
- Then I should have <left> cucumbers
 
#### Examples:
 
| start | eat | left |
| ----- | --- | ---- |
| 12    | 5   | 7    |
| 20    | 5   | 15   |

この Markdown も、GitHub Actions で Pull Request するフローに載せましょう。新しいシナリオが追加された場合、(cucumber のライブラリ上) テストコードが存在しないとエラーとなります。

機能で担保したいシナリオを Markdown で管理していくことで、次のメリットがあります。

  • 仕様が明確になる
  • CI で受け入れテスト(cucumber)を動かし成功すると、仕様を満たす状態 となる

ハマったこと

GitHub Actions Bot の commit で、他のワークフローをトリガーできない

Github actions workflow not triggering with tag push · community · Discussion #27028
I have a workflow with 2 actions. The first action is triggered when a push is made to the branch and pushes new git tag and the second action is triggered when after a new tag is pushed. However, ...
github.com

token に、PAT を渡すように変更すれば解決します。

他の解決策としては、workflow_run のトリガーを使えます。

ワークフローをトリガーするイベント - GitHub ドキュメント
GitHub で特定のアクティビティが発生したときに、スケジュールした時刻に、または GitHub の外部でイベントが発生したときに、ワークフローが実行されるように構成できます。
docs.github.com

ただし、デフォルトブランチでのみ動作します。

repository-dispatch の POST は、JSON で制限がある

GitHub - peter-evans/repository-dispatch: A GitHub action to create a repository dispatch event
A GitHub action to create a repository dispatch event - peter-evans/repository-dispatch
github.com

同期したいファイルを json に変換して、dispatch する event ペイロードに含めようと、当初考えていました。ただ、次の懸念があったため、却下しました。

  • json にしてしまうとコメントが消える
  • JSON のバイトサイズに上限がある

そこで、同期したいリポジトリの github.ref を event ペイロードに含めて、event を受けた側がソースコードをチェックアウトして使う方針に切り替えました。

終わりに

GitHub Actions と Pull Request を活用することで、自動的にアプリケーションのソースコードを更新する仕組みを簡単に組み立てられます。 このような Ops があれば、Slack でのメッセージラリーをする回数が減らせられます。ぜひ、ご活用ください。

DevOps
開発ツール

-

シェアする

フォローする

次のページ

zodのrefineにあるpathにハマった

前のページ

2022年の振り返り。転職と妊活

関連する記事

タグ「DevOps」の記事

Unleashで始めるフィーチャーフラグ

フィーチャーフラグ(Feature Flag)をご存知でしょうか?これは新機能のリリース制御やABテストを容易にする強力なツールです。しかし、適切な管理ツールなければ、フィーチャーフラグの管理は容易なことではありません。今回は、そんなフィーチャーフラグの管理を効率化するツール、**Unleash**について解説します。

2023-06-29

DevOps
CI/CDのDaggerで、GithubActionsとCircleCIにシュッと連携してみた

前々から気になっていた、CI/CD の非ベンダーロックインな Dagger というツールを試してみました。本記事では、試した内容について共有しようと思います。

2022-08-23

バックエンド
DevOps
クローリング
CircleCI + BackstopJS (Puppeteer) でビジュアルリグレッションテストを継続的に監視する

CircleCIとBackstopJSを組み合わせて、『継続的にWebページの視覚的な変化を監視するツール』を作成しました。

2019-11-15

DevOps
テスト

タグ「開発ツール」の記事

Disqusに広告が表示されるようになった

ブログ記事のページ下部に、Disqusを設置しています。 急遽、Disqusの上下に良くわからない広告が大量に表示されるようになりました。 Disqusのメール メールボックスを漁ってみると、以下のメールがありました。 Disqusからのメ

2026-02-06

開発ツール
DuckDB WASMとOPFSでGoogleマイアクティビティをブラウザ完結で可視化してみた

DuckDB WASMとOrigin Private File System (OPFS) を組み合わせ、Google マイアクティビティの履歴をブラウザ内に閉じたまま扱えるようにしたときの設計と学びを整理しました。

2025-09-17

開発ツール
ブラウザ
Million Lintを試してみた

Million.devを知り、少し試してみました。Million.jsについて このライブラリは、React DevToolsのProfilerより簡単にプロファイリングできるみたいです。 パフォーマンスのプロファイリングは通常、面倒で時間のかかる作業です。もしもこれを簡単に実行できるのであれば、めちゃくちゃ捗るなとわくわくしました。

2024-03-21

テスト
開発ツール
← ブログ一覧へ