Slide 1

Slide 1 text

ϦϦʔεࣗಈԽͷಋೖͱ ޮ཰ͷΑ͍ϦϦʔεϑϩʔΛٻΊͯ by Ryo Sakaguchi @Droidkaigi2017 Day.1

Slide 2

Slide 2 text

About me • Θ͘Θ͘͞Μͱ͔ݺ͹Εͯ ·͢ɻ(ձࣾͰͷ෍ڭʹ͸ࣦ ഊͨ͠) • Wantedly! ͱ͍͏ձࣾͰ Wantedly Peopleͷ։ൃΛ ͍ͯ͠·͢ɻ • ݩ͓ͶͩΜҎ্ͳՈ۩԰͞ ΜͰൢചһΛ͍ͯ͠·͠ ͨɻ

Slide 3

Slide 3 text

Agenda

Slide 4

Slide 4 text

Agenda • ࣗಈԽͷงғؾ • ໨త΍ϞνϕʔγϣϯɺͰ͖Δ͜ͱɺϝϦοτͳͲ • ϦϦʔεࣗಈԽʹؔ࿈͢Δπʔϧͷ঺հ • AndroidΞϓϦͷϦϦʔεͷࣗಈԽʹ໾ʹཱͭπʔϧ܈Λ঺հ͠·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖ४උʣ • ͍͔ͭ͘ͷϓϩδΣΫτΛྫʹɺࣗಈԽͨ͠ϦϦʔεϑϩʔΛಋೖ͢Δ͜ͱΛߟ͑ͯ Έ·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖʣ • ࣮ࡍʹಋೖ͢Δࡍʹඞཁͳ࡞ۀΛνΣοΫ͍͖ͯ͠·͢ɻ • ࣦഊ͕ͪ͠ͳέʔεͱ஫ҙ఺ • ·ͱΊతͳ • ࣭ٙԠ౴

Slide 5

Slide 5 text

ࠓ೔Ұ൪఻͍͑ͨ͜ͱ • ࣗಈԽͷৄࡉͳಋೖखॱͳͲͰ͸ͳ͘ɺͳΜͰ ΍Δͷ͔ɺϞνϕʔγϣϯΛϝΠϯʹ఻͍͑ͯ ͖͍ͨͱࢥ͍·͢ɻ • ಋೖࣗମ͸ରͯ͠೉͘͠ͳ͍ɻ • ඞཁͳͷ͸΍͍ͬͯ͘ؾ࣋ͪ

Slide 6

Slide 6 text

Agenda • ࣗಈԽͷงғؾ • ໨త΍ϞνϕʔγϣϯɺͰ͖Δ͜ͱɺϝϦοτͳͲ • ϦϦʔεࣗಈԽʹؔ࿈͢Δπʔϧͷ঺հ • AndroidΞϓϦͷϦϦʔεͷࣗಈԽʹ໾ʹཱͭπʔϧ܈Λ঺հ͠·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖ४උʣ • ͍͔ͭ͘ͷϓϩδΣΫτΛྫʹɺࣗಈԽͨ͠ϦϦʔεϑϩʔΛಋೖ͢Δ͜ͱΛߟ͑ͯ Έ·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖʣ • ࣮ࡍʹಋೖ͢Δࡍʹඞཁͳ࡞ۀΛνΣοΫ͍͖ͯ͠·͢ɻ • ࣦഊ͕ͪ͠ͳέʔεͱ஫ҙ఺ • ·ͱΊతͳ • ࣭ٙԠ౴

Slide 7

Slide 7 text

ͦ΋ͦ΋ࣗಈԽͷ໨తͬͯʁ

Slide 8

Slide 8 text

ࣗಈԽͷ໨త • ϧʔνϯϫʔΫɺఆܕ࡞ۀͷΑ͏ͳ΋ͷͳͷͰɺ ࣗಈԽ͢Δ͜ͱʹΑͬͯɺຊ࣭తͳۀ຿ʹूதͰ ͖ΔΑ͏ʹ͍ͨ͠ɻ • ؅ཧ͍ͯ͠ΔΞϓϦ͕ଟ͘ͳ͖ͬͯͨΓɺετΞ ܝࡌจͷଟݴޠରԠͳͲΛ͍ͯ͠Δ৔߹ɺߋ৽ख ॱ͕൥ࡶʹͳΔɻ • ͦͷϛεΛݮΒ͍ͨ͠ɻ • ϦϦʔε࡞ۀΛଐਓԽͤͨ͘͞ͳ͍ɻ

Slide 9

Slide 9 text

͜Μͳ͜ͱ͕Ͱ͖·͢

Slide 10

Slide 10 text

͜Μͳ͜ͱ͕Մೳʹ • Google Play Developer Console΁ͷAPKΞοϓϩʔυ(ෳ ਺APKͷҰׅΞοϓϩʔυ΋OKʂ) • ετΞ৘ใͷߋ৽ • Change log • Long description • Short description • ScreenShots • ؂ࢹπʔϧ(Crashlytics΍Firebase Crash Reporting, Bugsnag…) ΁ͷmapping.txtϑΝΠϧͷΞοϓϩʔυ

Slide 11

Slide 11 text

΋ͬͱ͍Ζ͍ΖͰ͖ΔΑ͏ʹͳΔ͚Ͳ ΍Γա͗͸ྑ͘ͳ͍͔Β஫ҙɻ (ޙड़)

Slide 12

Slide 12 text

ࣗಈԽͨ͠ΒԿ͕͏Ε͘͠ͳΔ͔!

Slide 13

