継続的な開発スタイル「AbemaTVのiOSアプリを週一でリリースしている話」

2016ba6b977a2e6691811fa66d5f4336?s=47 CyberAgent
February 22, 2019

 継続的な開発スタイル「AbemaTVのiOSアプリを週一でリリースしている話」

サイバーエージェントの技術者(エンジニア・クリエイター)向けカンファレンス『CA BASE CAMP 2019』
継続的な開発スタイル「AbemaTVのiOSアプリを週一でリリースしている話」
波戸 勇二

2016ba6b977a2e6691811fa66d5f4336?s=128

CyberAgent

February 22, 2019
Tweet

Transcript

  1. ܧଓతͳ։ൃελΠϧ ʮAbemaTV iOSΞϓϦΛिҰͰ ϦϦʔε͍ͯ͠Δ࿩ʯ CA BASE CAMP2019 Yuji Hato

  2. ೾ށ ༐ೋ • Contributed services dekatotoro @dekatotoro yuji.hato

  3. 1. ։ൃମ੍ 2. ίʔυϕʔε 3. ։ൃϑϩʔ 4. ࠓޙͷऔΓ૊Έ 5. ·ͱΊ

  4. ։ൃମ੍

  5. ։ൃମ੍ ໿80ਓ Android iOS Web New Device Streaming Client Developer

    Infrastructure API Content Engineering Content Delivery Data Management SRE Direction Design QA Board CTO VPoE board / Tech Lead Tech Lead
  6. ։ൃମ੍ ໿80ਓ Android iOS Web New Device Streaming Client Developer

    Infrastructure API Content Engineering Content Delivery Data Management SRE Direction Design QA Board CTO VPoE board / Tech Lead Tech Lead
  7. ։ൃମ੍ • iPhone • iPad • Apple TV ͦͷଞ Google

    Cast ΍ AirPlay ࠶ੜ iOS Team ։ൃσόΠε
  8. ։ൃମ੍ iOSΤϯδχΞ 12~15໊ ಺ఆऀ Πϯλʔϯ

  9. ։ൃମ੍ iOS Teamͷਓ਺ 4 8 12 8 12 ݱࡏ ʜ

    աڈ ະདྷ
  10. ։ൃମ੍ ཧ૝ͷ։ൃεϐʔυͱ඼࣭ ਓ਺

  11. ։ൃମ੍ ݱ࣮ͷ։ൃεϐʔυͱ඼࣭ ਓ਺

  12. ։ൃମ੍ ։ൃεϐʔυͱ඼࣭ͷ௿Լ • Ϛωδϝϯτίετ૿ • ίϛϡχέʔγϣϯίετ૿ • ίϯϑϦΫτϦεΫ • ίʔυ඼࣭ͷ͹Β͖ͭ

  13. ։ൃମ੍ ։ൃεϐʔυͱ඼࣭ͷ௿Լ • Ϛωδϝϯτίετ૿ • ίϛϡχέʔγϣϯίετ૿ • ίϯϑϦΫτϦεΫ • ίʔυ඼࣭ͷ͹Β͖ͭ

    • ੹຿ͷूத΍૿Ճ • υΩϡϝϯτෆඋ / ଐਓԽ • औΓѻ͏ίʔυൣғͷ޿͞ • εΩϧ΍ܦݧʹґଘ ݪҼ
  14. ։ൃମ੍ Team͝ͱͷ։ൃ ਓ ਓ ਓ

  15. ։ൃମ੍ iOSΤϯδχΞ 12~15໊ Πϯλʔϯ ಺ఆऀόΠτ ࠶ܝ

  16. ޿ࠂ ࢹௌ඼࣭ ϚωλΠζ ւ֎ରԠ ։ൃମ੍ Team͝ͱͷ։ൃ ίΞ Apple TV

  17. ։ൃମ੍ Team͝ͱͷ։ൃ .JDSP5FBN • ੹຿ͷ෼ࢄ • Ϛωδϝϯτίετͷ࡟ݮ • ίϛϡχέʔγϣϯίετͷ࡟ݮ

  18. Micro Team

  19. ։ൃମ੍ OKRΛಋೖ͍ͯ͠·͢ ϚωλΠζ σόΠε֦େ ຊ࣭վળ ۀ຿վળ ϝλσʔλ etc

  20. ຊ࣭վળ ϚωλΠζ σόΠε֦େ ։ൃମ੍ Objectiveʹඥ͍ͮͨKey Result

  21. ίʔυϕʔε

  22. ίʔυϕʔε • ios ‥‥ iOSΞϓϦ • tvos ‥‥ tvOSΞϓϦ •

    api ‥‥ APIϞδϡʔϧ • protobuf-swift ‥‥ .protoΛ.swiftʹม׵ͨ͠΋ͷ • cmdshelf-ios ‥‥ scripts • etc ‥‥ mock, tool, sample Repositories
  23. ίʔυϕʔε • ios • tvos • api Repositories

  24. ίʔυϕʔε • ios • tvos • api Repositories

  25. ίʔυϕʔε iOS

  26. ίʔυϕʔε iOS • 10 ~ 13ਓͰ։ൃ 1ϲ݄Ͱ187ݸͷpull request͕Ϛʔδ͞Ε͍ͯͯɺ Ӧۀ೔Ͱฏۉ͢Δͱ1೔໿8~10ݸͷpull request͕

    Ϛʔδ͞Ε͍ͯΔ
  27. ίʔυϕʔε tvOS

  28. ίʔυϕʔε tvOS • 2~3ਓͰ։ൃ 1ϲ݄Ͱ60ݸͷpull request͕Ϛʔδ͞Ε͍ͯͯɺ Ӧۀ೔Ͱฏۉ͢Δͱ1೔໿3ݸͷpull request͕Ϛʔ δ͞Ε͍ͯΔ

  29. ίʔυϕʔε API

  30. ίʔυϕʔε API • iOS, tvOSڞ௨ 1ϲ݄Ͱ35ݸͷpull request͕Ϛʔδ͞Ε͍ͯͯɺ Ӧۀ೔Ͱฏۉ͢Δͱ1೔໿1~2ݸͷpull request͕ Ϛʔδ͞Ε͍ͯΔ

  31. ίʔυϕʔε Tests 2009 tests 3200 tests 3526 tests 2019/02 2018/10

    2017/10
  32. ίʔυϕʔε Tests • ۃྗςετΛॻ͘ํ਑ • Model૚΍ϩδοΫ͸ςετΛॻ͘ • UIͷςετ͸΄ͱΜͲॻ͍͍ͯͳ͍ σβΠϯ΍࢓༷͕සൟʹมΘΔݱঢ়ͩͱίετ͕େ͖͍ ͷͱɺViewͱModelΛ෼཭͢Δઃܭʹ͍ͯ͠ΔͨΊɺUI

    ͸ModelͷςετͱQAͰ୲อ
  33. ຖ೔େྔͷίʔυ͕มߋ͞Ε͍ͯΔ

  34. ։ൃϑϩʔ

  35. ։ൃϑϩʔ • 2िؒαΠΫϧͷsprint։ൃͱਃ੥ • ։ൃظؒ1िؒɺQAظؒ1िؒ چ։ൃϑϩʔ

  36. ։ൃϑϩʔ QA 1िؒ 1िؒ QA QA ਃ੥ ਃ੥ ਃ੥ ਃ੥

    QA ։ൃ ։ൃ ։ൃ چ։ൃϑϩʔ
  37. ։ൃϑϩʔ QA 1िؒ 1िؒ QA QA ਃ੥ ਃ੥ ਃ੥ ਃ੥

    QA ։ൃ ։ൃ ։ൃ چ։ൃϑϩʔ ௕͍։ൃ
  38. ։ൃϑϩʔ • ։ൃ༻ͷmasterϒϥϯνͱQA༻ͷqaϒϥϯνͰӡ༻ • ֤ࣗfeatureϒϥϯνΛmaster / qa͔Β੾ͬͯ࡞ۀ • qaϒϥϯνͰςετ͕׬ྃͨ͠ΒϦϦʔεͰ͖Δঢ়ଶ چ։ൃϑϩʔ

    branchઓུ
  39. ։ൃϑϩʔ چ։ൃϑϩʔ branchઓུ master qa feature ̎िؒਃ੥ ։ൃ1िؒ QA1िؒ ϦϦʔεςετ

  40. ։ൃϑϩʔ چ։ൃϑϩʔ branchઓུ master qa feature ̎िؒਃ੥ ։ൃ1िؒ QA1िؒ ϦϦʔεςετ

    ɹ2"ظؒதʹ࣍ͷ։ൃΛ΍͍ͬͯ Δϝϯόʔ΋΋ͪΖΜ͍·͢
  41. ։ൃϑϩʔ • ֤TeamͷऔΓవΊͷௐ੔ίετ • ϦϦʔεϚωʔδϟʔͷෛ୲͕େ͖͍ • 1ͭͷTeamͷ஗ԆͰϦϦʔε͕ԆͼΔ • Teamؒͷ༏ઌ౓ʹࠨӈ͞ΕϦϦʔε͕ԆͼΔ •

    2िؒʹ1ճͷϦϦʔεͩͱվળͷ଎౓͕ग़ͳ͍ چ։ൃϑϩʔ ՝୊
  42. ։ൃϑϩʔ چ։ൃϑϩʔ ՝୊ ւ֎ରԠ ϚωλΠζ ίΞ ༧ఆͷਃ੥೔ ࣮ࡍͷਃ੥೔ ࣮૷ /

    QA ࣮૷ / QA ࣮૷ / QA मਖ਼ / QA ϦϦʔε
  43. ։ൃϑϩʔ • 1िؒαΠΫϧͷ։ൃͱਃ੥ • ։ൃͱQAͷظؒ͸෼͚ͳ͍ ৽։ൃϑϩʔ

  44. ։ൃϑϩʔ 1िؒ 1िؒ ਃ੥ ਃ੥ ਃ੥ ਃ੥ QA ։ൃ ਃ੥

    ਃ੥ ਃ੥ ৽։ൃϑϩʔ
  45. ։ൃϑϩʔ • ֤ࣗfeatureϒϥϯνΛmaster͔Β੾ͬͯ࡞ۀ • featureϒϥϯνͰQAޙʹmasterʹmerge • master͸ϦϦʔεςετΛ͢Ε͹ɺ͍ͭϦϦʔεͯ͠΋ྑ͍ঢ়ଶ ৽։ൃϑϩʔ branchઓུ

  46. ։ൃϑϩʔ ৽։ൃϑϩʔ branchઓུ master feature 1िؒਃ੥ ։ൃ no QA ։ൃ

    QA ϦϦʔεςετ
  47. ։ൃϑϩʔ ৽։ൃϑϩʔ branchઓུ master feature 1िؒਃ੥ ։ൃ no QA ։ൃ

    QA ϦϦʔεςετ 2"͕ෆཁͳ΋ͷ Ϟσϧ૚΍ϩδοΫͷΈͷมߋͰςετͰ୲อͰ͖ ͍ͯΔ 2"͕ඞཁͳ΋ͷ 6*69෦෼ ୺຤04όϦΤʔγϣϯςετ͕ඞཁ
  48. ։ൃϑϩʔ ৽։ൃϑϩʔ branchઓུ master feature 1िؒਃ੥ ։ൃ no QA ։ൃ

    QA ։ൃ with Feature Flag ඇಉظQA ϦϦʔεςετ Feature Flag ON
  49. ։ൃϑϩʔ ৽։ൃϑϩʔ branchઓུ master feature 1िؒਃ੥ ։ൃ no QA ։ൃ

    QA ։ൃ with Feature Flag ඇಉظQA ϦϦʔεςετ Feature Flag ON 'FBUVSF'MBHΛ࢖ͬͨ։ൃ͸ɺখ͍͞୯Ґ ͰίʔυϨϏϡʔͯ͠NBTUFSʹNFSHF͢Δ ͳͲɺॊೈͳ։ൃͱεϜʔζͳNBTUFSϒϥ ϯνͷਐߦ͕๬ΊΔΑ͏ʹͳΔ
  50. ։ൃϑϩʔ • ֤TeamͷऔΓవΊͷௐ੔ίετ͕ݮͬͨ • ϦϦʔεϚωʔδϟʔͷෛ୲͕ݮͬͨ • Teamؒͷґଘ͕ݮͬͨ • νέοτ༏ઌ౓ͷ൑அ͕దਖ਼ʹͳͬͨ •

    ϦʔυλΠϜͷ࡟ݮ ৽։ൃϑϩʔ ৼΓฦΓ
  51. ։ൃϑϩʔ • ݄༵೔ ϦϦʔεɺTestFlightਃ੥ • Ր༵೔ • ਫ༵೔ masterϒϥϯνΛϏϧυɺ࣍ճ෼PJܭըmtg •

    ໦༵೔ ϦϦʔεςετɺ࣍ճ෼શମܭըmtg • ༵ۚ೔ ਃ੥ ৽։ൃϑϩʔ εέδϡʔϧ
  52. ։ൃϑϩʔ ৽։ൃϑϩʔ εέδϡʔϧ ݄ 19࣌ ਃ੥ Ր ਫ ໦ ۚ

    19࣌ TestFlightਃ੥ 19࣌ masterϏϧυ TestFlight഑৴ ϦϦʔεςετ QA ։ൃ ϦϦʔε
  53. ։ൃϑϩʔ ৽։ൃϑϩʔ εέδϡʔϧ ݄ 19࣌ ਃ੥ Ր ਫ ໦ ۚ

    19࣌ TestFlightਃ੥ ϦϦʔεςετ ࣍ճ෼ PJ͝ͱܭըmtg ࣍ճ෼ શମܭըmtg QA ։ൃ ϦϦʔε 19࣌ masterϏϧυ TestFlight഑৴
  54. ։ൃϑϩʔ ৽։ൃϑϩʔ εέδϡʔϧ bitrise GitHub App Store Connect TestFlight Crashlytics

    Tester Designer Others Developer hook delivery pull request merge scheduler test
  55. ։ൃϑϩʔ ৽։ൃϑϩʔ εέδϡʔϧ bitrise GitHub App Store Connect TestFlight Crashlytics

    Tester Designer Others Developer delivery pull request merge scheduler test hook
  56. ։ൃϑϩʔ ৽։ൃϑϩʔ εέδϡʔϧ ݄ Ր ਫ ໦ ۚ ϦϦʔεςετ ࣍ճ෼

    PJ͝ͱܭըmtg ࣍ճ෼ શମܭըmtg QA ։ൃ ϦϦʔε 19࣌ TestFlightਃ੥ 19࣌ ਃ੥ ࣗಈԽ 19࣌ masterϏϧυ TestFlight഑৴
  57. ਓ͕ػցʹ߹ΘͤΔ

  58. ࠓޙͷऔΓ૊Έ

  59. ࠓޙͷऔΓ૊Έ • Feature Flagͷ׆༻ • masterϒϥϯν͸͍ͭͰ΋ϦϦʔεͰ͖Δঢ়ଶ • QAͳͲʹґଘ͠ͳ͍ϦϦʔεαΠΫϧ Trunk-Based Development

    https://trunkbaseddevelopment.com/
  60. ࠓޙͷऔΓ૊Έ • ΞϓϦͷߏ੒ཁૉΛϞδϡʔϧ୯ҐͰ෼ׂ (Static FrameworkԽʣ • Ϟδϡʔϧ୯ҐͰͷىಈɺσόοά • ૄ݁߹ͳઃܭ Micro

    FrameworkԽ
  61. ࠓޙͷऔΓ૊Έ • storyboard / xibΛ࢖ΘͣίʔυͰϨΠΞ΢τ • ίϯϑϦΫτϦεΫͷܰݮ • UIίʔυϨϏϡʔͷ޲্ •

    ࠶ར༻ੑͷ޲্ ※ σΟϝϦοτ΋ଟʑ͋ΔͨΊ࣮ݧతʹऔΓ૊Έ ίʔυϨΠΞ΢τ
  62. ·ͱΊ

  63. ·ͱΊ Micro Team × ࣗಈԽ ςετ ։ൃϑϩʔ Micro Framework Feature

    Flag
  64. εέʔϧ͢Δ։ൃTeam

  65. Thank you