iOSDC 2018 9/1 16:20〜 Track C の発表資料です。
ಈ࡞֬ೝͷͨΊͷࣾΞϓϦ৴αʔϏεΛ৽ͨʹ࡞ͬͨ2018/09/01iOSDC Japan 2018 Track Cໜ࿊ ஐେ @slightair1
View Slide
ࣗݾհ• ໜ࿊ ஐେ / @slightair• ΫοΫύουגࣜձࣾ ٕज़෦ ϞόΠϧج൫άϧʔϓॴଐ• ࣾͷ։ൃڥඋɺαʔϏε։ൃ෦ॺͷٕज़తࢧԉ͕ۀ2
ࠓͷ͓• ͨͪͷࣾΞϓϦ৴ͷ͍ํ• ࠓ·Ͱར༻͖ͯͨ͠ΞϓϦ৴αʔϏε• ৽͘͠࡞ͬͨΞϓϦ৴αʔϏεͷհ• վળ͞ΕͨɾؾΛ͚ͭͨ• ΞϓϦ৴ʹؔ͢Δͷհ3
։ൃ͍ͯ͠ΔΞϓϦɺ͍࣮ͭػʹ͍Εͯ৮Δʁ• ࢼ͠ʹ࡞ͬͯΈͨػೳΛ։ൃؔऀΈΜͳͰ৮ΔͨΊ• मਖ਼ͷPRΛग़ͨ͠ͱ͖• Ճɾमਖ਼ͨ͠ػೳͷಈ࡞֬ೝ• ૢ࡞ײͷ֬ೝ• ϦϦʔεલͷಈ࡞֬ೝ4
ৗੜ׆ͷதͰͷ͍৺Λࢼ͍ͨ͠• ࣮ࡍʹΞϓϦ͕ΘΕΔͰ͋Ζ͏λΠϛϯάͰΞϓϦΛࢼ͍ͨ͠• ྉཧ͠ͳ͕Β• ҠಈதͳͲɺྉཧͷ͜ͱΛߟ͑ͦ͏ͳλΠϛϯά• ৽ΞϓϦɾ৽ػೳͳΒͳ͓͞ΒɺΘΕΔఆͷγʔϯͰ• ࣾһͷࢲͷεϚʔτϑΥϯʹ։ൃ൛ͷΞϓϦΛೖΕͯࢼͤΔΑ͏ʹ͍ͯ͠Δ5
DeployGate Enterprise• ͱҧ͍৴αʔϏεࣗମͷϝϯς͕ෆཁͳͷ͏Ε͍͠• Enterprise൛Ͱ৫ͷϝϯόʔɾάϧʔϓཧ͕Ͱ͖Δ• ར༻ऀͷୀ৬࣌ͳͲΛߟ͑ΔͱඞਢɺͰཧେม…• άϧʔϓཧ͠Β͕͘ΜͬͯͬͯΈ͚ͨͲɺͨͪͷ͍ํͩͱࡉ͔͍άϧʔϓ͚ඞཁͳ͔ͬͨ6
TestFlight• ങऩલେม͓ੈʹͳ͍ͬͯͨ• Apple ެࣜͷΈ• ࣾ৴Ͱ Internal Tester ͕༻్ͱ͍͚ۙΕͲ• ࢲͰ͍ͬͯΔ AppleID ΛձࣾͷνʔϜʹొͨ͘͠ͳ͍• ٯʹձࣾͰऔͬͨ AppleID Λࢲͷ iPhone ʹೖΕͯ͏͔ͱ͍͏ͱɺͦ͏ͳΒͳ͍1• ͙͢ʹෆ࠾༻ʹͳͬͨ1 Android/PlayStoreͷํΞΧϯτपΓͷ༥௨͕ޮ͖ͦ͏ͩͬͨɻAlphaϦϦʔεͷػೳར༻Ͱ͖ͦ͏ɻ7
͍͍ͨਓ͕ٸʹ૿ݮ͢Δͱ͖େม• ʮ։ൃ͖ͯͨ͠ΞϓϦ͕େମͰ͖ͨͷͰࣾςετ൛৴։࢝ͨ͠ΑʂΈΜͳͬͯʂʯʢࣾϒϩάʣ• → ৴αʔϏεͷΞΧϯτՃґཔ͕େྔൃੜ• ͦΜͳʹۭ͖͕ͳ͍ͧɺϝϯόʔཧ͠ͳ͖Ό…• ͠Β͘͢Δͱར༻ࣗମ͕མͪண͍ͪΌ͏• ར༻සతʹશࣾһʹΞΧϯτల։͢Δͷݫ͍͠8
ಉ͡ΞϓϦͰෳͷઃఆͰผΞϓϦͱͯ͠৴͢Δ• ΞϓϦʹΑͬͯ৭ʑͳ৴ઃఆ͕͋Δ• BETA: ࠷৽ͷmasterϒϥϯνͷ༰Λ৴͢Δ• TEST: ϦϦʔεલͷಈ࡞֬ೝࢼ࡞ஈ֊ͷػೳΛՃ͠ػೳͷݕূ͢Δ• PR: PR୯ҐͰमਖ਼ɾػೳՃͷಈ࡞֬ೝΛߦ͏• ಉ͡ΞϓϦҰՕॴ·ͱΊ͓͖͍ͯͨ• ଓઌ2ͷมߋΞϓϦͷσόοάπʔϧͰมߋͰ͖ΔΑ͏ʹ͍ͯ͠Δ2 produc)onɺstagingɺ֤։ൃऀͷ։ൃڥͳͲ9
Β͕ཉ͍݅͠ɺղܾ͍ͨ͠• ৴αʔϏεͷҡ࣋ɾཧෛ୲ΛՄೳͳݶΓ͍͑ͨ• ΞΧϯτཧΛ͕ΜΓͨ͘ͳ͍• ࣾͷਓؒͳΒ͑Δ͘Β͍ͷ੍ݶͰेͦ͏ɺάϧʔϓͳͲࡉ͔͍ઃఆ·Ͱඞཁͳ͔ͬͨ• ֤ࣗͷՈͳͲɺࣾ֎ͰΠϯετʔϧͰ͖ΔΑ͏ʹ͍ͨ͠• ଞͷࣾπʔϧͷΞΧϯτɾΞΫηεݖݶཧͱ·ͱ·ͬͯΔͱ͏Ε͍͠• ଟͷΞϓϦɺͦΕΒʹෳͷ৴ઃఆ͕͖͋ͬͯΕ͍ʹ·ͱΊ͍ͨ10
haneda• iOS/Android ͚ͷͷࣾΞϓϦ৴αʔϏε• ΞϓϦҰཡϖʔδͱΞϓϦৄࡉϖʔδ͕͋Δ͘Β͍ͷγϯϓϧͳ༰• ઃఆόϦΤʔγϣϯΛkindͱݺͼɺΞϓϦ୯ҐͰ·ͱΊΔ• ࣾωοτϫʔΫ ·ͨ G SuiteೝূΛ௨ͬͨͷΈΞΫηε͕Մೳ11
12
haneda ͷߏ• AWS S3ʹϏϧυͨ͠όΠφϦͱϝλσʔλΛهड़ͨ͠JSONΛஔ͢Δ• CIͰϑΝΠϧੜͱΞοϓϩʔυΛߦ͏ͨΊͷfastlane ac4onΛ༻ҙͨ͠• WebΞϓϦ• S3ͷJSONΛݩʹHTMLΛϨϯμϦϯά͢Δ• iOSΞϓϦμϯϩʔυ༻ͷmanifestΛಈతੜ͢Δ• DB͍ͬͯͳ͍• ೝূʹࣾڞ௨ͷϦόʔεϓϩΩγΛར༻͢Δ33 groupad(ࣾϒϩάɾWiki)ͳͲͷࣾπʔϧͱڞ௨ͷΞΫηε੍ޚɻղઆهࣄ13
haneda ʹΑΓվળ͞Εͨ͜ͱ• G Suite ೝূʹͨ͠ͷͰೖࣾ࣌ʹࣾΞΧϯτ͕ൃߦ͞ΕΔͱಉ࣌ʹར༻Մೳʹͳͬͨ4• ଞͷࣾπʔϧ܈ͱಉ͡ΞΧϯτɾΞΫηεݖݶͰར༻Մೳʹɺࣾ֎Θ༷ͣʑͳॴͰશࣾһ͕ར༻Ͱ͖Δ• લड़ͷΑ͏ͳγϯϓϧͳߏͷͨΊ৴αʔϏεࣗମͷཧෛ୲ͦ͜·Ͱ্͕ΒͣʹࡁΜͩ4 DeployGate ͕ G Suite ࿈ܞʹରԠͨ͠ࡍʹܧଓར༻ݕ౼͕ͨ͠ɺҰ෦ػೳ͕Βͣݟૹͬͨ14
in-house fastlane ϓϥάΠϯ• in-house fastlane ϓϥάΠϯ5Λ࡞Γࣾ৴Λ৽نΞϓϦ։ൃʹಋೖ͍͢͠ڥʹͨ͠• haneda ͷ S3 όέοτ໊ͳͲͷઃఆϓϥάΠϯʹؚΊɺ࠷ݶͷઃఆ͚ͩͰΞοϓϩʔυͰ͖ΔΑ͏ʹ• Beta ͳͲͷΑ͘͏όοδΛ͚ͭͨΓɺάϨΠεέʔϧʹ͢ΔͳͲΞΠίϯΛՃ͢Δ ac5on ଐ͢Δ5 ࣾ Gem Server Ͱཧɺfastlane ʹ֎෦ Gem Server ͔ΒϓϥάΠϯΛಋೖͰ͖ΔΈΛՃͨ͠15
ϓϥάΠϯͷΞΫγϣϯ܈• upload_mobile_app_to_s3 / haneda• pre5y_badge• save_adhoc_archive• Cer;ficates / Profiles• generate_provisioning_profile• generate_apns_cer;ficate• GitHub API wrappers• create_issue• add_labels• add_comment• has_label16
fastlane match ʹΑΔূ໌ॻɾ伴ཧ• ূ໌ॻɺൿີ伴ɺProvisioning Profile ͳͲΛ҉߸Խͯ͠ϦϙδτϦͰཧ͍ͯ͠Δ6• ΞϓϦͷɾkind ͕૿͑ͯҰݩཧͰ͖Δ• EnterpriseProgramͷݖݶ͕ڧ͍ূ໌ॻͳͲΛΈͩΓʹ։ൃऀʹͨ͘͠ͳ͍ɺCIϚγϯͷΈΞΫηεͰ͖ΕΑ͍• CIϚγϯ͕ෳ͋ͬͯΠϯετʔϧͷख͕ؒ૿͑ͳ͍6 iOSΞϓϦͷαϒϛοτࣗಈԽͱূ໌ॻཧͷޮԽ - ΫοΫύου։ൃऀϒϩά17
ΞϓϦ৴ͷͨΊͷ lane ఆٛྫlane :build_and_upload_to_haneda doapp_identifier = base_app_identifier + '-beta'match(app_identifier: app_identifier,type: "enterprise",git_branch: "enterprise",readonly: true)pretty_badge(kind: 'beta', grayscale: false)gym(...)haneda(app_id: base_app_identifier,app_name: 'Overcookpad',kind_id: 'beta')end18
ಛఆͷϥϕϧ͕͍ͭͨPRͷΈ৴ॲཧΛߦ͏lane :pull_request do |params|pr_number = params[:pr]&.to_iUI.user_error!('Pull request number required') unless pr_number# (Ϣχοτςετ/֤छੳͳͲ...)next unless has_label(id: pr_number, label: 'InHouseBuild')build_and_upload_to_s3(staging: true, build_kind: :pr)build_url = Actions.lane_context[SharedValues::UPLOADED_MOBILE_APP_BUILD_URL]add_comment(id: pr_number, body: "Build uploaded to #{build_url}")end19
·ͱΊ• ࣾͷΞϓϦ৴ͷ͍ํʹ߹Θͤͯɺͷ৴αʔϏε haneda Λ࡞ͬͨ• Ͱ͖ΔݶΓγϯϓϧͳߏͰߏங͠ɺͰ͋ͬͯཧෛ୲͕૿͑ͳ͍Α͏ʹͨ͠• ଞͷࣾWebπʔϧͱͷ͍উखͱͦΖ͑Δ͜ͱ͕Ͱ͖ɺΞΧϯτཧͷղܾͨ͠• ΞϓϦ։ൃϓϩδΣΫτ͕૿͑ͯ͘Δͳ͔ɺ৴αʔϏεΛ͘͢ಋೖ͢ΔͨΊͷΈ߹ΘͤͯͦΖ͑Δ͜ͱ͕Ͱ͖ͨ20