Slide 13 text

࡞ۀ͕γϯϓϧʹͳͬͯ͏Ε͍͠ʂ

Slide 14

Slide 14 text

ࣗಈԽ͍ͯ͠ͳ͍ϦϦʔε࡞ۀ͸ ΦϖϨʔγϣϯϛεΛੜΈ͕ͪ

Slide 15

Slide 15 text

ࠓ·ͰͷϦϦʔε࡞ۀ • ॺ໊ϑΝΠϧΛ͍࣋ͬͯΔϦϦʔεϚωδϟʔతͳਓʹϦϦ ʔεΛ͓ئ͍͢Δɻ • ProductionAPKΛ༻ҙ͢Δɻ • ΞοϓσʔτจΛ༻ҙ͢Δɻ • ConsoleʹΞΫηεͯ͠ɺWEBΠϯλʔϑΣΠεͰΞοϓϩʔ υ͢Δ • ΞοϓϩʔυΛࣾ಺ʹप஌ • ߋ৽Λࣾ಺ʹ௨஌ Λશ෦ख࡞ۀ

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

͜Ε͔ΒͷϦϦʔε࡞ۀ

Slide 18

Slide 18 text

git push origin master

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

͸΍͍

Slide 21

Slide 21 text

͍͍ͩͨ͜ΕͰ͍͚Δɻ ͜ΕͳΒ…

Slide 22

Slide 22 text

ϛεͳ͘οʂ εϐʔσΟʹοʂ ϦϦʔεΛճͤΔοʂ

Slide 23

Slide 23 text

Ͱ΋ϦϦʔε࡞ۀͬͯͦΜͳʹճ਺ଟ͘ͳ͍Μ͡Ό...

Slide 24

Slide 24 text

ͦΕ͕ɺΞϓϦͷվળαΠΫϧΛ ि1Ͱճ͢ͱ݁ߏେมͰ͢

Slide 25

Slide 25 text

ͳͥେม͔ • ϦϦʔεΛߴ଎Ͱճ͍ͯ͘͠ͱͲ͏ͯ͠΋όά͕૿͍͑ͯ͘ɻ • ࠜຊతͳղܾࡦͱͯ͠͸ɺ͖ͪΜͱςετΛॻ͍ͯͦ΋ͦ ΋όάΛੜΈʹ͍͘؀ڥΛ੔͑Δ͜ͱ͕ඞཁɻ • Ͱ΋ɺى͖Δͱ͖͸ى͖Δɻ • ݁ՌతʹhotfixΛ͢Δ͜ͱ΋͋Δ • ͦͷhotfixΛؚΊΔͱिʹ1ճ͡Ό͢·ͳ͍ • ͦΜͳ࣌ɺϦϦʔε͕Ͱ͖Δ࡞ۀऀ͕1ਓͩͬͨΒʁ ͱ͔΍ͬͯΔͱ࣮֬ʹϛε͕૿͍͑ͯ͘

Slide 26

Slide 26 text

࣮ࡍʹ๻ࣗ਎͕΍ͬͯ͠·ͬͨ͜ͱҰཡ • ετΞͷChangelogͷ೔ຊޠʹӳޠΛӳޠʹ ೔ຊޠΛೖΕͯ͠·ͬͨ • APKΛsplit͍ͯͨ͠ͷͰɺԿճ͔͢ͰʹΞοϓ ϩʔυࡁΈͷAPKϑΝΠϧΛΞοϓϩʔυͯ͠ ͠·ͬͨ(஄͔ΕΔͷͰ࣮֐͸ͳ͍) ΫϦςΟΧϧ͗͢Δϛε͸൜ͯ͠ͳ͍͚Ͳɺ΋͏ Ұ౓ؔ࿈࡞ۀ͠ͳ͚Ε͹͍͚ͳ͍ετϨε͸݁ߏ ͋ͬͨɻ

Slide 27

Slide 27 text

ͦΜͳ࣌ʹग़ձͬͨͷ͕ࣗಈԽͰͨ͠ɻ

Slide 28

Slide 28 text

Agenda • ࣗಈԽͷงғؾ • ໨త΍ϞνϕʔγϣϯɺͰ͖Δ͜ͱɺϝϦοτͳͲ • ϦϦʔεࣗಈԽʹؔ࿈͢Δπʔϧͷ঺հ • AndroidΞϓϦͷϦϦʔεͷࣗಈԽʹ໾ʹཱͭπʔϧ܈Λ঺հ͠·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖ४උʣ • ͍͔ͭ͘ͷϓϩδΣΫτΛྫʹɺࣗಈԽͨ͠ϦϦʔεϑϩʔΛಋೖ͢Δ͜ͱΛߟ͑ͯ Έ·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖʣ • ࣮ࡍʹಋೖ͢Δࡍʹඞཁͳ࡞ۀΛνΣοΫ͍͖ͯ͠·͢ɻ • ࣦഊ͕ͪ͠ͳέʔεͱ஫ҙ఺ • ·ͱΊతͳ • ࣭ٙԠ౴

Slide 29

Slide 29 text

ࣗಈԽʹඞཁͳπʔϧ܈

Slide 30

Slide 30 text

૝ఆ؀ڥ • GitFlowΛ࢖͍ͬͯΔ • master(ϦϦʔεϒϥϯν) • develop • feature • hotfix • release • ݸਓɾνʔϜ͸໰Θͳ͍

Slide 31

Slide 31 text

CI

Slide 32

Slide 32 text

Wercker͔Bitrise͕Φεεϝ

Slide 33

Slide 33 text

