メールでGitHubにissueを作る

当社では開発はもとより様々な業務でGitHub issuesを利用しています。 今回、社内向けの営業さんからの質問もGitHub issuesでやりましょう、という話をしたところ、「メールで質問投げられるととても楽で助かるんだけど」という意見があったので、やってみることにしました。

AWSのお勉強がてら、メールの受信イベントのハンドリングにAmazon Simple Email Service(SES)を使います。

実現したい業務フローはこんな感じ。

  1. あるメールアドレス宛に質問メールを送る。
  2. GitHubの特定リポジトリのissuesに、メールの内容が登録される。
  3. Slackに登録内容が通知されるのをみて、技術担当が回答する。

メールを利用してGitHubのissueを投稿するにあたって、次の情報が必要です。

  • メール送信者のGitHubアカウント(と、issue作成に関する認可)
  • issueを作る対象のリポジトリ

そこで、簡単なウェブアプリを作って、これらを事前に設定するようにしました。 実際のフローはこのようになりました。

  1. ウェブアプリにアクセスし、GitHub OAuthを使ってログインする。
  2. GitHubアカウントの特定
  3. issue作成の認可
  4. 投稿可能リポジトリ情報の取得
  5. ウェブアプリ上で、投稿先リポジトリを選択・登録する。この時、専用のメールアドレスを発行する。
  6. 投稿先リポジトリとメールアドレスをひもづけることで、メール受信時に TOアドレスからリポジトリを特定可能にする。
  7. 生成されたメールアドレス宛に、質問メールを送る。
  8. GitHub上では、issue作成時にSlackへ通知するように事前に設定しておく。
  9. 後は、GitHub上でのやりとり。

メール受信時の処理は次のように行います。

  1. メールを受信するのはAmazon SESです。
  2. Amazon SESでは、受信したメールを指定したS3バケットに書き込むよう設定できます。
  3. S3バケットには、書き込み時にAmazon Lambdaのファンクションを実行するように設定します。
  4. Amazon Lamndaファンクションには、S3のエントリの情報が渡ります。 それらを元に、S3からメールの内容を取得します。
  5. 宛先・送信元のメールアドレスと対象リポジトリの情報やGitHub OAuthのトークンは ウェブアプリが保持しているので、取得したメールのサブジェクトや本文は、 ウェブアプリが持つAPIに渡してGitHub issueを作成します。

最初、SESから直接Lambdaファンクションを実行するようにしていたのですが、メール本文を取得するためにはS3を介す必要があることに気づくまでしばらくかかりました。

メール受信をイベントトリガーにできるようになると、業務に使える場面はいろいろありそうですね。


Written by imazu in Blog on 2016-05-06. Tags: GitHub, AWS, Python,