先日は、「Google スプレッドシート」の変更内容をSlackへ通知するアプリケーションについて紹介しました。業務管理に「Google スプレッドシート」を使用している方や、使用を検討している方は、以下の記事も合わせてご覧いただければと思います。
人手不足が続くIT業界では、「少数の正社員が多数の非正規社員を管理する「といった業務形態が一般的になりつつあります。 私が従事している実際のプロジェクトでも、正社員4名に対して非正規(派遣)社員8名という業務形態がおよそ1年間続いてい[…]
この記事では、私が実際の業務を通じて、Github上のソフトウェア開発で感じていた課題と、その対策として作成した「Pull Request」(以下では、「PR」とします。)の変更内容をSlackへ通知するアプリケーションについて紹介します。
この記事は、以下のような方にご覧いただき、業務内の課題解決の一助となれば幸いです。
- 「PR」の状況(ステータス、コメント)の変化に気付かず、対応が遅れることが多い方
- 「PR」の状況が常に気になり、他の業務に集中でき、頻繁に「PR」ページを確認している方
1. 実務上の課題
1-1. 「PR」の状況(ステータス、コメント)の変化に気付かない
「Github」の通知設定を変更することで「PR」の変更内容をアカウントのメールアドレス宛てに送信することが可能ですが、以下のような理由から気付かずに見落とされることが多い印象があります。
- 業務連絡のほとんどを「Slack」に一本化しているため、メールを確認するのは1日の業務で数回程度であるため
- 通知メールは変更内容を一通ずつ送ってくるため、関連する情報をまとめて参照することが困難なため
1-2. 「PR」の状況が常に気になる
以下のような「PR」は、常にその状況が気になり、他の業務に集中できず、頻繁に「PR」ページにアクセスし確認されることが多い印象があります。
- マージ期限の近い「PR」
- 次の案件のベースとなる「PR」
- 長期間更新のない「PR」
2. 開発環境の選択
私の業務では、主に「C/C++」と「Python 3」を使用したソフトウェア開発を行っています。その中で、「外部ツールとの連携用APIが豊富」「ある程度の処理速度の遅さがある程度許容できる」という理由から「Python 3」を選択しました。
2-1. 外部ツールとの連携用APIが豊富
「Python 3」で使用できるサードパーティ製のライブラリには、HTTP通信用の「Requests」や「GitHub」上のリポジトリ情報を取得できる「PyGithub」があります。そのため、「Requests」と「PyGithub」を連携することで、取得したリポジトリ情報を「Slack」にHTTP通信を介してメッセージを投稿することが可能になります。
2-2. 処理速度の遅さがある程度許容できる
「Python」は「C/C++」と比べると処理速度が比較的遅い言語として知られています。しかし、「PR」の内容は数分~数十分に1回の頻度で捜査し、変更があれば通知すれば良いと言えます。そのため、この記事で挙げた課題解決に対しては、処理速度以上に開発効率の高い「Python」が適していると判断しました。
3. 開発環境のセットアップ
3-1. python
pythonのインタプリタ・パッケージ管理用のライブラリpipのインストール方法については下記ページ2章を参考にしてください。
この記事では、Raspberry Pi 3 MODEL Bを対象に、ロボット製作に適した開発環境のセットアップ手順を紹介します。 このセットアップ手順を実行することで、以下の記事で紹介したようなロボット用のプログラミングが可能になりま[…]
この記事の2-1章で述べたHTTP通信用の「Requests」と「GitHub」上のリポジトリ情報を取得できる「PyGithub」は、どちらもpipでインストールできます。
3-2. Slack
この記事で紹介するアプリケーションでは、「Slack」が提供しているAPI「channels.history」「chat:write」を使用します。各APIの用途は以下の通りです。
- 「channels.history」: 「Slack」のメッセージログを取得するために使用する(投稿済みのメッセージを再投稿するのを予防するために使用する
- 「chat:write」: 「Slack」の特定のチャンネルにメッセージを投稿するために使用する
3-2-1. APIへのアクセス権限を持つアプリの作成
1. 「Slack」のアプリケーション管理画面にアクセスし、「Create an App」をクリックする。
2. 「アプリ名」と「追加先ワークスペース」を選択し、「Create App」をクリックする。
3. 作成したアプリケーションの「Settings」(左サイドメニュー)上の「OAuth & Permissions」をクリックする。
4. 「Scopes」の「Bot Token Scopes」に「channels:history」「chat:write」を追加する。
5. ページ上部の「Install App to Workspace」をクリックする。
6. 遷移先ページに記載されている内容を確認し、「許可する」をクリックする。


2. 遷移先ページで「Developer settings」をクリックする。
3. 遷移先ページで「Personal access tokens」を開き、「Generate new token」をクリックする。
4. 遷移先ページで「Note」に任意の文字列を記入し、「Select scopes」で「repo」をチェックする。
5. 遷移先ページで「Update token」をクリックする。
6. GitHubのリポジトリ用のアクセストークンが生成されるので、適切に保管する。
4. アプリケーション概要(python)
作成したアプリケーションのソースコードはGitHub上で公開しています。
4-1. メイン関数
MonitoringPullRequestのインスタンスを生成し、MonitoringPullRequest.main_loop関数を実行します。
インスタンス生成時に渡す引数の詳細は以下の通りです。
引数 | 詳細 |
{GITHUB_TOKEN} | 3-3-1章で生成したGitHubのアクセストークン |
{SLACK_TOKEN} | 3-2-1章で生成したSlackのアクセストークン |
{REPOSITORY} | 監視対象のリポジトリ名(※)
(※)リポジトリ名はGitHubのURLから取得できます。(例: https://github.com/{REPOSITORY}) |
{SLACK_CHANNEL} | 投稿先チャンネルID(※)
(※)チャンネルIDはSlackのURLから取得できます。(例: https://app.slack.com/client/{SLACK_WORKGROUP}/{SLACK_CHANNEL}) |
main_loop関数の引数には、定期実行の周期を秒単位で指定します。
4-2. MonitoringPullRequestクラス
「Slack」のチャンネルに「PR#{number}」というメッセージを投稿すると、そのメッセージに対してPRのステータスとコメントを、対象メッセージのレスとしてメッセージを投稿します。投稿メッセージのフォーマットは以下の通りです。
概要 | 投稿メッセージ | 備考 |
新規コメント | (New Comment) {comment} (Created at:{timestamp}) |
{timestamp}は「Pygithub」の「github.IssueComment.IssueComment」クラスのメンバ変数「closed_at」が書き込まれます。 |
PRステータス | (Chang Status) state:{open|closed|merged} |
– |
マージ可能性 | (Chang Status) mergeable:{True|False} |
コンフリクト発生時には「mergeable:False」と投稿されます。 |
(投稿メッセージのイメージ)
5. API References
Slack API | channels.history | リンク |
chat.postMessag | リンク | |
Pygithub | Repository | リンク |
PullRequest | リンク |