12
11

More than 5 years have passed since last update.

GitHub の特定のラベルが付いた issue の登録時に Slack に通知するツールを作ってみた

Posted at

概要

Slack には GitHub 連携用のアプリケーションがあって、リポジトリについて通知する仕組みがありますが、 issue 作成だけではなく、編集・削除など余計な情報も流れてきます。

今回、情報が埋もれないように バグレポート など特定のラベルがついている issue の登録時に Slack に通知する仕組みを作りました。

使用技術

GitHub Webhooks

GitHub で issue を追加した時に通知が飛ぶように GitHub の Webhooks を利用しました。

Slack Incoming Webhooks

最後に Slack に通知するために、Incoming Webhooks を利用しました。

Google Cloud Functions

今回のメインの部分です。 GitHub の通知を受け取って、特定のラベルが付いた issue 登録のみフィルタして Slack に通知する部分に Google Cloud Functions を採用しました。実装には Node.js を利用しています。

実装

コードは GitHub にあげています。 index.js が実装部分です。 50 行ほどで実装できました。他の用途にも使えるような汎用的な作りにはしていないので、以下にカスタマイズ方法を案内しておきます。

const request = require('request');
const secret = require('./config.json');

/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */
exports.noticeGithubIssueToSlack = (req, res) => {

  const body = req.body;

  if (
    body.action !== secret.validation.action ||
    body.issue.labels[0].name !== secret.validation.labelName
  ) return res.send(200);

  const message = makeMessage(body);

  request.post({
    uri: secret.webhook_url,
    headers: {
      'Content-type': 'application/json',
    },
    json: {
      'text': message
    }
  }, function(err, res, body) {
    res.send(200);
    console.log(err, res, body);
  });
};

function makeMessage(body) {
  return [
    body.issue.user.login + ' さんから新しい調査依頼がありました。',
    '```',
    '# ' + body.issue.title,
    body.issue.body,
    '```',
    body.issue.html_url,
  ].join('\n');
}

カスタマイズ方法

以下の部分をいじれば他の用途に使ったり、メッセージのカスタマイズをすることが可能です。

フィルタ部分

14-17 行目の if 文で特定のラベルの issue 投稿しか受け付けないようにフィルタリングしています。ここをいじれば、複数のラベルに対応したり、編集・削除も通知するなどカスタマイズ可能です。そもそも issue ではなくて pullreq など、他の webhooks に対応するなども可能です。

  if (
    body.action !== secret.validation.action ||
    body.issue.labels[0].name !== secret.validation.labelName
  ) return res.send(200);

Slack 通知メッセージ

35-44 行目で Slack に送信するメッセージを作成している。

function makeMessage(body) {
  return [
    body.issue.user.login + ' さんから新しい調査依頼がありました。',
    '```',
    '# ' + body.issue.title,
    body.issue.body,
    '```',
    body.issue.html_url,
  ].join('\n');
}

導入方法

導入方法は GitHub にまとめています。

まとめ

Cloud Functions を使うと Webhoooks を少しカスタマイズして通知するなど、サクッと実装できて良いですね。他にも PivotalTracker の更新情報を Slack に通知するツール などを以前実装しましたが、ツール間連携のかゆいところに手が届かない時に使うと便利です。

気になる方は触ってみてください!

関連記事

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11