2017年3月11日土曜日

hubot と Jenkins を Docker で動作させて Slack から Jenkins のジョブを実行させてみた

概要

構成として以下を実現してみました
hubot_jenkins_on_docker1.png

ユーザは Slack を使って hubot に話かけます
そして hubot から Jenkins のジョブを実行します
そして hubot および Jenkins は docker コンテナとして動作させます

環境

  • Mac OS X 10.12.3
  • docker 17.03.0-ce, build 60ccb22
  • Jenkins 2.32.3
  • hubot 2.19.0

Jenkins コンテナの準備

まずは Jenkins コンテナを準備します
Jenkins の設定ファイルなどの保存は一旦ローカルのストレージにしておきます

  • mkdir /work/local_jenkins_home
  • cd local_/work/jenkins_home
  • docker pull jenkins
  • docker run -d -p 8080:8080 -v $(pwd):/var/jenkins_home jenkins

でコンテナを起動させましょう
localhost:8080 にアクセスすれば設定画面が表示されると思います
簡単に初期設定だけ行っておきます

  • docker exec [container_id] cat /var/jenkins_home/secrets/initialAdminPassword

で初期パスワードを取得して認証します
そして、推奨プラグインたちをインストールします
Jenkins を利用するユーザのユーザ名とパスワード、メールアドレスを入力します (今回は、admin/jenkins とします)

あとは「Jenkins の管理 -> グローバルセキュリティの設定 -> CSRF 対策のチェックを外す」を行っておいてください
これは hubot からアクセスするために利用する設定となります

あとは適当なジョブを 1 つ作成しておいてください
今回は「test」というジョブを作成したことにします

Jenkins コンテナはそのままにして次に進みます

hubot コンテナの準備

hubot コンテナを作成します
hubot-jenkins というプラグインを使って先ほど作成した Jenkins コンテナと連携します
また、Slack アダプタを使って Slack とも連携するのあらかじめ HUBOT_SLACK_TOKEN を取得しておいてください (参考)

  • mkdir /work/hubot
  • cd /work/hubot
  • vim Dockerfile
vim Dockerfile

FROM node

RUN npm install -g yo generator-hubot
RUN npm list -g yo generator-hubot
RUN useradd bot
RUN mkdir /home/bot && chown bot.bot /home/bot

USER bot
WORKDIR /home/bot
RUN npm install hubot-jenkins --save
RUN yo hubot --owner "hawksnowlog" --name "jenkins-bot" --description "A bot which can be kicked any jenkins job" --adapter slack
COPY external-scripts.json /home/bot/

CMD cd /home/bot/hubot; bin/hubot --adapter slack
  • vim external-scripts.json
[
  "hubot-help",
  "hubot-jenkins"
]
  • docker build -t jenkins-bot .

で hubot 用のイメージを作成します
そしてイメージが作成できたら hubot コンテナを起動しましょう
各種、環境変数は各人の環境に合わせて変更してください
HUBOT_JENKINS_URL は Jenkins コンテナが動作している IP アドレスを
HUBOT_JENKINS_AUTH は初期設定で作成した Jenkins のユーザ名とパスワードを入力してください

  • docker run -d -e "HUBOT_SLACK_TOKEN=your-hubot-slack-token" -e "HUBOT_JENKINS_URL=http://172.17.0.2:8080" -e "HUBOT_JENKINS_AUTH=admin:jenkins" -e “PORT=8080" jenkins-bot

起動したら Slack からアクセスできるか確認してみましょう
Slack で作成した Hubot Integration の名前は「@jenkins-bot」とします

  • @jenkins-bot jenkins list

と入力するとジョブの一覧が表示されると思います

  • @jenkins-bot jenkins build test

みたいな感じで test ジョブを実行することができます
Slack 上で実行すると「@hawksnowlog: (201) Build started for test http://172.17.0.2:8080/job/test」みたいな感じでボットは返してくれます
あくまでもジョブの実行だけを行ってくれるのでジョブの経過は Jenkins 上で確認する必要があります

今回の場合 help コマンドも使えるので他の jenkins コマンドを確認したい場合は「@jenkins-bot help」と入力してみてください

docker-compose.yml にする

せっかくなので docker-compose.yml で起動できるようにしてみます
docker-compose を実行する場合は事前に起動しておいた Jenkins と Hubot コンテナは停止しておいてください

  • cd /work/hubot
  • mv ../local_jenkins_home/ .
  • vim docker-compose.yml
hubot:
  build: .
  links:
    - jenkins
  environment:
    - HUBOT_SLACK_TOKEN=your-hubot-slack-token
    - HUBOT_JENKINS_URL=http://jenkins:8080
    - HUBOT_JENKINS_AUTH=admin:jenkins
    - PORT=8080
jenkins:
  image: jenkins:latest
  ports:
    - 8080:8080
  volumes:
    - ./local_jenkins_home:/var/jenkins_home
  • docker-compose up -d

という感じです
ポイントは一番初めに設定した Jenkins のデータを一旦 docker-compose.yml 配下のディレクトリに移動して、docker-compose.yml からマウントできるようにした点です

あとは環境変数やポート、URL の設定をそのまま docker-compose 用に書き直したになります

これで、Jenkins + hubot コンテナがコマンド一発で起動できるようになります

最後に

Docker を使って Jenkins と Hubot のコンテナを作成し、Slack から Jenkins のジョブを実行できるようにしてみました
あとは Jenkins 上でジョブを追加すれば、そのまま Slack からでも実行できるようになります

今回 Jenkins の設定ファイル群はローカルに保存しています
このファイル群が削除またはロストしたりすると Jenkins コンテナが完全初期状態になっていまいます
なので、このディレクトリを tar などに圧縮してどこかにバックアップしておいたりするといいと思います
Jenkinsfile などは使っていないので Jenkinsfile を使ってジョブの設定はどこかのリポジトリで管理してもいいかなと思います

参考サイト

0 件のコメント:

コメントを投稿