actions-setup-docker-compose, sonar-update-center-actionやsauce-connect-actionなど5つくらいActionを実装したので、Tipsをここにまとめます。
公式テンプレートを使う
TypeScriptでGitHub Actionを書くためのテンプレートが公開されています。とりあえずこのテンプレートを使うのがおすすめです。
使っているのはnpm
, jest
, @vercel/ncc
, eslint
, prettier
とオーソドックスなもの。jest
が気に入らなければ置き換えても構わないでしょう。
公式ドキュメントとライブラリに目を通す
さらっとで良いので以下のページは読んでおくといいです。どういった情報がどこにあるのか、これをするために何を使えばいいのか、情報の場所を掴んでおきます。
特に以下は必要になる知識だと思われます:
- コマンドの実行は
execa
のようなライブラリではなく@actions/exec
を使う - GitHub APIの利用は
octokit
直呼び出しではなく@actions/github
にある getOctokit() を使う - ファイル操作は
fs
モジュール直呼び出しではなく@actions/io
を使う
Fixtureの作成と読込
単体テストでは api.github.com
との通信を再現してコードの挙動を見ていくことになります。一応 docs.github.com に期待されるステータスコードやそのペイロードが書かれていますが、まだ内容が間違っていることがあったので実際にコードを回して確認することを薦めます。ドキュメントよりは @octokit/rest
の型情報のほうが信用できます。
レスポンスを再現するためのFixtureは、JSON.stringify(response.data)
をJSONファイルに保存して作成します。tsconfig.json
に"resolveJsonModule": true
を設定すればJSONファイルをそのままオブジェクトとしてimportできるので便利です。
// quoted from https://git.io/JIchk import releases from './fixtures/sonarqube-releases.json' const token = process.env.GITHUB_TOKEN if (!token) { throw new Error('No GITHUB_TOKEN env var found') } test('searchLatestMinorVersion()', async () => { const scope = nock('https://api.github.com') .get('/repos/SonarSource/sonarqube/releases') .reply(200, releases) expect(await searchLatestMinorVersion(token)).toBe('8.5.*') })
こうしたテストの面倒を見てくれる@octokit/fixtures
もあるようですが、私はまだnock
しか使っていないので詳しいことは不明です。
Changelog Blogを購読する
Actions周りはまだ動きが活発で、最近も add-path
コマンドなどが削除されたばかりです。
変更に追従するためにもChangelog Blogは購読をすると良いでしょう。
TBU: まだ自動化できていないこと
- dependabot が依存を更新したら
dist
ディレクトリ以下のファイルも更新するpull_request
イベントでActionを発火させて、npm run all
した結果をcommit & pushするようにすればできるはず
2021年8月29日更新:下記、2つやり方をまとめました。