BacklogとCodeCommitを使ってる場合に、CodeCommitへのcommitをBacklogの課題コメントへ反映する方法
※PJT管理ツールや開発管理ツールとCodeCommitの連携方法って探してもまだあまりHitしないので投稿。
連携の構成
1. CodeCommit --> 2. Lambda --> 3. Backlog API
CodeCommitのイベントをLambdaで拾い、BacklogのAPIで課題コメントの追加をします。
1. CodeCommitのコミットコメント
Backlogの課題番号(プロジェクト名-連番)を含めた形でコミットコメントを記入します。
Lambda内でコミットコメントを解析するのでルール化したほうが良い。
今回は以下のようなルールとしてます。
課題番号1,課題番号2[改行]
コメントコメントコメントコメント
2. Lambdaの作成
自分がlambda初心者なのでここから細かくいきます。
コードを書く
const aws = require('aws-sdk');
const codecommit = new aws.CodeCommit({ apiVersion: '2015-04-13' });
const querystring = require('querystring');
const http = require('https');
const url = require('url');
const backlog_endPoint = process.env.BACKLOG_ENDPOINT;
const backlog_apiKey = process.env.BACKLOG_API_KEY;
const codeCommit_consoleUrl = "console.aws.amazon.com/codecommit/home";
function postComment(issueKey, commitMessage) {
// Backlog APIの課題コメント追加のURLを生成
const endpoint = backlog_endPoint + '/issues/' + issueKey + '/comments'
+ '?apiKey=' + backlog_apiKey;
const req_opts = url.parse(endpoint);
req_opts.method = 'POST';
req_opts.headers = {'Content-Type': 'application/x-www-form-urlencoded'};
const req =
http.request(
req_opts,
(res) => {
if (!(res.statusCode == 200) && !(res.statusCode == 201)) {
console.log('error, status: ' + res.statusCode);
res.on('data', (chunk) => {
console.log('BODY: ' + chunk);
});
}
}
)
;
req.on('error', (error) => {
console.log('probrem with request: ' + error.message);
});
const postData = querystring.stringify({
content: commitMessage,
notifiedUserId: [],
attachmentId: []
});
req.write(postData);
req.end();
}
exports.handler = function(event, context) {
console.log("Request JSON: " + JSON.stringify(event), null, " ");
const repositoryName = event.Records[0].eventSourceARN.split(":")[5];
const region = event.Records[0].eventSourceARN.split(":")[3];
const references = event.Records[0].codecommit.references;
for(let reference of references) {
let params = {
commitId: reference.commit,
repositoryName: repositoryName
};
codecommit.getCommit(params, function(err, commitInfo) {
if (err) {
console.log(err, err.stack);
} else {
// コミットコメントから課題番号を抽出
let issueKeys = commitInfo.commit.message.replace(/\r?\n/g, ":").split(":")[0].replace(/\s+/g, "").split(",");
for(let issueKey of issueKeys) {
let diffUrl = "https://" + region + "." + codeCommit_consoleUrl +
"?region=" + region + '#/repository/' + repositoryName + "/commit/" + commitInfo.commit.commitId;
// Backlogへ連携するコメントの編集
let commitMessage =
"CodeCommit Push通知<br/>" +
"<br/> ・Committer : " + commitInfo.commit.committer.name +
"<br/> ・Repository : " + repositoryName +
"<br/> ・Reference : " + reference.ref +
// Markdown記法
"<br/> ・CommitId : " + "[" + commitInfo.commit.commitId + "](" + diffUrl + ")" +
"<br/> ・Message : " + commitInfo.commit.message
;
postComment(issueKey, commitMessage);
}
}
});
}
};
再度、左側のリストからCodeCommitを選択すれば複数リポジトリも設定できる
5.ポリシーの追加
IAMコンソールからロールにCodeCommit関連のポリシーをアタッチする
6.BacklogのAPIキーの設定
Backlog側でAPIキーを発行する。
Backlogを使いこなそう (APIキーの設定)
その際、APIキーはユーザに紐づいており、課題コメントを登録する際もそのユーザアカウントで登録されるので専用ユーザを作成したほうがわかりやすい。
発行したAPIキーとエンドポイントをLanbdaの環境変数に設定する。
エンドポイントは https://[スペース名].backlog.com/api/v2
でOK
7.Lambdaの動作確認
CodeCommitからトリガーのテスト
3. Backlog API
Lambdaテストイベントの結果をBacklog側で確認してみる。
コメント内のCommitIdからCodeCommitコンソールのコミットDiffへリンクさせてる。
展望
- BacklogはAPIから課題更新できるので課題操作もできそう。 Backlog 小技集: Gitのコミットから課題の状態を更新する
- CodeCommitのプルリクエストのイベントを拾えるのか未検証
- Lanbdaを使うのでBacklog以外でもAPI連携機能があれば流用できるはず。