スキーマファーストで開発する場合、OpenAPIとかで定義を書いてから、サーバサイドのI/FやクライアントSDKを自動生成する。
手動でやるとクライアントSDKの生成を忘れことがよくあるので、自動化したい。
GitHub Actionsで生成〜Pull Request作成までを自動化してみる。
目次
前提
以下のような構成を想定する。
今回はサーバサイドのリポジトリにおける、クライアントSDK用コードの自動生成を試す。
サーバ開発の流れとしては、以下想定。
- Openapi.yamlにAPI定義を記載する
- Openapi.yamlに定義されたAPI仕様から、サーバサイドのI/Fを自動生成する
- I/F仕様に基づき実装する -> サーバサイドの実装完了
- Openapi.yamlに定義されたAPI仕様から、クライアントサイドのSDK(Java用)を自動生成する
- 生成されたクライアント用のSDKはprivateなmaven repositoryに配置しておく
- クライアントサイドは、private maven repositoryからクライアント用SDKを取得し、サーバのAPI呼び出しに利用する
Openapi.yamlを別リポジトリに配置するとか、クライアント用SDKとして複数言語生成した場合どうするとか色々あると思うが、とりあえず全部Java想定で試作する。
やること
- openapi.yamlの変更検知
検知したらGitHub Actionsを起動する - ビルドバージョンを更新
今回はマイナーバージョンをインクリメントする運用としてみる - openapi generateする
タスクランナー(Gradle)にgenerateコマンドが用意されている想定 - GitHubにCommit & Push
- Pull Request作成
Java用GitHub Actions用意
GitHub ActionsのテンプレートはJava環境を用意しておく。
1 | jobs: |
openapi.yamlの変更検知
対象ブランチにpushされたときを想定で以下のような感じ。
今回はmainブランチにpathに記載のファイルがpushされた場合に起動するように記載。
Pull Requestがマージされたときという書き方でもいい気がする。
1 | on: |
ビルドバージョンを更新
Gradle想定なので、jar生成前にbuild.graleに記載のバージョンを更新したい。
そのため、バージョンをgradle.properties
に記載しておき、build.gradleにはこのプロパティから読み込む設定にする。
GitHub Actionsの中でgradle.properties
に記載のバージョンを取得&書き換えをおこなう。
まずはgradle.properties
にバージョン情報記載
1 | apiVersion=1.0.0 |
build.gradle
はそのバージョンを読み込むように記載する
1 | : |
で、GitHub Actionsは以下のように設定して、gradle.properties
から現行バージョン取得 & バージョンをパース & マイナーバージョンの書き換え をする。
1 | - name: VUP |
openapi generateする
build.gradle
でgenerate用のタスクを用意している想定で、以下の通り。
openapi-generator-cliとかをdockerで引っ張ってきてもいい。
1 | - name: Generate with Gradle |
GitHubにCommit & Push
生成したコードをCommit & Pushする。
1 | - name: Get branch |
git操作はGitHub Actionsで自動生成されているsecrets.GITHUB_TOKEN
が利用されるので、特に気にしないでOK
エラーが出る場合は、permissions
を確認すること。ここでsecrets.GITHUB_TOKEN
の権限が設定される。
参考:権限の種類
適当なテンプレートを使うと、この辺が絞られているため、git push
でエラーになることがある。
権限がないと以下のようにリポジトリが見つからないエラーになった。
(privateリポジトリだからnot foundになったのかな?publicだと権限エラーになる?)
1 | Push to branch main |
Pull Request作成
actions/github-scriptというのを使うと、GitHub APIが叩けるので、それを使って Pull Request を作る。
1 | - name: Create pull request |
actions/github-script
は、Stepで定義した変数をprocess.env.XXXX
で読み込めるので、その辺をうまく使っていろいろやる。
おわりに
権限周りでハマってしまい試作に時間かかったが、これでコード自動生成ができた。
実際には、生成後にビルド&単体テストとか入れ込んでからPull Request生成するようにする。
あとはこのPull Requestがマージされたら、jarを生成してpublishするActionを用意すれば、実際に使えそう。
仕様書もReDocとかで生成して、どこかに配置するようにすれば完璧。
OpenAPIに限らず、gRPCとかスキーマ駆動で開発するものには応用できるはず。どんどん作業効率化していきたい。