今日は、Typetalk上で手軽にChatOpsを実現するJenkinsプラグインを作ったので、そちらの紹介をしたいと思います。なおこちらの機能は、先日リリースしたWebhookのレスポンスを使ったメッセージの投稿機能を利用して実現しています。
ChatOpsとは
みなさんは、”ChatOps”という言葉を聞いたことはあるでしょうか?ChatOpsとは、チャット経由で何らかの発言を待ち受けて、その発言に応じたオペレーションを実行するものです。利用例としては、チャット上でデプロイを促す発言を行い、その発言を受けてデプロイコマンドを実行するといったものがあげられるでしょう。
ChatOpsを実現する際、チャットツールと外部システムとの連携には、Hubotというチャットフレームワークがよく用いられます。TypetalkとHubotを連携するためのhubot-typetalk adaptorも、Nulabから提供しています。私達も、Hubotでデプロイ用コマンドを待ち受けて、適宜Jenkinsに連携するという仕組みを整えていました。
ただし、Hubotを使う場合、Hubotを動かすためのサーバを別途用意し、Typetalk上の発言を解析するスクリプトが必要となります。このため、ChatOpsをちょっと試してみたいというときに少しハードルがあることも確かでした。
(なお、HubotではなくGoogle Apps Scriptを利用する例などもあります。この場合、Hubotを動かすサーバは必要なくなりますが、発言を解析するサーバサイドのスクリプトは依然として必要です。)
Jenkins Typetalk Pluginを用いたChatOps
Hubotからは最終的にJenkins上のプロジェクトを実行することが多いので、Typetalkから直接Jenkinsに連携できればよさそうです。というわけで、JenkinsからTypetalkに通知できるJenkins Typetalk Pluginに、逆方向のTypetalkからJenkinsへ連携できる機能を追加しました。
Hubotを利用したときと、Jenkins Typetalk Pluginを利用したときの概要図は、以下のようになります。すでにJenkinsを導入している環境であれば、プラグインをインストールするだけでChatOpsを実現できます。
Jenkins Typetalk Pluginでできること
現在は下記の3機能を提供してます。
- プロジェクトをビルドする
- プロジェクト一覧を表示する
- コマンド / プロジェクト概要を表示する
プロジェクトをビルドする
Jenkins上のプロジェクトをビルドする機能です。プロジェクトにパラメータが定義されている場合、パラメータを指定することもできます(下のキャプチャでは、最後のオプション”1.0.0″がパラメータです)。
@jenkins+ build <project> (<key=value>)
プロジェクト一覧を表示する
Jenkins上のプロジェクト一覧を表示する機能です。正規表現でフィルタリングをかけることができます。それぞれのプロジェクトの最終ビルドが成功しているか失敗しているかも絵文字で表します。
@jenkins+ list (<regexp filter>)
コマンド / プロジェクト概要を表示する
コマンドやプロジェクトの概要を表示します。プロジェクトにパラメータが定義されている場合、パラメータの説明も合わせて表示されます。引数が必要なコマンドに引数を渡さなかった場合など、デフォルトの状態でも実行されます。コマンドの形式に迷ったら、まず実行してみるといいでしょう。
@jenkins+ help (<sub command>)
設定方法
全プロジェクトに対応したbot
TypetalkのWebhook URLを下記の形式で指定します。
http://<Jenkins URL>/typetalk/notify
Webhookの設定画面は、下記のようになります。ID / 名前は任意で構いません。Webhookもしくはbot自体の設定方法の詳細については、公式ドキュメントを参考にしてください。
なお、通常はJenkinsに認証をかけて運用していることと思います。その場合でも、下記のようにURL中にuserinfoを埋め込むことによって認証を通ることができます。
http://<username:token>@<Jenkins URL>/typetalk/notify
tokenについては、”http://<Jenkins URL>/user/<username>/configure” もしくは下記キャプチャのように、Jenkinsの画面右上のユーザ名のリンクからたどってください。
あとは、登録したbotに対して先に述べたような “@jenkins+ build helloWorldProject” などとメンションすると、ビルド実行することができます。
特定のプロジェクトに対応したbot
上記だけでもプロジェクトのビルドをはじめ最低限の需要は満たすことができるのですが、プロジェクト名が長いとそれを手打ちしないといけないなど、あまり使い勝手がよくありません。
ここで、下記のようにクエリストリングでプロジェクトを指定することによって、特定のプロジェクト専用のbotを作成できます。
http://<Jenkins URL>/typetalk/notify?project=<project>
上記の設定で、実際にメンションする際にプロジェクトを省略することができます。この場合のコマンドは、help と build の2つになります。
@jenkins-project+ help @jenkins-project+ build (<key=value>)
それぞれのbotの使い分け
特定のプロジェクトをビルドすることが多いのであれば、後者のようにプロジェクトをURL中で指定する方がいいでしょう。実際、私達の社内での使われ方も特定のプロジェクトに対応したbotが大多数です。本ブログエントリ最初でお見せしたアニメーションGIF画像も、特定プロジェクトのbotを使用しています。
プロジェクト一覧の表示を行いたい場合、もしくはbotをいくつも設定したくない場合は、前者の全プロジェクトに対応したbotを設定するとよいでしょう。
以上、Jenkinsを利用していた場合に、手軽にChatOpsを行う方法について紹介しました。この記事が、ChatOpsを導入したくてもできなかった皆さんのお役にたてれば幸いです。何かありましたら、コメントもしくはフィードバックいただければと思います。