Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Docker in CI
Search
株式会社ヌーラボ
PRO
April 23, 2016
Technology
10
1.8k
Docker in CI
第9回 コンテナ型仮想化の情報交換会@福岡 #lxcjp
http://ct-study.connpass.com/event/28449/
株式会社ヌーラボ
PRO
April 23, 2016
Tweet
Share
More Decks by 株式会社ヌーラボ
See All by 株式会社ヌーラボ
【資料】30分でわかる!“とりあえず課題を作った”から抜け出すBacklog活用術
nulabinc
PRO
0
19
【展示会ご参加者様向け】Backlog概要編-配布資料
nulabinc
PRO
0
30
Why Platform Engineering? - マルチプロダクト・少人数 SRE の壁を越える挑戦 -
nulabinc
PRO
5
670
Datadog のトライアルを成功に導く技術 / Techniques for a successful Datadog trial
nulabinc
PRO
0
310
僕たちは何を守っているのか?ビジネスを守る、ヌーラボのセキュリティ実践
nulabinc
PRO
1
68
Snowflake九州ユーザー会
nulabinc
PRO
0
63
ヌーラボ‧ウェブサイト課の ⼀年間の取り組みをふり返る
nulabinc
PRO
1
1.1k
今からでも入れる re:Inventがあるんですか!?
nulabinc
PRO
0
440
ライティングチームだからこそできた、「どことでも繋がれるチーム」づくりの結果 / Technical Writing Meetup vol.38
nulabinc
PRO
0
110
Other Decks in Technology
See All in Technology
Postman AI エージェントビルダー最新情報
nagix
0
110
2年でここまで成長!AWSで育てたAI Slack botの軌跡
iwamot
PRO
4
700
AIエージェント最前線! Amazon Bedrock、Amazon Q、そしてMCPを使いこなそう
minorun365
PRO
14
5.1k
Fabric + Databricks 2025.6 の最新情報ピックアップ
ryomaru0825
1
130
Абьюзим random_bytes(). Фёдор Кулаков, разработчик Lamoda Tech
lamodatech
0
340
ひとり情シスなCTOがLLMと始めるオペレーション最適化 / CTO's LLM-Powered Ops
yamitzky
0
430
より良いプロダクトの開発を目指して - 情報を中心としたプロダクト開発 #phpcon #phpcon2025
bengo4com
1
3.1k
セキュリティの民主化は何故必要なのか_AWS WAF 運用の 10 の苦悩から学ぶ
yoh
1
140
mrubyと micro-ROSが繋ぐロボットの世界
kishima
2
260
Witchcraft for Memory
pocke
1
310
“社内”だけで完結していた私が、AWS Community Builder になるまで
nagisa53
1
390
Oracle Cloud Infrastructure:2025年6月度サービス・アップデート
oracle4engineer
PRO
2
240
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Faster Mobile Websites
deanohume
307
31k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Automating Front-end Workflow
addyosmani
1370
200k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Designing Experiences People Love
moore
142
24k
Stop Working from a Prison Cell
hatefulcrawdad
270
20k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
Transcript
%PDLFSJO$* https://www.flickr.com/photos/dahlstroms/3144199355
• ໊લɿதଜ !JLJLLP • ॴଐɿ – #BDLMPHϓϩδΣΫτϚωʔδϟ – +FOLJOTϢʔβձ ⾃⼰紹介
None
2016年1⽉某⽇
None
None
ຊʹࡾڌ Ԭຊࣾɺ౦ژɺژ χϡʔϤʔΫࢧࣾ ɺγϯΨϙʔϧɺϕτφϜɺΞϦκφ
国内を中⼼に 約3500クライアント が利⽤するプロジェクト管理ツール タスク管理機能に加え、 • WebDAVによるファイル共有 • プルリクエスト機能を搭載したGitのリポジトリホスティング などを提供。 http://www.backlog.jp
全世界 約200万ユーザ が利⽤するオンラインのドローツール 基本的なドローツールの機能に加え複数のユーザで同時に編集出来るリアルタイム コラボレーションなど、コラボレーション機能が充実。 http://cacoo.com/
a . : / . /
• ΣϒαΠτ • ࣾπʔϧ • $* • ϓϩμΫγϣϯʹ·ͩ ヌーラボと Docker
• ΣϒαΠτ • ࣾπʔϧ • $* • ϓϩμΫγϣϯʹ·ͩ ヌーラボと Docker
• δϣϒͷ࣮ߦʹ͔ͭ͏ • $*ͷΫϥελʔʹ͔ͭ͏ CI でのユースケース
• δϣϒͷ࣮ߦʹ͔ͭ͏ • $*ͷΫϥελʔʹ͔ͭ͏ CI でのユースケース
• $*ΛͱΓ·͘ڥ • $*ͰͷϢʔεέʔε • ·ͱΊ アジェンダ
$*ΛͱΓ·͘ڥ
サービスで使っている技術
CI・CD の概要
• ςετͷ࣮ߦ • Ռͷੜ • Ռͷ4ͷΞοϓϩʔυ • ੩తϑΝΠϧͷ4ͷΞοϓϩʔυ • ".*ͷੜ
• ՌͷσϓϩΠ Jenkins の仕事
• ςετͷ࣮ߦ • Ռͷੜ • Ռͷ4ͷΞοϓϩʔυ • ੩తϑΝΠϧͷ4ͷΞοϓϩʔυ • ".*ͷੜ
• ՌͷσϓϩΠ Jenkins の仕事
• ςετͷ࣮ߦ • Ռͷੜ • Ռͷ4ͷΞοϓϩʔυ • ੩తϑΝΠϧͷ4ͷΞοϓϩʔυ • ".*ͷੜ
• ՌͷσϓϩΠ Jenkins の仕事 1⽉以降で対応
• δϣϒ • Ϗϧυ 数でみる Jenkins
プルリクベースの開発
ヌーラボのブランチ戦略
開発のながれ • όάमਖ਼ػೳՃͷͨΊʹϒϥϯνΛΔ • ࡞ۀ͕͓ΘΔͱ13Λग़ͯ͠ɺϨϏϡʔˍ Ϛʔδ • ϚελʔϒϥϯνͰλάΛଧͬͯϦϦʔε
タグきっかけのアーカイブ⽣成
デリバリーはチャットから
Jenkins Typetalk Plugin
デリバリーのながれ • UBHΛ͚ͭΔͱ4্ʹΞʔΧΠϒΛΞο ϓϩʔυ • νϟοτ্ͰίϚϯυൃߦ • +FOLJOT5ZQFUBML1MVHJO͕σϦόϦͷ δϣϒΛ࣮ߦ
$*ͰͷϢʔεέʔε
CI 環境の全体像
Jenkins Backlog Plugin
• ςετ͢Δϒϥϯν͕૿͑ͨ – 13͝ͱͷςετ࣮ߦ – ਓ͕૿͑ɺϒϥϯν૿͑ • ςετ࣮ߦʹඞཁͳڥ͕όϥόϥ – ҟͳΔόʔδϣϯͷπʔϧϛυϧΣΞ – جຊతʹಠཱͯ͠ಈ͔͍ͨ͠ メンバーやサービスが増えて…
• εϩʔςετ – ڥ͕͋͘·Ͱͨͳ͍ͱ͍͚ͳ͍ – ࣌ʹςετͦͷͷΛ͖͋ΒΊΔ͜ͱ • εϨʔϒͷϝϯς͕େม – ৽͘͠εϨʔϒͨͯΔͷେม – ϏϧυͷׂΓৼΓେม CI
における問題
そこで!
• εϩʔςετ – ϒϥϯν͝ͱʹಠཱͨ͠%PDLFSίϯςφΛ ಈ͔͢͜ͱͰͭඞཁ͕ͳ͘ͳͬͨ • εϨʔϒͷϝϯς͕େม – εϨʔϒʹ%PDLFSೖΕΔ͚ͩɻεϖοΫ Ξοϓ৽نՃ͕அવָʹͳͬͨ Docker
が解決したこと
5 つのキーポイント εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ %PDLFSpMFҰͭͰςετ͢Δ ΩϟογϡΛ༗ޮʹ͏ ϏϧυޙʹίϯςφΛআ͢Δ
ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
5 つのキーポイント εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ %PDLFSpMFҰͭͰςετ͢Δ ΩϟογϡΛ༗ޮʹ͏ ϏϧυޙʹίϯςφΛআ͢Δ
ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
3 ステップでスレーブ構成
• εϨʔϒͷىಈ͕ૣ͍ – &$Πϯελϯεͷىಈʹ͔͔Δ࣌ؒఔ • Ͳ͜ͰεϨʔϒΛཱͯΒΕΔ – ࣾڥͰ($1Ͱ%PDLFS͕ಈ͍ͯ͞ ͍͑Ε0, ウマイところ
5 つのキーポイント εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ %PDLFSpMFҰͭͰςετ͢Δ ΩϟογϡΛ༗ޮʹ͏ ϏϧυޙʹίϯςφΛআ͢Δ
ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
ジョブの構成例 $ ./gradlew clean test –Penv=ci $ docker run <run
option> test-image ./gradlew clean test
複数プロセスの実⾏ • %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”
Docker Compose でよくね? • ςετ͚ͩͷతʹݶ͍ͬͯ͑ɺ %PDLFSpMF͚ͩͰेͳ͜ͱ͕ଟ͍ • ଞͷ༻్Ͱ࠶ར༻͢ΔͳΒ%PDLFS $PNQPTF
5 つのキーポイント εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ %PDLFSpMFҰͭͰςετ͢Δ ΩϟογϡΛ༗ޮʹ͏ ϏϧυޙʹίϯςφΛআ͢Δ
ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
イメージをキャッシュする
依存ライブラリのキャッシュ
#1 ホストディレクトリ
#1 ホストディレクトリ $ docker run –v ${HOME}/.gradle:/root/.gradle test-image <test command>
• ϝϦοτ – ෳδϣϒؒͰͷڞ༗ • σϝϦοτ – ύʔϛογϣϯɺϩοΫ
#2 事前ビルド
#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> ґଘϥΠϒϥϦͷߋ৽Ξ ϓϦέʔγϣϯͦͷͷͷ ߋ৽ΑΓසൟʹى͜Βͳ ͍͜ͱ͕ఆ
#2 事前ビルド • ϝϦοτ – ύʔϛογϣϯʹؔΘΔ͕ͳ͍ • σϝϦοτ – ґଘؔΛมߋͨ͠߹ʹΩϟογϡ͕શͯ ΫϦΞ͞ΕΔ
#3 外部キャッシュ
#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 -
依存ライブラリのキャッシュ戦略 Ωϟογϡͷํ ϝϦοτ σϝϦοτ ψʔϥϘͷ࠾༻ ϗετσΟϨΫ τϦ ςετ࣮ߦ࣌ʹϗε τσΟϨΫτϦΛϚ ϯτͯ͠ɺͦ͜ʹ
ґଘϥΠϒϥϦΛอ ଘͤ͞Δ ґଘϥΠϒϥϦΛ ෳδϣϒͰڞ༗ Ͱ͖ɺଟগͷґଘ ؔͷมߋʹେ ͖ͳӨڹΛड͚ͳ ͍ ίϯςφͷςε τΛϧʔτϢʔβ Ҏ֎Ͱ࣮ߦ͢Δ ߹ɺύʔϛογϣ ϯͷ͕ൃੜ͠ ͏Δ +BWB 4DBMB .BWFO (SBEMF TCU ࣄલϏϧυ ґଘϥΠϒϥϦΛΠ ϯετʔϧͨ͠Π ϝʔδΛࣄલϏϧυ ͢Δ ύʔϛογϣϯͷ ͕ൃੜ͠ͳ͍ ҰͭͰґଘؔ ͕มΘΔͱΩϟο γϡ͕શΫϦΞ͞ ΕΔ 1FSM 1ZUIPO OPEFKT ֎෦Ωϟογϡ ΩϟογϡΞʔΧΠ ϒΛ࡞͠4ͳͲ ͷ֎෦ϦϙδτϦʹ อଘ͠ɺςετ࣮ߦ ࣌ʹμϯϩʔυ͢ Δ Ϗϧυπʔϧ͕ࣗ લͰґଘؔΛղ ܾ͢ΔΑΓѹత ʹૣ͍ ֎෦ΩϟογϡΛ ࣗલͰϝϯς͢Δ ඞཁ͕͋Δ 4DBMB TCU
5 つのキーポイント εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ %PDLFSpMFҰͭͰςετ͢Δ ΩϟογϡΛ༗ޮʹ͏ ϏϧυޙʹίϯςφΛআ͢Δ
ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
ビルド結果の取得
ワークスペースをマウントする # Dockerfile WORKDIR /opt/app $ docker run --rm –v
$(pwd):/opt/app test-image <test command> • ϝϦοτ – ςετ࣮ߦޙʹ͙͢ʹίϯςφΛআͰ͖Δ • σϝϦοτ – ύʔϛογϣϯ͕ൃੜ͠͏Δ
パーミッション問題 • ϧʔτϢʔβҎ֎ͰςετΛ࣮ߦ͠ͳ͍ ͱ͍͚ͳ͍߹͕͋Δ • ίϯςφʹ͓͚ΔϗετσΟϨΫτϦ ͷΦʔφʔෆఆ • ݖݶͷෆʹΑΓϗετσΟϨΫτϦ ͷϏϧυ݁Ռͷॻ͖ࠐΈࣦഊ͠͏Δ
ワークアラウンド#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 • ςετ࣮ߦϢʔβͰॻ͖ࠐΈग़དྷΔͱ͜Ζʹ ݁ՌΛॻ͘ • ϧʔτϢʔβͰͦͷ݁ՌΛϗετσΟϨΫτ Ϧʹίϐʔ͢Δ
ワークアラウンド#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)
実⾏結果をコンテナから取り出す # 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} • ύʔϛογϣϯͷൃੜ͠ͳ͍͕ς ετͷ࣮ߦεςοϓ͕ෳࡶ
5 つのキーポイント εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ %PDLFSpMFҰͭͰςετ͢Δ ΩϟογϡΛ༗ޮʹ͏ ϏϧυޙʹίϯςφΛআ͢Δ
ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
アーカイブをS3にあげる • σϓϩΠͷͨΊʹϏϧυͨ͠ΞʔΧΠϒ Λ4ʹ͋͛Δ – "NB[PO-JOVYʹಉࠝͷBXT$-*Λ͏ • ΞʔΧΠϒͷ੩తϦιʔεΛ$%/৴ ༻ʹ4ʹ͋͛Δ – ΠϯϋεͷΞοϓϩʔυπʔϧΛ͏
インハウスツールを 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>
何でも Dockernize • σϓϩΠ࣌ʹඞཁͳ71/ଓ – ͔ࣾΒͷΈຊ൪σϓϩΠͰ͖ΔΑ͏ʹ੍ݶ – σϓϩΠ͢ΔͨΊʹɺࣾʹ71/ଓ • &&ςετʹඞཁͳ4FMFOJVN࣮ߦڥ
%PDLFSΛΈࠐΜͩ݁Ռ
ビルドタイムの短縮
CI プロセスがポータブルに
·ͱΊ
まなんだこと • $*͕໘͢Δ – 13ϕʔεͷ։ൃʹΑΔෳϒϥϯνͷςε τͷฒߦ࣮ߦ – ར༻ٕज़ͷଟ༷ԽʹΑΔςετ࣮ߦڥͷෳ ࡶԽ • %PDLFS͕͜ΕΒΛޮՌతʹղܾ
5 つのキーポイント εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ %PDLFSpMFҰͭͰςετ͢Δ ΩϟογϡΛ༗ޮʹ͏ ϏϧυޙʹίϯςφΛআ͢Δ
ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ
Docker in CI • $*%PDLFSΛ࢝ΊΔͷʹΑ͍ελʔτ ϙΠϯτ – %PDLFSͷಋೖͦͷͷͦΜͳʹେ͖ͳม ߋΛඞཁͱ͠ͳ͍ – $*ձࣾΛ͑ͯڞ༗Ͱ͖ΔϓϥΫςΟε͕ ଟͦ͏
ψʔϥϘͰɺ%PDLFSΛ Ͳ͔ͬͲ্ཱ͔͍ͬͪ͛ͨํΛ ืू͍ͯ͠·͢ IUUQTOVMBCJODDPNKBDBSFFS IUUQTOVMBCJODDPNKBDBSFFSDP⒎FF