Slide 1

Slide 1 text

AndroidͷCIΛ࢝ΊΑ͏ VASILY,(Inc.(ງߐ 2016/8/7(Android(Φʔϧελʔζ(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

ൃදͷྲྀΕ • CIͱ͸ʁ • CIΛ࣮ݱ͢ΔͨΊͷ࢓૊Έ • όʔδϣϯ؅ཧγεςϜͷར༻ • AndroidͷϏϧυεΫϦϓτ • CIαʔόʔͷߏங • iQONͰͷCIಋೖࣄྫ ©"VASILY,"Inc.,"2016 4

Slide 5

Slide 5 text

CI? ©"VASILY,"Inc.,"2016 5

Slide 6

Slide 6 text

Con$nuous'Integra$on ܧଓతΠϯςάϨʔγϣϯ ©"VASILY,"Inc.,"2016 6

Slide 7

Slide 7 text

ΠϯςάϨʔγϣϯ? ©"VASILY,"Inc.,"2016 7

Slide 8

Slide 8 text

ΠϯςάϨʔγϣϯ • ݸʑͷιʔείʔυ͕શମͱͯ͠ػೳ͢Δ͔Λ֬ೝ͢ΔͨΊʹ Ұͭʹ౷߹͢Δ͜ͱ1 1"ϙʔϧɾMɾσϡόϧɺεςΟʔϒɾMɾϚςΟΞεɺΞϯυϦϡʔɾΫϩʔόʔ."ܧଓతΠϯςάϨʔγϣϯೖ ໳."೔ܦBPࣾ,"2009,"p."49 ©"VASILY,"Inc.,"2016 8

Slide 9

Slide 9 text

CIͱ͸ʁ • ΠϯςάϨʔγϣϯΛܧଓతʹසൟʹߦ͏ϓϥΫςΟε ©"VASILY,"Inc.,"2016 9

Slide 10

Slide 10 text

CIͱ͸ʁ • ΠϯςάϨʔγϣϯΛܧଓతʹසൟʹߦ͏ϓϥΫςΟε • ιϑτ΢ΣΞʹ͍ͭͯͷϑΟʔυόοΫΛड͚Δػձͷ૿Ճ • ෆ۩߹ͷࠞೖ͔Βमਖ਼·Ͱͷ࣌ؒ୹ॖ • ιϑτ΢ΣΞશମͷ඼࣭ͷ޲্ ©"VASILY,"Inc.,"2016 10

Slide 11

Slide 11 text

CIΛ࣮ݱ͢ΔͨΊͷ࢓૊Έ ©"VASILY,"Inc.,"2016 11

Slide 12

Slide 12 text

CIΛߦ͏ʹ͸ʁ • ΠϯςάϨʔγϣϯ͕؆୯ʹ࣮ߦͰ͖Δඞཁ͕͋Δ ©"VASILY,"Inc.,"2016 12

Slide 13

Slide 13 text

ΠϯςάϨʔγϣϯͷϓϩηε • ίϯύΠϧ • ੩తղੳ • ςετͳͲ ͜ΕΒͷҰ࿈ͷϓϩηεΛʮϏϧυʯͱݺͿ2 2"ϙʔϧɾMɾσϡόϧɺεςΟʔϒɾMɾϚςΟΞεɺΞϯυϦϡʔɾΫϩʔόʔ."ܧଓతΠϯςάϨʔγϣϯೖ ໳."೔ܦBPࣾ,"2009,"p."26 ©"VASILY,"Inc.,"2016 13

Slide 14

Slide 14 text

ΠϯςάϨʔγϣϯͷࣗಈԽ • ΠϯςάϨʔγϣϯΛϏϧυεΫϦϓτʹΑͬͯࣗಈԽ • ίϚϯυҰͭͰϏϧυΛ࣮ߦͰ͖ΔΑ͏ʹ͢Δ ©"VASILY,"Inc.,"2016 14

Slide 15

Slide 15 text

CI#(ܧଓతΠϯςάϨʔγϣϯ) • ιʔείʔυͷมߋΛى఺ʹϏϧυεΫϦϓτΛ࣮ߦ • ϏϧυΛ೔ৗతʹසൟʹ࣮ߦ͍ͯ͘͠ ©"VASILY,"Inc.,"2016 15

Slide 16

Slide 16 text

CIͷྲྀΕ 1. ϦϙδτϦͷมߋΛ؂ࢹ 2. มߋ͕͋Ε͹ιʔείʔυΛνΣοΫΞ΢τ 3. Ϗϧυͷ࣮ߦ 4. ࣮ߦ݁ՌΛϑΟʔυόοΫ 5. Ҿ͖ଓ͖ϦϙδτϦͷมߋΛ؂ࢹ ©"VASILY,"Inc.,"2016 16

Slide 17

Slide 17 text

CIʹඞཁͳཁૉ • όʔδϣϯ؅ཧγεςϜ • ϏϧυεΫϦϓτ • CIαʔόʔ ©"VASILY,"Inc.,"2016 17

Slide 18

Slide 18 text

CIʹඞཁͳཁૉ • όʔδϣϯ؅ཧγεςϜ • ιʔείʔυΛू໿ɾ؅ཧ • ϏϧυεΫϦϓτ • ϏϧυͷࣗಈԽ • CIαʔόʔ • ιʔείʔυͷมߋͷ؂ࢹɺϏϧυͷ࣮ߦɺϑΟʔυόοΫ ©"VASILY,"Inc.,"2016 18

Slide 19

Slide 19 text

όʔδϣϯ؅ཧγεςϜͷར༻ ©"VASILY,"Inc.,"2016 19

Slide 20

Slide 20 text

όʔδϣϯ؅ཧγεςϜͷར༻ • ιʔείʔυΛू໿ɾ؅ཧ • ιʔείʔυͷมߋΛى఺ʹCIΛ࣮ߦՄೳʹ͢Δ ©"VASILY,"Inc.,"2016 20

Slide 21

Slide 21 text

όʔδϣϯ؅ཧγεςϜͷར༻ • όʔδϣϯ؅ཧγεςϜΛ࢖༻ • GitͳͲ • ϦϙδτϦ؅ཧαʔϏεɾπʔϧʹΑͬͯίʔυΛू໿ • GitHub,)Bitbucket,)GitlabͳͲ ©"VASILY,"Inc.,"2016 21

Slide 22

Slide 22 text

AndroidͷϏϧυεΫϦϓτ ©"VASILY,"Inc.,"2016 22

Slide 23

Slide 23 text

AndroidͷϏϧυεΫϦϓτ • ϏϧυεΫϦϓτ͸ॏཁ • ΠϯςάϨʔγϣϯ͸ϏϧυεΫϦϓτʹΑͬͯࣗಈԽ • ϏϧυεΫϦϓτ͕ແ͍ͱCIΛ࣮ߦͰ͖ͳ͍ ©"VASILY,"Inc.,"2016 23

Slide 24

Slide 24 text

AndroidͷϏϧυεΫϦϓτ • AndroidStudioͷొ৔ • Eclipse͔ΒAndroidStudio΁։ൃ؀ڥ͕Ҡߦ ©"VASILY,"Inc.,"2016 24

Slide 25

Slide 25 text

• Ϗϧυπʔϧ͕Gradle΁Ҡߦ • ϓϩδΣΫτߏ੒͕Gradleϕʔεʹ • IDEͱϏϧυϓϩηεͷ෼཭ • CLIͰͷ࣮ߦ͕༰қʹ ©"VASILY,"Inc.,"2016 25

Slide 26

Slide 26 text

AndroidͷϏϧυεΫϦϓτ • Android(Gradle(Plugin͕ΠϯςάϨʔγϣϯΛࣗಈԽ • ΠϯςάϨʔγϣϯͷϓϩηε͕Gradleͷtaskͱͯ͠ఆٛ ©"VASILY,"Inc.,"2016 26

Slide 27

Slide 27 text

Android'Tasks3 • assemble The%task%to%assemble%the%output(s)%of%the%project. • check The%task%to%run%all%the%checks. • connectedCheck Runs%checks%that%requires%a%connected%device%or%emulator.%they%will%run%on%all%connected%devices%in%parallel. • deviceCheck Runs%checks%using%APIs%to%connect%to%remote%devices.%This%is%used%on%CI%servers. • build This%task%does%both%assemble%and%check • clean This%task%cleans%the%output%of%the%project. 3"Gradle"Plugin"User"Guide:"Android3tasks ©"VASILY,"Inc.,"2016 27

Slide 28

Slide 28 text

Android'Tasksͷґଘؔ܎ • ./gradlew tasks --allͰλεΫͷґଘؔ܎Λදࣔ app:assemble - [app:assembleDebug, app:assembleRelease] app:check - [app:lint, app:test] app:connectedCheck - [app:connectedAndroidTest] app:deviceCheck - [app:deviceAndroidTest] app:build - [app:assemble, app:check] app:clean - [] ©"VASILY,"Inc.,"2016 28

Slide 29

Slide 29 text

ΠϯςάϨʔγϣϯͷϓϩηε • ίϯύΠϧ • ੩తղੳ • ςετ ©"VASILY,"Inc.,"2016 29

Slide 30

Slide 30 text

Android'TasksͱͷରԠ • ίϯύΠϧ"→"./gradlew*assemble • ੩తղੳ"→"./gradlew*lint • ςετ"→"./gradlew*test,*connectedCheck,*deviceCheck • ίϯύΠϧ"+"੩తղੳ"+"ςετ"→"./gradlew*build ©"VASILY,"Inc.,"2016 30

Slide 31

Slide 31 text

AndroidͷCIΛߦ͏४උ͸Ͱ͖͍ͯΔ • GradleϕʔεͷϓϩδΣΫτͰ͸Gradle(Plugin͕ϏϧυεΫϦ ϓτΛ༻ҙ • ༻ҙ͞ΕͨϏϧυεΫϦϓτΛ࣮ߦ͢Δ͜ͱͰAndroidϓϩδΣ ΫτΛϏϧυ ©"VASILY,"Inc.,"2016 31

Slide 32

Slide 32 text

ΠϯςάϨʔγϣϯͷϓϩηε • ίϯύΠϧ • ੩తղੳ • ςετͳͲ ͜ΕΒͷҰ࿈ͷϓϩηεΛʮϏϧυʯͱݺͿ ©"VASILY,"Inc.,"2016 32

Slide 33

Slide 33 text

Ϗϧυͷ࣮ߦ • ΠϯςάϨʔγϣϯͷϓϩηε͸શ࣮ͯߦ͢΂͖͔ʁ • ࠷ऴతʹ͸શͯͷϓϩηεͷ࣮ߦΛ໨ࢦ͢ ©"VASILY,"Inc.,"2016 33

Slide 34

Slide 34 text

Ϗϧυͷ࣮ߦ • CIಋೖͷॳظ͸ίϯύΠϧ͔Β࢝ΊΔͱ༰қ • ීஈͷ։ൃ΁ͷӨڹ͕খ͍͞ • CI͕ఆணޙʹ੩తղੳɺςετͳͲͷϓϩηεΛ௥Ճ • νʔϜ͕CIʹͳΕ͔ͯΒஈ֊తʹϓϩηεΛ௥Ճ ©"VASILY,"Inc.,"2016 34

Slide 35

Slide 35 text

CIαʔόʔͷߏங ©"VASILY,"Inc.,"2016 35

Slide 36

Slide 36 text

CIαʔόʔͷߏங • CIπʔϧ΍CIαʔϏεΛ࢖͍CIαʔόʔΛ༻ҙ • ϦϙδτϦΛ؂ࢹɺมߋ͕͋Ε͹ϏϧυεΫϦϓτΛ࣮ߦ • ࣮ߦ݁ՌΛϑΟʔυόοΫ ©"VASILY,"Inc.,"2016 36

Slide 37

Slide 37 text

CIαʔόʔͷߏங • ༷ʑͳCIαʔόʔΛߏங͢ΔαʔϏεɺπʔϧ͕ଘࡏ ©"VASILY,"Inc.,"2016 37

Slide 38

Slide 38 text

CircleCIͰͷCIͷ࣮ߦ • CircleCIΛCIαʔόʔʹͨ͠৔߹ͷྫ • ର৅ͷϦϙδτϦΛ؂ࢹ • assembleλεΫΛ࣮ߦ ©"VASILY,"Inc.,"2016 38

Slide 39

Slide 39 text

ϦϙδτϦͷมߋΛ؂ࢹ • ࠨͷϝχϡʔ͔ΒʮADD$PROJECTSʯ Λબ୒ • ʮorganiza4onʯΛબ୒ ©"VASILY,"Inc.,"2016 39

Slide 40

Slide 40 text

ϦϙδτϦͷมߋΛ؂ࢹ • ର৅ͷϦϙδτϦͷʮBuild'projectʯΛΫϦοΫ • ϦϙδτϦͷมߋͷ؂ࢹ͕։࢝͞ΕΔ ©"VASILY,"Inc.,"2016 40

Slide 41

Slide 41 text

circle.yml • ࣮ߦ͢ΔϏϧυ಺༰Λఆٛ machine: java: version: openjdk8 environment: ANDROID_HOME: /usr/local/android-sdk-linux dependencies: override: - echo y | android update sdk --no-ui --all --filter "tools" - echo y | android update sdk --no-ui --all --filter "android-24,build-tools-24.0.1" test: override: - ./gradlew assemble ©"VASILY,"Inc.,"2016 41

Slide 42

Slide 42 text

ϏϧυεΫϦϓτͷ࣮ߦ • assembleλεΫΛ࣮ߦ test: override: - ./gradlew assemble ©"VASILY,"Inc.,"2016 42

Slide 43

Slide 43 text

༷ʑͳCIαʔϏεɾπʔϧ • Bitrise • CircleCI • Travis/CI • Wercker • GREENHOUSE • Jenkins ©"VASILY,"Inc.,"2016 43

Slide 44

Slide 44 text

ϦϙδτϦͷ؂ࢹͱϏϧυεΫϦϓτͷ࣮ߦ ©"VASILY,"Inc.,"2016 44

Slide 45

Slide 45 text

iQONͰͷCIಋೖࣄྫ ©"VASILY,"Inc.,"2016 45

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

CIશମͷྲྀΕ4 4"AndroidͷCI؀ڥΛCircleCI͔ΒWerckerʹҠߦ͠·ͨ͠ ©"VASILY,"Inc.,"2016 47

Slide 48

Slide 48 text

CIͷಋೖ • QA༻APKͷϝʔϧͰͷ഑෍Λվળ • CircleCIΛಋೖ • ΠϯςάϨʔγϣϯͷίϯύΠϧϓϩηε͔ΒCIΛ։࢝ • assembleλεΫͷ࣮ߦͱDeployGateͰͷ഑෍5 5"CircleCIͱDeployGateͰAndroidΞϓϦͷϦϦʔε࡞ۀΛࣗಈԽͯ͠Έͨ" ©"VASILY,"Inc.,"2016 48

Slide 49

Slide 49 text

CIΛಋೖͨ͠ޮՌ • ఆܕͷ܁Γฦ͠࡞ۀͷ࡟ݮ" • ࣾ಺QAͷޮ཰͕޲্ • ࣾ಺΁ͷCIͷఆண ©"VASILY,"Inc.,"2016 49

Slide 50

Slide 50 text

AndroidͷCI͸೉͍͠ʁ • AndroidͷΠϯςάϨʔγϣϯ͸طʹࣗಈԽ͞Ε͍ͯΔ • CIπʔϧɺCIαʔϏεͷਐԽ • ؆୯ʹCIαʔόΛߏஙͰ͖ΔΑ͏ʹͳ͍ͬͯΔ ©"VASILY,"Inc.,"2016 50

Slide 51

Slide 51 text

·ͱΊ • AndroidͷCI͸೉͘͠ͳ͍ • AndroidͷCIΛ࢝ΊΑ͏ ©"VASILY,"Inc.,"2016 51

Slide 52

Slide 52 text

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