orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

SkypeのチャットにJenkinsのビルド結果を通知する

はじめに

Jenkinsのビルド結果をSkypeのグループチャットに通知したいことがあります。Skype プラグインはあるのですが、ググるとインストールが大変でうまく動かないという声がチラホラありました。

とりあえずプラグインだけをインストールして設定を見てみましたが、通知先にユーザーしか選べず、グループチャットに対して通知できなさそうだったので、試していません。

代わりに以下のサイトを参考にさせてもらい、通知を実現しました。
Sending Jenkins build notifications to a Skype chat | Encoded Knowledge

SkypeプラグインはJenkinsのスレーブでSkypeを動かす必要がありますが、この方法ではSkypeを動かしているマシンからHTTPでJenkinsにアクセスできるだけで大丈夫です。

1. Skypeを動かす。

以前のエントリを参考にして、Skypeを動かします。

以降の手順は、基本的にskypeユーザーで実行します。

2. Skypeボットのスクリプトをダウンロードする

以下のコマンドを実行して、ボットのスクリプトをダウンロードします。

cd ~
git clone https://github.com/mirkonasato/buildchatbot.git

3. チャットの名前を取得する

以下のコマンドを実行して、最近のチャット一覧を表示させます。

. venv/bin/activate
env DISPLAY=:20 XAUTHORITY=/home/skype/.Xauthority python buildchatbot/listrecentchats.py

以下のように表示されるので、通知したいチャットの右側の値("#myname/$abc123"など)をコピーしておきます。

"Our project chat" -> "#myname/$abc123"
"Some other chat" -> "#friendname/$xyz789"

4. ボットのスクリプトに設定を書き込む

buildchatbot/buildchatbot.pyを開き、次のようになっている部分を

JENKINS_URL = 'http://127.0.0.1:8080'
SKYPE_CHAT = '#user/$abc123'

以下のように変更します。

JENKINS_URL = '<JenkinsのURL(末尾のスラッシュを付けない)>'
SKYPE_CHAT = '<3. でコピーした値>'

5. ボットを実行する

変更を保存したら、次のようにボットを実行します。

env DISPLAY=:20 XAUTHORITY=/home/skype/.Xauthority python buildchatbot/buildchatbot.py

この状態で、Jenkinsでビルドを実行して、目的のチャットに通知されることを確認します。

6. サーバー起動時にボットを起動する

UbuntuなのでUpstartを使います。今まで知らなかったですけど、普通のスクリプトをデーモン化したい時にすごく便利ですね。

sudoできるユーザーで、/etc/init/jenkins-skype-notification.confを以下の内容で作成します。

description "Jenkins Skype notification"
author "orangain <orangain@gmail.com>"

start on runlevel [2345]
stop on runlevel [016]

setuid Skype
chdir /home/skype
script
  . venv/bin/activate
  env DISPLAY=:20 XAUTHORITY=/home/skype/.Xauthority python buildchatbot/buildchatbot.py
end script
respawn

以下のコマンドを実行すれば、デーモンとして起動します。

sudo start jenkins-skype-notification

まとめ

ビルド結果がSkypeに通知されるようになりました。なかなかいい感じです。

しかしそれよりもUpstartが便利すぎて感動しました。世の中の常識を知らないことが多いので、もっと感度を高めていきたいです。


2013年3月10日追記:
このスクリプトで通知されるのは、ビルドが失敗したときと、正常に戻った時だけです。継続的に成功しているときは、通知されません。