multibranch pipeline with docker 入門編

49
Multibranch Pipeline with Docker 入門編 1

Upload: kimulla

Post on 22-Jan-2018

1.599 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Multibranch Pipeline with Docker 入門編

Multibranch Pipeline with Docker 入門編

1

Page 2: Multibranch Pipeline with Docker 入門編

• 名前:木村 俊介(きむら しゅんすけ)

• 会社:NTTコムウェア@2013

• Jenkins歴:1年ちょっと

自己紹介

SVNGUIぽちぽちParameterized Plugin

Git & git-flowっぽいやつMultibranch PipelineDocker

いま半年前

PJ支援etc スクラム開発

2

Page 3: Multibranch Pipeline with Docker 入門編

• 名前:木村 俊介(きむら しゅんすけ)

• 会社:NTTコムウェア@2013

• Jenkins歴:1年ちょっと

自己紹介

SVNGUIぽちぽちParameterized Plugin

Git & git-flowっぽいやつMultibranch PipelineDocker

いま半年前

PJ支援etc スクラム開発

3

試行錯誤

Page 4: Multibranch Pipeline with Docker 入門編

プロジェクト

• 社内向けのツール開発

• スクラム開発手法

• Java(Spring) + JavaScript(Vue.js)

• git-flowっぽい運用

• 開発メンバは5名

4

Page 5: Multibranch Pipeline with Docker 入門編

悩みごと

• GUIぽちぽち は 変更履歴が追いづらい

←いつ、なんで変更したんだっけ

5

Page 6: Multibranch Pipeline with Docker 入門編

Pipeline Plugin

• DSLでジョブを定義できる• プロジェクト直下にJenkinsfileを配置する

• 2パターンの構文• Scripted Pipeline Syntax

• Declarative Pipeline Syntax

sample- src- pom.xml- Jenkinsfile

6

Page 7: Multibranch Pipeline with Docker 入門編

プロジェクトの作成

7

Page 8: Multibranch Pipeline with Docker 入門編

プロジェクトの作成

8

Page 9: Multibranch Pipeline with Docker 入門編

Jenkinsfileの例(Scripted Pipeline)

#!/usr/bin/env groovy // エディタのために

node(‘master’) { // 実行するノードを指定stage(‘Build’) { // 実行する内容のラベルを指定

sh ‘mvn package –DskipTests=true'}stage('Test') {

sh ‘mvn test‘ // シェルを実行}

}

9

Page 10: Multibranch Pipeline with Docker 入門編

Stage View

• ステージごとに実行時間がわかる

10

Page 11: Multibranch Pipeline with Docker 入門編

便利なStepsたち

• 公式の Pipeline Steps Referenceだけでも282Steps…!

• その他のPluginも続々と対応• FindBugs Plugin

• CheckStyle Plugin

• JaCoCo Plugin

• 詳しくはhttps://github.com/jenkinsci/pipeline-plugin/blob/master/COMPATIBILITY.md

11

Page 12: Multibranch Pipeline with Docker 入門編

学んだこと

• 困ったときの Pipeline Syntax

←Stepを自動生成

12

Page 13: Multibranch Pipeline with Docker 入門編

学んだこと

• 特定ノードでしか動かない箇所を作らない特にnode内でinputで待たない

Top 10 Best Practices for Jenkins Pipeline Plugin 13

ジョブが滞留する→

Page 14: Multibranch Pipeline with Docker 入門編

反省点

• 新規に書くなら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

Page 15: Multibranch Pipeline with Docker 入門編

悩みごと

• GUIぽちぽち は 変更が即反映されるため、動作確認がしづらい

←新しいplugin入れてみたいけど…

15

Page 16: Multibranch Pipeline with Docker 入門編

悩みごと

• git-flow っぽいやつを採用したときに、日々増えるブランチをどう管理すればいいのか

https://leanpub.com/git-flow/read から引用

←ブランチ増えるたびにジョブをコピーするの?

16

Page 17: Multibranch Pipeline with Docker 入門編

Multibranch Pipeline

• Gitのブランチごとにジョブを作成してくれる

17

Page 18: Multibranch Pipeline with Docker 入門編

プロジェクトの作成

18

Page 19: Multibranch Pipeline with Docker 入門編

プロジェクトの作成

19

Page 20: Multibranch Pipeline with Docker 入門編

良いところ

• ブランチ毎のJenkinsfileを基にジョブが動くため、検証用ブランチを切れば動作確認が気軽にできる

20

Page 21: Multibranch Pipeline with Docker 入門編

ブランチの削除

https://issues.jenkins-ci.org/browse/JENKINS-42813

• ブランチの保存数を設定できる

21

Page 22: Multibranch Pipeline with Docker 入門編

ビルド履歴の保存

• ブランチ内のビルド履歴は全て保存される

22

Page 23: Multibranch Pipeline with Docker 入門編

ディスクフル

23

Page 24: Multibranch Pipeline with Docker 入門編

#!/usr/bin/env groovy

