GitHub Actionsで定期的にライブラリーの更新を確認するためのactionを作った: npm, nuget, gradle
最近ついに自作OSSライブラリーのメンテをする気になってきたのですが、使用しているライブラリーの更新情報を追うのが面倒だなぁ~~ということでGitHub Actionsを使ってSlackやらなんやらに通知するためのactionを作ったのでご紹介
作った奴
npm版:
GitHub - MeilCli/npm-update-check-action: npm new package version check action for GitHub Actions.
npm new package version check action for GitHub Actions. - MeilCli/npm-update-check-action
github.com
NuGet版:
GitHub - MeilCli/nuget-update-check-action: nuget new package version check action for GitHub Actions.
nuget new package version check action for GitHub Actions. - MeilCli/nuget-update-check-action
github.com
Gradle版:
GitHub - MeilCli/gradle-update-check-action: gradle maven new package version check action for GitHub Actions.
gradle maven new package version check action for GitHub Actions. - MeilCli/gradle-update-check-action
github.com
こいつらどういうactionかと言うと、各Package Managerに問い合わせて更新があるかどうかとその更新情報をactionのoutputとして返してくれるという感じの品物です。その後のstepでSlackとかTwitterとかに通知するactionを呼んで好きなところに通知すればいいという設計です
npm-update-check-action
npm版ではaction内でnpm outdated
コマンドを呼び出すようにしています。そしてその実行結果を処理してoutputに排出してくれます
Example
name: Check Package
on:
schedule:
- cron: '0 8 * * 5' # every friday AM 8:00
jobs:
npm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- run: npm install
- uses: MeilCli/npm-update-check-action@v2
id: outdated
- uses: 8398a7/action-slack@v2
if: steps.outdated.outputs.has_npm_update != 'false'
with:
status: ${{ job.status }}
text: ${{ steps.outdated.outputs.npm_update_text }}
author_name: GitHub Actions
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
例として8398a7/action-slackを使ってSlackに通知するWorkflowを用意しました
ここではon: schedule:
のcron
で毎週金曜の朝に定期実行するようにしてあげてます、頻度は(現実的な範囲で)お好きなように設定すればいいと思いますがあまりにも高頻度だと通知がうざいと思いますw
MeilCli/npm-update-check-action
を使用する前にnpm install
で依存関係を解決しておく必要があります
実行には後述するいくつかのinputが使用できますが、リポジトリーのトップにpackage.json
があるならば引数なしでもいいです。ただ、outputを利用するためになんらかのid
を設定しておく必要があります
実行が終わったら8398a7/action-slack
でSlackに通知します。更新がない場合に通知が飛んでくるのもうざいのでif
のところで更新がある場合のみ通知するようにしてあげます。他はお好きにカスタムしてあげればいいと思います
実際に通知が飛ぶとこんな感じになります
input/output
主要なinput:
output_text_style
- 後述のoutputの
npm_update_text
のテキストスタイルを指定します。語尾にURLが付くかどうかの差しかないので省略していいと思います
- 後述のoutputの
output:
has_npm_update
- 更新があるかどうかを
true
orfalse
で返してくれます。ただstep.if
とかで比較するときは文字列として比較してあげる必要があります
- 更新があるかどうかを
npm_update_text
- あらかじめ用意してる雑フォーマットで更新情報をテキストスタイルで返してくれます
npm_update_json
- 通知スタイルをカスタムしたい人向けにjson形式を返すようにしてます
nuget-update-check-action
nuget版ではaction内でdotnet list package --outdated
コマンドを呼び出すようにしています。そして例のごとくその実行結果を処理してoutputに排出してくれます
Example
name: Check Package
on:
schedule:
- cron: '0 8 * * 5' # every friday AM 8:00
jobs:
nuget:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-dotnet@v1
with:
dotnet-version: '3.0.100'
- run: dotnet restore
- uses: MeilCli/nuget-update-check-action@v1
id: outdated
- uses: 8398a7/action-slack@v2
if: steps.outdated.outputs.has_nuget_update != 'false'
with:
status: ${{ job.status }}
text: ${{ steps.outdated.outputs.nuget_update_text }}
author_name: GitHub Actions
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
例のごとく例として8398a7/action-slackを使ってSlackに通知するWorkflowを用意しました
細部は例のごとくnpm版と同じですが、actionを実行する前にactions/setup-dotnet
とdotnet restore
をしておく必要があります。あとdotnet list package
を使うのでインストールする.NET Coreは2.2以上が必要です
input/output
主要なinput:
highest_minor
- メジャーバージョンは固定でそれ未満のマイナーバージョンでの更新を確認してくれるみたいです(
dotnet list package --outdated
のオプション)
- メジャーバージョンは固定でそれ未満のマイナーバージョンでの更新を確認してくれるみたいです(
highest_patch
- 上と同様にメジャーバージョンとマイナーバージョンは固定でそれ未満のパッチバージョンでの更新を確認してくれるみたいです
include_prerelease
- 更新確認時にプレリリース版を含むかどうか
output:
has_nuget_update
nuget_update_text
nuget_update_json
例のごとくoutputはnpm版とほぼ同じですが、名前を変えてるので注意
gradle-update-check-action
gradle版では、gradleに標準でmaven packageに更新を確認する手段がないのでben-manes/gradle-versions-pluginを使うことにしました。そして例のごとくその実行結果を処理してoutputに排出してくれます
Example
name: Check Package
on:
schedule:
- cron: '0 8 * * 5' # every friday AM 8:00
jobs:
maven:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Grant permission
run: chmod +x gradlew
- uses: MeilCli/gradle-update-check-action@v1
id: outdated
- uses: 8398a7/action-slack@v2
if: steps.outdated.outputs.has_maven_update != 'false'
with:
status: ${{ job.status }}
text: ${{ steps.outdated.outputs.maven_update_text }}
author_name: GitHub Actions
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
例のごとく例として8398a7/action-slackを使ってSlackに通知するWorkflowを用意しました
細部は例のごとくnpm版と同じですが、actionを実行する前にactions/setup-java
を実行しておく必要があります。また、リポジトリーにはgradle wrapper filesを含んでおく必要があります(こんな感じ)。Androider的にはgradle wrapper filesは含んでおくことのほうが多いので問題にはならないと思いますが、もし含んでないのであれば何らかの方法でaction実行前に含むようにしておく必要があります
input/output
主要なinput:
skip_plugin_dependency
- gradleのpluginを使ってるのでactionでは一時的にbuild.gradleにpluginを利用する記述を追加するようにしてます。すでに使用しているリポジトリーのためにそれをスキップする引数を用意しました
revision
- なにやら更新確認する対象をrelease版とかに絞れるらしいですが、違いなどはben-manes/gradle-versions-pluginを見てください
output_text_style
- 例のごとくnpm版と同じです
output:
has_maven_update
maven_update_text
maven_update_json
例のごとくoutputはnpm版とほぼ同じですが、名前を変えてるので注意
おわりに
今回は普段使ってるNuGet・Gradle(Maven)とactionを作るため使ったnpmのライブラリーの更新確認をするactionを作りましたが、これ以外に作って欲しいものがあればリクエストくれれば作るかもしれませんし、私が作らなくてもaction作成は簡単なので今回作ったものを参考に作成して公開していただけると嬉しい限りです
ちなみにデバッグはあまりできてないのでバグってるところがあるかもしれません(いちおう自分の用途の範囲内で確認はしましたが)
IssueとかPullRequestとかStarとかとかを飛ばしてくれると嬉しいです
おまけ: SLACK_WEBHOOK_URL
Slack通知の例でsecretからSLACK_WEBHOOK_URLを使用していますが、これはIncoming Webhookというやつです
新旧あるらしいですが、新しい版のは作成がちょっと面倒に感じたので自分は古い方を使いました(そのうち動かなくなるでしょうw)
このIncoming WebhookのURLをGitHub Actionのために設定からSecretに登録しておきます
Incoming Webhookの作り方はこのあたりを見ればいいと思います: https://qiita.com/kshibata101/items/0e13c420080a993c5d16