Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Docker in CI
Search
株式会社ヌーラボ
PRO
April 23, 2016
Technology
1.9k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Docker in CI
第9回 コンテナ型仮想化の情報交換会@福岡 #lxcjp
http://ct-study.connpass.com/event/28449/
株式会社ヌーラボ
PRO
April 23, 2016
More Decks by 株式会社ヌーラボ
See All by 株式会社ヌーラボ
製造業の設計・生産技術向け Backlog入門
nulabinc
PRO
0
12
配布資料_ヌーラボの情シスがおすすめする_問い合わせ対応を削減するBacklog活用術.pdf
nulabinc
PRO
0
110
Bits Agent Builder の⼊⾨と活⽤事例
nulabinc
PRO
0
3k
Getting Started with Bits Agent Builder: Real-World Use Cases
nulabinc
PRO
0
81
The_Evolution_of_Bits_AI_SRE.pdf
nulabinc
PRO
0
420
進化するBits AI SREと私と組織
nulabinc
PRO
4
1.2k
実践 Datadog MCP Server
nulabinc
PRO
4
980
全社横断PjM⽀援チーム “PEaS”の取り組みと プロジェクトマネジメント でのAI活⽤について
nulabinc
PRO
0
250
Datadog の RBAC のすべて
nulabinc
PRO
4
990
Other Decks in Technology
See All in Technology
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
290
React Nativeでの OTA Updateって、 どう説明する?
ichiki1023
0
130
『GOエコノミー 』(相乗りサービス) におけるスペック駆動開発
mot_techtalk
1
210
The kernel report
ennael
PRO
1
190
行動するAIのためのオントロジー | DevRev — Encraft #26.pdf
dvrv_tknrszk
2
670
FinTech 1-2 : Overview of FinTech
ks91
PRO
0
130
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
300
メルカリにおけるAI時代の高速プロトタイピング基盤「Arca」
ryotarai
18
14k
20260929_AmazonGuardDutyの検出通知メールにAWS DevOpsAgentの調査結果を追加する
yhana
1
410
2026-10-01_MagicPod_QAハーネスエンジニアリングとQA組織の未来像
ynisqa1988
1
400
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
200
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
140
Featured
See All Featured
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
66k
Navigating Weather and Climate Data
rabernat
0
540
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
How GitHub (no longer) Works
holman
316
150k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
310
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
550
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
500
Code Reviewing Like a Champion
maltzj
528
40k
Color Theory Basics | Prateek | Gurzu
gurzu
1
480
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Pragmatic Product Professional
lauravandoore
37
7.5k
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