Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Multibranch Pipeline with Docker 入門編

1,984 views

Published on

第10回 Jenkins勉強会 2017/7/7(金)

https://www.meetup.com/ja-JP/Tokyo-Jenkins-Area-Meetup/events/240833004/?eventId=240833004&chapter_analytics_code=UA-100000849-2

Published in: Technology
  • Be the first to comment

Multibranch Pipeline with Docker 入門編

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

×