滅入るんるん

何か書きます

GitHub Actionsで定期的にライブラリーの更新を確認するためのactionを作った: npm, nuget, gradle

最近ついに自作OSSライブラリーのメンテをする気になってきたのですが、使用しているライブラリーの更新情報を追うのが面倒だなぁ~~ということでGitHub Actionsを使ってSlackやらなんやらに通知するためのactionを作ったのでご紹介

作った奴

npm版:

github.com

NuGet版:

github.com

Gradle版:

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のところで更新がある場合のみ通知するようにしてあげます。他はお好きにカスタムしてあげればいいと思います

f:id:meilcli:20190929151210p:plain

実際に通知が飛ぶとこんな感じになります

input/output

主要なinput:

  • output_text_style
    • 後述のoutputのnpm_update_textのテキストスタイルを指定します。語尾にURLが付くかどうかの差しかないので省略していいと思います

output:

  • has_npm_update
    • 更新があるかどうかをtrue or falseで返してくれます。ただ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-dotnetdotnet 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
  • 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