🛠️
OpenAPI のスキーマが変わった時に通知して型など諸々を自動で生成する GitHub Actions
昨今では API のスキーマから型を生成することはフロントエンド界での基本的エンジニア権とされていますが、これはバックエンドとフロントエンドでレポジトリが分かれている場合にややワークフローが煩雑になります。
これを楽にするための GitHub Actions の設定を書いてみたのでご紹介します。
何もない時のワークフロー
- OpenAPI スキーマを生成する
- 中身をコピって別レポジトリにはっつける
- npm run generate:all を実行して諸々を生成する
- PR 作ってマージ
というのをアップデートする度にやる必要があり地味に面倒です。
ので GitHub Actions で 2〜4 を自動化しちゃいましょう。
スキーマから生成して PR を作る Actions を作成
まずはフロント側のレポジトリで実行する Action を作ります。
やっていることは npm run generate:all
という諸々を生成(aspida とか)するスクリプトを実行して PR を作っています。
workflow_dispatch
と repository_dispatch
で手動でも API 経由でも実行できるようにしています。
name: Update OpenAPI
on:
workflow_dispatch:
repository_dispatch:
types:
- update-openapi
jobs:
update-icon:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
fetch-depth: 0
- uses: actions/setup-node@v2
with:
node-version: "16.x"
- name: Install
run: npm ci
- name: Generate files from schema
run: npm run generate:all
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
token: ${{ secrets.REPO_ACCESS_TOKEN }}
commit-message: "update openapi"
committer: GitHub <noreply@github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
branch: feature/update-openapi
branch-suffix: timestamp
delete-branch: true
title: "OpenAPI のアップデートと諸々の生成"
body: updated openapi
スキーマを他レポジトリに突っ込む & 先ほどの Action を実行する Action
次にバックエンド側で openapi に変更があった場合に、その openapi ファイルをフロント側のレポジトリに突っ込んで先ほど作った Action を実行します。
name: Dispatch OpenAPI Schema Update
on:
push:
branches: [develop]
jobs:
copy-file:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- uses: technote-space/get-diff-action@v4.0.1
with:
PATTERNS: docs/openapi.yml
- name: Pushes test file
uses: dmnemec/copy_file_to_another_repo_action@main
env:
API_TOKEN_GITHUB: ${{ secrets.ORG_SECRET }}
with:
source_file: "docs/openapi.yml"
destination_repo: "your_org_name/repo_name"
destination_folder: ""
destination_branch: "develop"
user_email: "hoge@gmail.com"
user_name: "hogehoge"
commit_message: "updated openapi"
if: env.GIT_DIFF
- name: Dispatch update-openapi
uses: peter-evans/repository-dispatch@v1
with:
repository: your_org_name/repo_name
token: ${{ secrets.ORG_SECRET }}
event-type: update-openapi
if: env.GIT_DIFF
以上、これで複数レポジトリでも自動で諸々アップデートできるようになりました!やったね!!
参考
Discussion