Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker in CI

Docker in CI

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

株式会社ヌーラボ

April 23, 2016
Tweet

More Decks by 株式会社ヌーラボ

Other Decks in Technology

Transcript

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

    View full-size slide

  2. •  ໊લɿதଜ஌੒ !JLJLLP

    •  ॴଐɿ
    – #BDLMPHϓϩδΣΫτϚωʔδϟ
    – +FOLJOTϢʔβձ
    ⾃⼰紹介

    View full-size slide

  3. 2016年1⽉某⽇

    View full-size slide

  4. ೔ຊʹࡾڌ఺ ෱Ԭຊࣾɺ౦ژɺژ౎

    χϡʔϤʔΫࢧࣾ
    ୆࿷ɺγϯΨϙʔϧɺϕτφϜɺΞϦκφ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. $*ΛͱΓ·͘؀ڥ

    View full-size slide

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

    View full-size slide

  14. CI・CD の概要

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. •  ςετͷ࣮ߦ
    •  ੒Ռ෺ͷੜ੒
    •  ੒Ռ෺ͷ4΁ͷΞοϓϩʔυ
    •  ੩తϑΝΠϧͷ4΁ͷΞοϓϩʔυ
    •  ".*ͷੜ੒
    •  ੒Ռ෺ͷσϓϩΠ
    Jenkins の仕事
    1⽉以降で対応

    View full-size slide

  18. •  ໿
    δϣϒ
    •  ໿
    Ϗϧυ೔
    数でみる Jenkins

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  24. Jenkins Typetalk Plugin

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  27. CI 環境の全体像

    View full-size slide

  28. Jenkins Backlog Plugin

    View full-size slide

  29. •  ςετ͢Δϒϥϯν͕૿͑ͨ
    – 13͝ͱͷςετ࣮ߦ
    – ਓ͕૿͑ɺϒϥϯν΋૿͑

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

    View full-size slide

  30. •  εϩʔςετ
    – ؀ڥ͕͋͘·Ͱ଴ͨͳ͍ͱ͍͚ͳ͍
    – ࣌ʹ͸ςετͦͷ΋ͷΛ͖͋ΒΊΔ͜ͱ΋

    •  εϨʔϒͷϝϯς͕େม
    – ৽͘͠εϨʔϒͨͯΔͷେม
    – ϏϧυͷׂΓৼΓେม
    CI における問題

    View full-size slide

  31. そこで!

    View full-size slide

  32. •  εϩʔςετ
    – ϒϥϯν͝ͱʹಠཱͨ͠%PDLFSίϯςφΛ
    ಈ͔͢͜ͱͰ଴ͭඞཁ͕ͳ͘ͳͬͨ

    •  εϨʔϒͷϝϯς͕େม
    – εϨʔϒʹ͸%PDLFSೖΕΔ͚ͩɻεϖοΫ
    Ξοϓ΍৽ن௥Ճ͕அવָʹͳͬͨ
    Docker が解決したこと

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. 3 ステップでスレーブ構成

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  38. ジョブの構成例
    $ ./gradlew clean test –Penv=ci
    $ docker run test-image ./gradlew clean test

    View full-size slide

  39. 複数プロセスの実⾏
    •  %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”

    View full-size slide

  40. Docker Compose でよくね?
    •  ςετ͚ͩͷ໨తʹݶ͍ͬͯ͑͹ɺ
    %PDLFSpMF͚ͩͰे෼ͳ͜ͱ͕ଟ͍

    •  ଞͷ༻్Ͱ΋࠶ར༻͢ΔͳΒ%PDLFS
    $PNQPTF

    View full-size slide

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

    View full-size slide

  42. イメージをキャッシュする

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  45. #1 ホストディレクトリ
    $ docker run –v ${HOME}/.gradle:/root/.gradle test-image command>
    •  ϝϦοτ
    – ෳ਺δϣϒؒͰͷڞ༗
    •  σϝϦοτ
    – ύʔϛογϣϯɺϩοΫ໰୊

    View full-size slide

  46. #2 事前ビルド

    View full-size slide

  47. #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
    ґଘϥΠϒϥϦͷߋ৽͸Ξ
    ϓϦέʔγϣϯͦͷ΋ͷͷ
    ߋ৽ΑΓ͸සൟʹى͜Βͳ
    ͍͜ͱ͕૝ఆ

    View full-size slide

  48. #2 事前ビルド
    •  ϝϦοτ
    – ύʔϛογϣϯʹؔΘΔ໰୊͕ͳ͍
    •  σϝϦοτ
    – ґଘؔ܎Λมߋͨ͠৔߹ʹΩϟογϡ͕શͯ
    ΫϦΞ͞ΕΔ

    View full-size slide

  49. #3 外部キャッシュ

    View full-size slide

  50. #3 外部キャッシュ
    •  ϝϦοτ
    – ॳճ࣮ߦͰ΋ڧ྽ʹૣ͍
    •  σϝϦοτ
    – ֎෦ΩϟογϡΛϝϯς͠ͳ͍ͱ͍͚ͳ͍
    # Dockerfile
    RUN mkdir /root/.gradle
    RUN cd /root/.gradle; curl -skL https://s3-ap-
    northeast-1.amazonaws.com//cache.20151201.tar.gz |
    tar zxf -

    View full-size slide

  51. 依存ライブラリのキャッシュ戦略
    Ωϟογϡͷ࢓ํ ϝϦοτ σϝϦοτ ψʔϥϘͷ࠾༻
    ϗετσΟϨΫ
    τϦ
    ςετ࣮ߦ࣌ʹϗε
    τσΟϨΫτϦΛϚ
    ΢ϯτͯ͠ɺͦ͜ʹ
    ґଘϥΠϒϥϦΛอ
    ଘͤ͞Δ
    ґଘϥΠϒϥϦΛ
    ෳ਺δϣϒͰڞ༗
    Ͱ͖ɺଟগͷґଘ
    ؔ܎ͷมߋʹ΋େ
    ͖ͳӨڹΛड͚ͳ
    ͍
    ίϯςφ಺ͷςε
    τΛϧʔτϢʔβ
    Ҏ֎Ͱ࣮ߦ͢Δ৔
    ߹ɺύʔϛογϣ
    ϯͷ໰୊͕ൃੜ͠
    ͏Δ
    +BWB 4DBMB
    .BWFO
    (SBEMF TCU

    ࣄલϏϧυ ґଘϥΠϒϥϦΛΠ
    ϯετʔϧͨ͠Π
    ϝʔδΛࣄલϏϧυ
    ͢Δ
    ύʔϛογϣϯͷ
    ໰୊͕ൃੜ͠ͳ͍
    ҰͭͰ΋ґଘؔ܎
    ͕มΘΔͱΩϟο
    γϡ͕શΫϦΞ͞
    ΕΔ
    1FSM 1ZUIPO
    OPEFKT
    ֎෦Ωϟογϡ ΩϟογϡΞʔΧΠ
    ϒΛ࡞੒͠4ͳͲ
    ͷ֎෦ϦϙδτϦʹ
    อଘ͠ɺςετ࣮ߦ
    ࣌ʹμ΢ϯϩʔυ͢
    Δ
    Ϗϧυπʔϧ͕ࣗ
    લͰґଘؔ܎Λղ
    ܾ͢ΔΑΓѹ౗త
    ʹૣ͍

    ֎෦ΩϟογϡΛ
    ࣗલͰϝϯς͢Δ
    ඞཁ͕͋Δ
    4DBMB TCU

    View full-size slide

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

    View full-size slide

  53. ビルド結果の取得

    View full-size slide

  54. ワークスペースをマウントする
    # Dockerfile
    WORKDIR /opt/app
    $ docker run --rm –v $(pwd):/opt/app test-image
    •  ϝϦοτ
    – ςετ࣮ߦޙʹ͙͢ʹίϯςφΛ࡟আͰ͖Δ
    •  σϝϦοτ
    – ύʔϛογϣϯ໰୊͕ൃੜ͠͏Δ

    View full-size slide

  55. パーミッション問題
    •  ϧʔτϢʔβҎ֎ͰςετΛ࣮ߦ͠ͳ͍
    ͱ͍͚ͳ͍৔߹͕͋Δ
    •  ίϯςφ಺ʹ͓͚ΔϗετσΟϨΫτϦ
    ͷΦʔφʔ͸ෆఆ
    •  ݖݶͷෆ଍ʹΑΓϗετσΟϨΫτϦ΁
    ͷϏϧυ݁Ռͷॻ͖ࠐΈ͸ࣦഊ͠͏Δ

    View full-size slide

  56. ワークアラウンド#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
    •  ςετ࣮ߦϢʔβͰॻ͖ࠐΈग़དྷΔͱ͜Ζʹ
    ݁ՌΛॻ͘
    •  ϧʔτϢʔβͰͦͷ݁ՌΛϗετσΟϨΫτ
    Ϧʹίϐʔ͢Δ

    View full-size slide

  57. ワークアラウンド#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)

    View full-size slide

  58. 実⾏結果をコンテナから取り出す
    # Dockerfile
    WORKDIR /opt/app
    COPY . /opt/app
    $ UNIQUE_NAME=“TEST_${GIT_COMMIT}_$(date +%s)”
    $ docker run --name=${UNIQUE_NAME} test-image
    $ docker cp ${UNIQUE_NAME}:/opt/app/build/test-result/ test-result
    $ docker rm ${UNIQUE_NAME}
    •  ύʔϛογϣϯͷ໰୊͸ൃੜ͠ͳ͍͕ς
    ετͷ࣮ߦεςοϓ͕ෳࡶ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  61. インハウスツールを Dockernize
    $ /usr/local/bin/upload-static-s3 ROOT.war –b
    # Dockerfile
    ENTRYPOINT [“/usr/local/bin/upload-static-s3”]
    $ docker run --rm /upload-static-s3 ROOT.war –
    b

    View full-size slide

  62. 何でも Dockernize
    •  σϓϩΠ࣌ʹඞཁͳ71/઀ଓ΋
    – ࣾ಺͔ΒͷΈຊ൪σϓϩΠͰ͖ΔΑ͏ʹ੍ݶ
    – σϓϩΠ͢ΔͨΊʹɺࣾ಺ʹ71/઀ଓ
    •  &&ςετʹඞཁͳ4FMFOJVN࣮ߦ؀ڥ΋

    View full-size slide

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

    View full-size slide

  64. ビルドタイムの短縮

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide