Pro Yearly is on sale from $80 to $50! »

Docker in CI

Docker in CI

第9回 コンテナ型仮想化の情報交換会@福岡 #lxcjp
http://ct-study.connpass.com/event/28449/

3e77f9dbec6a87756d1dbdddab283aee?s=128

Nulab Inc.

April 23, 2016
Tweet

Transcript

  1. %PDLFSJO$* https://www.flickr.com/photos/dahlstroms/3144199355

  2. •  ໊લɿதଜ஌੒ !JLJLLP  •  ॴଐɿ – #BDLMPHϓϩδΣΫτϚωʔδϟ – +FOLJOTϢʔβձ ⾃⼰紹介

  3. None
  4. 2016年1⽉某⽇

  5. None
  6. None
  7. ೔ຊʹࡾڌ఺ ෱Ԭຊࣾɺ౦ژɺژ౎  χϡʔϤʔΫࢧࣾ ୆࿷ɺγϯΨϙʔϧɺϕτφϜɺΞϦκφ

  8. 国内を中⼼に 約3500クライアント が利⽤するプロジェクト管理ツール タスク管理機能に加え、 •  WebDAVによるファイル共有 •  プルリクエスト機能を搭載したGitのリポジトリホスティング などを提供。 http://www.backlog.jp

  9. 全世界 約200万ユーザ が利⽤するオンラインのドローツール 基本的なドローツールの機能に加え複数のユーザで同時に編集出来るリアルタイム コラボレーションなど、コラボレーション機能が充実。 http://cacoo.com/

  10. a . : / . /

  11. •  ΢ΣϒαΠτ •  ࣾ಺πʔϧ •  $* •  ϓϩμΫγϣϯʹ͸·ͩ ヌーラボと Docker

  12. •  ΢ΣϒαΠτ •  ࣾ಺πʔϧ •  $* •  ϓϩμΫγϣϯʹ͸·ͩ ヌーラボと Docker

  13. •  δϣϒͷ࣮ߦʹ͔ͭ͏ •  $*ͷΫϥελʔʹ͔ͭ͏ CI でのユースケース

  14. •  δϣϒͷ࣮ߦʹ͔ͭ͏ •  $*ͷΫϥελʔʹ͔ͭ͏ CI でのユースケース

  15. •  $*ΛͱΓ·͘؀ڥ •  $*ͰͷϢʔεέʔε •  ·ͱΊ アジェンダ

  16. $*ΛͱΓ·͘؀ڥ

  17. サービスで使っている技術

  18. CI・CD の概要

  19. •  ςετͷ࣮ߦ •  ੒Ռ෺ͷੜ੒ •  ੒Ռ෺ͷ4΁ͷΞοϓϩʔυ •  ੩తϑΝΠϧͷ4΁ͷΞοϓϩʔυ •  ".*ͷੜ੒

    •  ੒Ռ෺ͷσϓϩΠ Jenkins の仕事
  20. •  ςετͷ࣮ߦ •  ੒Ռ෺ͷੜ੒ •  ੒Ռ෺ͷ4΁ͷΞοϓϩʔυ •  ੩తϑΝΠϧͷ4΁ͷΞοϓϩʔυ •  ".*ͷੜ੒

    •  ੒Ռ෺ͷσϓϩΠ Jenkins の仕事
  21. •  ςετͷ࣮ߦ •  ੒Ռ෺ͷੜ੒ •  ੒Ռ෺ͷ4΁ͷΞοϓϩʔυ •  ੩తϑΝΠϧͷ4΁ͷΞοϓϩʔυ •  ".*ͷੜ੒

    •  ੒Ռ෺ͷσϓϩΠ Jenkins の仕事 1⽉以降で対応
  22. •  ໿ δϣϒ •  ໿ Ϗϧυ೔ 数でみる Jenkins

  23. プルリクベースの開発

  24. ヌーラボのブランチ戦略

  25. 開発のながれ •  όάमਖ਼΍ػೳ௥ՃͷͨΊʹϒϥϯνΛ੾Δ •  ࡞ۀ͕͓ΘΔͱ13Λग़ͯ͠ɺϨϏϡʔˍ Ϛʔδ •  ϚελʔϒϥϯνͰλάΛଧͬͯϦϦʔε

  26. タグきっかけのアーカイブ⽣成

  27. デリバリーはチャットから

  28. Jenkins Typetalk Plugin

  29. デリバリーのながれ •  UBHΛ͚ͭΔͱ4্ʹΞʔΧΠϒΛΞο ϓϩʔυ •  νϟοτ্ͰίϚϯυൃߦ •  +FOLJOT5ZQFUBML1MVHJO͕σϦόϦͷ δϣϒΛ࣮ߦ

  30. $*ͰͷϢʔεέʔε

  31. CI 環境の全体像

  32. Jenkins Backlog Plugin

  33. •  ςετ͢Δϒϥϯν͕૿͑ͨ – 13͝ͱͷςετ࣮ߦ – ਓ͕૿͑ɺϒϥϯν΋૿͑  •  ςετ࣮ߦʹඞཁͳ؀ڥ͕όϥόϥ – ҟͳΔόʔδϣϯͷπʔϧ΍ϛυϧ΢ΣΞ – جຊతʹಠཱͯ͠ಈ͔͍ͨ͠ メンバーやサービスが増えて…

  34. •  εϩʔςετ – ؀ڥ͕͋͘·Ͱ଴ͨͳ͍ͱ͍͚ͳ͍ – ࣌ʹ͸ςετͦͷ΋ͷΛ͖͋ΒΊΔ͜ͱ΋  •  εϨʔϒͷϝϯς͕େม – ৽͘͠εϨʔϒͨͯΔͷେม – ϏϧυͷׂΓৼΓେม CI

    における問題
  35. そこで!

  36. •  εϩʔςετ – ϒϥϯν͝ͱʹಠཱͨ͠%PDLFSίϯςφΛ ಈ͔͢͜ͱͰ଴ͭඞཁ͕ͳ͘ͳͬͨ  •  εϨʔϒͷϝϯς͕େม – εϨʔϒʹ͸%PDLFSೖΕΔ͚ͩɻεϖοΫ Ξοϓ΍৽ن௥Ճ͕அવָʹͳͬͨ Docker

    が解決したこと
  37. 5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ

      ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
  38. 5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ

      ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
  39. 3 ステップでスレーブ構成

  40. •  εϨʔϒͷىಈ͕ૣ͍ – &$Πϯελϯεͷىಈʹ͔͔Δ࣌ؒఔ౓ •  Ͳ͜Ͱ΋εϨʔϒΛཱͯΒΕΔ – ࣾ಺؀ڥͰ΋($1Ͱ΋%PDLFS͕ಈ͍ͯ͞ ͍͑Ε͹0, ウマイところ

  41. 5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ

      ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
  42. ジョブの構成例 $ ./gradlew clean test –Penv=ci $ docker run <run

    option> test-image ./gradlew clean test
  43. 複数プロセスの実⾏ •  %PDLFSpMF一つだけでテスト実行 •  ローカル開発環境と同じ設定でテスト可能 # Dockerfile # install package

    required for test RUN apt-get install –y redis-server # Test Configuration in Jenkins $ docker run test-image bach –c “service redis-server start ; ./ gradlew clean test”
  44. Docker Compose でよくね? •  ςετ͚ͩͷ໨తʹݶ͍ͬͯ͑͹ɺ %PDLFSpMF͚ͩͰे෼ͳ͜ͱ͕ଟ͍  •  ଞͷ༻్Ͱ΋࠶ར༻͢ΔͳΒ%PDLFS $PNQPTF

  45. 5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ

      ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
  46. イメージをキャッシュする

  47. 依存ライブラリのキャッシュ

  48. #1 ホストディレクトリ

  49. #1 ホストディレクトリ $ docker run –v ${HOME}/.gradle:/root/.gradle test-image <test command>

    •  ϝϦοτ – ෳ਺δϣϒؒͰͷڞ༗ •  σϝϦοτ – ύʔϛογϣϯɺϩοΫ໰୊
  50. #2 事前ビルド

  51. #2 事前ビルド # Dockerfile RUN mkdir -p /opt/local/app COPY requirements.txt

    /opt/local/app/ WORKDIR /opt/local/app RUN pip install -r requirements.txt COPY . /opt/local/app $ docker build –t test-image . $ docker run test-image <test command> ґଘϥΠϒϥϦͷߋ৽͸Ξ ϓϦέʔγϣϯͦͷ΋ͷͷ ߋ৽ΑΓ͸සൟʹى͜Βͳ ͍͜ͱ͕૝ఆ
  52. #2 事前ビルド •  ϝϦοτ – ύʔϛογϣϯʹؔΘΔ໰୊͕ͳ͍ •  σϝϦοτ – ґଘؔ܎Λมߋͨ͠৔߹ʹΩϟογϡ͕શͯ ΫϦΞ͞ΕΔ

  53. #3 外部キャッシュ

  54. #3 外部キャッシュ •  ϝϦοτ – ॳճ࣮ߦͰ΋ڧ྽ʹૣ͍ •  σϝϦοτ – ֎෦ΩϟογϡΛϝϯς͠ͳ͍ͱ͍͚ͳ͍ # Dockerfile

    RUN mkdir /root/.gradle RUN cd /root/.gradle; curl -skL https://s3-ap- northeast-1.amazonaws.com/<cache-bucket>/cache.20151201.tar.gz | tar zxf -
  55. 依存ライブラリのキャッシュ戦略 Ωϟογϡͷ࢓ํ ϝϦοτ σϝϦοτ ψʔϥϘͷ࠾༻ ϗετσΟϨΫ τϦ ςετ࣮ߦ࣌ʹϗε τσΟϨΫτϦΛϚ ΢ϯτͯ͠ɺͦ͜ʹ

    ґଘϥΠϒϥϦΛอ ଘͤ͞Δ ґଘϥΠϒϥϦΛ ෳ਺δϣϒͰڞ༗ Ͱ͖ɺଟগͷґଘ ؔ܎ͷมߋʹ΋େ ͖ͳӨڹΛड͚ͳ ͍ ίϯςφ಺ͷςε τΛϧʔτϢʔβ Ҏ֎Ͱ࣮ߦ͢Δ৔ ߹ɺύʔϛογϣ ϯͷ໰୊͕ൃੜ͠ ͏Δ +BWB 4DBMB .BWFO  (SBEMF TCU  ࣄલϏϧυ ґଘϥΠϒϥϦΛΠ ϯετʔϧͨ͠Π ϝʔδΛࣄલϏϧυ ͢Δ ύʔϛογϣϯͷ ໰୊͕ൃੜ͠ͳ͍ ҰͭͰ΋ґଘؔ܎ ͕มΘΔͱΩϟο γϡ͕શΫϦΞ͞ ΕΔ 1FSM 1ZUIPO  OPEFKT ֎෦Ωϟογϡ ΩϟογϡΞʔΧΠ ϒΛ࡞੒͠4ͳͲ ͷ֎෦ϦϙδτϦʹ อଘ͠ɺςετ࣮ߦ ࣌ʹμ΢ϯϩʔυ͢ Δ Ϗϧυπʔϧ͕ࣗ લͰґଘؔ܎Λղ ܾ͢ΔΑΓѹ౗త ʹૣ͍  ֎෦ΩϟογϡΛ ࣗલͰϝϯς͢Δ ඞཁ͕͋Δ 4DBMB TCU 
  56. 5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ

      ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
  57. ビルド結果の取得

  58. ワークスペースをマウントする # Dockerfile WORKDIR /opt/app $ docker run --rm –v

    $(pwd):/opt/app test-image <test command> •  ϝϦοτ – ςετ࣮ߦޙʹ͙͢ʹίϯςφΛ࡟আͰ͖Δ •  σϝϦοτ – ύʔϛογϣϯ໰୊͕ൃੜ͠͏Δ
  59. パーミッション問題 •  ϧʔτϢʔβҎ֎ͰςετΛ࣮ߦ͠ͳ͍ ͱ͍͚ͳ͍৔߹͕͋Δ •  ίϯςφ಺ʹ͓͚ΔϗετσΟϨΫτϦ ͷΦʔφʔ͸ෆఆ •  ݖݶͷෆ଍ʹΑΓϗετσΟϨΫτϦ΁ ͷϏϧυ݁Ռͷॻ͖ࠐΈ͸ࣦഊ͠͏Δ

  60. ワークアラウンド#1 # run.sh su test-user –c “py.test tests –-junit-xml=/var/tmp/results.xml” cp

    –p /var/tmp/results.xml . $ docker run --rm –v $(pwd):/opt/app test-image ./run.sh •  ςετ࣮ߦϢʔβͰॻ͖ࠐΈग़དྷΔͱ͜Ζʹ ݁ՌΛॻ͘ •  ϧʔτϢʔβͰͦͷ݁ՌΛϗετσΟϨΫτ Ϧʹίϐʔ͢Δ
  61. ワークアラウンド#2 •  ςετΛ࣮ߦ͍ͯ͠ΔؒͷϗετσΟϨ ΫτϦͷΦʔφΛมߋ͠ɺ࣮ߦޙʹݩʹ ໭͢ # run.sh chown test-user .

    su test-user –c “py.test tests” chown $1 . $ docker run --rm –v $(pwd):/opt/app test-image ./run.sh $(id -u)
  62. 実⾏結果をコンテナから取り出す # Dockerfile WORKDIR /opt/app COPY . /opt/app $ UNIQUE_NAME=“TEST_${GIT_COMMIT}_$(date

    +%s)” $ docker run --name=${UNIQUE_NAME} test-image <test command> $ docker cp ${UNIQUE_NAME}:/opt/app/build/test-result/ test-result $ docker rm ${UNIQUE_NAME} •  ύʔϛογϣϯͷ໰୊͸ൃੜ͠ͳ͍͕ς ετͷ࣮ߦεςοϓ͕ෳࡶ
  63. 5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ

      ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
  64. アーカイブをS3にあげる •  σϓϩΠͷͨΊʹϏϧυͨ͠ΞʔΧΠϒ Λ4ʹ͋͛Δ – "NB[PO-JOVYʹಉࠝͷBXT$-*Λ࢖͏ •  ΞʔΧΠϒ಺ͷ੩తϦιʔεΛ$%/഑৴ ༻ʹ4ʹ͋͛Δ – Πϯϋ΢εͷΞοϓϩʔυπʔϧΛ࢖͏

  65. インハウスツールを Dockernize $ /usr/local/bin/upload-static-s3 ROOT.war –b <cdn-bucket> # Dockerfile ENTRYPOINT

    [“/usr/local/bin/upload-static-s3”] $ docker run --rm <in-house-registory>/upload-static-s3 ROOT.war – b <cdn-bucket>
  66. 何でも Dockernize •  σϓϩΠ࣌ʹඞཁͳ71/઀ଓ΋ – ࣾ಺͔ΒͷΈຊ൪σϓϩΠͰ͖ΔΑ͏ʹ੍ݶ – σϓϩΠ͢ΔͨΊʹɺࣾ಺ʹ71/઀ଓ •  &&ςετʹඞཁͳ4FMFOJVN࣮ߦ؀ڥ΋

  67. %PDLFSΛ૊ΈࠐΜͩ݁Ռ

  68. ビルドタイムの短縮

  69. CI プロセスがポータブルに

  70. ·ͱΊ

  71. まなんだこと •  $*͕௚໘͢Δ໰୊ – 13ϕʔεͷ։ൃʹΑΔෳ਺ϒϥϯνͷςε τͷฒߦ࣮ߦ – ར༻ٕज़ͷଟ༷ԽʹΑΔςετ࣮ߦ؀ڥͷෳ ࡶԽ •  %PDLFS͕͜ΕΒΛޮՌతʹղܾ

  72. 5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ

      ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
  73. Docker in CI •  $*͸%PDLFSΛ࢝ΊΔͷʹΑ͍ελʔτ ϙΠϯτ – %PDLFSͷಋೖͦͷ΋ͷ͸ͦΜͳʹେ͖ͳม ߋΛඞཁͱ͠ͳ͍ – $*͸ձࣾΛ௒͑ͯڞ༗Ͱ͖ΔϓϥΫςΟε͕ ଟͦ͏

  74. ψʔϥϘͰ͸ɺ%PDLFSΛ Ͳ͔ͬͲ্ཱ͔͍ͬͪ͛ͨํΛ ืू͍ͯ͠·͢ IUUQTOVMBCJODDPNKBDBSFFS IUUQTOVMBCJODDPNKBDBSFFSDP⒎FF