Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8833

CodeCommitにcommit/pushしたらLambda経由でSlackにcommentつき通知を飛ばす

$
0
0

AWS CodeCommit上で管理しているリポジトリに、誰かがcommit/pushしたらSlackで通知を受け取りたいと思って試行錯誤したときのメモになります。Lamda関数はNode.jsで記述しています。

前置き

  • CodeCommitやLamda、Slackの細かい話は書きません。
  • Lamda関数のNode.jsのサンプルコードや注意点だけを書きます。
  • 以下はすべてAWS Console上からの操作です。

処理の流れ

CodeCommit → トリガー → Lambda → Slack Incomming WebhookのURLにPOST → Slackからスマホアプリ等に通知が飛ぶ

Lamda関数

適当な名前でLamda関数を作成します。以下のサンプルコードをindex.jsに上書きします。optionsのIncomming WebhookのURLと、中程にあるSlack上に表示するメッセージのBlock Kitテンプレートはお好みに合わせて修正します。

codeCommitToSlackWebhook
constAWS=require('aws-sdk');constcodecommit=newAWS.CodeCommit({region:'ap-northeast-1'});consthttps=require('https');//const util = require("util");constoptions={hostname:'hooks.slack.com',path:'/services/*******/*******/*******',method:'POST',headers:{"Accept":"application/json","Content-Type":"application/json; charset=UTF-8"}};exports.handler=function(event,context){letrepository=event.Records[0].eventSourceARN.split(":")[5];letreferences=event.Records[0].codecommit.references;letfuncArr=references.map((x)=>{returnnewPromise((resolve,reject)=>{letparams={commitId:x.commit,repositoryName:repository};codecommit.getCommit(params,function(err,data){if(err)reject(err);elseresolve({params:params,data:data});});});});Promise.all(funcArr).then((values)=>{//console.log(util.inspect({//  values:values//},{colors:true, depth: null}));returnnewPromise((resolve,reject)=>{letblocks=[];blocks.push({type:'section',text:{type:'mrkdwn',text:`new commit pushed to \`${references[0].ref}\`\n\n*Repository:* "${repository}"`,}});letv=values.map((x)=>{lettmp=newDate(x.data.commit.committer.date.split('')[0]*1000);tmp=`${tmp.getFullYear()}/${('0'+(tmp.getMonth()+1)).slice(-2)}/${('0'+tmp.getDate()).slice(-2)}${('0'+tmp.getHours()).slice(-2)}:${('0'+tmp.getMinutes()).slice(-2)}:${('0'+tmp.getSeconds()).slice(-2)}`;return{type:'section',fields:[{type:'mrkdwn',text:'*CommitId:*\n'+x.params.commitId},{type:'mrkdwn',text:'*Comment:*\n'+x.data.commit.message},{type:'mrkdwn',text:'*Committer:*\n'+x.data.commit.committer.name},{type:'mrkdwn',text:'*When:*\n'+tmp}]};});values={blocks:blocks.concat(v)};resolve(values);});}).then((value)=>{//console.log(util.inspect({//  value:value//},{colors:true, depth: null}));letreq=https.request(options,(res)=>{letbody='';//console.log('statusCode: '+res.statusCode);res.setEncoding('utf8');res.on('data',(chunk)=>{body+=chunk;});res.on('end',()=>{//console.log({body:body});context.done(null,body);});});req.on('error',(e)=>{//console.log({e:e});context.fail(e);});req.write(JSON.stringify(value));req.end();}).catch((err)=>{//console.log({err:err});context.fail(err);});};

Lambdaのアクセス権限

  1. Lambda アクセス権 → 実行ロール → IAMロールの設定が別ウィンドウで開く
  2. 「ポリシーをアタッチします」でAWSCodeCommitReadOnlyをアタッチ

Lambdaのトリガー

  1. Lambda 設定 → デザイナー → トリガーの追加
  2. トリガーの設定 → CodeCommitを選択
  3. リポジトリ名選択、トリガー名にslackWebhookTriggerなど入力、ブランチ名をすべてのブランチを選択
  4. 追加

通知のテスト

  1. CodeCommit リポジトリ選択
  2. 設定 → トリガー → slackWebhookTriggerなどトリガー名のリンク
  3. ページ下部 → トリガーのテスト

Lambdaの注意点

環境変数を設定しないと通知内容に含まれる時刻がUTCになってしまいます。以下を設定します。

  • Lambda 設定 → 環境変数 → キー: TZ、値: Asia/Tokyoを追加

デバッグ

Lambda関数内のconsole.logのコメントアウトを外し、CloudWatch Logsでどこでエラーが発生しているか確認します。

参考URL

例: AWS Lambda 関数の AWS CodeCommit トリガーを作成する
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-notify-lambda.html

以上です。


Viewing all articles
Browse latest Browse all 8833

Trending Articles