Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

ローカルのJenkinsとリモートのフックにSlackを使った

何をしたか

(クラウド型の)GithubやBitbucketなどにpushしたタイミングで、オフィスのLAN内にいるJenkinsに仕事をさせるのに、同LAN内にSlack botを置いて中継役にした。

f:id:rightgo09:20171208081620p:plain

実際の環境では、もう少し複雑な矢印が存在してしまっていて、これを僕はピタゴラJenkinsと呼んでいる。

背景

オフィスLAN外にあるソースコードの変更でJenkinsにCIさせたかったけど、インターネットからオフィスには通信ができなかったため、クラウドVCS側のhookのURLを直接Jenkinsにすることができなかった。

開発のコミュニケーションツールとしてSlackを使っているので、
とりあえずgit pushしたらSlackに通知をするようにして、
Slack botを作って、その通知に対してのフックを作り、
ひっかかったら同LANのJenkinsのREST APIをHTTPで叩く、という仕組みになった。

Goのコード片
if ev.Type == "message" && strings.HasPrefix(text, HookWord) {
	go startJenkinsJob()
	rtm.SendMessage(rtm.NewOutgoingMessage("hook", ev.Channel))
}
まとめ

Slackを介さずに、直接Jenkinsにフックできれば一番だったけど、そうでない場合もあるので仕方ないよね、という感じ。
ただbotを作っていくと、どこで何をしているのかだんだんわからなくなっていくのが問題な感じある。
とりあえず、このピタゴラJenkinsも図にして開発チームのWikiに貼っておいた。