ChatOps run on on-premises.
0. はじめに
SlackのCloneプロジェクトと言われている Mattermost を使って
オンプレミス環境でChatOps的なことをやってみました。
今回Hubotなどを間に入れずにMattermost,Gitlab,Jenkinsのみで構成しています。
なお、十分な検証が行えているわけではありませんので検証環境等でのデモ、素振り用などに限定してお使いください。
また、Gitlab及びMattermost、Jenkinsはすでにインストールされている前提です。
時間に余裕があるときに、環境構築部分については別記事として掲載しようと思います。
2016/9/26追記:以下に環境構築の記事を掲載しました。
http://qiita.com/tbuchi888/items/66763a9af2e15fa74a3c
また、Jenkins2については以下も参照して頂ければと思います。
http://qiita.com/tbuchi888/items/3c65cb4757225b09f08f
1. 連携概要
以下のようなイメージで Mattermost と Gitlab と Jenkins を 連携させます。
1. デベロッパーがGitabへgit push
をするとMattermostの対象チャンネル(以降Chat)にGitLabからpushの情報が通知がされます。
- GitlabのSlackサービス と MattermostのIncoming Webhookで連携
2. オペレータがChatでgit pushの内容をchatのlinkから確認して問題なければ、"Build!!"(任意の予め登録した文字列)と入力することでJenkinsへビルドの指示を出します。
- MattermostのOutGoing Webhook と Jenkinsの Build Triggersで連携
3. JenkinsがGitlabから対象のソースコードを取得してビルドを開始します。
- JenkinsのSouce Code Mangement(gitlab-plugin)で連携
4. Jenkinsがビルド結果をChatに通知します。
- JenkinsのPost-build ActionsとMattermostのIncoming Webhookで連携
5. オペレータがChatで結果を確認します。
2. 使いどころ
今回試したのは、シンプルにJenkinsのビルドを行うまでですが、
アプリケーションのデプロイだけではなく、他ツール(Digdag,terraform,Vagrant(vsphere-plugin)やAnsible,Serverspecなどなど)をJenkinsより実行する部分もシェル等でコード化し連携することで、git push
と、Chatからの指示のみで例えばテスト済みのWebサーバをまるっと自動でスクラップアンドビルドするなど、オンプレミスでも面白いことができると思います。
3. 環境
VirtualBox on OSX YosemiteのVMとしてGitlab/MattermostサーバとJekinsサーバの2台構成で検証しました。
なお、両サーバで名前解決可能なようにJenkinssv
及びmygitlabsv
のIPアドレスはホスト(OSX)のhostsファイルに記載しています。
OS Ver. | OSS Ver. | memo |
---|---|---|
CentOS6.8 | GitlabCE ver.8.11.2 | |
- | Mattermost ver.3.30 | on GitlabCE |
CentOS6.8 | Jenkins ver.2.19 | |
- | - | Gitlab Plagin ver.1.3.0 |
- | - | Mattermost Plugin ver.2.0.2 |
4. 事前準備概要
- Mattermost で
- 今回用のチャンネルを作成します。
- Gitlab 及び Jenkinsと連携するためにIncommin/Outgoing Webhookを設定します。
- Gitlabで
- 今回用のプロジェクトを作成し
- サービス-Slack で MattermostのIncoming Webhookを設定します。
- Jenkins で
- プラグイン(gitlab及びmattermost)をインストールします。
- 今回用のプロジェクトを作成し
3. Build TriggersでMattermostのOutGoing Webhookを設定します。
4. Post-build ActionsでMattermostのIncoming Webhookを設定します。
5. Souce Code Mangement(gitlab-plugin)でGitlabのリポジトリを設定します。
4.1 Mattermostの設定
1. 今回用のチャンネルを作成します。(今回の例ではjenkinsという名前で作成) 2. Gitlab及びJenkinsと外部連携するためにIncommin/Outgoing Webhookを設定します。 3. 初期状態ではWebhookが利用できないのでSysytemコンソールからCustom Integrationsの設定を有効(true)にしてsaveしてから、画面左上メニューのSwitch to チーム名より、Sysytemコンソールを抜けます。なお、設定は必要に応じて変更してください。
4. IntegrationsメニューからWebhookを設定します。
5. Gitlab 及び Jenkinsと連携するためにIncoming Webhookをそれぞれ設定します。またチャンネルは、さきほど作成したjenkinsを指定します。
なお、設定内容(URL)はあとで利用するので控えておきます。
6. Jenkinsと連携するためにOutgoing Webhookを設定します。
チャンネルは、さきほど作成したjenkinsを指定します。
Triiger Words(One Per Line)にてBuildの指示を出す言葉(今回の例ではBuild!!)を設定します。
CallBack URLs(One Per Line)へJenkinsの対象プロジェクトをJENKINSのURL/job/プロジェクト名/build?
という形で設定します。(今回の例ではhttp://myjenkinssv:8080/job/mattermost/build?
)
なお、設定内容(token)はあとで利用するので控えておきます。
4.2 Gitlabの設定
- 今回用のプロジェクトを作成します。また後の動作確認のため、何かしらのコードを登録してコミットをしておいてください。
- プロジェクトの設定-サービスよりSlack を有効にして MattermostのIncoming WebhookのURL(4.1.5で作成したもの)を設定します。
※以下は画面取りのタイミングの関係で既にSlackが有効なためアイコンがグリーンになっていますが、設定前はグレーとなります。
ActiveにチェックをつけてSlackサービスを有効にします。
Webhookへ MattermostのIncoming WebhookのURL(4.1.5で作成したもの)を設定します。Usernameを設定します。(今回の例ではgitlab)
Save Change
後にTest setting
ボタンよりテストのリクエスト送信が正常に終了すること及びChat側にテストのpush通知が送られることを確認します。
4.3 Jenkinsの設定
- 管理機能よりプラグイン(gitlab及びmattermost)をインストールします。
Souce Code Mangement
タブでGitlabのリポジトリを設定します。
Build Triggers
タブでMattermostのOutGoing Webhookのtoken(4.1.6で作成したもの)を設定します。
Post-build Actions
タブのMattermost NotificationsのAdvanced設定で
EndpointへMattermostでのIncoming WebhookのURL(4.1.5で作成したもの)を、Project Channelへjenkinsを設定します。
なお、Gitlabの認証に失敗する場合は以下を実施します。
Jenkins側 設定
##### Jenkinsアカウントの設定 bash有効化
rootアカウントかsudoでJenkinsサーバへCLIでログインし、vi /etc/passwd
等でjenkins行の最後をfalse
からbash
に変えます。
変更前例
jenkins:x:498:498:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/false
変更後例
jenkins:x:498:498:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash
##### Jenkinsアカウントの設定 SSH keyの作成
jenkinsアカウントでSSH keyを作成します。
#su jenkins
bash-4.1$ mkdir .ssh
bash-4.1$ chmod 700 .ssh/
bash-4.1$ cd .ssh/
bash-4.1$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/jenkins/.ssh/id_rsa.
Your public key has been saved in /var/lib/jenkins/.ssh/id_rsa.pub.
The key fingerprint is:
~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~
bash-4.1$ cat id_rsa.pub
ssh-rsa
~~~~~~~~~~~~~~~~ jenkins@JENKINS_SERVER
# この中身をgitlabのjenkinsユーザのsshkeyとして登録する
~/.ssh/configファイルを作成
これがないとSSHがパスワード認証となりPermission deniedエラーとなります。
また、userをgitアカウントとするところがポイントです。
bash-4.1$ vi ~/.ssh/config
# パーミッションの変更も忘れずにする
bash-4.1$ chmod 644 config
bash-4.1$ cat ~/.ssh/config
host GITLABSERVER
HostName GITLABSERVER
User git
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /var/lib/jenkins/.ssh/id_rsa
IdentitiesOnly yes
LogLevel FATAL
GUI画面からJenkinsの対象プロジェクトのSouce Code Mangement
タブのCredentialsで以下を設定します。
- スコープグローバル
- ユーザー名 jenkins
- 秘密鍵 Jenkinsマスター上のファイルからを選択して/var/lib/jenkins/.ssh/id_rsa
を入力
- パスフレーズ:鍵生成の時にしていしたもの。なしの場合は初期表示を消す。
Gitlab 側
Jenkinsからアクセスするための専用ユーザーをGitlabに作成し、jenkinsサーバのjenkinsユーザーのid_rsa.pubをsshkeyとして登録します。
5.実行例
6.その他ハマりどころなど
Mattermostの日本語の事例がまだ少ないようで、特にGitlabとの連携部分について
調べるのにgitlab謹製のためキーワードが重複してしまうため
Gitlab側の設定でWebhookではなく、サービスのSlackを使うというところに
気づくまでがはまりどころで、自分としては盲点でした。
Mattermostは Slack Cloneをうたっているので当たり前といえば当たり前なのかもしれませんが。
それ以外は、特にはまりどころも少なかったので、既にGitlabとJenkinsをオンプレミスで利用されている環境であれば、検証レベルですがMattermostをハブとしてChatOpsライクなことを実施するハードルはかなり低いと感じました。
なお、今回ためしていませんがHubotを間に挟むと、メッセージや条件など、もう少し柔軟に設定できそうです。
7.参考
今回の検証にあたって以下を参考にさせていただきました。
- http://qiita.com/terukizm/items/4524249dd7f1298fdc06
- https://docs.mattermost.com/developer/webhooks-incoming.html
- https://docs.mattermost.com/developer/webhooks-outgoing.html
以上です。