sashimi4’s diary

日々の雑多なメモを書きます

Notify Gradle's build completion to Slack.

Gradleのビルド終了をSlackに通知する

今関わってるプロジェクトのビルドが諸事情により酷く長く、Instant Runが使えないこともしばしばあり、ビルド終了の通知を受けたくなったのでやってみたメモ。

How to

Slack通知を専門に行うtaskを追加する。

[project dir]/gradle/build_notifier.gradle

task pushToSlack << {
  Properties localProperties = new Properties()
  localProperties.load(project.rootProject.file('local.properties').newDataInputStream())
  (["${project.rootDir}/gradle/notify_build_finish.sh", localProperties.getProperty('slackToken')].execute().text)
}

tasks.whenTaskAdded { task ->
  if (task.name ==~ /assemble.*/) {
    task.doLast {
      project.tasks.getByName("pushToSlack").execute()
    }
  }
}

NOTE: task名が assemble で始まるタスクの終了を通知します

通知を行うシェルスクリプトを追加する。 [project dir]/gradle/notify_build_finish.sh

#!/bin/bash
curl -X POST --data-urlencode 'payload={"channel": "#チャンネル名 または @ユーザ名", "username": "Gradle", "text": "Build has just finished.", "icon_emoji": ":gradle:"}' https://hooks.slack.com/services/$1

NOTE: chmod +x notify_build_finish.sh で実行権限の付与を忘れないこと。

SlackのIncomingWebhookのTokenを設定。 [project dir]/local.properties

slackToken=*********/*********/***********************

追加したtaskを読み込む。

[project dir]/app/build.gradle

...
apply from: file('../gradle/build_notifier.gradle')
...

android {...}
...

めも

  • 共同開発には微妙。なにかしらオプトアウトできる手段を提供すべき。
  • Unix/Linux系OSでしか動作しない。WSLで動くだろうか?

おまけ

単純にMac内で通知が見れればいい場合は、 .bashrcalias notify='osascript -e '"'"'display notification "めっせーじ" with title "たいとる" subtitle "さぶたいとる" sound name "Purr"'"'"'' と入れておいて、

$ ./gradlew check ; notify

なんてすると終了時に通知を受け取れますね。

gradlew自体にaliasを張って、

alias gradle='echo $@ ; osascript -e '"'"'display notification "めっせーじ" with title "たいとる" subtitle "さぶたいとる" sound name "Purr"'"'"''

こんな感じにしたかったんだけどうまくいきませんでした。:thinking_face:

以上。