概要
構成として以下を実現してみました
ユーザは 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 件のコメント:
コメントを投稿