Slide 1

Slide 1 text

%PDLFSJO$* https://www.flickr.com/photos/dahlstroms/3144199355

Slide 2

Slide 2 text

•  ໊લɿதଜ஌੒ !JLJLLP •  ॴଐɿ – #BDLMPHϓϩδΣΫτϚωʔδϟ – +FOLJOTϢʔβձ ⾃⼰紹介

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

2016年1⽉某⽇

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

೔ຊʹࡾڌ఺ ෱Ԭຊࣾɺ౦ژɺژ౎ χϡʔϤʔΫࢧࣾ ୆࿷ɺγϯΨϙʔϧɺϕτφϜɺΞϦκφ

Slide 8

Slide 8 text

国内を中⼼に 約3500クライアント が利⽤するプロジェクト管理ツール タスク管理機能に加え、 •  WebDAVによるファイル共有 •  プルリクエスト機能を搭載したGitのリポジトリホスティング などを提供。 http://www.backlog.jp

Slide 9

Slide 9 text

全世界 約200万ユーザ が利⽤するオンラインのドローツール 基本的なドローツールの機能に加え複数のユーザで同時に編集出来るリアルタイム コラボレーションなど、コラボレーション機能が充実。 http://cacoo.com/

Slide 10

Slide 10 text

a . : / . /

Slide 11

Slide 11 text

•  ΢ΣϒαΠτ •  ࣾ಺πʔϧ •  $* •  ϓϩμΫγϣϯʹ͸·ͩ ヌーラボと Docker

Slide 12

Slide 12 text

•  ΢ΣϒαΠτ •  ࣾ಺πʔϧ •  $* •  ϓϩμΫγϣϯʹ͸·ͩ ヌーラボと Docker

Slide 13

Slide 13 text

•  δϣϒͷ࣮ߦʹ͔ͭ͏ •  $*ͷΫϥελʔʹ͔ͭ͏ CI でのユースケース

Slide 14

Slide 14 text

•  δϣϒͷ࣮ߦʹ͔ͭ͏ •  $*ͷΫϥελʔʹ͔ͭ͏ CI でのユースケース

Slide 15

Slide 15 text

•  $*ΛͱΓ·͘؀ڥ •  $*ͰͷϢʔεέʔε •  ·ͱΊ アジェンダ

Slide 16

Slide 16 text

$*ΛͱΓ·͘؀ڥ

Slide 17

Slide 17 text

サービスで使っている技術

Slide 18

Slide 18 text

CI・CD の概要

Slide 19

Slide 19 text

•  ςετͷ࣮ߦ •  ੒Ռ෺ͷੜ੒ •  ੒Ռ෺ͷ4΁ͷΞοϓϩʔυ •  ੩తϑΝΠϧͷ4΁ͷΞοϓϩʔυ •  ".*ͷੜ੒ •  ੒Ռ෺ͷσϓϩΠ Jenkins の仕事

Slide 20

Slide 20 text

•  ςετͷ࣮ߦ •  ੒Ռ෺ͷੜ੒ •  ੒Ռ෺ͷ4΁ͷΞοϓϩʔυ •  ੩తϑΝΠϧͷ4΁ͷΞοϓϩʔυ •  ".*ͷੜ੒ •  ੒Ռ෺ͷσϓϩΠ Jenkins の仕事

Slide 21

Slide 21 text

•  ςετͷ࣮ߦ •  ੒Ռ෺ͷੜ੒ •  ੒Ռ෺ͷ4΁ͷΞοϓϩʔυ •  ੩తϑΝΠϧͷ4΁ͷΞοϓϩʔυ •  ".*ͷੜ੒ •  ੒Ռ෺ͷσϓϩΠ Jenkins の仕事 1⽉以降で対応

Slide 22

Slide 22 text

•  ໿ δϣϒ •  ໿ Ϗϧυ೔ 数でみる Jenkins

Slide 23

Slide 23 text

プルリクベースの開発

Slide 24

Slide 24 text

ヌーラボのブランチ戦略

Slide 25

Slide 25 text

開発のながれ •  όάमਖ਼΍ػೳ௥ՃͷͨΊʹϒϥϯνΛ੾Δ •  ࡞ۀ͕͓ΘΔͱ13Λग़ͯ͠ɺϨϏϡʔˍ Ϛʔδ •  ϚελʔϒϥϯνͰλάΛଧͬͯϦϦʔε

