JenkinsとGitで実装するGatewayCheckIn Pattern #AsianAA

Preview:

DESCRIPTION

2014/06/28 に開催されたAsianAAでの発表資料です。

Citation preview

Gateway CheckIn Pattern Jenkins * Git

@kyon_mm in AAA 2014/06/28

Self Introduction

Self Introduction• きょん(@kyon_mm) 26歳うさみみエンジニア

Self Introduction• きょん(@kyon_mm) 26歳うさみみエンジニア

• Test Architect in Nagoya

Self Introduction• きょん(@kyon_mm) 26歳うさみみエンジニア

• Test Architect in Nagoya

• Groovy, F#, C#, Scala

Self Introduction• きょん(@kyon_mm) 26歳うさみみエンジニア

• Test Architect in Nagoya

• Groovy, F#, C#, Scala

• SCMBC, Nagoya.Testing, TDDBC

Self Introduction• きょん(@kyon_mm) 26歳うさみみエンジニア

• Test Architect in Nagoya

• Groovy, F#, C#, Scala

• SCMBC, Nagoya.Testing, TDDBC

• TDD/BDDチョットデキル

Self Introduction• きょん(@kyon_mm) 26歳うさみみエンジニア

• Test Architect in Nagoya

• Groovy, F#, C#, Scala

• SCMBC, Nagoya.Testing, TDDBC

• TDD/BDDチョットデキル

• 月曜日に長男が生まれました

Agenda• ツール紹介

• 安全と高速の両立

• JenkinsとGitによるGateway CheckIn Pattern

• まとめ

• おまけ

Jenkins

• Continuous Integration(CI) に特化したサーバーアプリケーションです。OSSですが、エンタープライズ版もあります。Javaがインストールされていれば動きます。

• http://jenkins-ci.org/

• 現状最も柔軟なCIツール。

Git

• Distributed Version Control System(DVCS)に特化したアプリケーションです。OSSで、Linux, Mac, Windowsで動作します。

• http://git-scm.com/

• 現状最も人気のあるDVCSです。

Agenda• ツール紹介

• 安全と高速の両立

• JenkinsとGitによるGateway CheckIn Pattern

• まとめ

• おまけ

Gitのマージの不安全さ• CIなどでGitのマージを行うと便利そうに見えるときがある。

• イメージ

• git checkout id/xxx

• build

• git merge master

• git push origin master

Gitのマージの不安全さ• Gitのマージはセマンティクスを保証しない。

• テストコードがセマンティクスを保証できているかどうかを判断するタイミングが、マージ前、マージ時、マージ後のときがあり、必ずしも十分なテストコードであるかどうかはわからない。

不安全さ | 時間 を 人数で見る不安全さ

コミットする人数

手動マージ 自動マージ

時間

コミットする人数

手動マージ 自動マージ

安全側に倒す• 人数が少ないうちは多少の時間を犠牲にして手動マージしたほうが安全なコミットをするほうがメリットが高いことが多い。

• スキル差があまりにあるときや、タスク分割が下手だと、いつまでもpushできないときがあるので、ペアプロ導入やコミット対象を気にしたタスク分割をする。

特定テストを気軽に確認する• 自分の環境以外で全ての(例えば)UnitTestを確認するためにJenkinsは向いている。

特定テストを気軽に確認する• 全員で1つのリポジトリを共有していると、テストが失敗したリビジョンが全員にpullされる可能性がある

• pushする前のルールが増えてしまい、下手したらいつまでもローカルで作業をするという悪循環が生まれる。

特定テストを気軽に確認する• コミッター毎にpush専用の個人用リポジトリを用意することで、気軽にpush & CIをできるようにする。

• push専用リポジトリ = privateリポジトリ

• pull専用リポジトリ = centralリポジトリ

Agenda• ツール紹介

• 安全と高速の両立

• JenkinsとGitによるGateway CheckIn Pattern

• まとめ

• おまけ

Gateway CheckIn Pattern

Gateway CheckIn Pattern

ある基準をクリアしたコードのみが共有される仕組み(すごいざっくり説明です。要出典)

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

developer:compile & component test

central:compile & component test & integration test

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

developerジョブが成功したときのみ、pullできるリポジトリにpushされる。 このdeveloperジョブをGatewayと見なして、Gateway CheckInと呼ぶことが多いようです。

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

Gitolite Server

Jenkins Server

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

edit & merge

pull | clonepushkick job

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon push

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon pushprivate build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon pushprivate buildjenkins push

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon pushprivate build

