Jenkins#3 メール送信・他サーバ操作
Jenkinsにてメール送信・他サーバ操作する方法を説明する。
目次
JenkinsTips
1.概要
今回実現すること
1.メールを送信する
Jenkinsの処理が完了したら、あらかじめ指定したメールアドレスに完了メールを送信する。
関係者に対してデプロイが完了した旨の通知ができる。
また、ビルド作業に時間が掛かる場合、Jenkinsを実行さえすればJenkinsの作業完了を待たなくても、Jenkinsがメールで通知するようにする。
2.別サーバに接続し操作する
Jenkinsから他サーバに接続し、シェルコマンド等を実行操作する。
たとえば、デプロイの前後でTomcatの再起動シェルを実行するなど。
3.ファイルを転送する
Jenkins(がインストールされている)サーバから別サーバに対してファイルを転送する。
4.Jenkinsジョブを自動実行する
指定時刻になるとJenkinsのジョブが自動実行されるように設定する。
SVNにモジュールがコミットされたことをトリガーとして、Jenkinsのジョブを実行する。
2.メールを送信する
概要
Jenkinsの処理が完了したら、あらかじめ指定したメールアドレスに完了メールを送信する。
関係者に対してデプロイが完了した旨の通知ができる。
また、ビルド作業に時間が掛かる場合、Jenkinsを実行さえすればJenkinsの作業完了を待たなくても、Jenkinsがメールで通知するようにする。
Jenkins設定
「Jenkinsの管理」「システムの設定」を開く。
「Jenkinsの位置」の項目にて以下の値を設定する。
項目 | 設定値 |
Jenkins URL | (デフォルトのまま) |
システム管理者のメールアドレス | メールの差出人に表示される値。デフォルトでは”まだアドレスが設定されていません。”となっているので必要に応じて変更すること。 |

「E-mail 通知」の項目にて「高度な設定」ボタンを押下する。

以下の値を設定する
項目 | 設定値 |
SMTPサーバー | smtp.gmail.com |
E-mailのサフィックス | 任意 |
SMTP認証 | チェックする |
ユーザ名 | Gmailアカウント |
パスワード | Gmailアカウントパスワード |
SSL | チェックする |
SMTPポート | 465 |
返信先アドレス | 任意 |
文字セット | UTF-8 |

「メールを送信して設定を確認」にチェックを入れ、テストメールの送信を行ってみる。

メール送信が失敗した場合:
Googleアカウントの設定にて「安全性の低いアプリの許可」という項目があるため、これを有効にして再度実施してみる。

成功すれば、以下のようなメールを受信できる。

ジョブに組み込む
「Pipeline Syntax」画面を開く。
Sample Stepのプルダウンにて「mail: Mail」を選択し、必要な情報を入力する。
「Generate Pipeline Script」を押下し、コードを生成し、コピーする。

コードをジョブに張り付ける。
その際、値が ’ ‘ となっている項目については削除をしておく。

ジョブを実行すると、メールが送信される。

3.別サーバに接続し操作する
概要
Jenkinsから他サーバに接続し、シェルコマンド等を実行操作する。
たとえば、デプロイの前後でTomcatの再起動シェルを実行するなど。

Jenkins設定
Jenkinsに対して、接続先サーバの設定を行う。その際、設定に対して「ノード名」をつける。
「Jenkinsの管理」「ノードの管理」を開く。

「新規ノード作成」を押下する。

ノード名に任意の名前を入力する。
「Permanent Agent」を選択し、OKボタンを押下する。

