Slide 1

Slide 1 text

AndroidͷCI؀ڥΛ CircleCI͔ΒWerckerʹͨ͠࿩ VASILY,(Inc.(ງߐ 2016/6/9'Android'Tes1ng'Bootcamp'#2 ©"VASILY,"Inc.,"2016 1

Slide 2

Slide 2 text

About&Me • Ryosuke)Horie)@Horie1024 • →)ͷௗͷΞΠίϯͰ͢ • Android)Developer • VASILY,)Inc. ©"VASILY,"Inc.,"2016 2

Slide 3

Slide 3 text

©"VASILY,"Inc.,"2016 3

Slide 4

Slide 4 text

©"VASILY,"Inc.,"2016 4

Slide 5

Slide 5 text

ࠓ೔ͷൃදͰΘ͔Δ͜ͱ • CircleCI͔ΒWercker΁ͷҠߦํ๏ ©"VASILY,"Inc.,"2016 5

Slide 6

Slide 6 text

ൃදͷྲྀΕ • iQONͷ։ൃͰར༻͍ͯͨ͠CircleCIʹΑΔCI؀ڥͷ঺հ • CircleCIͰফ໣ͨ͠఺ • Werckerͷݕূ • Wercker΁ͷҠߦํ๏ͷ঺հ • CircleCI.with.DockerͰ͸μϝʁ ©"VASILY,"Inc.,"2016 6

Slide 7

Slide 7 text

iQONͷ։ൃͰར༻͍ͯͨ͠CI؀ڥ ©"VASILY,"Inc.,"2016 7

Slide 8

Slide 8 text

iQONͷCI/CD؀ڥ • 1೥൒΄Ͳલ͔ΒCircleCIΛར༻ • h+p:/ /tech.vasily.jp/entry/ circleci_deploygate_android_app_automa=on • Ϣχοτςετ͔ΒϦϦʔε࡞ۀ·ͰࣗಈԽ ©"VASILY,"Inc.,"2016 8

Slide 9

Slide 9 text

iQONͷ։ൃϑϩʔ • PullRequestϕʔεͷ։ൃ • releaseϒϥϯνʹରͯ͠PullRequest • master΁Ϛʔδͯ͠ϦϦʔε ©"VASILY,"Inc.,"2016 9

Slide 10

Slide 10 text

શମͷྲྀΕ ©"VASILY,"Inc.,"2016 10

Slide 11

Slide 11 text

Ϣχοτςετ • શͯͷϒϥϯνͰ࣮ࢪ ©"VASILY,"Inc.,"2016 11

Slide 12

Slide 12 text

BetaʹΑΔAPK഑෍ • ಛఆϒϥϯν΁ͷϚʔδͰ࣮ߦ • releaseϒϥϯν΁ͷϚʔδ • masterϒϥϯν΁ͷϚʔδ ©"VASILY,"Inc.,"2016 12

Slide 13

Slide 13 text

GooglePlay΁ͷϦϦʔε • master΁ͷϚʔδͰ࣮ߦ • α൛ͰΞοϓϩʔυ • BetaͰͷ࠷ऴ֬ೝ • ߋ৽৘ใΛهೖޙ੡඼൛΁ϓϩϞʔτ • ϦϦʔε׬ྃ ©"VASILY,"Inc.,"2016 13

Slide 14

Slide 14 text

CircleCIͰফ໣ͨ͠఺ ©"VASILY,"Inc.,"2016 14

Slide 15

Slide 15 text

CircleCIͰফ໣ͨ͠఺ • OOM(Out'of'Memory) • Ϗϧυ࣌ؒ • Ϗϧυ؀ڥͷζϨ ©"VASILY,"Inc.,"2016 15

Slide 16

Slide 16 text

OOMͷڪා • 4GBͷน • build*toolsɺGradle1PluginͷΞοϓσʔτ͸ා͍ • JAVA_OPSɺdexOp=onͳͲͰඍௐ੔ ©"VASILY,"Inc.,"2016 16

Slide 17

Slide 17 text