central buildjenkins push

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon pushprivate build

central buildjenkins push

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon pushprivate build

central buildbleis pushjenkins push

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon pushprivate build

central buildbleis pushjenkins push

private build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon pushprivate build

central buildbleis push

jenkins push

jenkins push

private build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon pushprivate build

central buildbleis push

jenkins push

jenkins push

private build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis push

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis pushprivate build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis push

jenkins pushprivate build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis push

jenkins pushprivate build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis push

jenkins pushprivate build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis push

jenkins push

bleis pull

private build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis push

jenkins push

bleis pullprivate build

private build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis push

jenkins push

bleis pullprivate buildjenkins push

private build

kyon_mm Local Repo

kyon_mm private Repo

Central Repo

developer central

bleis Local Repo

bleis private Repo

bleis push

jenkins push

bleis pullprivate buildjenkins pushcentral build

private build

Agenda• ツール紹介

• 安全と高速の両立

• JenkinsとGitによるGateway CheckIn Pattern

• まとめ

• おまけ

構成まとめ• Gitリポジトリ数 : 開発者数 = n +1 : n

• Jenkinsジョブ数 = 2~

• privateからのみGitのhookでdeveloperジョブを起動。

• developerジョブ以降はJenkinsでジョブ連携

使っているJenkins Pluginや設定• ビルドパラメータ

• Git Plugin

• Build PipeLine Plugin

• Scriptler Plugin

• Log Parser

• Job ConfigHistory

まとめ• 実際にはもっと後続のジョブを連携させていますが、基本形は紹介した通りです。

• 少しずつ進歩してこの形になりましたが、基本的な形が出来てから3年ほど経過しましたが、5名程度以下の開発ではうまくいっています。(それ以上は知らない。

• 気軽にpushできるようにしたり、pullできるのはある基準での安全なコードのみに強制する仕組みもよい。

• リモートで仕事していると困るかもね :-p

ご清聴ありがとうございました

おまけ Jenkinsのダメなところ

おまけ Jenkinsのダメなところ

•ジョブは関数でしかないわけだが、関数的に扱えない。

おまけ Jenkinsのダメなところ

•ジョブは関数でしかないわけだが、関数的に扱えない。•同一のジョブを複数実行できない。再帰呼び出しも出来ない。例えば次ができない

おまけ Jenkinsのダメなところ

•ジョブは関数でしかないわけだが、関数的に扱えない。•同一のジョブを複数実行できない。再帰呼び出しも出来ない。例えば次ができない

• JobAAA repo1

おまけ Jenkinsのダメなところ

•ジョブは関数でしかないわけだが、関数的に扱えない。•同一のジョブを複数実行できない。再帰呼び出しも出来ない。例えば次ができない

• JobAAA repo1• JobBBB repo1

おまけ Jenkinsのダメなところ

•ジョブは関数でしかないわけだが、関数的に扱えない。•同一のジョブを複数実行できない。再帰呼び出しも出来ない。例えば次ができない

• JobAAA repo1• JobBBB repo1• JobBBB repo2

おまけ Jenkinsのダメなところ

•ジョブは関数でしかないわけだが、関数的に扱えない。•同一のジョブを複数実行できない。再帰呼び出しも出来ない。例えば次ができない

• JobAAA repo1• JobBBB repo1• JobBBB repo2

•マスター/スレーブで実行しているときに、スレーブマシンでジョブ実行中には「Jenkins自体の情報」を取得できない。

おまけ 現状のCIで何を選ぶべきか

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!• TeamCity

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!• TeamCity

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!• TeamCity

•とにかく柔軟にやりたい!!!

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!• TeamCity

•とにかく柔軟にやりたい!!!• Jenkins

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!• TeamCity

•とにかく柔軟にやりたい!!!• Jenkins

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!• TeamCity

•とにかく柔軟にやりたい!!!• Jenkins

• Jenkinsよりいいものがほしい!!!

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!• TeamCity

•とにかく柔軟にやりたい!!!• Jenkins

• Jenkinsよりいいものがほしい!!!• Vert.x + Scala | Groovy

おまけ 現状のCIで何を選ぶべきか

•簡単にやりたい!!!• Wercker, Travis.CI

•オンプレミスで簡単にやりたい!!!• TeamCity

•とにかく柔軟にやりたい!!!• Jenkins

• Jenkinsよりいいものがほしい!!!• Vert.x + Scala | Groovy•でつくるのが良いと思います。

Recommended