×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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ͷϏϧυϑϩʔ • Werckerpipelineͱ͍͏֓೦Λ࣋ͭ • wercker.ymlpipelineΛఆٛ͢ΔΠϝʔδ ©"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ͷରԠ • pipelinestepsͱ͍͏୯ҐͰߏ͞ΕΔ • 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ɺdependenciesWerckerͰ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ͷରԠ • testbuildɺdeploymentdistribute0apkͱఆٛ 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+Dockercircle.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