以下の要領で設定し、保存ボタンを押下する。
項目 | 設定値 |
(前画面で入力した値が入っている) | |
ノード名 | 任意 |
説明 | 1(Jenkins Jobを複数同時に動かしたときに、このサーバに対して同時操作可能な数) |
同時ビルド数 | 接続先サーバ上のパスを指定。作業領域となる。 |
リモートFSルート | 任意 |
ラベル | このマシーンを特定ジョブ専用にする |
用途 | 接続先サーバのIPアドレスまたはホスト名 |
ホスト | 接続先サーバにログインするためのログインIDとパスワード。(追加ボタンから登録しておく。) |
認証情報Host Key Verification Strategy | Non verifying Verification Strategy |
「高度な設定」ボタンを押下し、以下の項目を設定する。
項目 | 設定値 |
Javaのパス | /usr/local/java/jdk1.8.0_152/bin/java |

以下のようになれば成功。

別サーバへ接続し操作する
ジョブのコードにて「ノード名」を指定すると、その処理はノードに接続した状態で実行されることになる。
ジョブを作成し、以下のようにコードを記載する。
// 接続先ノード名を指定
node('ap_server_sapphire') {
// 接続先サーバで行う処理をここ以降に記載
sh 'hostname'
sh 'whoami'
sh 'pwd'
sh 'ls -ltr'
// ディレクトリを移動して行う場合、以下の記述をする
dir('/usr/local/apache-tomcat-9.0.2/webapps') {
sh 'ls -ltr'
}
}

ジョブを実行し、ログを確認してみる。
接続したサーバの情報が取得できていることが確認できる。

4.ファイルを転送する
概要
Jenkins(がインストールされている)サーバから別サーバに対してファイルを転送する。
今回は以下の要領で実施する。

ファイルを転送する
ビルドサーバ上にあるファイルを一時領域に保存する。
その後別サーバに接続し一時領域からファイルを取得する。
新規ジョブを作成し、以下のコードを記述する。
node {
// ビルドサーバ上にてファイル作成
sh 'hostname > test.txt'
// カレントディレクトリを'TEST_FILE'という名前でstach(しまう)
stash 'TEST_FILE'
}
node('ap_server_sapphire') {
// APサーバにてカレントディレクトリを一覧表示
sh 'ls -ltr'
// 'TEST_FILE'という名前でunstash(取り出す)
unstash 'TEST_FILE'
sh 'ls -ltr'
sh 'cat ./test.txt'
}

保存してジョブを実行し、ログを確認してみる。
処理が成功していることを確認できる

転送先サーバを参照してみても、処理が成功していることを確認できる。
$ cd /home/hawk/jenkins/workspace/07.stash
$ ls -ltr
合計 4
-rw-r-----. 1 hawk hawk 6 9月 24 02:36 2018 test.txt
$ cat test.txt
Topaz
5.Jenkinsジョブを自動実行する
概要
指定時刻になるとJenkinsのジョブが自動実行されるように設定する。
SVNにモジュールがコミットされたことをトリガーとして、Jenkinsのジョブを実行する。
定期的に実行
「定期的に実行」をチェックし、「スケジュール」にcron形式の記入法で記入すると、指定時刻にジョブを実行したり
一定間隔でジョブを実行することができる。
以下は5分毎に実行する設定。

以下の通り、5分毎にジョブが設定されている。

SVNにてコミットされたら実行
SVNにコミットされたことを検知してジョブを起動する。
スケジュールにはポーリングタイミングを記載する。
以下は5分毎にチェックを行い、コミットされていれば起動する。

このジョブでは以下のコードを記載している
svn://192.168.3.24/labo/JenkinsSample/trunk/HelloApp からチェックアウトを行っている。
node{
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: 'SVN', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://192.168.3.24/labo/JenkinsSample/trunk/HelloApp']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
}
svn://192.168.3.24/labo/JenkinsSample/trunk/HelloApp配下のファイルを更新してみる。

以下、#4にてコミットを検知して自動起動した。
(#3は設定追加直後に自動起動したもの)

#4のログを確認すると、SVNコミットコメントとリビジョンが確認でき、きっかけが何だったを確認できる。

ジョブがチェックアウトしている箇所以外の領域にコミットを行ってみる。

ジョブは自動起動していない。