OOMͷڪා • Gradle(Plugin(2.0ʹ্͛ͨλΠϛϯάͰOOMසൃ • transformClassesWithDexForReleaseͰOOM • ༷ʑͳରࡦΛࢼΈΔ΋ղܾͤͣ ©"VASILY,"Inc.,"2016 17

Slide 18

Slide 18 text

૿͑ଓ͚ΔϏϧυ࣌ؒ ©"VASILY,"Inc.,"2016 18

Slide 19

Slide 19 text

Ϗϧυ؀ڥͷζϨʹΑΔϏϧυࣦഊ • CircleCIଆͰ༻ҙ͞ΕͨSDK͕࠷৽Ͱ͸ͳ͍ • ૺ۰ͨ͠ࣄྫ:-Android-SDK-Toolsͷrevision͕࠷৽Ͱແ͍ • toolsͷΞοϓσʔτͰճආ dependencies: override(΋͘͠͸ pre): - echo y | android update sdk --no-ui --all --filter "tools" - echo y | android update sdk --no-ui --all --filter "build-tools-23.0.2" ©"VASILY,"Inc.,"2016 19

Slide 20

Slide 20 text

1೥൒ͷӡ༻ͷ݁Ռ • circle.yml͕ෳࡶԽ • ϝϯςφϯεੑ͕ѱԽ • CircleCI͓͡͞Μʹ ©"VASILY,"Inc.,"2016 20

Slide 21

Slide 21 text

Ͳ͏͢Ε͹ղܾͰ͖Δ͔ʁ • Jenkins΁ͷҠߦ • ϝϯςφϯεΛߟ͑Δͱආ͚͍ͨ • ଞͷCIαʔϏε΁ͷ৐Γ׵͑ • ίετ͸ֻ͔Δ͕ݱ࣮త ©"VASILY,"Inc.,"2016 21

Slide 22

Slide 22 text

·ͩ!CircleCI!Ͱফ໣ͯ͠Δͷʁ ©"VASILY,"Inc.,"2016 22

Slide 23

Slide 23 text

Werckerͷݕূ ©"VASILY,"Inc.,"2016 23

Slide 24

Slide 24 text

Wercker(ϫʔΧʔ)ʹ͍ͭͯݕূΛ։࢝ • OOM͕ආ͚ΒΕΔ͔ • Ϗϧυ࣌ؒͷ୹ॖ • Ϗϧυ؀ڥͷζϨΛແͤ͘Δ͔ ©"VASILY,"Inc.,"2016 24

Slide 25

Slide 25 text

OOMΛආ͚ΒΕΔ͔ • υΩϡϝϯτʹ͸ϝϞϦ੍ݶͷهࡌͳ͠ • OOMͷൃੜࣄྫΛ୳͕͢ݟ͚ͭΒΕͣ • WerckerͰCircleCIͰOOM͕ൃੜͨ͠৚݅ͰͷϏϧυΛ࣮ߦ • ෳ਺ճ࣮ߦ͕ͨ͠OOM͸ൃੜͤͣ • ආ͚ΒΕΔͱ൑அ ©"VASILY,"Inc.,"2016 25

Slide 26

Slide 26 text

OOMΛආ͚ΒΕΔ͔ • ࣮ߦ؀ڥ͕DockerͰ͋Δ͜ͱ͸ؔ܎͋Δ͔ʁ • docker runͷΦϓγϣϯ1 • -m)ϝϞϦϦϛοτͷࢦఆɻOOM͸ൃੜ͠ͳ͘ͳΔ • --oom-kill-disable)OOM)KillerͷແޮԽ • ࣮ࡍͲ͏ͳ͍ͬͯΔ͔Θ͔Βͳ͍ͷͰ஌Γ͍ͨ 1"Docker"run"ϦϑΝϨϯε#ϢʔβɾϝϞϦͷ੍ݶ ©"VASILY,"Inc.,"2016 26

Slide 27

Slide 27 text

Ϗϧυ࣌ؒͷ୹ॖ • AndroidΛϏϧυ͢ΔDockerΠϝʔδΛࣗ࡞ • SDKͷηοτΞοϓʹ͔͔Δ࣌ؒ෼୹ॖ • ΠϝʔδͷΩϟογϡͰpullʹֻ͔Δ࣌ؒΛ୹ॖ • Ϗϧυ࣌ؒΛ୹ॖՄೳ ©"VASILY,"Inc.,"2016 27

Slide 28

Slide 28 text

Ϗϧυ؀ڥͷζϨΛແͤ͘Δ͔ • DockerΠϝʔδΛࣗ࡞͢Δ͜ͱͰՄೳ • σϝϦοτ • Dockerfileͷϝϯςφϯε͕ඞཁʹͳΔ • େ͖ͳෛ୲ʹ͸ͳΒͳͦ͏ ©"VASILY,"Inc.,"2016 28

