サーバレスかつ無料でgithubのPRリストを毎日スラックに送る - Google Apps Script



![image](https://qiita-image-store.s3.amazonaws.com/0/30079/8de51f3b-b9b7-0bb7-6533-502737cfae6c.png)


# 背景

最近はrailsで開発していますが、毎朝PRのリストをslackになげてくれたら楽だなーと思い、Google Apps Scriptでつくりました。

毎日定時に行うという処理はcronが必要でサーバを用意する必要がありますが、Google Apps Scriptはcronのように定期処理を設定できるので、サーバレスかつ無料でいけます。

以下のようにslackに出すことができました。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/98da51bb-ff3d-9916-41c6-1be4599d36ea.png)


# 処理の流れ

1. Apps ScriptからGithub APIを読んでPRのリストを取得
2. 結果をScript内で、処理して、Slackになげる

上記のようにするので、slackとgithubのAPIトークンが必要です。

# 実装手順

## Tokenの取得

* **Slack**は以下などをみながらtokenを取得します。xoxp-〜というようなトークンなはずです
    * http://qiita.com/rubytomato@github/items/6558bfdb37d982891c09
    * http://qiita.com/Yinaura/items/5f00e025a95d0ff11bbd
* **Github**は以下をみながら取得します。
    * https://github.com/blog/1509-personal-api-tokens

githubに関しては以下のように設定しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/5f93dee9-7fb3-98f0-7f6d-4b55c920d49c.png)

## Apps Scriptの準備

以下をみながらApps ScriptのスクリプトをGoogle Drive上に新規作成をします

http://qiita.com/wapa5pow/items/3b55a19659d61abcfd96

## コードを書く
以下のコードをコピペします。
```slack_token```, ```github_token```, ```owner```, ```repo```, ```channel```は適宜かえてください。たとえば、githubのレポジトリのurlが https://github.com/xxx/yyy なら、ownerはxxxでrepoはyyyです。

```js
function execute() {
  var slack_token = "xxx";
  var github_token = "xxx";
  var owner = "xxx";
  var repo = "xxx";
  var channel = "xxx";
  notifyPullRequestToSlack(slack_token, channel, github_token, owner, repo);
}


function notifyPullRequestToSlack(slack_token, channel, github_token, owner, repo) {
  var result = getPullRequestLists(github_token, owner, repo);
  var messages = [];
  for (var i = 0; i < result.length; i++) {
    messages.push("<" + result[i]["url"] + "|" + result[i]["title"] + " by " + result[i]["user"] + ">");
  }
  slack(slack_token, channel, messages.join("\n"));
}
  
function slack(slack_token, channel, message) {
  var url        = 'https://slack.com/api/chat.postMessage';
  var channel    = '#' + channel;
  var icon_url   = "https://h2.slack-edge.com/3429/plugins/github/assets/service_96.png";
  var method     = 'post';
  
  var payload = {
    "token": slack_token,
    "channel": channel,
    "text": message,
    "icon_url": icon_url,
    "username": "PRくん"
  };
  
  var params = {
    'method' : method,
    'payload' : payload
  };
  
  var response = UrlFetchApp.fetch(url, params);
}

function getPullRequestLists(token, owner, repo) {
  var resultList = [];
  var options =
  {
    "method" : "get",
    "headers" : {
      "Authorization": "token " + token 
    }
  };
  var url = "https://api.github.com/repos/" + owner + "/" + repo + "/pulls";
  var response = UrlFetchApp.fetch(url, options);
  var json = JSON.parse(response.getContentText());
  for (var i = 0; i < json.length; i++) {
    var hash = json[i];
    
    if (hash && "url" in hash) {
      resultList.push({
        "url": hash["html_url"],
        "title": hash["title"],
        "user": hash["user"]["login"],
        "avatar_url": hash["user"]["avatar_url"]
      });
    }
  }
  return resultList;
}
```


## Apps Script上でcronの設定

以下のように設定できます。注意点としてcronの実行時間は1時間のうちのどこかというふうにしか選べません。
例えば、9-10pmなら午後9-10時のうちのどこかに発動するので正確なcronには向いてません。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/d387393e-e06e-5d18-6af3-171f75e9e7f8.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/43753deb-d73c-e281-0a21-ce454d2e426a.png)

以下で自分が設定したいものに適切に設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/7f98f587-f2d4-4c83-8d9f-277443885511.png)

# 結び

Google Apps Scriptをつかうとサーバレス＆無料でいろいろできちゃいます。