アプリ開発の効率化は、よいアプリを作るためには必要不可欠なものです。スマートフォンアプリ開発全盛の今日、世界には自動化をサポートする数多くのサービスが存在します。このセッションでは、アプリ品質を高めるための開発の効率化における考え方と、明日からできる改善についてお話しします。
このスライドは、2015/06/23に「ニフティクラウドmobile backend アプリ開発セミナー」にて発表しました。 http://ncmb.connpass.com/event/16024/
ΑΓΑ͍ΞϓϦΛ࡞ΔͨΊͷ ։ൃޮԽͷ͢͢ΊYuki Fujisaki Co-founder & CEODeployGate Inc.
View Slide
@tnj / Yuki FujisakiDeployGate Inc. Founder & CEO
גϛΫγΟೖࣾˣNJYJϞόΠϧˣͨΜΆΆάϧʔϓˣ"OESPJEެࣜΫϥΠΞϯτ։ൃΛޮԽʂ
2010 = Android 2.2mixiॳΫϥΠΞϯτΞϓϦ
։ൃऀೲظ× 1
/(^o^)\ ナンテコッタイ
Ͱ
ʮ͍͍ΞϓϦʯΛ࡞Γ͍ͨ★ ★ ★ ★ ★
1ඵແବʹͤͣʹΞϓϦΛ࡞Δ࣌ؒͱ͍͍ͯͨ͠
͜͏͍͏ͷਏ͍ʮ৽͍͠όʔδϣϯͰ͖ͨΑʯ ʮ͋ɺ͜ͷʹΠϯετʔϧͯ͠ʂʯճෆ۩߹ى͖͔ͨΒ͓࣋ͪ͠·ͨ͠ʔ ˠϩάͷճऩճطʹվमࡁΈͷෆ۩߹Λใࠂ͞ΕΔ ˠώΞϦϯάʴΞοϓσʔτճʮͳΜ͔ڧ੍ऴྃͨ͠ʂʯใࠂରԠ ճࢼͯ͠Β͏ਓΛ୳ͯ͠࿈Ε͖ͯͯɺ Πϯετʔϧ͓ͯ͢͠͠ΔճͦΕͧΕͷίϛϡχέʔγϣϯͪ࣌ؒɺεΠονϯάίετʙճhttp://alpha.mixi.co.jp/entry/2013/11649/
ࠓͷ͍͍ΞϓϦΛ࡞ΔͨΊͷࣗಈԽʹ͍ͭͯ%FQMPZ(BUF ͋ΔΑ
͍͍ΞϓϦΛ࡞ΔͨΊͷࣗಈԽʹ͍ͭͯ• ԿނࣗಈԽ͢Δͷ͔• ࣮ફͯ͠ΈΑ͏• ಘΒΕΔͷ• Ұาઌ
ͳͥɺࣗಈԽ͢Δͷ͔ʁ
• ։ൃ࡞ۀ͕ޮԽͯ͠ΞϓϦ։ൃ͕͘ͳΔ• ແବ͕ͳ͘ͳָ͕ͬͯͰ͖Δ• ۀ͕ݮΒͤΔ͔͠Εͳ͍ʂʂʂ
“͍͍ΞϓϦΛ࡞Δ͜ͱʹूத͢ΔͨΊ”
ʻલఏʼ
ਓؒͷҙࢤऑ͍
• ࠓͦ͜ςετυϦϒϯͳ։ൃ͢Δͧʂʂʂ• ࣄނΛͳͨ͘͢Ίʹखॱॻ͔ͬ͠Γ࡞Δͧʂ• υΩϡϝϯτ͔ͬ͠Γॻͧ͘ʂʂʂ
ਓؒɺർΕͨΒ৸Δ͠ɺզຫऑ͘ͳΔ͠ɺ͙͢ఘΊΔͷɻ
໌ͷேૣى͖ͯ͠ϥϯχϯά͢Δͧʂʂʂ͍͍ͩͨೋ৸
ؾ߹͍ͱࠜੑʹཔΒͳ͍ΈͰղܾ
ඞͣى͖ΕΔΈΛ࡞Δhttps://twitter.com/kairoshi/status/522546865510707200
ڥࣗવͱਓΛಈ͔͢Կͳ͍ˠཱͭ Πε͕͋Δˠ࠲Γ͍ͨhttp://pictogram-free.com/highresolution/l_001.pnghttp://www.monotaro.com/p/4050/3854/
ਓΛม͑Α͏ͱ͍͔ͯ͠͠͠͠ڥ͕มΘΕਓͷߦಈมΘΔ
ʻʗલఏʼ
ͳͥɺࣗಈԽ͢Δͷ͔ʁจԽΛΔ
• ίʔυΛίϛοτͨ͠ΒࣗಈͰςετ͞ΕΔ• ςετ͕௨Βͳ͍ͱϦϦʔεͰ͖ͳ͍• ͪΌΜͱಈ࡞֬ೝ͠ͱ͜͏ɺςετ͠Α͏ࣄނ͕ݮΔɺ࣭͕ҡ࣋Ͱ͖Δ
“Jenkinsͷ࠷େͷಋೖޮՌ ʮνʔϜͷϝϯόͷҙࣝมԽʯ”https://speakerdeck.com/uasano/jenkinsgatimunimotarasitekuretakoto
ͳͥɺࣗಈԽ͢Δͷ͔ʁ҉Λ͙
ϦϦʔεͷલʹ͜ͷઃఆϑΝΠϧΛฤू͢ΔͷΛΕͣʹʂ͋ͱରԠ͢Δͬͪ͜ͷαʔόͷઃఆมߋ͢Δ͜ͱɻͦͷ্Ͱ͜ͷεΫϦϓτΛ౿Έαʔόͷ্Ͱ࣮ߦ͙ͯ̍̌͠Β͍ͭʜΈΜͳେ͖ൿͷλϨઈରΕΔ
Կ͔ͱϦεΫ͕ߴ·Δ• ཧ͍ͯ͠Δਓ͕ډͳ͘ͳΔͱࢭ·Δ• ৽͍͠ਓ͕ೖͬͯ͘Δͷ͕͘͠ͳΔ• Ͱ͖Δਓ͕ݶΒΕΔͷͰ͕ͪ࣌ؒ૿͑Δ
҉͕ͳ͘ͳΓ ϦεΫ͕ݮͬͯεέʔϧ͢Δ͕ͯ͢ هड़͞Ε͍ͯΔ ࠶ݱՄೳλεΫ͕ Ұਓʹूத͠ͳ͍εέʔϧ͢Δಈ࡞͕ ه͞ΕΔ͍͢͠
ͳͥɺࣗಈԽ͢Δͷ͔ʁؾܰʹࢼͤΔΑ͏ʹ͢Δ
ίʔυΛॻ͍ͯίϛοτ͢Δ͚ͩͰมߋΛ୭ͰݟΕΔ
͘͢͝େࣄ
99%ਓ͕࡞ͬͯ ਓ͕͏
ҰൃͰͰ͖ͨΓ͠ͳ͍࠷ߴͷ ΞϓϦ༷ॻ.xlsx
Ұ൪ḿΔ࡞Δਓ ͏ਓ࡞ͬͨͦͷͰݟͤͯҙݟΒͬͯ͢
ݐઃతͳ ϑΟʔυόοΫ Ϟνϕʔγϣϯͨ·ʹυϠͬͨΓ͍ͨ͠=
Web։ൃ͕ͨΒͨ͠ Πϊϕʔγϣϯ։ൃ ࡞ΔϢʔβʔ ݟΔϩάˍ ϑΟʔυόοΫσϓϩΠ࠷$USM4ͰճΔ
ͰΞϓϦ։ൃͩͱ։ൃ ࡞ΔϏϧυˍ ΞʔΧΠϒͲ͔͜ʹஔ͘ PSϝʔϧૹ৴࣮ػʹೖΕΔ͓ख͍ΠϯετʔϧϢʔβʔ ݟΔϩάˍ ϑΟʔυόοΫϩάཉ͍͠ आΓΔϩά͏ ྲྀΕͯΔ
ແཧήʔ
࡞ͬͯΈͨʂೖΕͯʂɾɾɾ
ਓϝʔϧૹͬͯΠϯετʔϧਓ
8FCΈ͍ͨʹ͍ͨ͠ʜ
Ξοϓϩʔυͯ͠
https://dply.me/e18bnzURLΛڭ͑Δ͚ͩ
ී௨ͷਓͰ͑ΔΠϯετʔϧΨΠυΞοϓσʔτϓογϡSDKೖΕΕϩάૹΕΔ
ΞϓϦ։ൃͰ։ൃ ࡞ΔϢʔβʔ ݟΔϩάˍ ϑΟʔυόοΫσϓϩΠEHBUFQVTI"QQBQL
DEMO
ࣗಈԽͷతؾ߹ͱࠜੑʹཔΒͣ։ൃʹूதͯ͠Δ͚ͩͰ͍͍ΞϓϦ͕࡞ΕΔจԽΛΔ
࣮ફͯ͠ΈΑ͏
1. શମͷݟ͑ΔԽ2. ϏϧυࣗಈԽ3. ςετࣗಈԽ4. σϓϩΠࣗಈԽ։ൃ ࡞ΔϢʔβʔ ݟΔϩάˍ ϑΟʔυόοΫউखʹճΔ Α͏ʹ͢Δ
1. શମͷݟ͑ΔԽ
Կ͕ى͖͍ͯΔͷ͔ݟ͑ͳ͍ˣෆ҆
ͯ͢ͷใΛ ྲྀ͢ॴΛ࡞ΔIRCԿ͕ى͖͍ͯΔ͔ ΈΜͳ͕ݟ͑Δ
ݟ͑ΔͷͰ• ։ൃऀͰͳ͍ϝϯόʔ͋ͬɾɾɾ ͠ঢ়گ͕ۭؾͰཧղͰ͖ΔΑ͏ʹͳΔ
ݟ͑ΔͷͰ• ͙͢ؾ͕͍ͭͯରԠͰ͖Δ• ίʔυϨϏϡʔґཔ্͕͕͖ͬͯͨ• ৽͍͠όʔδϣϯ͕Ͱ͖ͨ• ΞϓϦ͕Ϋϥογϡͨ͠• ͦͷͰΓͱΓ͕ਐΉ
ݟ͑ΔͷͰ• ςετ͕స͚ͨΒ͙͢͢ؾʹࡽ͞ΕͯΔײ͡
ͳΜͰͭͳ͕ΔSlack͓͢͢Ί
2. Ϗϧυ
CI for iOS & Androidଞྗ ࣗྗ
ͬͯΔͳΒଞྗʹཔΖ͏
circle.yml ͪΐͬͱॻ͚ͩ͘test:override:- ./gradlew assembleDebug- cp -r project-name/build/outputs $CIRCLE_ARTIFACTSAndroidͷ߹
PR/ίϛοτ͝ͱʹࣗಈϏϧυ$ git push origin branchϏϧυ͕௨͍ͬͯΔ͜ͱ͕֬ೝͰ͖Δ Ϗϧυ͞ΕͨΞϓϦՌͱͯ͠Δ
ࣗಈϏϧυڥ 20Ͱ
Ϗϧυαʔό༻ҙҡ࣋ཧɺϝϯςφϯε৽OS/࿈ܞαʔϏεରԠػೳ֦ுແྉʙ༗ྉͰεέʔϧ ߴԽʂ
No GitHub,No Circle CI,No Developer Life
• αʔόϚγϯͷ༻ҙඞཁ• ̍ճ͙Βֻ͍͚ͯ ηοτΞοϓ͑͢͞Ε ׂͱಈ͘• ϓϥάΠϯॆ࣮ɺ ߴੑೳCron• ෳʹεέʔϧ
3. ςετ
2ςετॻ͍ͯΔʁ
·ͣࣗಈςετڥΛ࡞Ζ͏
·ͣதۭͰ͍͍ͷͰɺςετ͕ࣦഊͨ͠Β Ϗϧυ͕స͚ΔΑ͏ʹ͢Δస͚ͨΒϚʔδ͠ͳ͍Λϧʔϧʹ͢Δ
Կ͔͕ى͖ͨʂࣄނͬͨʂͱ͍͏ͱ͜Ζ͔Βɺ ෆ۩߹Λ࠶ݱ͢ΔςετΛॻ͘ͱಉ͡ೋͱى͖ͳ͍
͜Ε circle.yml ͪΐͬͱॻ͘test:pre:- emulator -avd circleci-android22 -no-audio -no-window:background: trueparallel: true- circle-android wait-for-bootoverride:- ./gradlew connectedAndroidTest- cp -r my-project/build/outputs/androidTest-results/* $CIRCLE_TEST_REPORTS- cp -r project-name/build/outputs $CIRCLE_ARTIFACTSAndroidͷ߹
ةݥɺࠓ͙͢͞ͳ͍ͱେৎʂͱ͍͏ΈͱจԽΛ࡞ͬͯ͠·͑ɺ
GitHub ্Ͱ҆શͳ͜ͱ͕ҰྎવखݩͰ࣮ߦΛΕͯ͠·ͬͨΓɺؾ͔ͮͣʹϚʔδͯ͠͠·͏͜ͱͳ͍
ڥࣗવͱਓΛಈ͔͢ʹͳʹ͔·͍ͣ ʹେৎ
4. σϓϩΠ
Android iOS
ϏϧυεΫϦϓτʹbuildscript {dependencies {classpath 'com.deploygate:gradle:0.6.2'}}apply plugin: 'deploygate'circle.ymlʹdeployment:deploygate:branch: /.+/commands:- ./gradlew uploadDeployGate
circle.ymlʹdependencies:pre:- gem install shenzhendeployment:deploygate:branch: /.+/commands:- ./ipa distribute:deploygate -a … -u …
ίϛοτ͢Δ͚ͩͰखݩʹ$ git push origin branchԿ͠ͳͯ͘ɺ୭Ͱߋ৽͕֬ೝͰ͖Δ
10ͰηοτΞοϓྃ
ಘΒΕΔͷ
λΠϜϥΠϯͷҰຊԽ• ୭͕Կ͍ͯ͠Δ͔͔Δ• ʹ͙͢ؾ͚ͮΔɺ ͦͷͰղܾͰ͖Δ• ։ൃऀҎ֎ͷਓ ίϛϡχέʔγϣϯ औΓ͘͢ͳΔ
$ git push origin branchςετͱ σϓϩΠࣗಈԽ• ίʔυॻ͍ͯ ίϛοτ͢Δ͚ͩ ຊ࣭ͷ։ൃʹूத• ҙࣝͤͣͱ࣭Λ ҡ࣋Ͱ͖Δ• ͱʹ͔͘࡞ͬͯɺ ݟͯɺ͕͢ؾܰʹ
Webͱಉ͡αΠΫϧͰ։ൃ։ൃ ࡞ΔϢʔβʔ ݟΔϩάˍ ϑΟʔυόοΫσϓϩΠHJUQVTI
͍͍ΞϓϦ͔͠࡞Εͳ͍
Ұาઌ
ࣗಈԽ͢Δ্Ͱͷߟ͑ํ
ਓͷίετߴ͍ ਓͷ࣌ؒΛकΖ͏
3ճ܁Γฦͨ͜͠ͱࣗಈԽ͢Δ
1ਓͳΒঘߋ͜Μͳ͜ͱ࣌ؒͬͯΒΕͳ͍ʮ৽͍͠όʔδϣϯͰ͖ͨΑʯ ʮ͋ɺ͜ͷʹΠϯετʔϧͯ͠ʂʯճෆ۩߹ى͖͔ͨΒ͓࣋ͪ͠·ͨ͠ʔ ˠϩάͷճऩճطʹվमࡁΈͷෆ۩߹Λใࠂ͞ΕΔ ˠώΞϦϯάʴΞοϓσʔτճʮͳΜ͔ڧ੍ऴྃͨ͠ʂʯใࠂରԠ ճࢼͯ͠Β͏ਓΛ୳ͯ͠࿈Ε͖ͯͯɺ Πϯετʔϧ͓ͯ͢͠͠ΔճͦΕͧΕͷίϛϡχέʔγϣϯͪ࣌ؒɺεΠονϯάίετʙճhttp://alpha.mixi.co.jp/entry/2013/11649/
Α͋͘Δٞ
ࣗࣾͰด͡Δvs֎෦αʔϏεΛ׆༻
ͪΖΜέʔεʹΑΔ͕֎෦αʔϏεΛΘͳ͍͜ͱʹΑΔϦεΫ ΛΕͣʹ
ྫ: ࣗಈϏϧυڥͷߏங(JU)VCΛར༻͍ͯ͠ΕͰηοτΞοϓɺແྉ ϊϋ͕ੈքͰੵ ࣗಈతʹ࠷৽ڥࣗࣾͰ࣋ͱ͏ͱ͢Δ߹Ϗϧυαʔόͷඅ༻ ઐͷ୲ऀͷ࠾༻ ߏஙͰ͖Δ·Ͱͷඇޮͳ࣌ؒ
ੲେاۀͰͳ͍ͱ࣋ͯͳ͔ͬͨΈΛΘ໊͔ͣͷελʔτΞοϓ͕׆༻ͯ͠େاۀͱಉ༷ੈքʹαʔϏεΛల։͍ͯ͠Δ
֎෦αʔϏεΛࠓ͔Β׆༻͢Δ͔ࣗࣾͰ։ൃอकӡ༻͢Δ͔ඇޮͳঢ়گΛଓ͚Δͱ͍͏બͰ ͜ͷઌੜ͖ͷ͜Εͳ͍
ࣗͨͪͷ։ൃͷຊ࣭ʹूத͠Α͏खݩʹ͋ΔϦιʔεͰΞτϓοτΛ࠷େԽ͢ΔͨΊʹ׆༻Ͱ͖ΔͷͲΜͲΜ׆༻͢Δ֎෦αʔϏεͷ׆༻30*ͷඇৗʹߴ͍ࢿ
• ৽͍ٕ͠ज़Λੵۃ׆༻ɺ ͱ͍͏ϒϥϯσΟϯά• ৽͍͠ਓ͕νʔϜʹೖͬͯ ͙͢ࣄͰ͖Δ• ੈքͷ։ൃऀͱͷ ڞ௨ݴޠ - Pull Reqͱ͔• ͬͱศརʹ͍ͨ͠ɺ վળ͠Α͏ͱ͍͏ϚΠϯυ͓·͚ʹ ͍ͭͯ͘Δͷ
·ͱΊ
͍͍ΞϓϦΛ࡞ΔͨΊͷࣗಈԽʹ͍ͭͯ• ԿނࣗಈԽ͢Δͷ͔• ؾ߹ͱࠜੑʹཔΒͣʹ։ൃʹूத͍ͯ͠Δ͚ͩͰ ͍͍ΞϓϦ͕ΕΔจԽΛΔ• ࣮ફͯ͠ΈΑ͏• ͯ͢Λ̍ΧॴͷλΠϜϥΠϯͰݟ͑ΔΑ͏ʹ͠Α͏• GitHubͬͯΔͳΒ1࣌ؒͰϏϧυ/ςετ/σϓϩΠΛࣗಈԽ• ಘΒΕΔͷ• ແବͳ͘ɺWeb։ൃͷΑ͏ͳ͞Ͱɺ͍͍ΞϓϦ͔͠࡞Εͳ͍ڥ• Ұาઌ• ਓͷίετߴ͍ɺ܁Γฦ͠Λͳͦ͘͏ɺ֎෦αʔϏεΛ׆༻͠Α͏
https://dply.me/start