Slide 29

Slide 29 text

Wercker΁ͷҠߦํ๏ͷ঺հ ©"VASILY,"Inc.,"2016 29

Slide 30

Slide 30 text

ҠߦͷͨΊʹ΍Δ͜ͱ 1. Wercker΁ͷొ࿥ 2. ΞϓϦέʔγϣϯͷ࡞੒ 3. DockerΠϝʔδͷ࡞੒ 4. DockerΠϝʔδΛϨδετϦʹొ࿥ 5. wercker.ymlΛ࡞੒ ©"VASILY,"Inc.,"2016 30

Slide 31

Slide 31 text

Wercker΁ͷొ࿥ͱΞϓϦέʔγϣϯ࡞੒ • ʮGet%Startedʯ͔ΒWercker΁ొ࿥ • GitHubΞΧ΢ϯτͰͷొ࿥͕؆୯ ©"VASILY,"Inc.,"2016 31

Slide 32

Slide 32 text

Wercker΁ͷొ࿥ͱΞϓϦέʔγϣϯ࡞੒ • ্෦ʮCreateʯΛΫϦοΫ • ϝχϡʔ͔ΒʮApplica,onʯΛΫϦοΫ ©"VASILY,"Inc.,"2016 32

Slide 33

Slide 33 text

Wercker΁ͷొ࿥ͱΞϓϦέʔγϣϯ࡞੒ • ϦϙδτϦΛબ୒ ©"VASILY,"Inc.,"2016 33

Slide 34

Slide 34 text

Wercker΁ͷొ࿥ͱΞϓϦέʔγϣϯ࡞੒ • publicͳϓϩδΣΫτͳΒʮwercker,will,checkout,the,code,withoutusing,an,SSH,keyʯ • privateͳϓϩδΣΫτͳΒʮAdd,the,deploy,key,to,the,selected,repository,for,meʯ ©"VASILY,"Inc.,"2016 34

Slide 35

Slide 35 text

Wercker΁ͷొ࿥ͱΞϓϦέʔγϣϯ࡞੒ • νΣοΫΛೖΕΔͱApplica(on͕publicͱͯ͠ެ։ ©"VASILY,"Inc.,"2016 35

Slide 36

Slide 36 text

Wercker΁ͷొ࿥ͱΞϓϦέʔγϣϯ࡞੒ • ʮGenerate(a(default(wercker.ymlʯΛΫϦοΫ • wercker.ymlͷ਽ܗ͕දࣔ͞ΕΔͷͰίϐʔͯ͠ϓϩδΣΫτʹ௥Ճ ©"VASILY,"Inc.,"2016 36

Slide 37

Slide 37 text

Wercker΁ͷొ࿥ͱΞϓϦέʔγϣϯ࡞੒ • GitHubʹϓογϡ͢ΔͱϏϧυ͕։࢝ ©"VASILY,"Inc.,"2016 37

Slide 38

Slide 38 text

DockerΠϝʔδͷ࡞੒ • Android͕ϏϧυͰ͖ΔΠϝʔδΛ࡞Δ • ʮandroid)dockerΠϝʔδʯͰݕࡧ • ࠓճΠϝʔδΛࣗ࡞ͨ͠खॱ͸Qiitaʹ·ͱΊ·ͨ͠ • h0p:/ /goo.gl/htgMyw ©"VASILY,"Inc.,"2016 38

Slide 39

Slide 39 text

DockerΠϝʔδΛϗεςΟϯάαʔϏεʹొ࿥ • DockerHubɺQuay(Ωʔ).ioͳͲ • ࡞੒ͨ͠ΠϝʔδΛWercker͕pullͰ͖ΔΑ͏ʹ͢Δ • ฐࣾͷDockerΠϝʔδ͸Quay.ioʹϗετ2 • Android΋ͦ͜ʹ৐͔ͬΔ 2"ΞυαʔόʔΛElas'cBeanstalk"with"DockerʹҠߦͨ͠࿩ ©"VASILY,"Inc.,"2016 39

Slide 40

Slide 40 text

Quay.io͔ΒͷDockerΠϝʔδͷpull • iQONͰ࢖༻͢ΔDockerΠϝʔδ͸privateͳϦϙδτϦͱͯ͠ Quay.ioͰϗετ • WerckerͰ͸privateͳϦϙδτϦΛ • ৄࡉ͸Qiitaʹ·ͱΊͯ͋Γ·͢4h6p:/ /goo.gl/EFCPwI ©"VASILY,"Inc.,"2016 40

Slide 41

Slide 41 text

DockerΠϝʔδΛϗεςΟϯάαʔϏεʹొ࿥ • publicͳϓϩδΣΫτͳΒDockerHubͰे෼ • public.repositoryͰAndroid.SDKΛؚΉΠϝʔδΛެ։͢Δͱ࠶ ഑෍ͰϥΠηϯεҧ൓ • publicͱͯ͠ΠϝʔδΛެ։͢ΔͷΛආ͚Δඞཁ͕͋Δ • GitHubͱ࿈ܞͯ͠Automated.Build΋Մೳ • DockerfileΛߋ৽ͯ͠pushͨ͠ΒࣗಈͰΠϝʔδΛϏϧυ. ©"VASILY,"Inc.,"2016 41

Slide 42

Slide 42 text

WerckerͷϏϧυϑϩʔ • Wercker͸pipelineͱ͍͏֓೦Λ࣋ͭ • wercker.yml͸pipelineΛఆٛ͢ΔΠϝʔδ ©"VASILY,"Inc.,"2016 42

Slide 43

Slide 43 text

Workrflows • 5݄ʹൃද͞ΕͨWerckerͷ৽͍͠Ϗϧυϑϩʔ[^3] • JenkinsͷBuild4Pipeline4Pluginʹࣅ͍ͯΔ [^3]%Introducing%Wercker%Workflows ©"VASILY,"Inc.,"2016 43

Slide 44

Slide 44 text

Workrflows • ৽نͰ࡞੒ͨ͠Applica(onͷϏϧυϑϩʔ͸શͯWorkflows1 • چϏϧυϑϩʔ͔Β͸೚ҙͰϚΠάϨʔγϣϯՄೳ ©"VASILY,"Inc.,"2016 44

Slide 45

Slide 45 text

WorkflowsʹΑΔϏϧυϑϩʔ • wercker.ymlͰpipelineΛఆٛ • ैདྷ͸Build1ͱ1DeployͷΈ͕ͩͬͨ೚ҙʹఆٛՄೳ • pipelineΛWerckerͷWeb1UIͰ૊Έ߹ΘͤΔ ©"VASILY,"Inc.,"2016 45

Slide 46

Slide 46 text

circle.ymlͱwercker.ymlͷରԠ • pipeline͸stepsͱ͍͏୯ҐͰߏ੒͞ΕΔ • wercker.ymlͰ͸ఆٛͨ͠pipelineηΫγϣϯຖʹstepsΛఆ͍ٛͯ͘͠ • stepsʹ͸छྨ͕͋Δ[^4] • Internal6steps:6Wercker͕։ൃͨ͠૊ࠐΈͷsteps • A:er6steps:6pipeline͕failed6or6passedͨ͠ࡍʹ࣮ߦ͞ΕΔsteps • script6steps:6shell6commandΛ࣮ߦ͢Δsteps • Installing6packages:6packageͷΠϯετʔϧΛ࣮ߦ͢Δsteps • ࣗ࡞:6ʮstep6registryʯʹొ࿥͢Δ͜ͱͰwercker.yml͔Β࢖༻Ͱ͖Δ [^4]h&p:/ /devcenter.wercker.com/docs/steps/index.html ©"VASILY,"Inc.,"2016 46

Slide 47

Slide 47 text

circle.ymlͱwercker.ymlͷରԠ • ςετɺmasterϒϥϯνͷ৔߹ʹBetaͰͷ഑෍Λߦ͏cricle.yml machine: java: version: openjdk8 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --filter "android-23,build-tools-23.0.3" test: override: - ./gradlew testDebug deployment: master: branch: master commands: - ./gradlew assembleDebug crashlyticsUploadDistributionRelease ©"VASILY,"Inc.,"2016 47

Slide 48

Slide 48 text

circle.ymlͱwercker.ymlͷରԠ • machineɺdependencies͸WerckerͰ͸DockerΠϝʔδ͕୲͏ • boxηΫγϣϯΛఆٛ • DockerHub͔Β࡞੒ͨ͠ΠϝʔδΛpull box: horie1024/wercker-android-build:0.1 test: override: - ./gradlew testDebug deployment: master: branch: master commands: - ./gradlew assembleDebug crashlyticsUploadDistributionRelease ©"VASILY,"Inc.,"2016 48

Slide 49

Slide 49 text

circle.ymlͱwercker.ymlͷରԠ • test͸buildɺdeployment͸distribute0apkͱఆٛ box: horie1024/wercker-android-build:0.1 test: override: - ./gradlew testDebug deployment: master: branch: master commands: - ./gradlew assembleDebug crashlyticsUploadDistributionRelease ©"VASILY,"Inc.,"2016 49

Slide 50

Slide 50 text

circle.ymlͱwercker.ymlͷରԠ • script(stepsͰcircle.ymlͱಉ͡Α͏ʹ࣮ߦ box: horie1024/wercker-android-build:0.1 build: steps: - script: name: Unit test code: | ./gradlew testDebug distribute-apk: steps: - script: name: Distribute APK code: | - ./gradlew assembleDebug crashlyticsUploadDistributionRelease ©"VASILY,"Inc.,"2016 50

Slide 51

Slide 51 text

circle.ymlͱwercker.ymlͷରԠ • wercker.ymlΛGitHub΁ϓογϡ͢ΔͱϏϧυ͕։࢝ box: horie1024/wercker-android-build:0.1 build: steps: - script: name: Unit test code: | ./gradlew testDebug distribute-apk: steps: - script: name: Distribute APK code: | - ./gradlew assembleDebug crashlyticsUploadDistributionRelease ©"VASILY,"Inc.,"2016 51

Slide 52

Slide 52 text

Workflowsͷઃఆ • distribute*apk͸͜ͷ··ͩͱ࣮ߦ͞Εͳ͍ • WerckerͷWeb0UI͔ΒWorkflowsΛઃఆ͢Δඞཁ͕͋Δ • Applica8onͷʮManage0WorkflowsʯΛΫϦοΫ ©"VASILY,"Inc.,"2016 52

Slide 53

Slide 53 text

Workflowsͷઃఆ • ʮAdd$new$pipelineʯ͔ΒpipelineΛ௥Ճ • Name:$distribute4apk,$YML$Pipeline$name:$distribute4apk • YML$Pipeline$name͕wercker.ymlͰఆٛͨ͠pipelineʮdistribute4apkʯͱରԠ ©"VASILY,"Inc.,"2016 53

Slide 54

Slide 54 text

Workflowsͷઃఆ • ʮOn$BranchʯͰͲͷBranch৔߹ʹpipelineΛ࣮ߦ͢Δ͔ఆٛ • ʮExecute$pipelinesʯʹ͸ʮdistribute5apkʯΛࢦఆ ©"VASILY,"Inc.,"2016 54

Slide 55

Slide 55 text

Workflowsͷઃఆ • ׬੒ • masterϒϥϯν΁ͷpush͕͋ͬͨ৔߹ʮdistribute.apkʯpipeline͕࣮ߦ͞ΕBetaͰAPK͕഑෍ ©"VASILY,"Inc.,"2016 55

Slide 56

Slide 56 text

iQONͷcircle.yml͔Βwercker.yml΁Ҡߦ • iQONͷcircle.yml΋ಉ͡Α͏ʹwercker.ymlʹॻ͖׵͑ • ϢχοτςετɺBeta΁ͷ഑෍ɺGooglePlay΁ͷΞοϓϩʔυΛpipelineͰఆٛ • WorkflowsΛઃఆ ©"VASILY,"Inc.,"2016 56

Slide 57

Slide 57 text

Google&Play΁ͷࣗಈΞοϓϩʔυ • gradle(play(publisherΛར༻ play { serviceAccountEmail = SERVICE_ACCOUNT_EMAIL pk12File = file(KEY_FILE_PATH) track = PLAY_TARGET_TRACK // 'production' or 'rollout' or 'beta' or 'alpha' } • gradle(taskͰ࣮ߦɺGooglePlay΁Ξοϓϩʔυ ./gradlew publishApkRelease ©"VASILY,"Inc.,"2016 57

Slide 58

Slide 58 text

Google&Play΁ͷࣗಈΞοϓϩʔυ • werckerͷpipelineͰఆٛ upload-google-play: steps: - script: name: Upload APK to GooglePlay code: | ./gradlew publishApkRelease -PdisablePreDex crashlyticsUploadDistributionRelease ©"VASILY,"Inc.,"2016 58

Slide 59

Slide 59 text

keystoreɺ.p12ΩʔϑΝΠϧͷѻ͍ • IP੍ݶΛ͔͚ͨs3ͷόέοτʹ഑ஔ • Wercker͕ެ։͍ͯ͠Δsource-ipΛొ࿥ • build-pipelineͰfetch • ৄࡉ͸Qiitaʹ·ͱΊͯ͋Γ·͢-h9p:/ /goo.gl/B92HAf ©"VASILY,"Inc.,"2016 59

Slide 60

Slide 60 text

Ҡߦͨ݁͠Ռ • OOM͸ൃੜ͍ͯ͠ͳ͍(ࠓͷॴ) ©"VASILY,"Inc.,"2016 60

Slide 61

Slide 61 text

Ҡߦͨ݁͠Ռ • Ϗϧυ࣌ؒͷ୹ॖ • Ϣχοτςετ"໿5෼"$>"໿3෼ • ϢχοτςετɺϦϦʔεϏϧυɺGooglePlay΁ͷϦϦʔε"໿10෼"$>"໿6෼ ©"VASILY,"Inc.,"2016 61

Slide 62

Slide 62 text

Ҡߦͨ݁͠Ռ • Ϗϧυ؀ڥͷζϨ • DockerΠϝʔδΛࣗ࡞ͨ͜͠ͱͰղܾ • Dockerfileͷϝϯςφϯε࡞ۀ͸ෛ୲ʹ͸ײ͡ͳ͍ ©"VASILY,"Inc.,"2016 62

Slide 63

Slide 63 text

CircleCI(with(DockerͰ͸μϝʁ ©"VASILY,"Inc.,"2016 63

Slide 64

Slide 64 text

CircleCI(with(DockerͰ͸μϝʁ • DockerͳΒCircleCIͰ΋ར༻Մೳ • CircleCIͷVMͰdockerίϚϯυ͕ୟ͚Δ • DockerΛར༻ͨ͠৔߹΋4GB੍ݶ͕͋Δͷ͔ʁ • CircleCIͷDockerαϙʔτͰͷϏϧυΛࢼ͢ ©"VASILY,"Inc.,"2016 64

Slide 65

Slide 65 text

CircleCI(with(DockerͰ͸μϝʁ • CircleCIͰdockerΛར༻ͯ͠Ϗϧυ͢ΔͱOOM͕ൃੜ͠ͳ͔ͬͨ • -m.Φϓγϣϯ͸CirlceCIͷVMͰ͸༗ޮʹͳΒͳ͍ • OOMʹ͍ͭͯ͸CircleCIͰ΋WerckerͰ΋ݱঢ়Ͱ͸ආ͚ΒΕͦ͏ • CircleCIͰ͸DockerΠϝʔδͷΩϟογϡΛࣗྗͰ΍Δඞཁ͕͋Δ • circle.yml͕ෳࡶԽ ©"VASILY,"Inc.,"2016 65

Slide 66

Slide 66 text

CircleCI(with(DockerͰ͸μϝʁ • CircleCIͰ͸DockerΠϝʔδͷΩϟογϡΛࣗྗͰ΍Δඞཁ͕ ͋Δ • circle.yml͕ෳࡶԽ • Werckerͷํ͕ઃఆ͕γϯϓϧɺΠϝʔδͷΩϟογϡ΋σϑ ΥϧτͰޮ͘ ©"VASILY,"Inc.,"2016 66

Slide 67

Slide 67 text

·ͱΊ • CircleCI͔ΒWercker΁ͷҠߦ͸ͦ͜·Ͱ೉͘͠ͳ͍ • Wercker΁ͷҠߦͰCircleCIͰײ͍ͯͨ͡໰୊఺ΛղܾͰ͖ͨ • CircleCI+with+Docker͸circle.yml͕ෳࡶԽ͢ΔͷͰ༷ࢠݟ ©"VASILY,"Inc.,"2016 67

Slide 68

Slide 68 text

࠷ޙʹ • VASILYͰ͸AndroidΤϯδχΞΛืू͍ͯ͠·͢ʂ ©"VASILY,"Inc.,"2016 68

Slide 69

Slide 69 text

͋Γ͕ͱ͏͍͟͝·ͨ͠ ©"VASILY,"Inc.,"2016 69