CI • Wercker 1. DockerͰίϯςφΛ޷͖ʹ࡞ͬ ͯϏϧυ؀ڥΛ͔ͳΓࣗ༝ʹ૊ ΈཱͯΔ͜ͱ͕Ͱ͖Δ • Dockerfile͕ॻ͚Ε͹޷͖ʹ ࡞ΕΔ 2. ଞʹ΋͢Ͱʹग़དྷ্͕͍ͬͯΔ ίϯςφΛ࢖͏͜ͱ΋Ͱ͖Δɻ 3. ͸΍͍ 4. αϙʔτ͕ϑϥϯΫͳؾ͕͢ Δɻ 5. ͍͍ͩͨແྉ

Slide 34

Slide 34 text

CI • Bitrise 1. ͳΜͱͳ͘iOSͷΠϝʔδ͕ڧ͍͔ ΋͠Εͳ͍͚Ͳɺandroidͷαϙʔ τ΋εΰΠ͔ͬ͠Γ͍ͯ͠Δɻ 2. ͍͍ͩͨجຊతʹ͸GUIͰ׬݁Ͱ͖ ΔͷͰɺͪΐͬͱमਖ਼͍ͨ͠ͱ͖ ͱ͔ศར 3. WEBͷίϯιʔϧ͔ΒϏϧυΛε έδϡʔϧͯ͠ୟ͘͜ͱ΋Ͱ͖Δɻ 4. ͔ͬ͠Γ࢖͏ͳΒ༗ྉ͚ͩͲɺ੍ ݶ෇͖ͷແྉϓϥϯ΋͋Δɻ 5. ໘౗ͳॺ໊ϑΝΠϧͷ؅ཧΛखॿ ͚ͯ͘͠ΕΔ

Slide 35

Slide 35 text

CI Ͳ͕͍͍ͬͪͷʁ • ؀ڥߏஙͱϏϧυϑϩʔͷߏஙͷ͠΍͢͞Ͱ͸ Bitriseʹ܉഑্͕͕Γ·͢ɻ • ॊೈੑͱݴ͏؍఺Ͱ͸Wercker͔ͳ͊ͱࢥͬͯ ͍Δɻ

Slide 36

Slide 36 text

APKͷΞοϓϩʔυ

Slide 37

Slide 37 text

APKͷΞοϓϩʔυ • ༗໊ॴ͕2ͭ͋Γ·͢ɻ 1. Triple-T/gradle-play-publisher 2. fastlane/fastlane

Slide 38

Slide 38 text

ࡶʹൺֱͯ͠Έ·ͨ͠

Slide 39

Slide 39 text

ൺֱ͸͠·͚ͨ͠Ͳ Έͳ͞Μ͕͓ؾ͖ͮͷΑ͏ʹେࠩ͸͋Γ·ͤΜɻ ͲͪΒͰ΋޷͖ͳํΛ࢖͑͹͍͍ͱࢥ͍·͢ɻ కΓͷѱ͍ൺֱʹͳͬͯ͠·͍·ͨ͠…

Slide 40

Slide 40 text

Ͱ͕͢

Slide 41

Slide 41 text

fastlaneͱ͍͑͹fablic fablicͱ͍͑͹

Slide 42

Slide 42 text

Fabric is Joining Google — January 18, 2017

Slide 43

Slide 43 text

Ͱ͢ΑͶʁ

Slide 44

Slide 44 text

fastlane is Joining Google — January 23, 2017

Slide 45

Slide 45 text

ࠓޙʹظ଴ʂ

Slide 46

Slide 46 text

ͦͷଞͷπʔϧ

Slide 47

Slide 47 text

ͦͷଞͷπʔϧ • Tonkotsu • GooglePlayͷߋ৽ΛSlackʹ௨஌ʂ • PlayConsoleΞϓϦΛೖΕͯͳ͍ਓ΍ࣾ಺ʹ ௨஌͢Δͱ͖ͱ͔ʹͱͯ΋໾ཱͪ·͢ɻ

Slide 48

Slide 48 text

͍͍ͩͨ͜ͷπʔϧ͚ͩͰࣗಈԽΛ࣮ફ͢Δ͜ͱ͕Ͱ͖·͢ɻ

Slide 49

Slide 49 text

Agenda • ࣗಈԽͷงғؾ • ໨త΍ϞνϕʔγϣϯɺͰ͖Δ͜ͱɺϝϦοτͳͲ • ϦϦʔεࣗಈԽʹؔ࿈͢Δπʔϧͷ঺հ • AndroidΞϓϦͷϦϦʔεͷࣗಈԽʹ໾ʹཱͭπʔϧ܈Λ঺հ͠·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖ४උʣ • ͍͔ͭ͘ͷϓϩδΣΫτΛྫʹɺࣗಈԽͨ͠ϦϦʔεϑϩʔΛಋೖ͢Δ͜ͱΛߟ͑ͯ Έ·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖʣ • ࣮ࡍʹಋೖ͢Δࡍʹඞཁͳ࡞ۀΛνΣοΫ͍͖ͯ͠·͢ɻ • ࣦഊ͕ͪ͠ͳέʔεͱ஫ҙ఺ • ·ͱΊతͳ • ࣭ٙԠ౴

Slide 50

Slide 50 text

ಋೖ४උฤ

Slide 51

Slide 51 text

ͦͷࣗಈԽ΄Μͱ͏ʹඞཁͰ͔͢ʁ

Slide 52

Slide 52 text

