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 株式会社ヌーラボ
ヌーラボ‧ウェブサイト課の ⼀年間の取り組みをふり返る
nulabinc
PRO
1
890
今からでも入れる re:Inventがあるんですか!?
nulabinc
PRO
0
330
ライティングチームだからこそできた、「どことでも繋がれるチーム」づくりの結果 / Technical Writing Meetup vol.38
nulabinc
PRO
0
71
4つの基本的な組織形態を知る ~ミンツバーグの組織論 7つの類型と力学、そしてその先へ~ より GWD in Nagoya
nulabinc
PRO
2
190
必要なのは客観性。組織変革をもたらす、より良い「対話」を生み出すための活動 #scrummikawa
nulabinc
PRO
3
1.3k
悪い実装例から学ぶ ウェブアクセシビリティ改善のヒント
nulabinc
PRO
1
740
ヌーラボカスタマーサクセスチームのBacklog活用
nulabinc
PRO
0
370
言葉で「ヌーラボらしさ」をどう届ける? グローバルチームでコラボレーションする大切さ
nulabinc
PRO
1
130
タスクの可視化は争いをなくす!? 夏休みを乗り切る 宿題プロジェクトマネジメント
nulabinc
PRO
2
310
Other Decks in Technology
See All in Technology
一度 Expo の採用を断念したけど、 再度 Expo の導入を検討している話
ichiki1023
1
170
分解して理解する Aspire
nenonaninu
1
150
Developer Summit 2025 [14-D-1] Yuki Hattori
yuhattor
19
6.2k
現場の種を事業の芽にする - エンジニア主導のイノベーションを事業戦略に装着する方法 -
kzkmaeda
2
2.1k
The Future of SEO: The Impact of AI on Search
badams
0
200
アジャイル開発とスクラム
araihara
0
170
7日間でハッキングをはじめる本をはじめてみませんか?_ITエンジニア本大賞2025
nomizone
2
1.8k
開発スピードは上がっている…品質はどうする? スピードと品質を両立させるためのプロダクト開発の進め方とは #DevSumi #DevSumiB / Agile And Quality
nihonbuson
2
3k
なぜ私は自分が使わないサービスを作るのか? / Why would I create a service that I would not use?
aiandrox
0
740
管理者しか知らないOutlookの裏側のAIを覗く#AzureTravelers
hirotomotaguchi
2
420
Data-centric AI入門第6章:Data-centric AIの実践例
x_ttyszk
1
410
株式会社EventHub・エンジニア採用資料
eventhub
0
4.3k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
Code Review Best Practice
trishagee
67
18k
How to train your dragon (web standard)
notwaldorf
91
5.8k
It's Worth the Effort
3n
184
28k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
550
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
GraphQLとの向き合い方2022年版
quramy
44
13k
Rails Girls Zürich Keynote
gr2m
94
13k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
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