IRC
Jenkins
GitBucket

JenkinsfileでIRCへ通知を仕込む

More than 1 year has passed since last update.

背景

職場ではオフライン環境で開発作業を実施している。
なので、開発資産(ソースコード)を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 というものを作成。
これで通知に成功した。

以上。