Post on 22-Jan-2018
Multibranch Pipeline with Docker 入門編
1
• 名前:木村 俊介(きむら しゅんすけ)
• 会社:NTTコムウェア@2013
• Jenkins歴:1年ちょっと
自己紹介
SVNGUIぽちぽちParameterized Plugin
Git & git-flowっぽいやつMultibranch PipelineDocker
いま半年前
PJ支援etc スクラム開発
2
• 名前:木村 俊介(きむら しゅんすけ)
• 会社:NTTコムウェア@2013
• Jenkins歴:1年ちょっと
自己紹介
SVNGUIぽちぽちParameterized Plugin
Git & git-flowっぽいやつMultibranch PipelineDocker
いま半年前
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
スレーブ毎に乖離が出てきて…
Java8node v6.5
Java7node 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 builddocker run
docker stopdocker cpdocker 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 . /buildWORKDIR /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