https://pepabo.connpass.com/event/225504/
Continuous Documentation- CI/CDύΠϓϥΠϯΛ׆༻ͨ͠จॻԽٕज़ -খࢁ݈Ұ / GMO PEPABO inc.2021.09.27 Pepabo Tech Conference #161
View Slide
2ࣗݾհٕज़෦ɹٕज़ج൫νʔϜ2018 த్ೖࣾখࢁ ݈Ұ Ken’ichiro Oyamaগ࣮͠༻తͰখ͞ͳOSSΛॻ͘ͷ͕झຯɻʢ࠷ۙྗΛೖΕ͍ͯΔOSS https://github.com/k1LoW/octocov ͱ͍͏ओʹGitHub ActionsͰಈ͔͢ίʔυϝτϦΫεϨϙʔτج൫ʣ● GitHub : k1LoW● Twitter : @k1LoW
3ΞδΣϯμ1. υΩϡϝϯτͱ2. γεςϜͱυΩϡϝϯτͷဃ3. γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν4. ܧଓతυΩϡϝϯςʔγϣϯ5. ·ͱΊ
“υΩϡϝϯτ”ͱ4
5υΩϡϝϯτͱ։ൃ։࢝·ͰͷΦʔόʔϔου
υΩϡϝϯτͱ6։ൃऀ͕ɺࣝθϩͷঢ়ଶ͔ΒγεςϜΛཧղ͠։ൃΛ։࢝͢Δ·Ͱͷ࣌ؒίετΛɺຊൃදͰʮ։ൃ։࢝·ͰͷΦʔόʔϔουʯͱݺͿʢʮΦϯϘʔσΟϯάͷίετʯͱ͍ͬͨํ͕Ұൠత͔ʣ• ։ൃऀ͕γεςϜΛཧղ͍ͨ͠ͱ͖• ։ൃऀ͕৽ͨʹγεςϜ։ൃʹࢀՃͨ͠ͱ͖• ͘͠։ൃऀ͕ࣗͷ୲Ҏ֎ͷߏཁૉػೳΛཧղ͍ͨ͠ͱ͖• γεςϜͰར༻͍ͯ͠Δٕज़ελοΫʹेͳݟ͕͋ͬͨͱͯ͠ɺ࣮։ൃ։࢝·Ͱʹखؒͱ͕͔͔࣌ؒΔ։ൃ։࢝·ͰͷΦʔόʔϔου
υΩϡϝϯτͱ7৽ن։ൃͷ߹ɺ࣮ࡍʹ։ൃΛ։࢝͢Δ·Ͱʹࠨਤʹ͋ΔΑ͏ͳෳͷϨΠϠʔʹ͍ͭͯݕ౼Λ͢Δ• ΕΒΕ͕͕ͪͩɺ్த͔Β։ൃʹJOIN͢Δ߹ɺ৽ن։ൃ࣌ͱಉ͡ͷϨΠϠʔͷཧղ͕ඞཁʹͳΔ• ҧ͏ͷʮ͢Ͱʹ͋ΔͷΛཧղ͢Δඞཁ͕͋Δʯͱ͍͏͜ͱ͚ͩͲͷΑ͏ͳαʔϏε͔ͲͷΑ͏ͳΞʔΩςΫνϟ͔ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣͲͷΑ͏ͳ։ൃڥ͔ʢຊ൪ڥɾ։ൃڥʣͲͷΑ͏ͳίʔυ͔։ൃαʔϏεཧղϨΠϠʔΞʔΩςΫνϟཧղϨΠϠʔσʔλετΞཧղϨΠϠʔ։ൃڥཧղϨΠϠʔίʔυཧղϨΠϠʔ։ൃ։࢝·ͰͷΦʔόʔϔου
8υΩϡϝϯτͱ։ൃऀ͕γεςϜΛཧղ͢Δ
υΩϡϝϯτͱ9• ৽͍͠։ൃऀγεςϜΛݟͯཧղΛ͢Δඞཁ͕͋Δ• ։ൃ։࢝·ͰͷΦʔόʔϔου͕େ͖͍ঢ়ଶγεςϜҎ֎ʹԿͳ͍ঢ়ଶ
υΩϡϝϯτͱ10• γεςϜͷཧղΛॿ͚ΔͨΊυΩϡϝϯτΛॻ͘• ৽͍͠։ൃऀυΩϡϝϯτΛ௨ͯ͡γεςϜͷཧղΛਐΊΔ͜ͱ͕Ͱ͖ΔυΩϡϝϯτͰཧղΛॿ͚Δ
υΩϡϝϯτͱ11• υΩϡϝϯτΛӡ༻͢Δత→ ։ൃ։࢝·ͰͷΦʔόʔϔουΛݮ͢ΔͨΊ• ݮ͢ΔͨΊʹγεςϜͷཧղΛॿ͚Δ͜ͱ͕Ͱ͖ͳ͍ͱ͍͚ͳ͍• υΩϡϝϯτ͍ͭଘࡏ͢Δ͖͔→ ཧղͯ͠Β͍͍ͨγεςϜ͕ଘࡏ͍ͯ͠Δͱ͖• ܧଓతʹؒҧ͍ͷͳ͍ेͳυΩϡϝϯτ͕ଘࡏ͠ଓ͚Δඞཁ͕͋Δ• ※৽ن։ൃલͷʢઃܭͳͲͷʣυΩϡϝϯτຊൃදͷείʔϓ͔Β֎͢ຊൃදʹ͓͚Δ”υΩϡϝϯτ"ʮܧଓతʹʯʮγεςϜͷཧղΛॿ͚ΔʯυΩϡϝϯτ͕ඞཁ
γεςϜͱυΩϡϝϯτͷဃ12
γεςϜͱυΩϡϝϯτͷဃ13• γεςϜͱυΩϡϝϯτͱͷؒʹ༰ͷဃ͕ൃੜ͍ͯ͠Δ߹͕͋Δ• ʮॻ͍ͯ͋Δ͜ͱ͕ؒҧ͍ͬͯΔʯঢ়ଶʢ߹ʹΑͬͯʮॻ͍ͯ͋Δ͜ͱ͕Γͳ͍ʯʣ• ߃ৗతʹ༰ʹ͕ࠩग़͍ͯΔঢ়ଶ• ߋ৽λΠϛϯά͕ͣΕΔ͜ͱͰγεςϜͱυΩϡϝϯτͷ༰ʹ͕ࠩग़͍ͯΔঢ়ଶγεςϜͱυΩϡϝϯτͷဃ
γεςϜͱυΩϡϝϯτͷဃ14• γεςϜͱͷဃ͕͋ΔυΩϡϝϯτͰγεςϜΛཧղ͢ΔͱɺؒҧͬͨཧղͰ։ൃʹೖͬͯ͠·͏• ࣮ؔ࿈͕૿͍͑ͯͯؾܰʹΓͤͳ͘ͳ͍ͬͯͨΠϯελϯε• ࣮ߟྀ͠ͳ͍ͱ͍͚ͳ͍͜ͱ͕มΘ͍ܾͬͯͨࡁػೳ• ࣮૿͍͑ͯͨόον• ։ൃऀ͕ͦͷဃʹؾͮ͘ͷ͕͚Ε͍΄Ͳ։ൃʹ͓͚ΔϚΠφε͕େ͖͘ͳΔ• γεςϜཧղͷΓͳ͓͠🔥• ίʔυͷॻ͖͠🔥 🔥• ؒҧͬͨཧղͷ··ϦϦʔεɺޙʹো🔥 🔥 🔥 🔥 🔥 🔥γεςϜͱυΩϡϝϯτͷဃ͕͋Δͱ
γεςϜͱυΩϡϝϯτͷဃ15γεςϜͱυΩϡϝϯτͷဃΛখ͘͢͞ΔͨΊʹɺ·ͣɺγεςϜͱυΩϡϝϯτͷဃΛஅͰ͖ΔΈ͕ඞཁ• γεςϜͱυΩϡϝϯτͷରԠؔΛද͢Ұछͷ͕ؔඞཁ• ʮͨͩυΩϡϝϯτΛॻ͘ʯγεςϜ͕ߋ৽͞Εͨͱ͖ʹɺυΩϡϝϯτͷͲ͜Λߋ৽͢Εྑ͍ͷ͔͕Θ͔Γʹ͍͘ˠͭ·Γ͕ؔͳ͍ঢ়ଶͦͯ͠ɺဃ͕͋ΔظؒΛͰ͖Δ͚ͩখ͘͢͞ΔͨΊʹ• ܧଓతʹ• Ͱ͖Δ͚ͩγεςϜͷߋ৽ʹ͍ۙλΠϛϯάͰυΩϡϝϯτΛγεςϜʹ߹Θͤͯߋ৽͠ଓ͚Δ͜ͱ͕ඞཁγεςϜͱυΩϡϝϯτͷဃΛখ͘͢͞Δʹ
γεςϜͱυΩϡϝϯτͷဃ16γεςϜͱυΩϡϝϯτͷဃʹ͍ͭͯɺू߹Λ༻͍ͯϞσϧԽ͢ΔࢼΈγεςϜͱυΩϡϝϯτͷဃͷϞσϧԽhttps://speakerdeck.com/k1low/web-system-architecture-number-8
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν17
18γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢ΞϓϩʔνγεςϜ͔ΒߏԽσʔλΛநग़ͯ͠υΩϡϝϯτੜΛ͢Δ
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν19• JavadocɺgodocɺPHPDoc etc• γεςϜ͔ΒυΩϡϝϯτΛੜ͢Δ͜ͱͰɺγεςϜͱυΩϡϝϯτͷဃΛͳͦ͘͏ͱ͍ͯ͠ΔγεςϜ͔ΒߏԽσʔλΛநग़͢ΔυΩϡϝϯτ ߏԽσʔλ γεςϜ
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν20• ຊൃදʹ͓͚ΔʮΞϊςʔγϣϯʯͱɺʮγεςϜʹର͢Δ։ൃऀͷཧղɾΠϝʔδΛߏԽσʔλʹϝλใͱͯ͠Ճ͢Δʯͱ͍͏ҙຯ• PHPDocͳͲͰɺίϝϯτΛιʔείʔυʹ• ιʔείʔυͷʮߏʹԊͬͨܗͰʯ• ͔ͭʮܾΊΒΕͨϑΥʔϚοτʹैͬͯʯՃ͢Δ͜ͱͰɺॳΊͯ࠷ऴతͳυΩϡϝϯτʹө͞ΕΔ→Ξϊςʔγϣϯ্هҎ֎ͷίϝϯτυΩϡϝϯτ͔Βແࢹ͞ΕΔ→ΞϊςʔγϣϯͰͳ͍Ξϊςʔγϣϯ
21γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢ΞϓϩʔνߏԽσʔλ͔ΒγεςϜͱυΩϡϝϯτͷ྆ํΛੜ͢Δ
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν22• OpenAPI• ੜݩσʔλΛ1ͭʹ͢Δ͜ͱͰγεςϜͱυΩϡϝϯτͷဃΛͳͦ͘͏ͱ͍ͯ͠ΔߏԽσʔλ͔ΒγεςϜͱυΩϡϝϯτͷ྆ํΛੜ͢ΔυΩϡϝϯτ ߏԽσʔλ γεςϜ
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν23• 2ͭͷྫͷڞ௨ͱͯ͠ɺγεςϜͱυΩϡϝϯτͷؒʹߏԽσʔλΛհͨؔ͠࿈Λ͍࣋ͬͯΔ͜ͱ͕Θ͔Δɻ• γεςϜͱυΩϡϝϯτͷରԠؔΛද͢Ұछͷؔʹͳ͍ͬͯΔ2ͭͷΞϓϩʔνͷڞ௨
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν24• γεςϜͱυΩϡϝϯτͷဃΛͳͨ͘͢ΊʹɺγεςϜͷมԽͱ࿈ಈ͍ͯ͠ΔߏԽσʔλΛυΩϡϝϯτੜʹ׆༻͢Δ• ʮγεςϜ͔ΒߏԽσʔλΛநग़͢ΔʯʮߏԽσʔλ͔ΒγεςϜΛ࡞ΔʯͲͪΒͰྑ͍• ιʔείʔυɺIaCͷίʔυͱ͍ͬͨίʔυ͚ͩͰͳ͘ɺࢄτϨʔγϯάServiceDiscoveryɺService Mapͱ͍ͬͨΈͰಘΒΕͨάϥϑγεςϜͷมԽͱ࿈ಈͨ͠ߏԽσʔλͱݴ͑Δ• ߏԽσʔλ͔ΒυΩϡϝϯτͷܗΛੜ͠ɺΞϊςʔγϣϯʹγεςϜͷཧղʹඞཁͳઆ໌Λ݀ຒΊ͍ͯ͘͠Πϝʔδ• ॏཁͳͷΞϊςʔγϣϯͷ݀ຒΊ·Ͱͯ͠ॳΊͯγεςϜͷཧղΛॿ͚ΔυΩϡϝϯτʹͳΔͱ͍͏͜ͱߏԽσʔλΛ׆༻ͨ͠υΩϡϝϯςʔγϣϯ
ܧଓతυΩϡϝϯςʔγϣϯ25
ܧଓతυΩϡϝϯςʔγϣϯ26• γεςϜͱυΩϡϝϯτͷؒʹߏԽσʔλΛհͨؔ͠࿈Λ࣋ͨͤΔ͜ͱͰ྆ऀͷဃΛͳ͘͢ख๏ʢʹπʔϧʣΛಘΔ͜ͱ͕Ͱ͖ͨ• ͦͷπʔϧΛ࣮ߦ͢Δͷ͕ɺৗʹ։ൃऀʹਓͰ͋Δͱʮ࣮ߦΕʯ͕ൃੜͯ͠͠·͏• ΞϓϦέʔγϣϯͱಉ༷ʹɺCI/CDͷΈΛ׆༻͢Δɻ• ηΩϡϦςΟʹ͓͚ΔDevSecOpsηΩϡϦςΟγϑτϨϑτɺDeveloper-First Securityͱಉ͡୭͕υΩϡϝϯςʔγϣϯπʔϧΛ࣮ߦ͢Δͷ͔υΩϡϝϯτܧଓతʹσϦόϦ͢Δ
27ܧଓతυΩϡϝϯςʔγϣϯGMOϖύϘʹ͓͚ΔܧଓతυΩϡϝϯςʔγϣϯ
ܧଓతυΩϡϝϯςʔγϣϯ28σʔλϕʔεεΩʔϚͷυΩϡϝϯςʔγϣϯ
ܧଓతυΩϡϝϯςʔγϣϯ29
ܧଓతυΩϡϝϯςʔγϣϯ30• CIϑϨϯυϦͳσʔλϕʔευΩϡϝϯτੜπʔϧ• https://github.com/k1LoW/tbls• PostgreSQL, MySQLͳͲͷRDBMS͚ͩͰͳ͘ɺBigQueryAmazon DynamoDB,Cloud Spannerͱ͍ͬͨσʔλιʔεʹରԠ• υΩϡϝϯτΛॆ࣮ͤ͞Δػೳͱͯ͠ϝλσʔλΛΞϊςʔγϣϯ͢Δ͜ͱ͕Մೳ• ςʔϒϧɺΧϥϜͳͲͷίϝϯτ༩͚ͩͰͳ͘λάɺϦϨʔγϣϯͳͲtbls
ܧଓతυΩϡϝϯςʔγϣϯ31• ैདྷσʔλϕʔεͱυΩϡϝϯτผͰཧ• CI্Ͱςετ༻σʔλϕʔε͔ΒςʔϒϧఆٛΛߏԽσʔλͱͯ͠நग़ɻͦΕʹՃͰςʔϒϧίϝϯτΧϥϜίϝϯτΛΞϊςʔγϣϯ͠ɺυΩϡϝϯτΛੜtbls
ܧଓతυΩϡϝϯςʔγϣϯ32ΠϯϑϥΞʔΩςΫνϟͷυΩϡϝϯςʔγϣϯ
ܧଓతυΩϡϝϯςʔγϣϯ33ndiag
ܧଓతυΩϡϝϯςʔγϣϯ34• https://github.com/k1LoW/ndiag• ओʹΠϯϑϥͷϋΠϨϕϧΞʔΩςΫνϟͷυΩϡϝϯτΛੜ͢ΔతͰ։ൃ• YAML͔ΒʮߏਤΛੜ͢ΔʯͰʮυΩϡϝϯτΛੜ͢ΔʯͰͳ͘ ʮෳͷΓޱͰߏਤΛؚΉΩϡϝϯτͷܗΛ࡞Δʯͱ͍͏ಛΛ࣋ͭ• ֤ߏཁૉάϧʔϓʹΞϊςʔγϣϯΛॻ͘͜ͱͰυΩϡϝϯτͱཱͯͤ͠͞Δndiag
ܧଓతυΩϡϝϯςʔγϣϯ35• γεςϜͱυΩϡϝϯτͷؔ࿈෦ʮߏԽσʔλΛநग़͢ΔʯͰͳ͘ɺൺֱػೳ·Ͱ• ୯७ʹɺରͱ͍ͯ͠ΔγεςϜ͕ඇৗʹෳࡶͰ͔ͭଟذʹΘͨΔͨΊ• વndiagͷೖྗYAMLͳͷͰɺγεςϜ͔ΒใΛߏԽσʔλΛநग़͢ΔεΫϦϓτ͕࡞ΕΕɺͦΕΛndiagͷೖྗʹ͢Δ͜ͱ͕Մೳndiag
·ͱΊ36
·ͱΊ37• ։ൃ։࢝·ͰͷΦʔόʔϔουͷݮͷͨΊʹʮܧଓతʹʯʮγεςϜͷཧղΛॿ͚ΔʯυΩϡϝϯτ͕ඞཁ• ʮܧଓతʹɺؒҧ͍ͷͳ͍ेͳυΩϡϝϯτΛଘࡏ͠ଓ͚ͤ͞ΔʯͱʮγεςϜ͕มԽͯ͠γεςϜͱυΩϡϝϯτͷဃΛେ͖͘͠ͳ͍ʯͱ͍͏͜ͱ• γεςϜͷมԽͱ࿈ಈͨ͠ߏԽσʔλΛͬͯυΩϡϝϯτͷܗΛੜ͢Δ͜ͱͰɺγεςϜͷมԽ͕υΩϡϝϯτʹө͞ΕΔΈΛߏஙͰ͖Δ• ্هͷΈΛιϑτΣΞʹΑΓࣗಈԽɺ͞ΒʹCI/CDͷΈʹࡌͤΔ͜ͱͰɺγεςϜͱυΩϡϝϯτͷဃΛݶΓͳ͘ܧଓతʹখ͘͞อͭ͜ͱ͕ՄೳʹͳΔ·ͱΊ
·ͱΊ38• γεςϜͷมԽͱ࿈ಈͨ͠ߏԽσʔλΛͬͯυΩϡϝϯτͷܗγεςϜͷมԽʹै͢ΔΑ͏ʹͳͬͨɻ• ݱঢ়ɺͦΕΒʹ༩͢ΔΞϊςʔγϣϯʢ։ൃऀ͕ॻ͘આ໌จষʣΛͲ͏ܧଓతʹॻ͍ͯΒ͏͔͕՝• ΞϓϦέʔγϣϯͷιʔείʔυͱಉ͡Α͏ͳΞϓϩʔνͱͯ͠ɺΧόϨοδͷܭଌΧόϨοδύʔηϯςʔδʹΑͬͯCIΛFailͤ͞ΔΈͳͲ͕ߟ͑ΒΕΔ• tblsndiagυΩϡϝϯτͷΧόϨοδܭଌͰ͖ΔΑ͏ʹͳ͍ͬͯΔ• ΑΓϞνϕʔγϣϯΛͬͯॻ͍ͯΒ͏ΈɺΑΓॻ͖͘͢ͳΔΈߟ͍͖͍͑ͯͨ• ࠶ܝ: ηΩϡϦςΟʹ͓͚ΔDevSecOpsηΩϡϦςΟγϑτϨϑτɺDeveloper-First Securityͱಉ͡ࠓޙͷ՝
39Thank You!Thank You!