Multibranch Pipeline
with Docker 入門編
1
• 名前:木村 俊介(きむら しゅんすけ)
• 会社:NTTコムウェア@2013
• Jenkins歴:1年ちょっと
自己紹介
SVN
GUIぽちぽち
Parameterized Plugin
Git & git-flowっぽいやつ
Multibranch Pipeline
Docker
いま半年前
PJ支援etc スクラム開発
2
• 名前:木村 俊介(きむら しゅんすけ)
• 会社:NTTコムウェア@2013
• Jenkins歴:1年ちょっと
自己紹介
SVN
GUIぽちぽち
Parameterized Plugin
Git & git-flowっぽいやつ
Multibranch Pipeline
Docker
いま半年前
PJ支援etc スクラム開発
3
試
行
錯
誤
プロジェクト
• 社内向けのツール開発
• スクラム開発手法
• Java(Spring) + JavaScript(Vue.js)
• git-flowっぽい運用
• 開発メンバは5名
4
悩みごと
• GUIぽちぽち は 変更履歴が追いづらい
←いつ、なんで変更したんだっけ
5
Pipeline Plugin
• DSLでジョブを定義できる
• プロジェクト直下にJenkinsfileを配置する
• 2パターンの構文
• Scripted Pipeline Syntax
• Declarative Pipeline Syntax
sample
- src
- pom.xml
- Jenkinsfile
6
プロジェクトの作成
7
プロジェクトの作成
8
Jenkinsfileの例
(Scripted Pipeline)
#!/usr/bin/env groovy // エディタのために
node(‘master’) { // 実行するノードを指定
stage(‘Build’) { // 実行する内容のラベルを指定
sh ‘mvn package –DskipTests=true'
}
stage('Test') {
sh ‘mvn test‘ // シェルを実行
}
}
9
Stage View
• ステージごとに実行時間がわかる
10
便利なStepsたち
• 公式の Pipeline Steps Reference
だけでも282Steps…!
• その他のPluginも続々と対応
• FindBugs Plugin
• CheckStyle Plugin
• JaCoCo Plugin
• 詳しくはhttps://github.com/jenkinsci/pipeline-
plugin/blob/master/COMPATIBILITY.md
11
学んだこと
• 困ったときの Pipeline Syntax
←Stepを自動生成
12
学んだこと
• 特定ノードでしか動かない箇所を作らない
特にnode内でinputで待たない
Top 10 Best Practices for Jenkins Pipeline Plugin 13
ジョブが滞留する→
反省点
• 新規に書くなら
Declarative Pipeline がおススメ
• 後処理がパッと見でわかりやすい
• lintもかけられる
try {
…
} catch(Exception e) {
echo ‘send email or chat’
throw e
} finally {
echo ‘delete file’
}
…
post {
failure {
echo ‘send email or chat’
}
always {
echo ‘delete file’
}
}
Scripted Pipeline Declarative Pipeline
14
悩みごと
• GUIぽちぽち は 変更が即反映されるため、
動作確認がしづらい
←新しいplugin入れてみたいけど…
15
悩みごと
• git-flow っぽいやつを採用したときに、
日々増えるブランチをどう管理すればいいのか
https://leanpub.com/git-flow/read から引用
←ブランチ増えるたびに
ジョブをコピーするの?
16
Multibranch Pipeline
• Gitのブランチごとにジョブを作成してくれる
17
プロジェクトの作成
18
プロジェクトの作成
19
良いところ
• ブランチ毎のJenkinsfileを基にジョブが動くため、
検証用ブランチを切れば動作確認が気軽にできる
20
ブランチの削除
https://issues.jenkins-ci.org/browse/JENKINS-42813
• ブランチの保存数を設定できる
21
ビルド履歴の保存
• ブランチ内のビルド履歴は全て保存される
22
ディスクフル
23
#!/usr/bin/env groovy
properties([[$class: 'BuildDiscarderProperty',
strategy: [$class: 'LogRotator’,
numToKeepStr: '5', artifactNumToKeepStr: '5']
]])
node(‘master’) {
stage(‘Build’) {
…
• Jenkinsfileの例(Scripted Pipeline)
ビルド履歴の保存
24
学んだこと
• 学んだこと
• 不要なブランチはこまめに消す
• ディスク使用率は監視する(Disk Usage Plugin)
• PRを扱うためには以下を使う
• Bitbucket Branch Source Plugin
• Github Branch Source Plugin
• PRの情報が追加で欲しければWEB APIを呼び出す
25
反省点
• PR時のジョブを Parameterized Build
で頑張って自作した後に上記pluginに移行…
26
悩みごと
• 今どきのCIっぽく、
ビルドはクリーンなコンテナ内で行いたい
master
slave slave
スレーブ毎に乖離が出てきて…
Java8
node v6.5
Java7
node v6.4
A.xml B.xml
27
Docker
• Docker上でジョブを実行するメジャーな方法
• Docker Plugin
• Docker Pipeline Plugin
• Dockerコマンドをshステップで実行
28
Docker
Docker Plugin
slave
Docker Pipeline Plugin
slave
…
イメージをスレーブとして登録
ジョブごとに
スレーブを生成~破棄する
スレーブは常に存在し、ジョブ実行中に
スレーブからDockerを生成~破棄する
Dockerコマンドを
shステップで実行
node {
..
sh “docker …”
..
}
Jenkinsfile
29
採用したもの
ビルド
単体テスト
静的解析
API生成
docker build
docker run
docker stop
docker cp
docker rm
• 開発者のローカル環境でも同じ成果物が作れる
ようにしたかったため、shステップを採用
30
Dockerfileのイメージ
FROM openjdk:8u131-jdk-alpine
RUN apk update && apk upgrade && 
apk add maven=3.3.9-r1
// mavenのローカルリポジトリのディレクトリを指定
COPY settings.xml /usr/share/java/maven-3/conf/settings.xml
// コンテナ内の/buildにアプリ資材を移す
COPY . /build
WORKDIR /build
31
• 各種ライブラリを
インストールしたイメージを作成する
Dockerコマンドのイメージ
• DockerコマンドをMakefileにまとめると
Jenkinsfileが見通しがよくなる
build:
// イメージのビルド
docker build -t $(BUILD_SERVER_IMAGE) –f Dockerfile .
// コンテナの起動&ライブラリのキャッシュ
docker run –name $(BUILD_CONTAINER)
-v $(CACHE_PATH)/.m2:/root/.m2
$(BUILD_SERVER_IMAGE) mvn package
// 成果物の取り出し
docker cp $(BUILD_CONTAINER):/build/target server
// コンテナの削除
docker rm $(BUILD_CONTAINER)
32
Jenkinsfileのイメージ
…
sh ‘make –f Makefile.docker build’
archiveArtifacts 'target/*jar'
…
33
• shステップで実行するだけ
学んだこと
• maven等のライブラリはキャッシュする
(お手軽なのはホストへのマウント)
• Dockerで分離した環境が作れるので、
開発者の端末もスレーブに
追加できるようになった
25分 2分
34
反省点
• コンテナ内のパスと
Jenkinsのworkspaceのパスが異なると、
CheckStyleでソースへ飛べなくなることが…
35
反省点
• コンテナは実行環境に徹するべきだった
…workspace/
- src
- pom.xml
- Jenkinsfile
- Dockerfile
実行ユーザで起動
-u $(id -u):$(id -g)
階層を保ったままマウントする
-v $(pwd):$(pwd)
ワークスペースをカレントにする
-w $(pwd)
…workspace/
- src
- pom.xml
- Jenkinsfile
- Dockerfile
36
Docker Pipeline Plugin
• Plugin は前述の動きをしてくれるので良さそう
• 少し試してブログにメモ書きました
#!/usr/bin/env groovy
pipeline {
agent {
dockerfile {
filename 'Dockerfile'
args '-v /tmp/docker/cache/.m2:/var/maven/.m2'
}
}
stages {
…
}
Docker Pipeline Pluginの例(Declarative Pipeline)
37
まとめ
• Pipeline で
ジョブをコードとして構成管理できる
• Multibranch Pipeline で
複数ブランチが見やすく管理できる
• Docker で
いつでもクリーンなビルド環境を保てる
38
最後に一言
• ある日の自分・・・
まーたJenkinsこわれてるよ
…あー…テスト失敗しとる…
39
最後に一言
• 後ろの席のコミッタ(@sogabe)
こわれてるのはJenkins
じゃなくてジョブかオマエ
40
言葉は正しく
41
Jenkinsこわれた
42
Jenkinsこわれた
ジョブが失敗した
43
Jenkinsこわれた
44
Jenkinsこわれた
Jenkinsをこわした
45
Jenkinsこわれた
46
Jenkinsこわれた
自分の力量不足で
Jenkinsさんに
ご迷惑をかけた
47
48
権利について
• Javaは、Oracle Corporation及びその子会社、
関連会社の米国およびその他の国における登録商標です。
• その他本文中に記載されている製品名および社名は、
それぞれ各社の登録商標または商標です。
• 本文中では® および™ の表記は省略しています。
49

Multibranch Pipeline with Docker 入門編