SlideShare a Scribd company logo
Jenkins  再⼊入⾨門
Miyata Jumpei (@miyajan)
Apr 20, 2016 #cybozu_ikyu
⾃自⼰己紹介
• 宮⽥田  淳平  (@miyajan)  
• サイボウズ株式会社  
• 開発基盤部⽣生産性向上チーム  
• 品質保証部テストエンジニアリングチーム  
• 最近の趣味:筋トレ  
• 5ヶ⽉月で50kg→60kg
今回のお話
社内のKAIZENアプリに登録されたレコード
当時の問題
Jenkins環境がカオス
• 1つのjenkinsを複数チームで共有していた  
• 159ジョブ存在  
• ビルドマシンに必要なものを好き勝⼿手インストール  
• 再構築がほぼ不不可能  
• jenkins本体やプラグインのアップデートが困難  
• アップデートするとなにかしらのジョブが落落ちる
ビルドスクリプトがカオス
• Jenkins上のジョブの設定に複雑なスクリプトが書かれている  
• バージョン管理理できない  
• grepとかもできない  
• そこからGitのリポジトリ内にあるスクリプトを呼び出している  
• 依存関係の把握が難しい  
• スクリプトのメンテナンスが属⼈人的になりがち  
• Jenkinsおじさんと呼ばれる
プラグインがカオス
• 予想外の挙動をする  
• メンテナンスされてない  
• プラグインを組み合わせるとうまく動かない  
• どれをインストールしたか覚えてない
Jenkinsの構造上の問題
• GUI設定の功罪  
• GUIによる設定は⼀一⾒見見簡単だけどメンテナンス性が低い  
• ホームページビルダーを思い出せ!  
• ジョブの数が増えすぎると管理理が厳しい  
• 全体の設定やプラグインが⼀一律律に適⽤用されてしまう  
• ビルド環境がその場しのぎで変更更されていく  
• 依存関係が複雑、再現不不能
Jenkinsはオワコンなのか!?
最近流流⾏行行りのCIツールはどうだろう!?
メリット
• リポジトリにymlファイルとか置くだけ  
• シンプル  
• バージョン管理理される  
• コンテナベースのビルド  
• 毎回クリーンかつ独⽴立立した環境  
• 単純なCI/CDに向いてる
デメリット
• 世の中の情報がまだ少ない  
• ベストプラクティスが出揃ってない印象(偏⾒見見)  
• Jenkins上で多様化かつ複雑化したジョブの置き換えが難しい  
• 1リポジトリに複数のジョブ  
• 並列列実⾏行行  
• cron的な使い⽅方  
• etc.  
• できなくはないかもだけど結局カオス化しそう
Jenkinsを置き換えるのも⾟辛そう!
Jenkinsを⼀一からやり直そう!
Goal
• Jenkins本体とプラグインを気軽に更更新できる  
• ジョブの設定の変更更が容易易  
• ビルド環境が独⽴立立かつ⼿手軽に再構築可能  
• これまでと同等以上のことができる
運⽤用編
Release  Line
• Jenkinsには複数のRelease  Lineが存在する  
• LTS  Release  
• 3ヶ⽉月に1度度リリースされる安定版  
• その間は重要な不不具合改修のみ  
• Weekly  Release  
• 毎週リリースされる最新版  
• 最新のJenkinsを試したい⼈人向き  
• 業務で運⽤用するならLTS
master  &  slave
master
slave
slave
slave
build
build
build
master  &  slave
• master  
• 通常SPOF  
• 負荷をかけないようにビルドには使わないことを推奨  
• ノードの管理理から設定できる  
• slave  
• 冗⻑⾧長性とscalabilityのために複数slaveを追加できる構成を推奨  
• ビルドはできる限り特定のslaveに依存しないようにする  
• Windowsやmacだとしょうがない感ある  
• Dockerコンテナ内でビルドすると便便利利(後述)
1チーム1Jenkins
• 複数チームで運⽤用すると調整が厳しい  
• 本体やプラグインを他チームの事情で更更新できな
くなる  
• 複数チームのSPOFになってしまう  
• チームごとに楽に構築できるようにしたほうがいい
Jenkins構築
• masterはDockerで構築すると楽  
• tagを変えるだけでバージョン変更更できる
$ docker run 
-p 8080:8080 -p 50000:50000 
-v /var/jenkins_home:/var/jenkins_home 
-v /etc/localtime:/etc/localtime:ro 
--env JAVA_OPTS=“-Duser.timezone=Asia/Tokyo -Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8” 
--env JENKINS_OPTS=“--sessionTimeout=1440” 
jenkins:1.642.4
構成管理理ツール
• masterもslaveも複数存在する状況になってくると構
成管理理ツールの導⼊入を推奨  
• メンテコスト削減  
• 環境構築⼿手順をスクリプトで⾒見見える化  
• 特定の環境だけ違うという状況を避ける  
• ⾃自分はansible使ってます
プラグインの管理理
• プラグインはとても便便利利な反⾯面、問題を起こしやすい  
• プラグインのメンテ頻度度が⾼高くないことが多い  
• プラグイン同⼠士の組み合わせで予想外の問題が起きることも  
• プラグインをインストールしすぎて管理理できなくなる  
• どのプラグインが使われているor使われていないのか  
• 本当に必要なプラグインだけ活⽤用する  
• ビルドスクリプト側でなんとかなることが多い  
• 使えるプラグインやハマるプラグインの情報を共有することも⼤大事
ジョブ設定編
ビルドスクリプト
• JenkinsのGUIに書かない  
• 変更更を管理理できない  
• リポジトリの変更更とスクリプトの変更更が連動しない  
• リポジトリに⼊入れる  
• GUIからは1スクリプト呼び出すだけにする  
• 変更更を管理理できる  
• リポジトリの変更更とスクリプトの変更更が連動する  
• 構造化  
• しっかりDRY、KISSといった原則を守る  
• 共通で呼び出されるスクリプトが区別できるようにディレクトリ構造を整理理
コンテナ内ビルド
• LinuxならDockerコンテナ内でビルド推奨  
• プラグインで実現可能  
• 環境の切切り替えが楽  
• クリーンで再現可能な環境
コンテナ内ビルド系プラグイン
• 複数ある  
• Docker  Plugin  
• CloudBees  Docker  Custom  Build  Environment  
Plugin  
• Pipeline  Plugin  +  CloudBees  Docker  Pipeline  Plugin  
• どれがいいの?
Docker  Plugin
• Dockerコンテナをslaveとして⽴立立ち上げる  
• 設計上イケてない点が多い  
• 使⽤用するイメージをシステムの設定で管理理するためジョブ
ごとに切切り替えられない  
• コンテナ内でビルドしたいだけなのにコンテナをslaveにす
るのは⼤大げさ  
• 今年年に⼊入って新しいバージョンがリリースされてない
CloudBees  Docker  Custom  
Build  Environment  Plugin
• ビルドをDockerコンテナ内で実⾏行行する  
• workspaceと/tmpをmountする  
• 前処理理や後処理理はコンテナ内で⾏行行われないので注意  
• ジョブごとに使⽤用するイメージを切切り替えられる  
• リポジトリ内のDockerfileを指定することもできる  
• ⼿手軽に使えて実⽤用的
ちなみにCloudBeesって?
• エンタープライズ向けJenkinsソリューションを提供  
• Jenkinsの⽣生みの親、川⼝口耕介⽒氏がCTO  
• Jenkins  Enterprise  
• ⼤大規模向けに技術サポートや独⾃自プラグイン  
• オンプレミス版とクラウド版の両⽅方ある  
• OSS版やコミュニティにも貢献
Pipeline  Plugin
• デリバリーパイプラインをDSL(Groovy)で記述できるプラグイン  
• 旧名Workflow  Plugin  
• Build  Pipeline  PluginとかDelivery  Pipeline  Pluginとかややこしい名前
のプラグインが多いけど別物  
• Jenkins  2.0では標準でインストールされる  
• ジョブやパイプラインの設定をリポジトリで管理理できる  
• コードで記述できるので柔軟な設定が可能  
• まだ発展途中感ある
Pipeline  Plugin
node  {  
      //  Mark  the  code  checkout  'stage'....  
      stage  'Checkout'  
      //  Get  some  code  from  a  GitHub  repository  
      git  url:  'https://github.com/jglick/simple-‐‑‒maven-‐‑‒project-‐‑‒with-‐‑‒tests.git'  
      //  Get  the  maven  tool.  
      //  **  NOTE:  This  'M3'  maven  tool  must  be  configured  
      //  **              in  the  global  configuration.                        
      def  mvnHome  =  tool  'M3'  
      //  Mark  the  code  build  'stage'....  
      stage  'Build'  
      //  Run  the  maven  build  
      sh  "${mvnHome}/bin/mvn  clean  install"  
}
Jenkinsfile  from  SCM
Snippet  Generator
Pipeline  Stage  View  Plugin
CloudBees  Docker  Pipline  
Plugin
• Pipeline  Plugin内でDocker操作を記述できる
ようにしたプラグイン  
• コンテナ内ビルド  
• imageのbuild  &  publish  
• オプションをコードで記述できるので柔軟
CloudBees  Docker  Pipeline  
Plugin
docker.image(ʻ‘maven:3.3.3-‐‑‒jdk-‐‑‒8ʼ’).inside(ʻ‘-‐‑‒v  /m2repo:/m2repoʼ’)  {  
    git  '…your-‐‑‒sources…'  
    sh  'mvn  -‐‑‒B  clean  install'  
}
Docker系プラグインまとめ
• 現在のジョブで⼿手軽に試すなら  
• CloudBees  Docker  Custom  Build  
Environment  Plugin  
• Jenkins  2.0時代を⾒見見据えるなら  
• Pipeline  Plugin  +  CloudBees  Docker  
Pipeline  Plugin
その他
• タイムアウトを設定する  
• 予想外に滞留留したときに気づける  
• Build-‐‑‒timeout  Plugin  
• ディスク容量量に注意する  
• 古いビルドの破棄や成果物の保存最⼤大数を設定する  
• 誰が責任を持つジョブか分かるようにする  
• ⻑⾧長く運⽤用すると消していいのかわからないジョブが出てくる  
• ジョブ名にチーム名or個⼈人名を⼊入れるとか
まとめ
• Jenkinsはカオスになりやすい  
• GUI設定の功罪  
• ジョブが増えすぎると管理理不不能  
• その場しのぎのビルド環境  
• 運⽤用で回避できる  
• ビルドスクリプトをバージョン管理理する  
• Jenkinsを分散  
• コンテナによる再現可能かつクリーンなビルド環境  
• 正直まだ⼿手探り
One  more  thing…
Jenkins  2.0
• ついに出るよ!
Jenkins  1.x  の歴史
• 2005年年  Hudson  1.0リリース  
• 2011年年  forkしてJenkins  1.396リリース  
• 2016年年  1.656ぐらい  
• 11年年間1.xが続いた
Jenkins  1.x  の問題
• インストール後なにすればいいかわからん  
• プラグイン多すぎ  
• セキュリティの設定どうすればいいの  
• Continuous  Deliveryの普及でユースケースが複雑化  
• より柔軟にジョブの設定ができるUIが必要  
• 公式サイト(jenkins-‐‑‒ci.org)古すぎ  
• 6年年前からある  
• ⽬目的のドキュメントを探せない  
• そもそもJenkinsはCIだけじゃないし
Jenkins  2.0  の⽬目⽟玉
• Pipeline  as  Code  
• UI改善  
• 公式サイト改善  
• 1.xとの後⽅方互換性
Pipeline  as  Code
• Pipeline  Pluginがデフォルトでインストール済み  
• 複雑なJenkinsジョブを実現  
• ビルド、テスト、デプロイパイプライン  
• より柔軟なロジックを組むための概念念  
• Stage,  Human  Input,  Parallel  
• Jenkinsの再起動からの復復旧  
• as  Code  
• すべてのジョブ定義がスクリプト化  
• バージョン管理理、コードレビューができる
UI改善
• セットアップウィザード  
• ジョブ設定
Jenkins 再入門
Jenkins 再入門
Jenkins 再入門
Jenkins 再入門
Jenkins 再入門
Jenkins 再入門
Jenkins 再入門
Jenkins 再入門
新公式サイト(jenkins.io)
Roadmap
• 02/29:  alpha  
• 03/23:  beta  
• 04/06:  RC  
• 04/20:  Release!  
• 今年年の夏:  
• LTS  Release  
• 1.xのメンテナンス停⽌止
Try  2.0!
$  docker  pull  jenkinsci/jenkins:2.0-‐‑‒rc-‐‑‒1  
$  docker  run  -‐‑‒p  8080:8080  -‐‑‒p  50000:50000  jenkinsci/jenkins:2.0-‐‑‒rc-‐‑‒1
まとめ
• Jenkinsはまだまだ進化している  
• Jenkins最⾼高!
WE  ARE  HIRING!
Jenkinsを探求したい⽅方はぜひサイボウズへ!  
http://cybozu.co.jp/company/job/recruitment/
Thanks!

More Related Content

Jenkins 再入門