Help us understand the problem. What is going on with this article?

CodeCommitの変更をBacklogの課題に連携

More than 1 year has passed since last update.

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初心者なのでここから細かくいきます。

 1.Lambdaの作成
1_lambda_create1.png
  

 2.ロールの作成
2_lambda_role.png

3_role_create.png

4_lambda_role2.png
 
 3.コード作成
4_lambda_create3.png

  コードを書く

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/>&ensp;・Committer : " + commitInfo.commit.committer.name +
                    "<br/>&ensp;・Repository : " + repositoryName +
                    "<br/>&ensp;・Reference : " + reference.ref +
                    // Markdown記法
                    "<br/>&ensp;・CommitId : " + "[" + commitInfo.commit.commitId + "](" + diffUrl + ")" +
                    "<br/>&ensp;・Message : " + commitInfo.commit.message
                ;
                postComment(issueKey, commitMessage);    
            }
        }
    });
}


};

 4.トリガーの設定
5_Lambda_edit1.png

6_Lambda.png

7_Lambda.png

  再度、左側のリストからCodeCommitを選択すれば複数リポジトリも設定できる
8_Lambda.png

9_Lambda.png

  トリガーを設定するとCodeCommit側からも確認できる
10_CodeCommit.png

 5.ポリシーの追加
  IAMコンソールからロールにCodeCommit関連のポリシーをアタッチする

12_IAM.png
  イベントを拾うだけなのでReadOnlyポリシーで十分

13_Lambda.png

 6.BacklogのAPIキーの設定
  Backlog側でAPIキーを発行する。
  Backlogを使いこなそう (APIキーの設定)
  
  その際、APIキーはユーザに紐づいており、課題コメントを登録する際もそのユーザアカウントで登録されるので専用ユーザを作成したほうがわかりやすい。

15_Lambda.png
  発行したAPIキーとエンドポイントをLanbdaの環境変数に設定する。
  エンドポイントは https://[スペース名].backlog.com/api/v2 でOK

 7.Lambdaの動作確認
  CodeCommitからトリガーのテスト
16_CodeCommit.png

  Lambdaでテストイベントを作成してテスト
17_Lambda.png
18_Lambda.png
19_Lambda.png

3. Backlog API

 Lambdaテストイベントの結果をBacklog側で確認してみる。
21_Backlog.png
 コメント内のCommitIdからCodeCommitコンソールのコミットDiffへリンクさせてる。

22_CodeCommit.png
 
 
 

展望

 

参考記事

Aiira
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away