ຊ౰ʹඞཁͰ͔͢ʁ • ͳͥࣗಈԽ͢Δͷ͔ • ͜Εʹ͍ͭͯಥ͖٧Ίͯߟ͍͑ͯ͘ͱ࣮ࡍ͸͠ͳͯ͘΋͍͍έʔ ε͸ଘࡏ͠·͢ɻ • ԿΛͲ͏ࣗಈԽ͢Δ͔͕ࣗͣͱݟ͖͑ͯ·͢ɻ • ͦΕ͕Ͱ͖ͨΒಋೖ४උ͕ऴͬͨΈ͍ͨͳ΋ΜͰ͢ɻ • ࣗಈԽ͢ΔϝϦοτ͕͋Δͳɺͱײͨ͡Β࣮ࡍʹ࡞ۀʹͱΓ͔͔ Γ·͠ΐ͏ɻ • ϝϦοτ͕ײ͡ΒΕͨΒɺʮfoobar͔ͩΒࣗಈԽ͍ͨ͠ɻ͔ͩ Βগ࣌ؒ͘͠Εʯతͳ͓࿩ΛνʔϜͰ͢Δͱྑ͍ͱࢥ͍·͢ɻ • ݸਓͳΒؾʹͤͣ΍ͬͯ͠·͍·͠ΐ͏ɻ

Slide 53

Slide 53 text

Case.1

Slide 54

Slide 54 text

Case.1 ׬શʹࠃ಺޲͚ͷέʔε

Slide 55

Slide 55 text

Case.1 ׬શʹࠃ಺޲͚ͷέʔε → ৔߹ʹΑͬͯ͸ࣗಈԽ͠ͳͯ͘΋ྑ͍

Slide 56

Slide 56 text

Case.1 ͳ͔ͥʁ • ϦϦʔεʹ͔͔Δෛ୲͕ͦ͜·Ͱେ͖͘ͳ͍ͱ ૝ఆͰ͖ΔͨΊɻ • ଟݴޠରԠ࣌ʹଟ͘ͷΞοϓσʔτจΛॻ ͘ඞཁ͕͋Δ͕ɺ׬શࠃ಺޲͚ͷ৔߹͸ͦ ͷ޻਺͕͔͔Βͳ͍ɻ

Slide 57

Slide 57 text

Case.2

Slide 58

Slide 58 text

Case.2 άϩʔόϧʹల։͍ͯͯ͠ϩʔΧϥΠζ΋๛෋ͳ ΞϓϦ

Slide 59

Slide 59 text

Case.2 άϩʔόϧʹల։͍ͯͯ͠ϩʔΧϥΠζ΋๛෋ͳ ΞϓϦ → ͥͻࣗಈԽ͍ͨ͠

Slide 60

Slide 60 text

Case.2 ͳ͔ͥʁ • ΞοϓσʔτจΛԹ͔Έͷ͋Δख࡞ۀͰ܁Γฦ͠ ͍ͯ͘ඞཁ͕͋Δɻ • ਖ਼௚͔ͳΓͭΒ͍ɻ • APKͷΞοϓϩʔυ͚ͩͰ͸ͳ͘ετΞ৘ใͷߋ ৽΋ຊ౰ʹԯ߷ʹͳΔɻ • 14ݴޠ x 5ຕͷεΫϦʔϯγϣοτΛΞοϓϩʔυ ͢Δ͜ͱ͕͋ͬͨΒͲ͏͠Α͏ɻ

Slide 61

Slide 61 text

Case.3

Slide 62

Slide 62 text

Case.3 ओʹࠃ಺޲͚ɺ͚ͩͲNDKΛ࢖ͬͨΓɺRealm Λ࢖ͬͨΓ͍ͯ͠Δ৔߹

Slide 63

Slide 63 text

Case.3 ओʹࠃ಺޲͚ɺ͚ͩͲNDKΛ࢖ͬͨΓɺRealm Λ࢖ͬͨΓ͍ͯ͠Δ৔߹ → APK SplitΛͯ͠ɺΞϓϦαΠζΛ࡟ݮ͍ͯ͠ Δ৔߹͸ͱͬͯ΋ޮՌతͰ͢

Slide 64

Slide 64 text

APK Splitʁ

Slide 65

Slide 65 text

