Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CI/CDのボトルネックを把握できていますか?BigQueryでビルド情報ダッシュボードを構築した話

9bcd328daf60fe29dc9970f6cfc26730?s=47 Kenta Kase
September 03, 2021

 CI/CDのボトルネックを把握できていますか?BigQueryでビルド情報ダッシュボードを構築した話

https://event.cloudnativedays.jp/cicd2021/talks/1152

開発人数が多く、規模の大きいプロダクトでは最終的な成果物をビルドするだけで1時間以上かかってしまうことも珍しくありません。ですが最初からそれほど時間がかかっていたわけではなく、時間とともに巨大化するコードベース、追加されたステップなどによりいつの間にかどこかの処理がボトルネックとなっていることが多いでしょう。

CIサービスの多くは成功/失敗の情報、全体としてのビルド時間の情報は見やすく提供していますが、各ステップの時間やステップのエラー率などの細かい粒度の情報を時系列で確認する機能までは提供されていないことが多いです。そのため、ボトルネック箇所を特定するためには過去の生ビルドログを自分の目で確認するコストが高い作業が必要でした。

そこで、Jenkins, CircleCI, Github Actions, BitiseのビルドデータをAPI経由で取得してBigQueryに蓄積するCIAnalyzerというツールを開発しました。さらにDataPortalでダッシュボードを作成してデータを可視化したことで、例えば以下のような問題の解決に役立ちました。

- 半年、1年前と比較してボトルネックとなっているステップの発見
- 不規則に発生する厄介なビルドエラーがいつから起きているのかの特定

これ以外にも実際の業務で問題の解決に役立った事例をいくつか紹介しながら、CI/CDのデータを長期に蓄積して分析することの重要性をお伝えしたいと思います。

参考:
https://github.com/Kesin11/CIAnalyzer

9bcd328daf60fe29dc9970f6cfc26730?s=128

Kenta Kase

September 03, 2021
Tweet

