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

2,167
-1

Published on

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

Published in: Technology, Business
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,167
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
10
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

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

  1. 1. Gateway CheckIn Pattern Jenkins * Git @kyon_mm in AAA 2014/06/28
  2. 2. Self Introduction
  3. 3. Self Introduction • きょん(@kyon_mm) 26歳 うさみみエンジニア
  4. 4. Self Introduction • きょん(@kyon_mm) 26歳 うさみみエンジニア • Test Architect in Nagoya
  5. 5. Self Introduction • きょん(@kyon_mm) 26歳 うさみみエンジニア • Test Architect in Nagoya • Groovy, F#, C#, Scala
  6. 6. Self Introduction • きょん(@kyon_mm) 26歳 うさみみエンジニア • Test Architect in Nagoya • Groovy, F#, C#, Scala • SCMBC, Nagoya.Testing, TDDBC
  7. 7. Self Introduction • きょん(@kyon_mm) 26歳 うさみみエンジニア • Test Architect in Nagoya • Groovy, F#, C#, Scala • SCMBC, Nagoya.Testing, TDDBC • TDD/BDDチョットデキル
  8. 8. Self Introduction • きょん(@kyon_mm) 26歳 うさみみエンジニア • Test Architect in Nagoya • Groovy, F#, C#, Scala • SCMBC, Nagoya.Testing, TDDBC • TDD/BDDチョットデキル • 月曜日に長男が生まれました
  9. 9. Agenda • ツール紹介 • 安全と高速の両立 • JenkinsとGitによるGateway CheckIn Pattern • まとめ • おまけ
  10. 10. Jenkins • Continuous Integration(CI) に特化したサー バーアプリケーションです。OSSですが、エン タープライズ版もあります。Javaがインス トールされていれば動きます。 • http://jenkins-ci.org/ • 現状最も柔軟なCIツール。
  11. 11. Git • Distributed Version Control System(DVCS)に 特化したアプリケーションです。OSSで、 Linux, Mac, Windowsで動作します。 • http://git-scm.com/ • 現状最も人気のあるDVCSです。
  12. 12. Agenda • ツール紹介 • 安全と高速の両立 • JenkinsとGitによるGateway CheckIn Pattern • まとめ • おまけ
  13. 13. Gitのマージの不安全さ • CIなどでGitのマージを行うと便利そうに見えるときがあ る。 • イメージ • git checkout id/xxx • build • git merge master • git push origin master
  14. 14. Gitのマージの不安全さ • Gitのマージはセマンティクスを保証しない。 • テストコードがセマンティクスを保証できて いるかどうかを判断するタイミングが、マー ジ前、マージ時、マージ後のときがあり、必 ずしも十分なテストコードであるかどうかは わからない。
  15. 15. 不安全さ | 時間 を 人数で見る 不安全さ コミットする人数 手動マージ 自動マージ 時間 コミットする人数 手動マージ 自動マージ
  16. 16. 安全側に倒す • 人数が少ないうちは多少の時間を犠牲にして 手動マージしたほうが安全なコミットをする ほうがメリットが高いことが多い。 • スキル差があまりにあるときや、タスク分割 が下手だと、いつまでもpushできないときが あるので、ペアプロ導入やコミット対象を気 にしたタスク分割をする。
  17. 17. 特定テストを気軽に確認する • 自分の環境以外で全ての(例えば)UnitTestを確 認するためにJenkinsは向いている。
  18. 18. 特定テストを気軽に確認する • 全員で1つのリポジトリを共有していると、テ ストが失敗したリビジョンが全員にpullされる 可能性がある • pushする前のルールが増えてしまい、下手し たらいつまでもローカルで作業をするという 悪循環が生まれる。
  19. 19. 特定テストを気軽に確認する • コミッター毎にpush専用の個人用リポジトリ を用意することで、気軽にpush & CIをできる ようにする。 • push専用リポジトリ = privateリポジトリ • pull専用リポジトリ = centralリポジトリ
  20. 20. Agenda • ツール紹介 • 安全と高速の両立 • JenkinsとGitによるGateway CheckIn Pattern • まとめ • おまけ
  21. 21. Gateway CheckIn Pattern
  22. 22. Gateway CheckIn Pattern ある基準をクリアしたコードのみが共有され る仕組み(すごいざっくり説明です。要出典)
  23. 23. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  24. 24. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central developer:compile & component test central:compile & component test & integration test
  25. 25. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central developerジョブが成功したときのみ、pullできるリポジトリ にpushされる。 このdeveloperジョブをGatewayと見なして、Gateway CheckInと呼ぶことが多いようです。
  26. 26. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central Gitolite Server Jenkins Server
  27. 27. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  28. 28. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  29. 29. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  30. 30. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  31. 31. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  32. 32. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  33. 33. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  34. 34. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  35. 35. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central edit & merge pull ¦ clone push kick job
  36. 36. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  37. 37. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  38. 38. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  39. 39. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  40. 40. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  41. 41. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  42. 42. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  43. 43. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  44. 44. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  45. 45. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  46. 46. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  47. 47. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  48. 48. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  49. 49. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  50. 50. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  51. 51. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push
  52. 52. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push private build
  53. 53. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push private build jenkins push
  54. 54. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push private build central build jenkins push
  55. 55. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push private build central build jenkins push
  56. 56. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push private build central buildbleis push jenkins push
  57. 57. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push private build central buildbleis push jenkins push private build
  58. 58. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push private build central buildbleis push jenkins push jenkins push private build
  59. 59. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo kyon push private build central buildbleis push jenkins push jenkins push private build
  60. 60. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  61. 61. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo
  62. 62. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo bleis push
  63. 63. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo bleis push private build
  64. 64. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo bleis push jenkins push private build
  65. 65. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo bleis push jenkins push private build
  66. 66. kyon_mm Local Repo kyon_mm private Repo Central Repo developer central bleis Local Repo bleis private Repo bleis push jenkins push private build
  67. 67. 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
  68. 68. 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 private build
  69. 69. 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 jenkins push private build
  70. 70. 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 jenkins push central build private build
  71. 71. Agenda • ツール紹介 • 安全と高速の両立 • JenkinsとGitによるGateway CheckIn Pattern • まとめ • おまけ
  72. 72. 構成まとめ • Gitリポジトリ数 : 開発者数 = n +1 : n • Jenkinsジョブ数 = 2∼ • privateからのみGitのhookでdeveloperジョブ を起動。 • developerジョブ以降はJenkinsでジョブ連携
  73. 73. 使っているJenkins Pluginや設定 • ビルドパラメータ • Git Plugin • Build PipeLine Plugin • Scriptler Plugin • Log Parser • Job ConfigHistory
  74. 74. まとめ • 実際にはもっと後続のジョブを連携させていますが、基本形 は紹介した通りです。 • 少しずつ進歩してこの形になりましたが、基本的な形が出来 てから3年ほど経過しましたが、5名程度以下の開発ではうま くいっています。(それ以上は知らない。 • 気軽にpushできるようにしたり、pullできるのはある基準で の安全なコードのみに強制する仕組みもよい。 • リモートで仕事していると困るかもね :-p
  75. 75. ご清聴ありがとうございました
  76. 76. おまけ Jenkinsのダメなところ
  77. 77. おまけ Jenkinsのダメなところ • ジョブは関数でしかないわけだが、関数的に扱えない。
  78. 78. おまけ Jenkinsのダメなところ • ジョブは関数でしかないわけだが、関数的に扱えない。 • 同一のジョブを複数実行できない。再帰呼び出しも出来な い。例えば次ができない
  79. 79. おまけ Jenkinsのダメなところ • ジョブは関数でしかないわけだが、関数的に扱えない。 • 同一のジョブを複数実行できない。再帰呼び出しも出来な い。例えば次ができない • JobAAA repo1
  80. 80. おまけ Jenkinsのダメなところ • ジョブは関数でしかないわけだが、関数的に扱えない。 • 同一のジョブを複数実行できない。再帰呼び出しも出来な い。例えば次ができない • JobAAA repo1 • JobBBB repo1
  81. 81. おまけ Jenkinsのダメなところ • ジョブは関数でしかないわけだが、関数的に扱えない。 • 同一のジョブを複数実行できない。再帰呼び出しも出来な い。例えば次ができない • JobAAA repo1 • JobBBB repo1 • JobBBB repo2
  82. 82. おまけ Jenkinsのダメなところ • ジョブは関数でしかないわけだが、関数的に扱えない。 • 同一のジョブを複数実行できない。再帰呼び出しも出来な い。例えば次ができない • JobAAA repo1 • JobBBB repo1 • JobBBB repo2 • マスター/スレーブで実行しているときに、スレーブマシンで ジョブ実行中には「Jenkins自体の情報」を取得できない。
  83. 83. おまけ 現状のCIで何を選ぶべきか
  84. 84. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!!
  85. 85. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI
  86. 86. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!!
  87. 87. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!! • TeamCity
  88. 88. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!! • TeamCity
  89. 89. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!! • TeamCity • とにかく柔軟にやりたい!!!
  90. 90. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!! • TeamCity • とにかく柔軟にやりたい!!! • Jenkins
  91. 91. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!! • TeamCity • とにかく柔軟にやりたい!!! • Jenkins
  92. 92. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!! • TeamCity • とにかく柔軟にやりたい!!! • Jenkins • Jenkinsよりいいものがほしい!!!
  93. 93. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!! • TeamCity • とにかく柔軟にやりたい!!! • Jenkins • Jenkinsよりいいものがほしい!!! • Vert.x + Scala | Groovy
  94. 94. おまけ 現状のCIで何を選ぶべきか • 簡単にやりたい!!! • Wercker, Travis.CI • オンプレミスで簡単にやりたい!!! • TeamCity • とにかく柔軟にやりたい!!! • Jenkins • Jenkinsよりいいものがほしい!!! • Vert.x + Scala | Groovy • でつくるのが良いと思います。

×