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
660
Datadog のトライアルを成功に導く技術 / Techniques for a successful Datadog trial
nulabinc
PRO
0
310
僕たちは何を守っているのか?ビジネスを守る、ヌーラボのセキュリティ実践
nulabinc
PRO
1
66
Snowflake九州ユーザー会
nulabinc
PRO
0
63
ヌーラボ‧ウェブサイト課の ⼀年間の取り組みをふり返る
nulabinc
PRO
1
1.1k
今からでも入れる re:Inventがあるんですか!?
nulabinc
PRO
0
430
ライティングチームだからこそできた、「どことでも繋がれるチーム」づくりの結果 / Technical Writing Meetup vol.38
nulabinc
PRO
0
110
Other Decks in Technology
See All in Technology
成立するElixirの再束縛(再代入)可という選択
kubell_hr
0
530
IAMのマニアックな話 2025を執筆して、 見えてきたAWSアカウント管理の現在
nrinetcom
PRO
4
630
SFTPコンテナからファイルをダウンロードする
dip_tech
PRO
0
560
初めてのAzure FunctionsをClaude Codeで作ってみた / My first Azure Functions using Claude Code
hideakiaoyagi
1
170
Prox Industries株式会社 会社紹介資料
proxindustries
0
140
CI/CDとタスク共有で加速するVibe Coding
tnbe21
0
220
LinkX_GitHubを基点にした_AI時代のプロジェクトマネジメント.pdf
iotcomjpadmin
0
160
IIWレポートからみるID業界で話題のMCP
fujie
0
630
ひとり情シスなCTOがLLMと始めるオペレーション最適化 / CTO's LLM-Powered Ops
yamitzky
0
320
kubellが挑むBPaaSにおける、人とAIエージェントによるサービス開発の最前線と技術展望
kubell_hr
1
390
Amplifyとゼロからはじめた AIコーディング 成果と展望
mkdev10
1
340
2025/6/21 日本学術会議公開シンポジウム発表資料
keisuke198619
2
470
Featured
See All Featured
Side Projects
sachag
455
42k
Being A Developer After 40
akosma
90
590k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Writing Fast Ruby
sferik
628
61k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Become a Pro
speakerdeck
PRO
28
5.4k
The Cost Of JavaScript in 2023
addyosmani
50
8.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
4 Signs Your Business is Dying
shpigford
184
22k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
660
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