APK Splitʁ splits { abi { enable true reset() include 'x86', 'armeabi', 'armeabi-v7a' universalApk false // trueʹ͢Δͱ෼ղͨ͠APKͷଞʹ // ࠓ·ͰϏϧυ͍ͯͨ͠APK΋ग़ྗ͞Ε·͢ɻ // fablic΍DeployGateʹΞοϓϩʔυ͢ΔࡍʹޮՌత } }

Slide 66

Slide 66 text

Case.3 ͳͥSplit͍ͯ͠Δͱ͖͸ޮՌత͔ʁ

Slide 67

Slide 67 text

Case.3 ͳͥSplit͍ͯ͠Δͱ͖͸ޮՌత͔ʁ → ΞϓϦ͕ෳ਺ʹ෼͔Ε·͢ɻ ্هͷྫͩͱuniversalAPKΛআ͍ͯ3ͭͷAPK͕ग़དྷ্͕Γ·͢ɻ ͜ΜͳΜ͍͍ͪͪखͰϙνϙν΍ͬͯΒΕ·ͤΜɻ ͳͷͰࣗಈͰΞοϓϩʔυָͯ͠Λ͍ͯ͜͠͏ͱݴ͏ελΠϧͰ͢ɻ ΞϓϦͷαΠζ͸ࠃ಺ͩͱͦ͏Ͱ΋ແ͍͔΋͠Ε·ͤΜ͕ɺւ֎ͩͱܧଓ཰ʹӨڹ͠·͢ɻ ͳͷͰ΋֘͠౰͞ΕΔਓ͕͍Βͬ͠ΌͬͨΒͥͻಋೖͯ͠Έ͍ͯͩ͘͞ʂ

Slide 68

Slide 68 text

Agenda • ࣗಈԽͷงғؾ • ໨త΍ϞνϕʔγϣϯɺͰ͖Δ͜ͱɺϝϦοτͳͲ • ϦϦʔεࣗಈԽʹؔ࿈͢Δπʔϧͷ঺հ • AndroidΞϓϦͷϦϦʔεͷࣗಈԽʹ໾ʹཱͭπʔϧ܈Λ঺հ͠·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖ४උʣ • ͍͔ͭ͘ͷϓϩδΣΫτΛྫʹɺࣗಈԽͨ͠ϦϦʔεϑϩʔΛಋೖ͢Δ͜ͱΛߟ͑ͯ Έ·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖʣ • ࣮ࡍʹಋೖ͢Δࡍʹඞཁͳ࡞ۀΛνΣοΫ͍͖ͯ͠·͢ɻ • ࣦഊ͕ͪ͠ͳέʔεͱ஫ҙ఺ • ·ͱΊతͳ • ࣭ٙԠ౴

Slide 69

Slide 69 text

ಋೖฤ

Slide 70

Slide 70 text

࣮ࡍʹखॱͱίʔυͰಋೖ͔Β഑৴·ͰΛ௥͍͖ͬͯ·͠ΐ͏ʂ

Slide 71

Slide 71 text

ࠓճͷཁ݅(͋͘·Ͱ΋૝ఆͰ͢) • ঢ়گ • ͋ͳͨ͸5ਓͰߏ੒͞Εͨ։ൃνʔϜͷAndroidΤϯδχΞͰ ͢ɻ • ΞϓϦ͸ࠃࡍల։͓ͯ͠Γɺ຋༁΋֎෦ʹґཔ͍ͯͨ͠Γ͠· ͢ɻ • ͜ͷ1ϲ݄ɺαʔϏεάϩʔεͷͨΊʹɺ1िؒʹ1ճͷϦϦʔε αΠΫϧΛճ͍ͯ͘͠ࣄʹͳΓ·ͨ͠ɻ • νʔϜʹ͸ϏδωεαΠυͷਓ΋ډ·͢ɻ·ͨɺCSνʔϜ͔Β ͸ϦϦʔε͕͞ΕͨΒ͍ͪૣ͘ڭ͑ͯ΄͍͠ͱݴΘΕ͍ͯ·͢ɻ • ΞϓϦ಺ͷDBʹ͸RealmΛ࢖༻͍ͯ͠·͢ɻ

Slide 72

Slide 72 text

Թ͔Έͷ͋Δख࡞ۀ(1/3) • ϦϦʔεલʹͳΓɺࠓճͷΞοϓσʔτจΛߟ͑ɺ10ݴޠ ෼ͷ຋༁ґཔΛग़͠·ͨ͠ɻ • ຋༁Λ଴ͭؒɺ࠷ऴ֬ೝͷςετΛߦ͍·ͨ͠ɻ • ςετ׬ྃޙɺAPKΛϏϧυ͠·ͨ͠ɻ • ຋༁͕͞ΕͨΞοϓσʔτจ͢΂͕ͯखݩʹἧ͍·ͨ͠ɻ • ͍͟ΞοϓϩʔυͰ͢ɻ • ΞϓϦαΠζͷංେԽΛ཈੍͢ΔͨΊʹɺAPK splitΛ࢖͏ ͜ͱʹͨ͠ͷͰɺશ෦Ͱ5ͭͷAPKΛΞοϓϩʔυ͢Δ͜ͱ ʹͳΓ·ͨ͠ɻ

Slide 73

Slide 73 text

Թ͔Έͷ͋Δख࡞ۀ(2/3) • GooglePlay Developer Console΁ΞΫηε͠ ·͢ɻ • APKΛΞοϓϩʔυ͠(x5)ɺ֤ݴޠ͝ͱʹΞο ϓσʔτจΛίϐϖ͍͖ͯ͠·͢(x10)ɻ • ͍͟ެ։ϘλϯΛԡ͠·͢ʂ

Slide 74

Slide 74 text

• GooglePlay Developer Console΁ΞΫηε͠ ·͢ɻ • APKΛΞοϓϩʔυ͠(x5)ɺ֤ݴޠ͝ͱʹΞο ϓσʔτจΛίϐϖ͍͖ͯ͠·͢(x10)ɻ • ͍͟ެ։ϘλϯΛԡ͠·͢ʂ

Slide 75

Slide 75 text

APKΛΞοϓϩʔυ͠(x5) ΞοϓσʔτจΛೖྗ͠·͢(x10)

Slide 76

Slide 76 text

Թ͔Έͷ͋Δख࡞ۀ(3/3) • APKΛΞοϓϩʔυޙɺCSνʔϜͱ։ൃνʔϜ ʹʮΞοϓϩʔυ͕׬ྃ͠·ͨ͠ʯͱप஌͠· ͢ɻ • ετΞͷߋ৽ΛPlayConsoleΞϓϦͷ௨஌Ͱ֬ ೝͰ͖ͨͷͰɺCSνʔϜʹ΋͏Ұ౓࿈ܞ͠· ͢ɻ

Slide 77

Slide 77 text

݁ߏେมײ͋Δɻ

Slide 78

Slide 78 text

Ͱ͸ࣗಈԽ͢ΔͱͲ͏ͳΔ͔

Slide 79

Slide 79 text

ࠓճ͸αΫοͱͰ͖ΔࣗಈԽͰߟ͍͑ͨͱࢥ͍·͢ɻ 1. GooglePlay Developer Console΁ΞΫηε͠ ·͢ɻ → ͢΂ͯϩʔΧϧͰ४උ&׬݁͠·͠ΐ͏ by fastlane

Slide 80

Slide 80 text

ࠓճ͸αΫοͱͰ͖ΔࣗಈԽͰߟ͍͑ͨͱࢥ͍·͢ɻ 1. GooglePlay Developer Console΁ΞΫηε͠ ·͢ɻ → ͢΂ͯϩʔΧϧͰ४උ&׬݁͠·͠ΐ͏ by fastlane 2. APKΛΞοϓϩʔυ͠(x5)ɺ֤ݴޠ͝ͱʹΞο ϓσʔτจΛίϐϖ͍͖ͯ͠·͢(x10)ɻ → ϓϩάϥϜʹ೚ͤ·͠ΐ͏ by fastlane && CI

Slide 81

Slide 81 text

ࠓճ͸αΫοͱͰ͖ΔࣗಈԽͰߟ͍͑ͨͱࢥ͍·͢ɻ 1. GooglePlay Developer Console΁ΞΫηε͠·͢ɻ → ͢΂ͯϩʔΧϧͰ४උ&׬݁͠·͠ΐ͏ by fastlane 2. APKΛΞοϓϩʔυ͠(x5)ɺ֤ݴޠ͝ͱʹΞοϓσʔτจΛ ίϐϖ͍͖ͯ͠·͢(x10)ɻ → ϓϩάϥϜʹ೚ͤ·͠ΐ͏ by fastlane && CI 3. APKΛΞοϓϩʔυޙɺCSνʔϜͱ։ൃνʔϜʹʮΞοϓ ϩʔυ͕׬ྃ͠·ͨ͠ʯͱप஌͠·͢ɻ → SlackͰࣗಈతʹ௨஌͢Δ࢓૊ΈΛ࡞Γ·͠ΐ͏ by Slack & CI

Slide 82

Slide 82 text

ࠓճ͸αΫοͱͰ͖ΔࣗಈԽͰߟ͍͑ͨͱࢥ͍·͢ɻ 1. GooglePlay Developer Console΁ΞΫηε͠·͢ɻ → ͢΂ͯϩʔΧϧͰ४උ&׬݁͠·͠ΐ͏ by fastlane 2. APKΛΞοϓϩʔυ͠(x5)ɺ֤ݴޠ͝ͱʹΞοϓσʔτจΛίϐϖ͍͖ͯ͠· ͢(x10)ɻ → ϓϩάϥϜʹ೚ͤ·͠ΐ͏ by fastlane && CI 3. APKΛΞοϓϩʔυޙɺCSνʔϜͱ։ൃνʔϜʹʮΞοϓϩʔυ͕׬ྃ͠· ͨ͠ʯͱप஌͠·͢ɻ → SlackͰࣗಈతʹ௨஌͢Δ࢓૊ΈΛ࡞Γ·͠ΐ͏ by Slack & CI 4. ετΞͷߋ৽ΛPlayConsoleΞϓϦͷ௨஌Ͱ֬ೝͰ͖ͨͷͰɺCSνʔϜʹ΋ ͏Ұ౓࿈ܞ͠·͢ɻ → ͪ͜Β΋SlackͰࣗಈతʹ௨஌͢Δ࢓૊ΈΛ࡞Γ·͠ΐ͏ by tonkotsu

Slide 83

Slide 83 text

͜Ε͚ͩͰ΋͍ͩͿָʹͳΓ ·͢Αʂ Ͱ͸࣮ݱ͍͖ͯ͠·͠ΐ͏ɻ

Slide 84

Slide 84 text

Step.1(1/2) ·ͣ͸fastlaneͷ४උ͔Β • fastlane͕GooglePlay Developer ConsoleʹΞ Ϋηε͢ΔͨΊͷService AccountΛ࡞Γɺੜ ੒͞ΕΔjsonϑΝΠϧΛ༻ҙ͠·͢ɻ • ࣍ʹfastlaneͷΠϯετʔϧΛߦ͍·͢ɻ gem install fastlane

Slide 85

Slide 85 text

Step.1(2/3) • fastlaneΛ࢖ͬͯGoogelPlay͔Βݱࡏͷ࠷৽ͷετ Ξܝࡌ৘ใΛऔಘ͠ɺgit؅ཧԼʹ͓͖·͠ΐ͏ɻ − ͜ͷ࣌஫ҙ͍ͨ͠ͷ͕ɺઌఔμ΢ϯϩʔυͨ͠json ϑΝΠϧ͸gitͷϦϙδτϦʹೖΕͳ͍Α͏ʹͯ͠ ͍ͩ͘͞ɻ > cd your_project_folder > fastlane supply init -j /path/to/json > git add . > git push

Slide 86

Slide 86 text

Step.1(3/3) ͜Μͳײ͡ͰΞοϓσʔτจ͕͸͍ͬͨσΟϨΫτϦ͕ϓϩδΣ ΫτϑΥϧμ಺ʹੜ੒͞Ε·͢ɻ ΞοϓσʔτΛ഑৴͢Δࡍ͸ςΩετϑΝΠϧʹόʔδϣϯίʔ υͷ໊લΛ͚ͭͯɺΞοϓϩʔυ͢Δ͜ͱͰετΞʹߋ৽͕͔͔ Γ·͢ɻ metadata └── android ├── en-US │ └── changelogs │ ├── 100000.txt // όʔδϣϯίʔυ͕ϑΝΠϧ໊ʹͳΔ │ └── 100100.txt └── ja-JP └── changelogs └── 100100.txt fastlaneͷ४උ͸Ҏ্Ͱ͢ɻ

Slide 87

Slide 87 text

Step.2(1/2) • CI͕masterϓογϡʹ൓Ԡͯ͠ɺϦϦʔεϏϧ υΛ࡞੒͠ɺfastlaneΛୟ͘༻ʹઃఆ͠·͠ΐ ͏ɻ release: steps: - script: name: Upload to GooglePlay. code: | ls -la $WERCKER_REPORT_ARTIFACTS_DIR ./script/deploy/deploy2googleplay.sh

Slide 88

Slide 88 text

Step.2(2/2) • /deploy2googleplay.shͷத਎ fastlane supply run -p com.wakwak.awsomeglobalapp \ -j ./app/signingConfigs/json_key.json \ -u \ "./app/build/outputs/apk/app-production-arm64-v8a-release.apk",\ "./app/build/outputs/apk/app-production-armeabi-release.apk",\ "./app/build/outputs/apk/app-production-armeabi-v7a-release.apk",\ "./app/build/outputs/apk/app-production-mips-release.apk",\ "./app/build/outputs/apk/app-production-x86-release.apk",\ "./app/build/outputs/apk/app-production-x86_64-release.apk" \ --verbose --skip_upload_images --skip_upload_screenshots ͜͜·Ͱ΍Ε͹ ͱΓ͋͑ͣϏϧυˠϦϦʔε͸׬੒͠·͢

Slide 89

Slide 89 text

Q.ͳΜ͔ΊΜͲͦ͘͞͏ʁ

Slide 90

Slide 90 text

A.͸͍ɻΘΓͱ޻ఔ௕͍Ͱ͢ɻ ͜ΕͰ΋ΊͬͪΌল͍ͯ·͢ɻ

Slide 91

Slide 91 text

ҙ֎ʹ໘౗ • ࣗಈԽͷϑϩʔΛ૊ΈཱͯΔͷ͸ͱͯ΋ָ͍͠ Ͱ͕͢ɺ࠷ॳ͸͜·͝·ͨ͠࡞ۀ͕ଟ͍ͷͰͪ ΐͬͱ໘౗ʹײ͡Δ͔΋͠Ε·ͤΜɻ • Թ͔Έͷ͋Δख࡞ۀϦϦʔεΛ΍ΊΔʹ͸Թ͔ Έͷ͋Δ࡞ۀʹΑͬͯҙ֎͸ͳ͑͠·ͤΜɻ • ϕετͳͷ͸ϦϙδτϦͷΦʔφʔ͕࠷ॳʹΨ οʂͬͱ࡞ۀͯ͠͠·͏͜ͱɻ

Slide 92

Slide 92 text

Step.3(1/2) • Ξοϓϩʔυ׬ྃΛ௨஌͠·͠ΐ͏ releaseͱ͍͏channelʹϏϧυ׬ྃΛ௨஌͢Δ stepΛ௥Ճ͠·͢ɻ after-steps: - slack-notifier: url: $SLACK_URL_RELEASE channel: release username: wercker

Slide 93

Slide 93 text

Step.3(2/2) • શମͰ͸͜Μͳײ͡ʹͳΔ͔ͱࢥ͍·͢ɻ release: steps: - script: name: Upload to GooglePlay. code: | ls -la $WERCKER_REPORT_ARTIFACTS_DIR ./script/deploy/deploy2googleplay.sh after-steps: - slack-notifier: url: $SLACK_URL_RELEASE channel: release username: wercker

Slide 94

Slide 94 text

Step.4 (1/1) • ετΞͷߋ৽Λ௨஌͠·͠ΐ͏ tonkotsuΛ࢖͍·͢ ઃఆํ๏͸ϦϙδτϦʹৄ͘͠ॻ͍ͯ͋Γ·͢ɻ > go run tonkotsu.go config.go -c config.toml • ͜ΕͰɺετΞ͕ߋ৽͞Εͨ࣌ʹSlackͷ௨஌ ΛૹΔ͜ͱ͕Ͱ͖ΔͷͰɺىಈ͚͓͚ͩͯ͠͹ ଞͷ࡞ۀʹूதͰ͖·͢

Slide 95

Slide 95 text

͜Ε͚ͩ४උ͓͚ͯ͠͹ޙ͸

Slide 96

Slide 96 text

(͍͍ͩͨ) git push origin master

Slide 97

Slide 97 text

ͰOKͰ͢

Slide 98

Slide 98 text

Agenda • ࣗಈԽͷงғؾ • ໨త΍ϞνϕʔγϣϯɺͰ͖Δ͜ͱɺϝϦοτͳͲ • ϦϦʔεࣗಈԽʹؔ࿈͢Δπʔϧͷ঺հ • AndroidΞϓϦͷϦϦʔεͷࣗಈԽʹ໾ʹཱͭπʔϧ܈Λ঺հ͠·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖ४උʣ • ͍͔ͭ͘ͷϓϩδΣΫτΛྫʹɺࣗಈԽͨ͠ϦϦʔεϑϩʔΛಋೖ͢Δ͜ͱΛߟ͑ͯ Έ·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖʣ • ࣮ࡍʹಋೖ͢Δࡍʹඞཁͳ࡞ۀΛνΣοΫ͍͖ͯ͠·͢ɻ • ࣦഊ͕ͪ͠ͳέʔεͱ஫ҙ఺ • ·ͱΊతͳ • ࣭ٙԠ౴

Slide 99

Slide 99 text

ࣦഊ͕ͪ͠ͳέʔεͱ஫ҙ఺

Slide 100

Slide 100 text

Case.1 ԿͰ΋͔ΜͰ΋ࣗಈԽ͠Α͏ͱ͢Δ

Slide 101

Slide 101 text

ԿͰ΋͔ΜͰ΋ࣗಈԽ͠Α͏ͱ͢Δ • લड़͠·͕ͨ͠ɺࣗಈԽͷ࡞ۀࣗମ͸໘౗Ͱ ৭ʑ΍Βͳ͖Ό͍͚ͳ͍Ͱ͢ɻ • ͳͷͰɺϦϦʔεαΠΫϧͷதͰϘτϧωοΫ ʹͳ͍ͬͯΔͱ͜Ζʹݶఆͯࣗ͠ಈԽΛద༻͢ Δ͜ͱͰޮՌ͕࠷େԽ͞Ε·͢ɻ

Slide 102

Slide 102 text

ͨͱ͑͹ • ϦϦʔε௨஌ͷTwitter΍ࣾ಺ͷ৘ใڞ༗πʔϧ ʹߋ৽಺༰Λ౤ߘ͠Α͏ʂ • ૉ੖Β͍͠ͱ͸ࢥ͍·͕͢ɺຊདྷ͸֤πʔ ϧʹ௚઀ॻ͍͍ͯ͘΄͏͕ॊೈੑ͕ߴ͍΋ ͷΛ͍͍ͪͪࣗಈԽ͢ΔͱΦϨΦϨߋ৽ख ॱ͕ൃੜ͠·͢ɻ • ա౓ͳࣗಈԽ͸ଐਓੑΛߴΊͯ͠·͏ͱࢥ ͍ͬͯ·͢ɻ

Slide 103

Slide 103 text

Case.2 ࣗ෼͕ϦϙδτϦΦʔφʔͰ͸ͳ͍

Slide 104

Slide 104 text

ࣗ෼͕ϦϙδτϦΦʔφʔͰ͸ͳ͍ • ࣗಈԽ͢Δʹ͋ͨͬͯ͸ηϯγςΟϒͳϑΝΠϧ ΍৘ใΛѻ͏͜ͱʹͳΓ·͢ɻ • ͦΜͳ࣌ʹɺͦͷਓʹ౎౓৘ใͷ֬ೝΛͯࣗ͠ಈ ԽϑϩʔΛ௥Ճ͍ͯ͘͠ͷ͸೉͍͠Ͱ͢ɻ • ͳΔ΂ࣗ͘ಈԽ͸ϦϙδτϦΦʔφʔʹ͍ۙঢ়ଶ Ͱ࣮ࢪ͢Δ͜ͱͰಋೖͷ͠΍͕͔͢͞ΘΓ·͢ɻ • ϨʔϧΛෑ͍ͯ͋͛Δͱޙଓͷ։ൃऀ͸ͦ͜ʹͷ ͔͍͖ͬͬͯ·͢ɻ

Slide 105

Slide 105 text

Agenda • ࣗಈԽͷงғؾ • ໨త΍ϞνϕʔγϣϯɺͰ͖Δ͜ͱɺϝϦοτͳͲ • ϦϦʔεࣗಈԽʹؔ࿈͢Δπʔϧͷ঺հ • AndroidΞϓϦͷϦϦʔεͷࣗಈԽʹ໾ʹཱͭπʔϧ܈Λ঺հ͠·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖ४උʣ • ͍͔ͭ͘ͷϓϩδΣΫτΛྫʹɺࣗಈԽͨ͠ϦϦʔεϑϩʔΛಋೖ͢Δ͜ͱΛߟ͑ͯ Έ·͢ɻ • Ͳ͏΍ͬͯ΍Δͷ͔ʁʢಋೖʣ • ࣮ࡍʹಋೖ͢Δࡍʹඞཁͳ࡞ۀΛνΣοΫ͍͖ͯ͠·͢ɻ • ࣦഊ͕ͪ͠ͳέʔεͱ஫ҙ఺ • ·ͱΊతͳ • ࣭ٙԠ౴

Slide 106

Slide 106 text

·ͱΊͯΈ·͢

Slide 107

Slide 107 text

·ͱΊ • ࣗಈԽ͸޻਺͕͔͔ΔͷͰɺಋೖ͢ΔݸॴΛܾఆ͠ ͔ͯΒ͚ͦͩ͜Λ΍Δ͜ͱɻ • ʮ͜͜·Ͱ͍Δ͔ͳ...ʁʯͬͯҰճͰ΋ࢥͬͨΒ ͦͷ෦෼ʹؔͯ͠͸΍Βͳ͍ɻ • ͦ΋ͦ΋ࣗಈԽͷඞཁͳ͍ϓϩδΣΫτ΋͋Δɻ • νʔϜͰ࿩͠߹ͬͯΈΔͱྑ͍͔΋͠Εͳ͍ɻ • ࣗಈԽ͢ΔͱϝϦοτ͸͋ΔɻͳͷͰɺੵۃతʹݕ ౼͍ͯͬͯ͠΄͍͠ʂ

Slide 108

Slide 108 text

Ҏ্Ͱ͢ʂ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