Slide 26

Slide 26 text

タグきっかけのアーカイブ⽣成

Slide 27

Slide 27 text

デリバリーはチャットから

Slide 28

Slide 28 text

Jenkins Typetalk Plugin

Slide 29

Slide 29 text

デリバリーのながれ •  UBHΛ͚ͭΔͱ4্ʹΞʔΧΠϒΛΞο ϓϩʔυ •  νϟοτ্ͰίϚϯυൃߦ •  +FOLJOT5ZQFUBML1MVHJO͕σϦόϦͷ δϣϒΛ࣮ߦ

Slide 30

Slide 30 text

$*ͰͷϢʔεέʔε

Slide 31

Slide 31 text

CI 環境の全体像

Slide 32

Slide 32 text

Jenkins Backlog Plugin

Slide 33

Slide 33 text

•  ςετ͢Δϒϥϯν͕૿͑ͨ – 13͝ͱͷςετ࣮ߦ – ਓ͕૿͑ɺϒϥϯν΋૿͑ •  ςετ࣮ߦʹඞཁͳ؀ڥ͕όϥόϥ – ҟͳΔόʔδϣϯͷπʔϧ΍ϛυϧ΢ΣΞ – جຊతʹಠཱͯ͠ಈ͔͍ͨ͠ メンバーやサービスが増えて…

Slide 34

Slide 34 text

•  εϩʔςετ – ؀ڥ͕͋͘·Ͱ଴ͨͳ͍ͱ͍͚ͳ͍ – ࣌ʹ͸ςετͦͷ΋ͷΛ͖͋ΒΊΔ͜ͱ΋ •  εϨʔϒͷϝϯς͕େม – ৽͘͠εϨʔϒͨͯΔͷେม – ϏϧυͷׂΓৼΓେม CI における問題

Slide 35

Slide 35 text

そこで!

Slide 36

Slide 36 text

•  εϩʔςετ – ϒϥϯν͝ͱʹಠཱͨ͠%PDLFSίϯςφΛ ಈ͔͢͜ͱͰ଴ͭඞཁ͕ͳ͘ͳͬͨ •  εϨʔϒͷϝϯς͕େม – εϨʔϒʹ͸%PDLFSೖΕΔ͚ͩɻεϖοΫ Ξοϓ΍৽ن௥Ճ͕அવָʹͳͬͨ Docker が解決したこと

Slide 37

Slide 37 text

5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ   ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ

Slide 38

Slide 38 text

5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ   ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ

Slide 39

Slide 39 text

3 ステップでスレーブ構成

Slide 40

Slide 40 text

