Jenkins でのビルド失敗時に AWS SNS で通知を送りたかったので、そのために試行錯誤したメモ。
AWS SNS について
Simple Notification Service の略で、通知を扱うための AWS のマネージドサービス。AWS SNS にメッセージを Publish することで、設定に応じてメールやチャットツールなどに通知を送ることができる。
AWS SNS の設定方法についてはググればたくさん出てくるので割愛する。
今回は、AWS SNS の Topic は既に作成済みという前提で話をする。
Amazon SNS Build Notifier について
当初 Amazon SNS Build Notifier というプラグインを使おうとしていたが、これは動かなかった。
リポジトリを見ると 2016 年以降メンテナンスされていないようだし、そもそも Pipeline に対応していないのかもしれない。
Pipeline: AWS Steps を使う
Pipeline: AWS Steps というプラグインの中に snsPublish という機能を見つけて「これはいけそうだぞ」と思って試してみたところ、できた。
Jenkins 公式がメンテしているし、現時点ではこれを使うのがベストっぽい。
AWS の認証情報を設定する
いくつか方法があるが、ふたつ紹介する。
SNS:Publish
権限のある IAM ロールを割り当てる
Jenkins サーバを Amazon EC2 で運用している場合はこの方法が最善だと思われる。
使用する SNS トピックに対して publish できる権限を付与した IAM ロールを作成し、Jenkins が動いている EC2 インスタンスに対して割り当てるだけ。
サーバ内に認証情報を置いておく必要が無いのでセキュア。
Jenkins サーバ内に Credentials を設置する
Jenkins サーバが AWS 以外のサーバで動いている場合はこの方法をとるしかない。
Jenkins のビルドは jenkins
ユーザが実行していたので、jenkins
ユーザのホームディレクトリ以下の .aws/credentials
に認証情報が保存されるようにする。
$ sudo su - jenkins
$ aws configure
同じサーバ内で AWS の認証情報が複数ある場合は、Pipeline 定義で withAWS という step を挟むことで柔軟に認証情報を設定できるらしい。
Pipeline 定義に通知設定を書く
以下のように書くと「ビルドが失敗した場合」に通知することができる。
pipeline {
stages {
// 必ずコケるステージ
stage('main') {
steps {
sh 'false'
}
}
}
post {
failure {
snsPublish(
topicArn: 'arn:aws:sns:ap-northeast-1:000000000000:xxxxxxxx',
subject: 'Build failed!',
message: env.BUILD_URL,
)
}
}
}
ビルドを実行すると、無事通知が届くと思う。