やりたかったこと
backlogを課題管理に、Githubはエンジニアの内部タスク管理というように、並行利用しています。
backlogでお客さまから依頼が来た際に、手動で内部用のissueを立てていましたが、これを自動化してみました。
構成
backlog側
プロジェクト設定->Webhookで、スクリプトのURLを指定
プロジェクトに対する管理者権限がないと、設定できないようです。
フックするスクリプト
飛んできたJSONを処理して、APIをcurlで叩く
案件やリポジトリによって変える場所
const BACKLOG_PROJECT = "PRJNAME";
const GHE_TOKEN = "xxxxxxxxxxxxx";
const GHE_ORGANIZATION = "xx";
const GHE_REPO = "repository name";
const GHE_URL = 'https://xxxx.xxx';//GitHub EnterpriseのURLを指定
curlでGithubAPIを叩くところ
今のところ、新規登録時のみに動かしているため、APIのエンドポイントは
POST /repos/:owner/:repo/issues
https://developer.github.com/v3/issues/#create-an-issue
/*
GHEのAPIを叩く
*/
$data = [
'title' => '🔗 backlog - '. $summary,
'body' => 'from https://[xxxx].backlog.jp/view/' . $projectKey . '-' . $key_id . "\n\n" . $description,//backlogの本文プラスURL
// 'assignees' => [ 'onuma' ]
];
$header = [
'Authorization: token '. GHE_TOKEN, // tokenをヘッダに含める
];
//特定のプロジェクトだったら
if( $projectKey === BACKLOG_PROJECT){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, GHE_URL.'/api/v3/repos/'. GHE_ORGANIZATION. '/' . GHE_REPO . '/issues');//apiのエンドポイント
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); // post
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); // jsonデータを送信
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); // リクエストにヘッダーを含める
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
$response = curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$result = json_decode($body, true);
curl_close($curl);
}
GitHub側
認証のためのアクセストークンを生成
参考URL
以下を参考にさせていただきました。
https://gist.github.com/hissy/6a114d0d9a85f3338aed
https://qiita.com/re-24/items/bfdd533e5dacecd21a7a
https://developer.github.com/v3/issues/#create-an-issue
今後の展開
サーバが必要なのはちょっと今時っぽくないので、Google のCloud functionsで動かすように
書き換えたいと思ってます。