•  εϨʔϒͷىಈ͕ૣ͍ – &$Πϯελϯεͷىಈʹ͔͔Δ࣌ؒఔ౓ •  Ͳ͜Ͱ΋εϨʔϒΛཱͯΒΕΔ – ࣾ಺؀ڥͰ΋($1Ͱ΋%PDLFS͕ಈ͍ͯ͞ ͍͑Ε͹0, ウマイところ

Slide 41

Slide 41 text

5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ   ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ

Slide 42

Slide 42 text

ジョブの構成例 $ ./gradlew clean test –Penv=ci $ docker run test-image ./gradlew clean test

Slide 43

Slide 43 text

複数プロセスの実⾏ •  %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”

Slide 44

Slide 44 text

Docker Compose でよくね? •  ςετ͚ͩͷ໨తʹݶ͍ͬͯ͑͹ɺ %PDLFSpMF͚ͩͰे෼ͳ͜ͱ͕ଟ͍ •  ଞͷ༻్Ͱ΋࠶ར༻͢ΔͳΒ%PDLFS $PNQPTF

Slide 45

Slide 45 text

5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ   ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ

Slide 46

Slide 46 text

イメージをキャッシュする

Slide 47

Slide 47 text

依存ライブラリのキャッシュ

Slide 48

Slide 48 text

#1 ホストディレクトリ

Slide 49

Slide 49 text

#1 ホストディレクトリ $ docker run –v ${HOME}/.gradle:/root/.gradle test-image •  ϝϦοτ – ෳ਺δϣϒؒͰͷڞ༗ •  σϝϦοτ – ύʔϛογϣϯɺϩοΫ໰୊

Slide 50

Slide 50 text

#2 事前ビルド

Slide 51

Slide 51 text

#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 ґଘϥΠϒϥϦͷߋ৽͸Ξ ϓϦέʔγϣϯͦͷ΋ͷͷ ߋ৽ΑΓ͸සൟʹى͜Βͳ ͍͜ͱ͕૝ఆ

Slide 52

Slide 52 text

#2 事前ビルド •  ϝϦοτ – ύʔϛογϣϯʹؔΘΔ໰୊͕ͳ͍ •  σϝϦοτ – ґଘؔ܎Λมߋͨ͠৔߹ʹΩϟογϡ͕શͯ ΫϦΞ͞ΕΔ

Slide 53

Slide 53 text

#3 外部キャッシュ

Slide 54

Slide 54 text

#3 外部キャッシュ •  ϝϦοτ – ॳճ࣮ߦͰ΋ڧ྽ʹૣ͍ •  σϝϦοτ – ֎෦ΩϟογϡΛϝϯς͠ͳ͍ͱ͍͚ͳ͍ # Dockerfile RUN mkdir /root/.gradle RUN cd /root/.gradle; curl -skL https://s3-ap- northeast-1.amazonaws.com//cache.20151201.tar.gz | tar zxf -

Slide 55

Slide 55 text

依存ライブラリのキャッシュ戦略 Ωϟογϡͷ࢓ํ ϝϦοτ σϝϦοτ ψʔϥϘͷ࠾༻ ϗετσΟϨΫ τϦ ςετ࣮ߦ࣌ʹϗε τσΟϨΫτϦΛϚ ΢ϯτͯ͠ɺͦ͜ʹ ґଘϥΠϒϥϦΛอ ଘͤ͞Δ ґଘϥΠϒϥϦΛ ෳ਺δϣϒͰڞ༗ Ͱ͖ɺଟগͷґଘ ؔ܎ͷมߋʹ΋େ ͖ͳӨڹΛड͚ͳ ͍ ίϯςφ಺ͷςε τΛϧʔτϢʔβ Ҏ֎Ͱ࣮ߦ͢Δ৔ ߹ɺύʔϛογϣ ϯͷ໰୊͕ൃੜ͠ ͏Δ +BWB 4DBMB .BWFO (SBEMF TCU ࣄલϏϧυ ґଘϥΠϒϥϦΛΠ ϯετʔϧͨ͠Π ϝʔδΛࣄલϏϧυ ͢Δ ύʔϛογϣϯͷ ໰୊͕ൃੜ͠ͳ͍ ҰͭͰ΋ґଘؔ܎ ͕มΘΔͱΩϟο γϡ͕શΫϦΞ͞ ΕΔ 1FSM 1ZUIPO OPEFKT ֎෦Ωϟογϡ ΩϟογϡΞʔΧΠ ϒΛ࡞੒͠4ͳͲ ͷ֎෦ϦϙδτϦʹ อଘ͠ɺςετ࣮ߦ ࣌ʹμ΢ϯϩʔυ͢ Δ Ϗϧυπʔϧ͕ࣗ લͰґଘؔ܎Λղ ܾ͢ΔΑΓѹ౗త ʹૣ͍ ֎෦ΩϟογϡΛ ࣗલͰϝϯς͢Δ ඞཁ͕͋Δ 4DBMB TCU

Slide 56

Slide 56 text

5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ   ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ

Slide 57

Slide 57 text

ビルド結果の取得

Slide 58

Slide 58 text

ワークスペースをマウントする # Dockerfile WORKDIR /opt/app $ docker run --rm –v $(pwd):/opt/app test-image •  ϝϦοτ – ςετ࣮ߦޙʹ͙͢ʹίϯςφΛ࡟আͰ͖Δ •  σϝϦοτ – ύʔϛογϣϯ໰୊͕ൃੜ͠͏Δ

Slide 59

Slide 59 text

パーミッション問題 •  ϧʔτϢʔβҎ֎ͰςετΛ࣮ߦ͠ͳ͍ ͱ͍͚ͳ͍৔߹͕͋Δ •  ίϯςφ಺ʹ͓͚ΔϗετσΟϨΫτϦ ͷΦʔφʔ͸ෆఆ •  ݖݶͷෆ଍ʹΑΓϗετσΟϨΫτϦ΁ ͷϏϧυ݁Ռͷॻ͖ࠐΈ͸ࣦഊ͠͏Δ

Slide 60

Slide 60 text

ワークアラウンド#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 •  ςετ࣮ߦϢʔβͰॻ͖ࠐΈग़དྷΔͱ͜Ζʹ ݁ՌΛॻ͘ •  ϧʔτϢʔβͰͦͷ݁ՌΛϗετσΟϨΫτ Ϧʹίϐʔ͢Δ

Slide 61

Slide 61 text

ワークアラウンド#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)

Slide 62

Slide 62 text

実⾏結果をコンテナから取り出す # Dockerfile WORKDIR /opt/app COPY . /opt/app $ UNIQUE_NAME=“TEST_${GIT_COMMIT}_$(date +%s)” $ docker run --name=${UNIQUE_NAME} test-image $ docker cp ${UNIQUE_NAME}:/opt/app/build/test-result/ test-result $ docker rm ${UNIQUE_NAME} •  ύʔϛογϣϯͷ໰୊͸ൃੜ͠ͳ͍͕ς ετͷ࣮ߦεςοϓ͕ෳࡶ

Slide 63

Slide 63 text

5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ   ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ

Slide 64

Slide 64 text

アーカイブをS3にあげる •  σϓϩΠͷͨΊʹϏϧυͨ͠ΞʔΧΠϒ Λ4ʹ͋͛Δ – "NB[PO-JOVYʹಉࠝͷBXT$-*Λ࢖͏ •  ΞʔΧΠϒ಺ͷ੩తϦιʔεΛ$%/഑৴ ༻ʹ4ʹ͋͛Δ – Πϯϋ΢εͷΞοϓϩʔυπʔϧΛ࢖͏

Slide 65

Slide 65 text

インハウスツールを Dockernize $ /usr/local/bin/upload-static-s3 ROOT.war –b # Dockerfile ENTRYPOINT [“/usr/local/bin/upload-static-s3”] $ docker run --rm /upload-static-s3 ROOT.war – b

Slide 66

Slide 66 text

何でも Dockernize •  σϓϩΠ࣌ʹඞཁͳ71/઀ଓ΋ – ࣾ಺͔ΒͷΈຊ൪σϓϩΠͰ͖ΔΑ͏ʹ੍ݶ – σϓϩΠ͢ΔͨΊʹɺࣾ಺ʹ71/઀ଓ •  &&ςετʹඞཁͳ4FMFOJVN࣮ߦ؀ڥ΋

Slide 67

Slide 67 text

%PDLFSΛ૊ΈࠐΜͩ݁Ռ

Slide 68

Slide 68 text

ビルドタイムの短縮

Slide 69

Slide 69 text

CI プロセスがポータブルに

Slide 70

Slide 70 text

·ͱΊ

Slide 71

Slide 71 text

まなんだこと •  $*͕௚໘͢Δ໰୊ – 13ϕʔεͷ։ൃʹΑΔෳ਺ϒϥϯνͷςε τͷฒߦ࣮ߦ – ར༻ٕज़ͷଟ༷ԽʹΑΔςετ࣮ߦ؀ڥͷෳ ࡶԽ •  %PDLFS͕͜ΕΒΛޮՌతʹղܾ

Slide 72

Slide 72 text

5 つのキーポイント   εϨʔϒͷߏஙํ๏Λγϯϓϧʹอͭ   %PDLFSpMFҰͭͰςετ͢Δ   ΩϟογϡΛ༗ޮʹ࢖͏   ϏϧυޙʹίϯςφΛ࡟আ͢Δ   ඞཁͳπʔϧΛ%PDLFSOJ[F͢Δ

Slide 73

Slide 73 text

Docker in CI •  $*͸%PDLFSΛ࢝ΊΔͷʹΑ͍ελʔτ ϙΠϯτ – %PDLFSͷಋೖͦͷ΋ͷ͸ͦΜͳʹେ͖ͳม ߋΛඞཁͱ͠ͳ͍ – $*͸ձࣾΛ௒͑ͯڞ༗Ͱ͖ΔϓϥΫςΟε͕ ଟͦ͏

Slide 74

Slide 74 text

ψʔϥϘͰ͸ɺ%PDLFSΛ Ͳ͔ͬͲ্ཱ͔͍ͬͪ͛ͨํΛ ืू͍ͯ͠·͢ IUUQTOVMBCJODDPNKBDBSFFS IUUQTOVMBCJODDPNKBDBSFFSDP⒎FF