
継続的インテグレーションのプロセスにおいて、自動ビルド失敗時に開発者に通知する仕組みは不可欠です。今回は、Jenkinsのビルドが失敗した場合にメール通知を自動で行う方法を紹介します。
見出し
はじめに
JenkinsなどのCI/CDツールで自動ビルドが失敗した場合、開発者にできるだけ早く問題を通知し、ビルドが成功するようにすぐに故障を改修するように促す仕組みは、継続的なインテグレーションのプロセスを健全に保つためになくてはなりません。そのために、開発者へ通知する仕組みは重要です。
今回は、Jenkinsのパイプラインジョブにおいて、ビルドが失敗した場合に、メールで通知する方法を紹介します。
前提
以下の準備が完了している必要があります。
- Jenkinsが構築済みであること
- Jenkins内でDockerが実行可能であること
- GitHubのアカウントがあること
このやり方がわからない場合は以前の記事「爆速でJenkinsをマスターしよう(Docker編)」を参照してください。
Mailtrapのアカウント作成
今回はテストメール用のSMTPサーバとしてMailtrapを使用します。それではアカウントを作成していきましょう。
「Sign up Now」をクリックします。
GitHubでサインインします。(もちろん、Googleアカウントやメールでサインインしても問題ありません)
「Authorize railsware」をクリックします。
これで無料のテスト用メールアカウントが作成されました。
「SMTP Settings」の「SMTP」の箇所をJenkinsに設定します。
Jenkinsのメールの設定
拡張メール用のプラグインを入れる
Jenkinsでパイプラインからメールを送信する場合はプラグインのインストールが必要です。
「Jenkinsの管理」から「プラグインの管理」をクリックします。
拡張メール用のプラグイン「Email Extension Plugin」がインストールされていることを確認します。推奨設定でJenkinsをセットアップした場合はデフォルトでインストールされているはずですが、インストールされていなればインストールしましょう。
拡張メールの設定
Jenkinsに拡張メールの設定をしましょう。
「Jenkins管理」から「システムの設定」をクリックします。
「拡張Email通知」の以下の項目にMailtrapのSMTPの内容を設定します。
- SMTPサーバー
- SMTP認証のユーザ名とパスワード
- SMTPポート
「保存」をクリックしたら完了です。
ビルド失敗用のサンプルアプリケーション作成
今回はNodeJSのDockerアプリケーションの自動テストした場合にメール通知を送信するので、そのために必ず失敗するDockerアプリケーションを作ります。
ベースを作る
必要なフォルダとファイルを作成し、パッケージをインストールします。
$ mkdir devops_fail_build_nodejs
$ cd devops_fail_build_nodejs/
$ npm init -y
$ npm i -D jest
$ mkdir src
$ touch src/index.js
$ touch src/utils.js
$ mkdir test
$ touch test/utils.spec.js
実装する
簡単なプログラムを実装しましょう。
index.js
const { greeting } = require('./utils');
const name = 'Keid';
console.log(greeting(name));
utils.js
const greeting = name => `Good morning ${name}`;
module.exports = { greeting };
utils.spec.js
ここであえて失敗するテストを書きます。
const { greeting } = require('../src/utils');
describe('utils test', () => {
describe('greeting fucntion test', () => {
test('should return a correct message', () => {
expect(greeting('Katharine')).toBe('Hello Katharine');
});
});
});
package.json
...
"scripts": {
"start": "node src/index",
"test": "jest"
},
...
Dockerfile
FROM node:11-alpine
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
RUN npm install
COPY ./ ./
CMD npm start
完成です。
メール通知用のパイプラインの設定ファイル作成
ベースを作る
$ pwd
/Users/you/devops_fail_build_nodejs
$ touch Jenkinsfile
$ tree -I node_modules
.
├── Dockerfile
├── Jenkinsfile
├── package-lock.json
├── package.json
├── src
│ ├── index.js
│ └── utils.js
└── test
└── utils.spec.js
パイプラインの設定ファイルを作る
Jenkinsfile
node {
def app
def to = emailextrecipients([
[$class: 'CulpritsRecipientProvider'],
[$class: 'DevelopersRecipientProvider'],
[$class: 'RequesterRecipientProvider']
])
try {
stage('Clone repository') {
checkout scm
}
stage('Build image') {
app = docker.build('{your-github-account}/devops_fail_build_nodejs')
}
stage('Test') {
app.inside {
sh 'npm install --only=dev'
sh 'npm test'
}
} catch(error) {
currentBuild.result = "FAILURE";
def subject = "${env.JOB_NAME} - Build #${env.BUILD_NUMBER} ${currentBuild.result}"
def content = '${JELLY_SCRIPT,template="html"}'
if(to != null && !to.isEmpty()) {
emailext(body: content, mimeType: 'text/html',
replyTo: '$DEFAULT_REPLYTO', subject: subject,
to: to, attachLog: true )
}
throw error;
}
}
「{your-github-account}」は自分のGitHubアカウントに置き換えてください。
GitHubにPushする
GitHubにサンプルアプリケーションをPushしておきましょう。
GitHubにリポジトリを作ります。
GitHubにPushします。
$ git init
$ touch .gitignore
$ echo 'node_modules/' > .gitignore
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin https://github.com/{your-github-account}/devops_fail_build_nodejs.git
$ git push -u origin master
「{your-github-account}」は自分のGitHubアカウントに置き換えてください。
メール通知の動作確認
それでは、パイプラインのビルドが失敗した時にメール通知が来ることを確認しましょう。
パイプラインジョブを作る
ホーム画面から「新規ジョブ作成」をクリックします。
任意のジョブ名(今回は「email_notification」)を入力し、「パイプライン」を選択し、「OK」をクリックします。
「パイプライン」から「Pipeline script from SCM」を選択し、「リポジトリURL」にGitHubに先程PushしたリポジトリのURLを入力します。
「保存」をクリックすればジョブ作成が完了です。
失敗するビルドを実行し、メール通知を確認する
「ビルド実行」をクリックします。
想定通りビルドが失敗しました。ビルド番号をクリックしてみましょう。
「Console Output」をクリックします。
テストが失敗し、メールが送られていることが確認できます。
Mailtrapの画面を見てみましょう。
ビルド失敗のメールが届いています。
これでメール通知が完了しました。
最後に
いかがでしたか?これでJenkinsでビルド失敗時にメール通知ができるようになりましたね。継続的インテグレーションを加速させていきましょう。それでは。
環境
- Jenkins: 2.151


コメントを残す