🛠️

OpenAPI のスキーマが変わった時に通知して型など諸々を自動で生成する GitHub Actions

2022/09/02に公開

昨今では API のスキーマから型を生成することはフロントエンド界での基本的エンジニア権とされていますが、これはバックエンドとフロントエンドでレポジトリが分かれている場合にややワークフローが煩雑になります。

これを楽にするための GitHub Actions の設定を書いてみたのでご紹介します。

何もない時のワークフロー

  1. OpenAPI スキーマを生成する
  2. 中身をコピって別レポジトリにはっつける
  3. npm run generate:all を実行して諸々を生成する
  4. PR 作ってマージ

というのをアップデートする度にやる必要があり地味に面倒です。
ので GitHub Actions で 2〜4 を自動化しちゃいましょう。

スキーマから生成して PR を作る Actions を作成

まずはフロント側のレポジトリで実行する Action を作ります。
やっていることは npm run generate:all という諸々を生成(aspida とか)するスクリプトを実行して PR を作っています。

workflow_dispatchrepository_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

以上、これで複数レポジトリでも自動で諸々アップデートできるようになりました!やったね!!

参考

https://github.com/marketplace/actions/push-a-file-to-another-repository
https://ayumitamai97.medium.com/continuously-generate-typescript-typings-from-graphql-schema-across-multiple-repositories-ja-fdb2c99c7f1c

Discussion