properties([[$class: 'BuildDiscarderProperty',strategy: [$class: 'LogRotator’, numToKeepStr: '5', artifactNumToKeepStr: '5']

]])

node(‘master’) { stage(‘Build’) {…

• Jenkinsfileの例(Scripted Pipeline)

ビルド履歴の保存

24

Page 25: Multibranch Pipeline with Docker 入門編

学んだこと

• 学んだこと• 不要なブランチはこまめに消す

• ディスク使用率は監視する(Disk Usage Plugin)

• PRを扱うためには以下を使う• Bitbucket Branch Source Plugin

• Github Branch Source Plugin

• PRの情報が追加で欲しければWEB APIを呼び出す

25

Page 26: Multibranch Pipeline with Docker 入門編

反省点

• PR時のジョブを Parameterized Buildで頑張って自作した後に上記pluginに移行…

26

Page 27: Multibranch Pipeline with Docker 入門編

悩みごと

• 今どきのCIっぽく、ビルドはクリーンなコンテナ内で行いたい

master

slave slave

スレーブ毎に乖離が出てきて…

Java8node v6.5

Java7node v6.4

A.xml B.xml

27

Page 28: Multibranch Pipeline with Docker 入門編

Docker

• Docker上でジョブを実行するメジャーな方法

• Docker Plugin

• Docker Pipeline Plugin

• Dockerコマンドをshステップで実行

28

Page 29: Multibranch Pipeline with Docker 入門編

Docker

Docker Plugin

slave

Docker Pipeline Plugin

slave…

イメージをスレーブとして登録ジョブごとにスレーブを生成~破棄する

スレーブは常に存在し、ジョブ実行中にスレーブからDockerを生成~破棄する

Dockerコマンドをshステップで実行

node {..sh “docker …”..

}

Jenkinsfile

29

Page 30: Multibranch Pipeline with Docker 入門編

採用したもの

ビルド単体テスト静的解析API生成

docker builddocker run

docker stopdocker cpdocker rm

• 開発者のローカル環境でも同じ成果物が作れるようにしたかったため、shステップを採用

30

Page 31: Multibranch Pipeline with Docker 入門編

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

• 各種ライブラリをインストールしたイメージを作成する

Page 32: Multibranch Pipeline with Docker 入門編

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

Page 33: Multibranch Pipeline with Docker 入門編

Jenkinsfileのイメージ

… sh ‘make –f Makefile.docker build’archiveArtifacts 'target/*jar'

33

• shステップで実行するだけ

Page 34: Multibranch Pipeline with Docker 入門編

学んだこと

• maven等のライブラリはキャッシュする(お手軽なのはホストへのマウント)

• Dockerで分離した環境が作れるので、開発者の端末もスレーブに追加できるようになった

25分 2分

34

Page 35: Multibranch Pipeline with Docker 入門編

反省点

• コンテナ内のパスとJenkinsのworkspaceのパスが異なると、CheckStyleでソースへ飛べなくなることが…

35

Page 36: Multibranch Pipeline with Docker 入門編

反省点

• コンテナは実行環境に徹するべきだった

…workspace/- src- pom.xml- Jenkinsfile- Dockerfile

実行ユーザで起動-u $(id -u):$(id -g)

階層を保ったままマウントする-v $(pwd):$(pwd)

ワークスペースをカレントにする-w $(pwd)

…workspace/- src- pom.xml- Jenkinsfile- Dockerfile

36

Page 37: Multibranch Pipeline with Docker 入門編

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

Page 38: Multibranch Pipeline with Docker 入門編

まとめ

• Pipeline でジョブをコードとして構成管理できる

• Multibranch Pipeline で複数ブランチが見やすく管理できる

• Docker でいつでもクリーンなビルド環境を保てる

38

Page 39: Multibranch Pipeline with Docker 入門編

最後に一言

• ある日の自分・・・

まーたJenkinsこわれてるよ…あー…テスト失敗しとる…

39

Page 40: Multibranch Pipeline with Docker 入門編

最後に一言

• 後ろの席のコミッタ(@sogabe)

こわれてるのはJenkinsじゃなくてジョブかオマエ

40

Page 41: Multibranch Pipeline with Docker 入門編

言葉は正しく

41

Page 42: Multibranch Pipeline with Docker 入門編

Jenkinsこわれた

42

Page 43: Multibranch Pipeline with Docker 入門編

Jenkinsこわれたジョブが失敗した

43

Page 44: Multibranch Pipeline with Docker 入門編

Jenkinsこわれた

44

Page 45: Multibranch Pipeline with Docker 入門編

JenkinsこわれたJenkinsをこわした

45

Page 46: Multibranch Pipeline with Docker 入門編

Jenkinsこわれた

46

Page 47: Multibranch Pipeline with Docker 入門編

Jenkinsこわれた

自分の力量不足でJenkinsさんにご迷惑をかけた

47

Page 48: Multibranch Pipeline with Docker 入門編

48

Page 49: Multibranch Pipeline with Docker 入門編

権利について

• Javaは、Oracle Corporation及びその子会社、関連会社の米国およびその他の国における登録商標です。

• その他本文中に記載されている製品名および社名は、それぞれ各社の登録商標または商標です。

• 本文中では® および™ の表記は省略しています。

49