背景
職場ではオフライン環境で開発作業を実施している。
なので、開発資産(ソースコード)をGitで管理し、
GitのプラットホームにGitBucketを導入した。
そしてCI用に、Jenkinsも導入。
ここで、GitBucketとJenkinsを連携させて、ブランチやPRを自動ビルドしてくれるようにしたい。
そしてビルド結果を通知(メールかIRC)してほしい。
そんな仕組みを作ろうと試みた。
#土台はCentOS6.5
GitBucketとJenkinsの連携
GitBucketとJenkinsを連携させるために、Jenkinsfileを作りました。
仕組みについては以下を参照・参考にしました。
https://jenkins.io/doc/book/pipeline/jenkinsfile/
https://qiita.com/kounoike/items/52fa35ca5813d0edc7b7
これで、Jenkinsfileをプロジェクト直下に配置するだけで、GitBucketとJenkinsが連携してくれます。
Jenkins側のプロジェクトの起動トリガーはWebHooksで設定。
JenkinsfileからIRCへの通知の発信
JenkinsfileによってJava/Mavenプロジェクトを自動でチェックアウト・ビルドするところまではすんなり。
CheckstyleやFindbugsを実行して実行結果を収集するのもできた。
(新規警告の検出ができてないけど・・・)
で、IRCにビルド結果を通知させたい。
GitBucketのPRにビルド結果は出るけど、何回もブラウザ更新するのも微妙だし。
IRCにJenkinsからの通知を垂れ流ししておきたい。
で、調べた結果以下が参考になった。
まず、
http://b-side.work/2017/04/jenkins-pipeline-post-notification/
https://jenkins.io/doc/pipeline/tour/post/
この2つのサイトで、email/hipchat/slackは標準対応されているけどIRCは無い、ということを知った。
そこからさらに調べて調べて、やっと以下のサイトにたどり着く。
https://wilsonmar.github.io/jenkins2-pipeline/
https://github.com/jenkinsci/pipeline-examples/blob/master/pipeline-examples/ircnotify-commandline/ircNotify.groovy
どうやらnetchatを使って実行できるようだ。
ただし、私の環境では上記リンク先のサンプルのようにシングルクォーテーションではうまく動作しなかった。
なので、最終的には以下のようなスクリプトに落ち着いた。
pipeline {
agent any
tools {
maven 'apaceh-maven-3.3.9'
jdk 'jdk1.8.0_131'
}
stages {
stage ('build') {
steps {
sh 'mvn clean package'
}
}
}
post {
always {
ircnotice("sending notifications...")
}
}
}
def ircnotice(param_msg) {
def MSG = "Project: ${env.JOB_NAME}, Build: ${env.BUILD_NUMBER}, Author: ${env.CHANGE_AUTHOR}, Result: ${currentBuild.currentResult}, Time: ${currentBuild.duration}, ${env.BUILD_URL} ."
sh """
(
echo "NICK bot"
echo "USER bot 8 * : bot"
sleep 1
echo "JOIN #jenkins"
echo "PRIVMSG #jenkins" :${MSG}
echo QUIT
) | nc localhost 6667
"""
}
IRCはngircdを使用しており、ポート番号は6667。
IRCもJenkinsも同一サーバー上に構築したのでホストはlocalhostで成功。
チャンネル名は #jenkins
というものを作成。
これで通知に成功した。
以上。