Transcript

  1. CI/CDͷϘτϧωοΫΛ೺ѲͰ͖͍ͯ·͔͢ʁ BigQueryͰϏϧυ৘ใμογϡϘʔυΛ 
 ߏஙͨ͠࿩ CI/CD Conference 2021ʢ2021/09/03ʣ Ճ੉݈ଠ @Kesin11

  2. ࣗݾ঺հ • ॴଐɿDeNAͷSWETάϧʔϓʢSoftWare Engineer in Testʣ • Twitterɿ@Kesin11ɺGitHubɿKesin11 • CI/CDαʔϏεͷϚχΞͳͷͰ༗໊ͳαʔϏε͸େମνϣοτϫΧϧ

    • ͜͜2೥΄ͲओʹϞόΠϧήʔϜͷJenkinsͷߏஙɺӡ༻ɺύΠϓϥΠϯߏங • CEDEC2020ʮϞ バ Πϧ ゲ ʔϜ։ൃʹ͓͚ΔJenkins ʙΫϥ΢ ド ࣌୅ͷ Jenkinsߏஙͱ؅ཧςΫχοΫʙʯ
  3. ൃද಺༰ • CI/CDΛ௕ظؒӡ༻͢Δͱݟ͑ͯ͘Δ໰୊ • ࣗ࡞ͷϏϧυσʔλऩूπʔϧͷ঺հ • μογϡϘʔυΛ࡞੒ͨ͜͠ͱͰՄೳʹͳͬͨ͜ͱ • ࣮຿ͰղܾͰ͖࣮ͨྫͷ঺հ

  4. લఏ • ຊൃද͸ओʹiOS/AndroidΞϓϦΛCIαʔϏε্ͰϏϧυ͢Δߏ੒ • ಛʹJenkins + ࣗલͷmac + iOS/Android +

    Unity • k8s + ίϯςφϏϧυͷੈքͱ͸՝୊ײ͕ҟͳΔ͔΋͠Ε·ͤΜ
  5. ͜͜࠷ۙCI/CDք۾͕೤͍ • Github Actions, CircleCI, Bitrise, Azure Pipelines • k8sͱίϯςφք۾΋৽πʔϧͷ࿩͕ͲΜͲΜฉ͑ͯ͘͜Δ

    • ৽͍͠πʔϧͷ৽͍͠ػೳͰ࣮ݱͰ͖Δ͜ͱΛߟ͑Δͷ͸ͱͯ΋ָ͠ ͍
  6. CI/CDΛ௕ظӡ༻͢Δͱݟ͑ͯ͘Δ໰୊ • Ϗϧυ͕͍࣌ؒͭͷؒʹ͔ͱͯ΋௕͘ͳ͍ͬͯΔ • ϥϯμϜʹͨ·ʹࣦഊ͢ΔϏϧυ • ϏϧυΩϡʔ͕٧·Γ͕ͪ • Ϗϧυɾςετͷࣦഊ͕์ஔ͞Ε͕ͪʹͳΔ

  7. Azure Pipelines • Azure PipelinesͰ͸ਆμογϡϘʔυ͕σϑΥϧτͰ࢖͑Δʂ ը૾ɿmicrosoft/typescriptͷAzure Pieplines

  8. ύΠϓϥΠϯͷ੒ޭ/ ࣦഊ෼ੳ ੒ޭ཰ ͍ࣦͭഊ͔ͨ͠ Ͳͷεςοϓ͕ࣦഊ͔ͨ͠ https://typescript.visualstudio.com/TypeScript/_pipeline/analytics/ stageawareoutcome?de fi nitionId=6&contextType=build

  9. ςετ݁Ռ ςετͷ੒ޭ཰ ੒ޭ཰ͷਪҠ ࣦഊͨ͠ςετέʔεͷҰཡ ςετέʔε͝ͱͷฏۉ࣌ؒ https://typescript.visualstudio.com/TypeScript/_test/analytics? de fi nitionId=6&contextType=build

  10. ύΠϓϥΠϯͷ࣌ؒ ࣌ؒͷਪҠ εςοϓ͝ͱʹ͔͔Δ࣌ؒ https://typescript.visualstudio.com/TypeScript/_pipeline/analytics/ duration?de fi nitionId=6&contextType=build

  11. ͜Εͩɾɾɾʂ

  12. ଞͷCIαʔϏεͰ΋ಉ͡΋ͷ͕ཉ͍͠ɾɾɾʂ • ౰࣌͸ྨࣅαʔϏεΛݟ͚ͭΒΕͳ͔ͬͨ • ݱࡏͰ͸ଘࡏ͠·͢ʢޙड़ʣ • Github Actions΍CircleCIͷAPIΛࢼͨ͠ͱ͜ΖɺAzure Pipelinesͱಉ ౳ͷμογϡϘʔυΛ࡞Δͷʹඞཁͳσʔλ͸औಘͰ͖ͦ͏

    • ͜͏ͳͬͨΒࣗ࡞͢Δ͔͠ͳ͍
  13. CIAnalyzer • https://github.com/Kesin11/CIAnalyzer • ֤CIαʔϏεͷAPI͔Βσʔλऔಘɺ੔ܗɺ݁ՌͷΤΫεϙʔτ • Github Actions, CircleCI, Jenkins,

    BitriseʹରԠ • αʔόʔͷӡ༻ෆཁ • DBͷӡ༻ෆཁ • CIଆʹಛผͳπʔϧ΍εςοϓͷ௥Ճෆཁ • σʔλ͸֤ࣗͰ޷͖ͳ৔ॴʹΤΫεϙʔτʢBigQueryΛެࣜαϙʔτʣ
  14. Ϗϧυ࣌ؒͱ੒ޭ཰

  15. δϣϒͱεςοϓຖͷ࣌ؒ

  16. ςετ݁ՌͱςετέʔεҰཡ

  17. Ωϡʔ଴ͪ࣌ؒ

  18. BigQuery + DataStudio • σʔλ͸BigQueryʹ஝ੵ • ࣗલͰDBӡ༻͕ෆཁ • σʔλྔʹΑΔύϑΥʔϚϯεͷݒ೦͕ͳ͍ •

    ਖ਼نԽͤͣʹJSONͷߏ଄Λͦͷ··౤ೖՄೳ • μογϡϘʔυ͸DataStudioʢDataPortalʣ • ಉ͡GoogleͷαʔϏεͳͷͰBigQueryͱ૬ੑൈ܈ • JSONͷߏ଄ͷ··͍͍ײ͡ʹάϥϑ͕࡞ΕΔ • μογϡϘʔυ༻ͷWebαʔόʔͷӡ༻͕ෆཁ • ݖݶ؅ཧ͕GDriveͱಉ͡UIͳͷͰ୭Ͱ΋ઃఆ͠΍͍͢
  19. CIAnalyzerͷΞʔΩςΫνϟ • ֤αʔϏεͷAPIΛར༻ͯ͠σʔλΛऔಘ͢Δpullܕ • ύΠϓϥΠϯதͰಛผͳπʔϧΛಈ͔͢ઃఆͷ௥Ճ͸ෆཁ • ऩूର৅Λઃఆ༻ͷYAMLʹهࡌ͢Δ • Ͳ͔͜ͷ؀ڥͰఆظతʹىಈͰ͖Ε͹OK •

    ͓࢖͍ͷCIαʔϏεͷεέδϡʔϧ࣮ߦΛར༻͢Δͷ͕؆୯ • ࣗલͰαʔόʔͷӡ༻͕ෆཁ
  20. શମతͳಛ௃ • ͱʹ͔͘௿ίετʹӡ༻Ͱ͖ͯۀ຿Ͱ࢖͏োน͕ۃྗͳ͍Α͏ʹઃܭ • ࣗલͰαʔόʔΛӡ༻͢Δඞཁ͕ͳ͍ • ύΠϓϥΠϯͷதͰಛผͳπʔϧΛಈ͔͢ඞཁ͕ͳ͍ • ֎෦αʔϏεʹσʔλΛ౉͞ͳ͍ͷͰۀ຿Ͱ΋࢖͍΍͍͢

  21. μογϡϘʔυΛ࡞੒ͨ͠ 
 ͜ͱͰՄೳʹͳͬͨ͜ͱ

  22. աڈͷϏϧυه࿥Λ શͯḪΕΔ BigQueryͷྗʹΑͬͯաڈͷσʔ λશͯΛදࣔͤͯ͞΋࣌ؒ͸΄΅͔ ͔Βͳ͍ ΄ͱΜͲͷCIαʔϏεͰաڈͷه࿥ ͸࢒͍ͬͯΔ΋ͷͷɺḪͬͯूܭ͢ Δ͜ͱ͸ࠔ೉ͳͷͰେ͖ͳϝϦοτ ͱͳΔ iOS/Androidͷ1೥ؒͷφΠτϦʔϏϧυ

    ࣦഊͨ͠Ϗϧυɺࣦഊͨ͠εςοϓͷΈߜΓࠐΈ
  23. ฏۉతͳϏϧυ࣌ؒ ͷ૿Ճ܏޲ͷਖ਼֬ͳ ೺Ѳ ҆ఆ͢Δϒϥϯνɺ੒ޭͨ͠Ϗϧυ͚ͩͰϓ ϩοτ masterϒϥϯνɺφΠτϦʔϏϧυΈ͍ͨ ͳ҆ఆ͍ͯ͠Δ৚͕݅ϕετ ମײͰ͸ͳ͘ɺ਺ϲ݄લͱൺֱͯ͠ͲΕ͚ͩ ͕࣌ؒ௕͘ͳ͍ͬͯΔ͔ਖ਼֬ʹ೺ѲͰ͖Δ ௚ۙͰϏϧυ͕࣌ؒڐ༰Ͱ͖ͳ͍଎౓Ͱ૿Ճ

    ܏޲Ͱ͋Ε͹ૣظʹରࡦΛݕ౼͢Δ iOS/Androidͷ1೥ؒͷϏϧυ࣌ؒͷਪҠ φΠτϦʔɿΩϟογϡONɺΫϦʔϯɿΩϟογϡOFF
  24. CI/CDͷσʔλ஝ੵʹΑͬͯ ղܾͰ͖࣮ͨྫ঺հ

  25. ಛఆͷεςοϓ͕ੲʹൺ΂ͯେ෯ʹ͕͔͔࣌ؒ ΔΑ͏ʹͳ͍ͬͯͨࣄྫ • iOS/AndroidΞϓϦͷϏϧυ࣌ؒվળͷͨΊɺ͕͔͔͍࣌ؒͬͯΔεςοϓΛ෼ੳ͍ͯͨ͠ͱ͜ΖGCS ʹΞοϓϩʔυ͍ͯ͠Δεςοϓʹ7෼΋͔͔͍ͬͯͨ • ੲ͸ͦΜͳʹ͕͔͔͍࣌ؒͬͯͨهԱ͕ͳ͍ͷͰ2ϲ݄·ͰσʔλΛḪͬͯൺֱͨ͠ͱ͜Ζɺ 
 2෼ˠ7෼ʹ৳ͼ͍ͯͨ͜ͱ͕൑໌ •

    1ճͷϏϧυதʹGCS΁ͷΞοϓϩʔυ͸ෳ਺ճߦ͍ͬͯͨͷͰɺ͋Δδϣϒʹ͓͍ͯ͸શମͷϏϧυ ࣌ؒͷ໿20%ऑ΋઎Ίͯ͠·͍ͬͯͨ • gsutil rsyncͷࡍʹసૹʹඞཁͳϑΝΠϧΛಛఆ͢Δॲཧ͕࣌ؒϑΝΠϧ਺૿Ճʹ൐ͬͯ৳ͼ͍ͯͨ͜ͱ ͕ݪҼ • gsutil cp ʹஔ͖׵͑Δ͜ͱͰݩͷ7෼ˠ30ඵʹ·ͰվળͰ͖ͨ
  26. CircleCIͰͷόοΫΤϯυαʔόʔͷϏϧυ͕ كʹࣦഊ͢Δࣄྫ • ͋Δͱ͖͔ΒCircleCIͷϏϧυδϣϒ͕كʹࣦഊɺϦτϥΠ͢Δͱ௚Δ͜ͱ΋͋Δͱ͍͏Ṗݱ৅͕ൃੜ • μογϡϘʔυ্ͰFailedͳδϣϒɺ͞ΒʹFailedʹͳͬͨݪҼͷεςοϓΛௐࠪͯ͠ҎԼΛݪҼΛಛఆ • docker buildதͷίϯύΠϧΤϥʔ •

    ڊେϦϙδτϦͷgit cloneʹࣦഊ͍ͯ͠Δ • ݪҼ͕2ͭ͋Δ͜ͱɺٯʹͦΕҎ֎ͷݪҼ͸ແ͍͜ͱΛಥ͖ࢭΊΒΕͨ͜ͱ͕େ͖͍ • લऀ͸ίʔυΛ௚ͯ͠΋Β͍ɺޙऀͷgit clone͸ݪҼΛಛఆͰ͖ͳ͔ͬͨͷͰCircleCIͷresource_class Λ1ஈ֊্͛ͯΈΔ͜ͱʹ • 1िؒ΄Ͳ༷ࢠݟΛͨ݁͠Ռ࠶ൃ͠ͳ͘ͳͬͨͷͰղܾ
  27. ྨࣅαʔϏεͷ঺հ • CIAnalyzerͱࣅͨΑ͏ͳػೳΛఏڙ͍ͯ͠ΔαʔϏεͷ঺հ • ͨͩ͠ɺ͍ͣΕ΋CIAnalyzer΄Ͳৄࡉͳ෼ੳ͸Ͱ͖ͳ͍ • Azure Pipelinesʢ࠶ܝʣ • ࣗ෼ʹͱͬͯ͸ຊՈɻAzureΛ͓࢖͍ͷํ͸ͥͻ͓ࢼ͠Λ

  28. CircleCIͷInsightsػೳ Ϗϧυ࣌ؒɺ੒ޭ཰͸ݟΒΕΔ தԝ஋ͱ95%λΠϧʹΑͬͯ֎Ε஋Λ আ֎Ͱ͖Δͷ͸ૉ੖Β͍͠ ςετέʔε͝ͱͷ੒ޭ཰΍ɺ࣌ؒ৘ใ ΋ݟΒΕΔʢ·ͩpreivewػೳʣ εςοϓ͝ͱͷ࣌ؒ΍੒ޭ཰ΛݟΒΕ ͳ͍ͷͰݸਓతʹ͸ػೳ͕଍Γͳ͍

  29. meercode.io ෳ਺ͷCIαʔϏεʹରԠͨ͠μογϡ ϘʔυΛ࡞੒Ͱ͖ΔαʔϏε Github Actions΍Bitriseɺͦͷଞͷαʔ Ϗε΋αϙʔτ Ϗϧυ࣌ؒɺ੒ޭ཰ɺϦϙδτϦ͝ͱͷ CIαʔϏεͷ࢖༻࣌ؒͳͲ εςοϓ͝ͱͷ࣌ؒ΋෼ੳՄೳ

  30. ·ͱΊ • CI/CDΛ௕ظӡ༻͍ͯ͘͠ͱൃੜ͢Δ໰୊ͷௐࠪίετ͸ߴ͍ • Ϗϧυ࣌ؒͷ૿Ճ • ͨ·ʹࣦഊ͢ΔϏϧυ • ϏϧυσʔλΛ෼ੳՄೳʹ͢Δ •

    ࣗ࡞ͨ͠CIAnalyzerͷ঺հ • BigQuery + DataStudioʢDataPortalʣ • ࣮ࡍʹۀ຿Ͱศརʹ׆༻Ͱ͖͍ͯΔࣄྫͷ঺հ k8s + ίϯςφϏϧυͷCI/CDͷੈք͸ৄ͘͠ͳ͍ͷͰɺ 
 ͜ͷք۾Ͱ͸͜͏͍͏πʔϧ͕͋Γ·͢Έ͍ͨͳ৘ใΛڭ͑ͯ΋Β͑Δͱخ͍͠Ͱ͢ʂ
  31. ࢀߟ৘ใ • CIAnalyzer https://github.com/Kesin11/CIAnalyzer • ࢖͍ํͷ঺հهࣄ https://zenn.dev/kesin11/articles/cf08579949b8b0 • Azure Pipelines

    • TypeScriptʢnode14ͷCIʣ https://typescript.visualstudio.com/TypeScript/ _build?de fi nitionId=6&view=runs • Windows Terminal https://dev.azure.com/ms/terminal/_build? de fi nitionId=136&view=runs • GithubͷmicrosoftͷϦϙδτϦ͸Azure PipelinesΛ࢖ͬͯΔ΋ͷ͕ଟ͍
  32. ࢀߟ৘ใ • CircleCIʢInsightͷυΩϡϝϯτʣ https://circleci.com/docs/2.0/ insights/ • Meercode meercode.io

  33. None