Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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 株式会社ヌーラボ
チームワークマネジメント Bar #5
nulabinc
PRO
0
12
Geeks Who Drink Fukuoka - 202508
nulabinc
PRO
0
10
TRIAL Meetup#1
nulabinc
PRO
0
8
20251129_BacklogWorld.pdf
nulabinc
PRO
0
22
業務プロセス改善を開発⽣産性に つなげるまでの奮闘⽇記
nulabinc
PRO
0
69
AI とナレッジ共有で進化する Backlog の未来
nulabinc
PRO
0
100
DATA_SUMMT2025_Presentation_materials.pdf
nulabinc
PRO
0
97
Streamlitとロール関連の話
nulabinc
PRO
0
100
サクフェス2024_ヌーラボ原_CSと開発
nulabinc
PRO
0
32
Other Decks in Technology
See All in Technology
AIBuildersDay_track_A_iidaxs
iidaxs
4
1.3k
たまに起きる外部サービスの障害に備えたり備えなかったりする話
egmc
0
410
障害対応訓練、その前に
coconala_engineer
0
200
半年で、AIゼロ知識から AI中心開発組織の変革担当に至るまで
rfdnxbro
0
140
NIKKEI Tech Talk #41: セキュア・バイ・デザインからクラウド管理を考える
sekido
PRO
0
210
"人"が頑張るAI駆動開発
yokomachi
1
510
Entity Framework Core におけるIN句クエリ最適化について
htkym
0
120
ESXi のAIOps だ!2025冬
unnowataru
0
370
M&Aで拡大し続けるGENDAのデータ活用を促すためのDatabricks権限管理 / AEON TECH HUB #22
genda
0
240
2025-12-18_AI駆動開発推進プロジェクト運営について / AIDD-Promotion project management
yayoi_dd
0
160
2025-12-27 Claude CodeでPRレビュー対応を効率化する@機械学習社会実装勉強会第54回
nakamasato
4
1.1k
子育てで想像してなかった「見えないダメージ」 / Unforeseen "hidden burdens" of raising children.
pauli
2
330
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
0
31
Darren the Foodie - Storyboard
khoart
PRO
0
2k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
28
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
130
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.3k
For a Future-Friendly Web
brad_frost
180
10k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
0
170
Scaling GitHub
holman
464
140k
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