Clipใ—ใŸๆ—ฅ: 2024-11-19T10:53:05+09:00 Clipใ—ใŸ่จ˜ไบ‹: [Terraform Monorepo ใฎ CI ใฎๅฎŸ่กŒๆ™‚้–“ใ‚’ๅฏ่ฆ–ๅŒ–ใ— 2 ๅˆ†ไปฅไธŠ้ซ˜้€ŸๅŒ– - freee Developers Hub](https://developers.freee.co.jp/entry/2024/11/19/100000) ---- SRE team ใฎ [suzuki-shunsuke](https://github.com/suzuki-shunsuke) ใงใ™ใ€‚ ไปŠๅนดใฎ 8 ๆœˆ(็ด„3ใ‹ๆœˆๅ‰)ใ‹ใ‚‰ freee ใฎ SRE team ใซ join ใ—ใพใ—ใŸใ€‚ ๆœฌ่จ˜ไบ‹ใงใฏ Terraform Monorepo ใฎ CI ใฎๅฎŸ่กŒๆ™‚้–“ใ‚’ [CIAnalyzer](https://github.com/Kesin11/CIAnalyzer) ใงๅฏ่ฆ–ๅŒ–ใ— 2 ๅˆ† (70 percentile ใง็ด„ 160 %) ไปฅไธŠ้ซ˜้€ŸๅŒ–ใ—ใŸ่ฉฑใ‚’็ดนไป‹ใ—ใพใ™ใ€‚ ## ่ƒŒๆ™ฏ freee ใซใฏ AWS ใชใฉใ‚’็ฎก็†ใ™ใ‚‹ Terraform ใฎ Monorepo ใŒใ‚ใ‚Šใ€ SRE ใ‚’ไธญๅฟƒใซๅคšใใฎ้–‹็™บ่€…ใŒใใฎใƒชใƒใ‚ธใƒˆใƒชใง้–‹็™บใ‚’่กŒใฃใฆใ„ใพใ™ใ€‚ CI ใซใฏ GitHub Actions ใฎ Self-hosted Runner ใ‚’ไฝฟใฃใฆใ„ใพใ™ใ€‚ ใƒ•ใƒญใƒผใจใ—ใฆใฏ GitHub Flow ใ‚’ๆŽก็”จใ—ใฆใŠใ‚Šใ€ Pull Request ใ‚’ไฝœๆˆใ™ใ‚‹ใจ CI ใง terraform plan ใŒๅฎŸ่กŒใ•ใ‚Œใพใ™ใ€‚ terraform apply ใฏ GitHub ใฎ [Merge Queue](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue) ใ‚’ไฝฟใฃใฆๅฎŸ่กŒใ•ใ‚Œใ€ terraform apply ใŒๅคฑๆ•—ใ™ใ‚‹ใจใƒžใƒผใ‚ธใ•ใ‚Œใชใ„ใ‚ˆใ†ใซใชใฃใฆใ„ใพใ™ใ€‚ ่‡ชๅˆ†ใŒๅ…ฅ็คพใ™ใ‚‹ๅ‰ใ‹ใ‚‰ใ“ใฎ CI ใซๆ™‚้–“ใŒใ‹ใ‹ใ‚Š้–‹็™บ่€…ไฝ“้จ“ใ‚’ๆใชใฃใฆใ„ใ‚‹ใจใ„ใ†่ชฒ้กŒใŒใ‚ใ‚Šใพใ—ใŸใ€‚ ่‡ชๅˆ†ใŒๅ…ฅ็คพใ—ใฆๅฐ‘ใ—่งฆใฃใŸใ ใ‘ใงใ‚‚็ขบใ‹ใซ CI ใŒ้…ใ„ใจๆ„Ÿใ˜ใพใ—ใŸใ€‚ ไธŠ่ฟฐใฎ้€šใ‚Š SRE ใ‚’ไธญๅฟƒใซๅคšใใฎ้–‹็™บ่€…ใŒใใฎใƒชใƒใ‚ธใƒˆใƒชใง้–‹็™บใ‚’่กŒใฃใฆใ„ใ‚‹ใŸใ‚ใ€ใ“ใฎใƒชใƒใ‚ธใƒˆใƒชใฎ CI ใ‚’้ซ˜้€ŸๅŒ–ใ™ใ‚‹ใ“ใจใงๅคšใใฎ้–‹็™บ่€…ใฎ็”Ÿ็”ฃๆ€งใ‚’ๅ‘ไธŠใซใคใชใŒใ‚‹ใจ่€ƒใˆใ€ๆ”นๅ–„ใซๅ–ใ‚Š็ต„ใ‚€ใ“ใจใซใ—ใพใ—ใŸใ€‚ ## ใ‚„ใฃใŸใ“ใจ ใ‚„ใฃใŸใ“ใจใฏๅคงใใๅˆ†ใ‘ใฆๆฌกใฎ 5 ใคใงใ™ใ€‚ 1. OKR ใฎ่จญๅฎš 2. ๅฎŸ่กŒๆ™‚้–“ใฎ่จˆๆธฌใƒปๅฏ่ฆ–ๅŒ– 3. SLI / SLO ใฎ่จญๅฎš 4. ใƒœใƒˆใƒซใƒใƒƒใ‚ฏใฎๅˆ†ๆž 5. ๆ”นๅ–„ ### OKR ใฎ่จญๅฎš ใพใšๆœ€ๅˆใซ OKR ใ‚’่จญๅฎšใ—ใ€ใ‚„ใ‚‹ใ“ใจใ‚’็ฐกๆฝ”ใซๆ˜Ž็ขบใซใ—ใพใ—ใŸ (ๅฎŸ้š›ใฎใ‚‚ใฎใซ่‹ฅๅนฒๆ‰‹ใ‚’ๅŠ ใˆใฆใ„ใพใ™)ใ€‚ - Objective: CI ใ‚’้ซ˜้€ŸๅŒ–ใ—ใ€ๅ…จ้–‹็™บ่€…ใŒ็ด ๆ—ฉใ Terraform ใงใ‚คใƒณใƒ•ใƒฉใ‚’ๆง‹็ฏ‰ใ—ใŸใ‚Šๅค‰ๆ›ดใ‚’ๅŠ ใˆใ‚‰ใ‚Œใ‚‹ใ‚ˆใ†ใซใ—ใ€้–‹็™บ่€…ใฎ็”Ÿ็”ฃๆ€งใซ่ฒข็Œฎใ™ใ‚‹ - KR1: CI ใซใฉใฎใใ‚‰ใ„ใ‹ใ‹ใฃใฆใ„ใ‚‹ใฎใ‹ๅฏ่ฆ–ๅŒ–ใ•ใ‚Œใ€ใ„ใคใงใ‚‚็ขบ่ชใ™ใ‚‹ใ“ใจใŒใงใใ‚‹ - KR2: SLI/SLO ใŒๅฎšใพใฃใฆใŠใ‚Šใ€ CI ใฎ้€Ÿๅบฆใซใคใ„ใฆๅฎข่ฆณ็š„ใซ่ฉ•ไพกใƒป่ญฐ่ซ–ใงใใ‚‹ใ‚ˆใ†ใซใชใฃใฆใ„ใ‚‹ - KR3: SLO ใ‚’้”ๆˆใ™ใ‚‹ ### ๅฎŸ่กŒๆ™‚้–“ใฎ่จˆๆธฌใƒปๅฏ่ฆ–ๅŒ– ๆ”นๅ–„ใฎๅ‰ใซใพใšใฏ CI ใฎๅฎŸ่กŒๆ™‚้–“ใ‚’่จˆๆธฌใƒปๅฏ่ฆ–ๅŒ–ใ—ใ€ๆ”นๅ–„ใ‚’่ฉ•ไพกใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ—ใŸใ€‚ ใใ†ใงใชใ„ใจๆ”นๅ–„ใ—ใŸใจใ—ใฆใ‚‚ใ€ๅฎŸ้š›ๆœฌๅฝ“ใซ้€ŸใใชใฃใŸใฎใ‹ใƒปใฉใฎใใ‚‰ใ„้€ŸใใชใฃใŸใฎใ‹ๆ„Ÿ่ฆšใงใ—ใ‹ๅˆ†ใ‹ใ‚‰ใšใ€ๅฎข่ฆณ็š„ใช่ญฐ่ซ–ใŒใงใใพใ›ใ‚“ใ€‚ ๅฏ่ฆ–ๅŒ–ใฎใŸใ‚ใฎใƒ„ใƒผใƒซใจใ—ใฆๆฌกใฎ 2 ใคใŒๅ€™่ฃœใซไธŠใŒใ‚Šใพใ—ใŸใ€‚ 1. [GitHub Actions Usage Metrics](https://docs.github.com/en/enterprise-cloud@latest/organizations/collaborating-with-groups-in-organizations/viewing-usage-metrics-for-github-actions) 2. [CIAnalyzer](https://github.com/Kesin11/CIAnalyzer) CIAnalyzer ใซใคใ„ใฆใฏไฝœ่€…ๆง˜ใฎใƒ–ใƒญใ‚ฐใ‚‚ๅ‚็…งใ—ใฆใใ ใ•ใ„: [CI/CDใฎใƒ‡ใƒผใ‚ฟใ‚’ๅŽ้›†ใ™ใ‚‹CIAnalyzerใฎ็ดนไป‹](https://zenn.dev/kesin11/articles/cf08579949b8b0) GitHub Actions Usage Metrics ใฏ GitHub ๅ…ฌๅผใฎๆฉŸ่ƒฝใงใ€ Plan ใซใ‚‚ใ‚ˆใ‚Šใพใ™ใŒ็‰นๅˆฅใชใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ—ใชใ—ใซไฝฟใˆใพใ™ใ€‚ ไธ€ๆ–น CIAnalyzer ใฏ OSS ใง CIAnalyzer ใ‚’ๅฎŸ่กŒใ™ใ‚‹ CI ใ‚„ BigQuery ใ‚„ Looker Studio ใชใฉใฎใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ—ใŒๅฟ…่ฆใง GitHub Actions Usage Metrics ใ‚ˆใ‚Šๆ‰‹้–“ใŒใ‹ใ‹ใ‚Šใพใ™ใ€‚ ใใ“ใงใพใšใฏ GitHub Actions Usage Metrics ใ‚’็œบใ‚ใฆใฟใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ ็œบใ‚ใฆใฟใŸ็ตๆžœใ€่ฉณ็ดฐใชใƒœใƒˆใƒซใƒใƒƒใ‚ฏใฎๅˆ†ๆžใชใฉใฏ GitHub Actions Usage Metrics ใงใฏ้›ฃใ—ใ„ใ“ใจใŒๅˆ†ใ‹ใ‚Šใพใ—ใŸใ€‚ ใใ“ใง CIAnalyzer ใ‚’ๆง‹็ฏ‰ใ—ใพใ—ใŸใ€‚ ๆ‰‹้–“ใŒใ‹ใ‹ใ‚‹ใจใฏๆ›ธใใพใ—ใŸใŒใ€ๅ…ฌๅผใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใซๅพ“ใˆใฐใ•ใปใฉ้›ฃใ—ใใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ GitHub Actions ใงๅฎšๆœŸๅฎŸ่กŒใ—ใฆใƒ‡ใƒผใ‚ฟใ‚’ BigQuery ใซๅŽ้›†ใ™ใ‚‹ใ‚ˆใ†ใซใ—ใพใ—ใŸใ€‚ CIAnalyzer ใงใฏๅ…ฌๅผใซ Looker Studio ใฎใ‚ตใƒณใƒ—ใƒซใŒๆไพ›ใ•ใ‚Œใฆใ„ใพใ™ใŒใ€ๆˆ‘ใ€…ใฎใƒ‹ใƒผใ‚บใซใฏใ‚ใพใ‚Šๅˆใ‚ใชใ‹ใฃใŸใŸใ‚่‡ชไฝœใ—ใพใ—ใŸใ€‚ ็ตๆžœใจใ—ใฆใฉใฎ Workflow, Job, step ใซใฉใฎใใ‚‰ใ„ๆ™‚้–“ใŒใ‹ใ‹ใฃใฆใ„ใ‚‹ใ‹ใŒๅˆ†ใ‹ใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚ ### ่ฃœ่ถณ: Actions Performance Metrics ใซใคใ„ใฆ ใ“ใฎ่จ˜ไบ‹ใฎๅŸท็ญ†ไธญใซ [Actions Performance Metrics ใŒ Public preview ใซใชใ‚Šใพใ—ใŸ](https://github.blog/changelog/2024-10-31-actions-performance-metrics-in-public-preview/)ใ€‚ Actions Usage Metrics ใจๆฏ”ในใ‚‹ใจๅ„ Job ใฎๅนณๅ‡ๅฎŸ่กŒๆ™‚้–“ใ‚„ๆˆๅŠŸ็Ž‡ใชใฉใ‚‚่ฆ‹ใ‚Œใฆไพฟๅˆฉใงใ™ใ€‚ Actions Usage Metrics ๅŒๆง˜็‰นๅˆฅใชใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ—็„กใ—ใงไฝฟใˆใ‚‹ใฎใ‚‚่‰ฏใ„ใจใ“ใ‚ใงใ™ใ€‚ ใŸใ ใ—ใ€ step ๅ˜ไฝใฎๆƒ…ๅ ฑใฏๅ–ใ‚Œใพใ›ใ‚“ใ— CIAnalyzer ใฎใ‚ˆใ†ใซๅฏ่ฆ–ๅŒ–ใฏๅ‡บๆฅใชใ„ใฎใงใ€ใ‚„ใฏใ‚Š CIAnalyzer ใŒๅฟ…่ฆใงใ—ใŸใ€‚ ### ่ฃœ่ถณ: actions-timeline ใซใคใ„ใฆ CIAnalyzer ใฎไฝœ่€…ๆง˜ใŒไฝœใฃใฆใ„ใ‚‹ [actions-timeline](https://github.com/Kesin11/actions-timeline) ใจใ„ใ†ๅˆฅใฎใƒ„ใƒผใƒซใซใคใ„ใฆ่ฃœ่ถณใ—ใพใ™ใ€‚ [GitHub Actionsใฎใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’ๅฏ่ฆ–ๅŒ–ใ™ใ‚‹actions-timelineใ‚’ไฝœใฃใŸ](https://zenn.dev/cybozu_ept/articles/20231002_actions_timeline) actions-timeline ใฏๅŒใ˜ไฝœ่€…ใŒ CIAnalyzer ใฎใ‚ใจใซไฝœใฃใŸใ‚‚ใฎใงใ‚ใ‚Š GitHub Star ๆ•ฐใ‚‚ไธŠๅ›žใฃใฆใ„ใ‚‹ใ“ใจใ‹ใ‚‰ใ“ใ‚Œใ‚‰ใฎใƒ„ใƒผใƒซใ‚’ใ‚ˆใ็Ÿฅใ‚‰ใชใ„ไบบใ‹ใ‚‰ใ™ใ‚‹ใจ actions-timeline ใ‚’ไฝฟใฃใŸใปใ†ใŒ่‰ฏใ„ใฎใงใฏใชใ„ใ‹ใจๆ€ใ†ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ ใ—ใ‹ใ—ใ€ใ“ใ‚Œใ‚‰ใฎใƒ„ใƒผใƒซใฏๆฉŸ่ƒฝ็š„ใซๅ…จใ็•ฐใชใ‚‹ใ‚‚ใฎใงใ‚ใ‚Š actions-timeline ใฏๆฑบใ—ใฆ CIAnalyzer ใฎไธŠไฝไบ’ๆ›ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ actions-timeline ใฏ BigQuery ใชใฉใ‚’ๅฟ…่ฆใจใ›ใš้žๅธธใซๅฐŽๅ…ฅใŒๅฎนๆ˜“ใง workflow ใฎๅฎŸ่กŒ็ตๆžœใ‚’ Mermaid ใ‚’ไฝฟใฃใฆๅˆ†ใ‹ใ‚Šใ‚„ใ™ใๆ็”ปใ—ใฆใใ‚Œใ‚‹ใƒ„ใƒผใƒซใงใ™ใŒใ€ใ‚ใใพใงๅ€‹ใ€…ใฎ workflow run ใฎ็ตๆžœใ‚’ๅฏ่ฆ–ๅŒ–ใ™ใ‚‹ใƒ„ใƒผใƒซใงใ‚ใ‚Šใ€้ŽๅŽปใฎ workflow ใฎๅฎŸ่กŒ็ตๆžœใ‚’่“„็ฉใ—ใฆ็ตฑ่จˆ็š„ใซๅˆ†ๆžใงใใ‚‹ใ‚ˆใ†ใชใƒ„ใƒผใƒซใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ไปŠๅ›žใฎใ‚ˆใ†ใซ CI ใฎๅฎŸ่กŒ็ตๆžœใซ้–ขใ™ใ‚‹ใƒ€ใƒƒใ‚ทใƒฅใƒœใƒผใƒ‰ใ‚’ๆง‹็ฏ‰ใ—ใŸใ‚Šใ€ๆ”นๅ–„ๆดปๅ‹•ใ‚’่กŒใฃใŸ N ใƒถๆœˆใงใฉใฎใใ‚‰ใ„ CI ใŒๆ”นๅ–„ใ—ใŸใฎใ‹ๅฎข่ฆณ็š„ใซ็คบใ—ใŸใ‚Šใ™ใ‚‹ใฎใซใฏไฝฟใˆใพใ›ใ‚“ใ€‚ ไปŠๅ›žใฏไปŠใฎใจใ“ใ‚ actions-timeline ใฎๅฟ…่ฆๆ€งใ‚’ๆ„Ÿใ˜ใชใ‹ใฃใŸใฎใงๅฐŽๅ…ฅใ—ใพใ›ใ‚“ใงใ—ใŸใ€‚ ### SLI / SLO ใฎ่จญๅฎš CI ใฎ้€Ÿๅบฆใซใคใ„ใฆๅฎข่ฆณ็š„ใซ่ฉ•ไพกใƒป่ญฐ่ซ–ใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใŸใ‚ใฎ SLI/SLO ใ‚’่จญๅฎšใ—ใพใ—ใŸใ€‚ Google ใฎ SRE ใŒๅ…ฌ้–‹ใ—ใฆใ„ใ‚‹ [The Art of SLOs](https://static.googleusercontent.com/media/sre.google/ja//static/pdf/jp-art-of-slos-handbook-pdf-a4.pdf) ใซใ‚ˆใ‚‹ใจ SLI ใฏ workflow ใฎๅฎŸ่กŒๆ™‚้–“ใฎใ‚ˆใ†ใชใ‚‚ใฎใงใฏใชใ 0 ~ 1 ใซๅŽใพใ‚‹ใ‚ˆใ†ใชๅ€คใŒ่‰ฏใ„ใจใ•ใ‚Œใฆใ„ใพใ™ใ€‚ ใใ“ใงไปฅไธ‹ใฎใ‚ˆใ†ใชใ‚‚ใฎใ‚’ SLI ใจใ—ใฆ่จญๅฎšใ—ใพใ—ใŸใ€‚ `ๆˆๅŠŸใ—ใŸ workflow ใฎใ†ใก็›ฎๆจ™ๆ™‚้–“ไปฅๅ†…ใซๅฎŒไบ†ใ—ใŸ workflow ใฎๅ‰ฒๅˆ` ๆ•ฐๅผใง่กจใ™ใจไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ ``` SLI = (ใ‚ฟใ‚คใƒ ใƒ•ใƒฌใƒผใƒ  A ใฎ้–“ใซ B ๅˆ†ไปฅๅ†…ใซๆˆๅŠŸใ—ใŸ workflow ใฎๆ•ฐ) / (Aๆ™‚้–“ใฎใ‚ฟใ‚คใƒ ใƒ•ใƒฌใƒผใƒ ใฎ้–“ใซๆˆๅŠŸใ—ใŸ workflow ใฎๆ•ฐ) * 100% ``` ใ“ใ“ใง 2 ใคใฎใƒ‘ใƒฉใƒกใƒผใ‚ฟ A, B ใŒใ‚ใ‚Šใพใ™ใ€‚ - A: ใฉใฎใใ‚‰ใ„ใฎๆ™‚้–“ใงใƒ‡ใƒผใ‚ฟใ‚’้›†่จˆใ™ใ‚‹ใ‹ (1ๆ™‚้–“, 1 ๆ—ฅ, etc) - B: workflow ใฎๅฎŸ่กŒๆ™‚้–“ใฎๆœŸๅพ…ๅ€ค (3 ๅˆ†, 5 ๅˆ†, 10 ๅˆ†, etc) ใ‚ใจใฏ็›ฎๆจ™ใจใ™ใ‚‹ SLI ใฎๅ€ค (SLO) ใ‚‚ใ‚ใ‚Šใพใ™ใ€‚ ใ“ใ‚Œใ‚‰ใฎใƒ‘ใƒฉใƒกใƒผใ‚ฟใ‚’ใฉใ†่จญๅฎšใ™ใ‚‹ใ‹ใฏๆญฃ่งฃใฎใชใ„้›ฃใ—ใ„ๅ•้กŒใงใ™ใŒใ€ๆšซๅฎšใง่จญๅฎšใ—ๅฟ…่ฆใซๅฟœใ˜ใฆ่ฆ‹็›ดใ™ใ“ใจใซใ—ใพใ—ใŸใ€‚ workflow ใฎๅฎŸ่กŒๆ™‚้–“ใฏ queuedDurationSec + workflowDurationSec ใจใ—ใพใ—ใŸใ€‚ ### ใƒœใƒˆใƒซใƒใƒƒใ‚ฏใฎๅˆ†ๆž ๆ™‚้–“ใฎใ‹ใ‹ใฃใฆใ„ใ‚‹ Job ใ‚„ Step ใ‚’็‰นๅฎšใ—ใ€ใƒœใƒˆใƒซใƒใƒƒใ‚ฏใซใชใฃใฆใ„ใ‚‹ใจใ“ใ‚ใ‹ใ‚‰ๅ„ชๅ…ˆ็š„ใซๆ”นๅ–„ใ—ใพใ—ใŸใ€‚ ใพใš checkout ใซใ‚„ใŸใ‚‰ๆ™‚้–“ใŒใ‹ใ‹ใฃใฆใ„ใ‚‹ใ“ใจใŒๅˆ†ใ‹ใ‚Šใ€ใใ“ใ‚’ๆ”นๅ–„ใ™ใ‚‹ใ ใ‘ใงใ‚‚็ตๆง‹้€Ÿใใชใ‚‹ใ“ใจใŒๅˆ†ใ‹ใ‚Šใพใ—ใŸใ€‚ ### ๆ”นๅ–„ ๅˆ†ๆžใซๅŸบใฅใๅฎŸ้š›ใซ workflow ใ‚’ไฟฎๆญฃใ—้ซ˜้€ŸๅŒ–ใ—ใพใ—ใŸใ€‚ 1. Job ใฎไธฆๅˆ—ๅฎŸ่กŒ 2. Workflow ใ‚„ Job ใฎใƒžใƒผใ‚ธ 3. shallow clone 4. sparse checkout 5. ็„ก้ง„ใชๅ‡ฆ็†ใฎๅ‰Š้™ค 6. ใƒชใƒใ‚ธใƒˆใƒชใซใ‚ณใƒŸใƒƒใƒˆใ•ใ‚Œใฆใ„ใ‚‹ zip ใƒ•ใ‚กใ‚คใƒซใฎๅ‰Š้™ค 7. ใƒ•ใ‚กใ‚คใƒซใ‚„ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใฎๅญ˜ๅœจใƒใ‚งใƒƒใ‚ฏใฎใŸใ‚ใ ใ‘ใซๆ…‹ใ€… checkout ใ—ใฆใ„ใŸใฎใ‚’ GitHub Content API ใซ็ฝฎใๆ›ใˆ 8. terrform plan ใŒ no change ใฎใจใ infracost ใ‚’ skip ๆ”นๅ–„ใฎ PR ใ‚’ไฝœๆˆใ™ใ‚‹้š›ใฏใ€ไบˆใ‚ๆ”นๅ–„ๅฏพ่ฑกใฎๅ‡ฆ็†ใซใฉใฎ็จ‹ๅบฆๆ™‚้–“ใŒใ‹ใ‹ใฃใฆใ„ใ‚‹ใฎใ‹ใ‚ใ‹ใฃใฆใ„ใ‚‹ใŸใ‚ใ€ใใฎ PR ใซใ‚ˆใฃใฆใฉใฎ็จ‹ๅบฆใฎๆ”นๅ–„ใŒ่ฆ‹่พผใ‚ใ‚‹ใ‹ใŒๅฎข่ฆณ็š„ใซๅˆ†ใ‹ใ‚Šใ€ PR ใซ่ชฌๅพ—ๅŠ›ใ‚’ใ‚‚ใŸใ›ใ‚‹ใ“ใจใŒๅ‡บๆฅใพใ—ใŸใ€‚ #### Job ใฎไธฆๅˆ—ๅฎŸ่กŒ job ใฎไพๅญ˜้–ขไฟ‚ใ‚’่ฆ‹็›ดใ—ใ€็›ดๅˆ—ใงๅฎŸ่กŒใ•ใ‚Œใฆใ„ใ‚‹ job ใ‚’ไธฆๅˆ—ใงๅฎŸ่กŒใ™ใ‚‹ใ‚ˆใ†ใซใ—ใพใ—ใŸใ€‚ #### Workflow ใ‚„ Job ใฎใƒžใƒผใ‚ธ ็‹ฌ็ซ‹ใ—ใŸ job ใงๅˆฅใ€…ใซๅŒใ˜ๅ‡ฆ็†ใ‚’่กŒใฃใฆใ„ใ‚‹ใ‚ฑใƒผใ‚นใŒใ‚ใ‚Šใพใ—ใŸใ€‚ไพ‹ใˆใฐ terraform plan ใ‚’ๅฎŸ่กŒใ™ใ‚‹ใƒกใ‚คใƒณใฎ workflow ใจใฏๅˆฅใซ terraform plan ใฎ็ตๆžœใซๅฏพใ—ใฆ infracost ใ‚’ๅฎŸ่กŒใ™ใ‚‹ workflow ใŒใ‚ใ‚Šใ€ไธกๆ–นใฎ workflow ใง็‹ฌ็ซ‹ใ—ใฆ terraform plan ใ‚’ๅฎŸ่กŒใ—ใฆใ„ใพใ—ใŸใ€‚ ใใ“ใง infracost ใ‚’ๅฎŸ่กŒใ™ใ‚‹ workflow ใ‚’ใƒกใ‚คใƒณใฎ workflow ใจใƒžใƒผใ‚ธใ™ใ‚‹ใ“ใจใง็„ก้ง„ใช workflow ใฎๅฎŸ่กŒใ‚’ใชใใ—ใพใ—ใŸใ€‚ ใ“ใ‚Œใฏ้ซ˜้€ŸๅŒ–ใจใ„ใ†ใ‚ˆใ‚Šใฏ Self hosted Runner ใฎใƒชใ‚ฝใƒผใ‚นๅŠน็Ž‡ใฎๆ”นๅ–„ใจใ‚‚่จ€ใˆใพใ™ใ€‚ workflow ใ‚„ job ใ‚’ๅˆ†ๅ‰ฒใ—ใฆไธฆๅˆ—ๅฎŸ่กŒใ—ใฆ้ซ˜้€ŸๅŒ–ใ™ใ‚‹ๅ ดๅˆใ‚‚ใ‚ใ‚Šใพใ™ใŒใ€ Job ใ‚’ๅฎŸ่กŒใ™ใ‚Œใฐ Job ใ‚’ๅฎŸ่กŒใ™ใ‚‹ Node ใฎใ‚นใ‚ฑใ‚ธใƒฅใƒผใƒชใƒณใ‚ฐใ‚„ใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ—ใŒใ‚ใ‚Šใ€ใชใซใ‚‚ใ—ใชใใฆใ‚‚ใ‚ชใƒผใƒใƒผใƒ˜ใƒƒใƒ‰ใŒใ‚ใ‚Šใพใ™ใ€‚ ใพใŸ job ๆฏŽใซ checkout ใ‚’ๅฎŸ่กŒใ—ใฆใ„ใ‚ŒใฐไปŠๅ›žใฎใ‚ˆใ†ใซ checkout ใซๆ™‚้–“ใŒใ‹ใ‹ใ‚‹ใ‚ฑใƒผใ‚นใงใฏ็„ก้ง„ใŒๅคงใใใชใ‚Šใพใ™ใ€‚ #### shallow clone ๅ…ˆ่ฟฐใฎ้€šใ‚Š checkout ใซๆ™‚้–“ใŒใ‹ใ‹ใฃใฆใ„ใ‚‹ใฎใงๆ”นๅ–„ใ—ใพใ—ใŸใ€‚ ใพใš [shallow clone](https://github.blog/jp/2021-01-13-get-up-to-speed-with-partial-clone-and-shallow-clone/) ใ›ใšใซๅ…จๅฑฅๆญดใ‚’ checkout ใ—ใฆใ„ใ‚‹ job ใŒใ‚ใฃใŸใฎใงใ€ใชใœ shallow clone ใ—ใฆใ„ใชใ„ใฎใ‹่ชฟในใ€็‰นใซ็†็”ฑใŒใชใ‘ใ‚Œใฐ shallow clone ใ‚’ใ™ใ‚‹ใ‚ˆใ†ใซใ—ใ€ๅฟ…่ฆใŒใ‚ใ‚Œใฐใƒญใ‚ธใƒƒใ‚ฏใ‚’ๆ”นไฟฎใ—ใฆ shallow clone ใงใ‚‚ๅ‹•ใใ‚ˆใ†ใซใ—ใพใ—ใŸใ€‚ actions/checkout ใฏใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใง shallow clone ใชใฎใง็†็”ฑใ‚‚ใชใ shallow clone ใ‚’ใ—ใชใ„ใฎใฏๅค‰ใช่ฉฑใงใฏใ‚ใ‚Šใพใ™ใŒใ€ shallow clone ใง่‰ฏใ„ใจใ“ใ‚ใงใ‚‚ shallow clone ใ—ใชใ„ใ‚ณใƒผใƒ‰ใŒใ‚ณใƒ”ใƒšใ•ใ‚Œใฆๆฅใฆใ—ใพใฃใŸใจใ‹ใ€ๆญดๅฒ็š„็ตŒ็ทฏใง shallow clone ใงใใ‚‹ใ‚ˆใ†ใซใชใฃใŸใฎใซ shallow clone ใ—ใชใ„ใพใพใซใชใฃใฆใŸใจใ„ใ†ใ“ใจใŒ่€ƒใˆใ‚‰ใ‚Œใพใ™ใ€‚ PR ใงๅค‰ๆ›ดใ•ใ‚ŒใŸใ‚ณใƒผใƒ‰ใ‚’ๆคœๅ‡บใ™ใ‚‹ใฎใซ git ใ‚ณใƒžใƒณใƒ‰ใ‚’ไฝฟใฃใฆใ„ใฆใ€ใใ“ใง git ใฎๅฑฅๆญดใŒๅฟ…่ฆใชใฎใง shallow clone ใ ใจๅ‹•ใ‹ใชใ„ใ‚ฑใƒผใ‚นใ‚‚ใ‚ใ‚Šใพใ—ใŸใŒใ€ใใ“ใฏ GitHub API ใง PR ใงๅค‰ๆ›ดใ•ใ‚ŒใŸใƒ•ใ‚กใ‚คใƒซใฎไธ€่ฆงใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ“ใจใง่งฃๆฑบใ—ใพใ—ใŸใ€‚ [REST API endpoints for pull requests - GitHub Docs](https://docs.github.com/en/rest/pulls/pulls?apiVersion=2022-11-28#list-pull-requests-files) ใชใŠใ€ API ใ ใจ 3,000 ใƒ•ใ‚กใ‚คใƒซใพใงใ—ใ‹ๅ–ๅพ—ใงใใชใ„ใจใ„ใ†ๅˆถ็ด„ใฏใ‚ใ‚Šใพใ™ใŒใ€ใปใผๅ•้กŒใซใชใ‚‰ใชใ„ใจๆ€ใ„ใพใ™ใ€‚ #### ใƒชใƒใ‚ธใƒˆใƒชใซใ‚ณใƒŸใƒƒใƒˆใ•ใ‚Œใฆใ„ใ‚‹ zip ใƒ•ใ‚กใ‚คใƒซใฎๅ‰Š้™ค shallow clone ใงใ‚‚ๆ€ใฃใŸใปใฉ้€Ÿใใชใ‚‰ใชใ‹ใฃใŸใฎใŒไธๆ€่ญฐใ ใฃใŸใฎใงใ™ใŒใ€็ตๆง‹ใชๆ•ฐใฎๅคงใใ‚ใฎ zip ใƒ•ใ‚กใ‚คใƒซใŒใ‚ณใƒŸใƒƒใƒˆใ•ใ‚Œใฆใ„ใ‚‹ใ“ใจใŒๅˆคๆ˜Žใ—ใพใ—ใŸใ€‚ ใใ‚Œใ‚‰ใฏๅ…จใฆ Lambda Function ใฎใ‚ณใƒผใƒ‰ใงใ—ใŸใ€‚ ใพใšๅคงใใช zip ใƒ•ใ‚กใ‚คใƒซใฎใ‚ˆใ†ใชใƒใ‚คใƒŠใƒชใƒ•ใ‚กใ‚คใƒซใ‚’ Git ใง็ฎก็†ใ™ใ‚‹ใฎใฏ้ฉๅˆ‡ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ Git ใง็ฎก็†ใ™ใ‚‹ใจใ—ใŸใ‚‰ Git LFS ใฎใ‚ˆใ†ใชใ‚‚ใฎใ‚’ไฝฟใ†ในใใงใ—ใ‚‡ใ†ใŒใ€่‡ชๅˆ†ใฎ็†่งฃใŒๆญฃใ—ใ‘ใ‚Œใฐ Git LFS ใ‚’ไฝฟใฃใฆใ‚‚ shallow clone ใฏ้€Ÿใใชใ‚Šใพใ›ใ‚“ใ€‚ [About Git Large File Storage - GitHub Docs](https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-git-large-file-storage) ๅŠ ใˆใฆไปŠๅ›žใฎ zip ใƒ•ใ‚กใ‚คใƒซใฏใ‚ณใƒผใƒ‰ใ‹ใ‚‰็”Ÿๆˆใ•ใ‚ŒใŸ Lambda Function ใฎใ‚ณใƒผใƒ‰ใงใ™ใŒใ€ใ“ใ‚Œใ‚’ๆ‰‹ๅ…ƒใง็”Ÿๆˆใ—ใฆใ‚ณใƒŸใƒƒใƒˆใ™ใ‚‹ใฎใฏ CI ใฎ้ซ˜้€ŸๅŒ–ใจใฏๅˆฅใซๅคงใใชๅ•้กŒใŒใ‚ใ‚Šใพใ™ใ€‚ 1. ใ‚ณใƒผใƒ‰ใจ็”Ÿๆˆใ•ใ‚ŒใŸ zip ใซๅทฎๅˆ†ใŒใ‚ใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚‹(ใ‚ณใƒผใƒ‰ใ‚’ๆ›ดๆ–ฐใ—ใŸใ‚ใจใซใ†ใฃใ‹ใ‚Š zip ใ‚’ๆ›ดๆ–ฐใ—ๅฟ˜ใ‚Œใ‚‹ใจใ‹) 2. ๆ‚ชๆ„ใฎใ‚ใ‚‹ใ‚ณใƒผใƒ‰ใŒไป•่พผใพใ‚Œใ€ Lambda ใงๅฎŸ่กŒใ•ใ‚Œใ†ใ‚‹ 3. zip ใฎไธญ่บซใ‚’ PR ใƒฌใƒ“ใƒฅใƒผใ™ใ‚‹ใฎใŒๅ›ฐ้›ฃ ใใ“ใงๆ”นๅ–„ๆกˆใŒไธปใซ 2 ใคใ‚ใ‚Šใพใ™ใ€‚ 1. zip ใ‚’ S3 ใซ็งปใ™ 2. [lambroll](https://github.com/fujiwara/lambroll) ใชใฉใ‚’ไฝฟใฃใฆใƒ‡ใƒ—ใƒญใ‚คใ™ใ‚‹ ไปŠๅ›žๅ•้กŒใซใชใฃใฆใ„ใ‚‹ Lambda Function ใฏ SRE team ใŒ็ฎก็†ใ™ใ‚‹ใ‚‚ใฎใงใฏใชใ‹ใฃใŸใฎใงใ€ๅ…ทไฝ“็š„ใซใฉใ†ๅฏพๅฟœใ™ใ‚‹ใ‹ใฏใŠไปปใ›ใ—ใคใคใƒชใƒใ‚ธใƒˆใƒชใ‹ใ‚‰ zip ใƒ•ใ‚กใ‚คใƒซใ‚’ๅ‰Š้™คใ™ใ‚‹ใ‚ˆใ†ใซไพ้ ผใ—ใฆๅ›žใ‚Šใพใ—ใŸใ€‚ #### sparse checkout shallow clone ใงใ‚‚ๆ€ใฃใŸใปใฉ้€Ÿใใชใ‚‰ใชใ‹ใฃใŸใฎใงใ€ [sparse checkout](https://git-scm.com/docs/git-sparse-checkout) ใ‚’ใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ sparse checkout ใฏ [actions/checkout](https://github.com/actions/checkout) ใฎ sparse-checkout input ใงๅฏพ่ฑกใฎใƒ‘ใ‚นใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ ใ‘ใงใ™ใ€‚ ๅคงใใช Monporepo ใงใฏใƒชใƒใ‚ธใƒˆใƒชๅ…จไฝ“ใ‚’ checkout ใ›ใšใจใ‚‚ CI ใซๅฟ…่ฆใชใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚„่จญๅฎšใƒ•ใ‚กใ‚คใƒซใจๅฏพ่ฑกใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ ใ‘ checkout ใ™ใ‚Œใฐๅ‹•ใๅ ดๅˆใ‚‚ใ‚ˆใใ‚ใ‚Šใพใ™ใ€‚ ใพใŸใ€ไพ‹ใˆใฐ [actionlint](https://github.com/rhysd/actionlint) ใ‚„ [ghalint](https://github.com/suzuki-shunsuke/ghalint) ใง GitHub Actions Workflow ใฎ lint ใ‚’ใ™ใ‚‹ๅ ดๅˆ .github ้…ไธ‹ใ ใ‘ checkout ใ™ใ‚Œใฐๅๅˆ†ใ ใฃใŸใ‚Šใ—ใพใ™ใ€‚ ใŸใ ใ—ใ€ไพๅญ˜ใ™ใ‚‹ local Module ใชใฉใ‚‚ checkout ใ—ใฆใชใ„ใจๅ‹•ใ‹ใชใใชใฃใฆใ—ใพใ†ใ‚ฑใƒผใ‚นใŒใ‚ใ‚Šใพใ—ใŸใ€‚ ใใ“ใงๅ˜ใซ terraform ใ‚’ๅฎŸ่กŒใ™ใ‚‹ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ ใ‘ใงใชใใใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใŒไพๅญ˜ใ™ใ‚‹ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚‚ checkout ใ—ใชใ„ใจใ„ใ‘ใชใ„ใฎใงใ™ใŒใ€ใใฎไพๅญ˜้–ขไฟ‚ใ‚’ใ‚ณใƒผใƒ‰ใ‚’ checkout ใ™ใ‚‹ๅ‰ใซ่งฃๆฑบใ™ใ‚‹ใฎใฏๅ›ฐ้›ฃใงใ—ใŸใ€‚ ไปŠๅ›žใฎๅ ดๅˆใ€ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช้šŽๅฑคใฎๆœ€ๅˆใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใŒใ‚ตใƒผใƒ“ใ‚นๅใซใชใฃใฆใŠใ‚Šใ€ไป–ใฎใ‚ตใƒผใƒ“ใ‚นใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช้…ไธ‹ใซใ‚ใ‚‹ local Module ใ‚’ๅ‚็…งใ—ใฆใ„ใ‚‹ใ‚ˆใ†ใชใ‚ฑใƒผใ‚นใฏใชใ‹ใฃใŸใŸใ‚ใ€ไปฅไธ‹ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ใƒใ‚งใƒƒใ‚ฏใ‚ขใ‚ฆใƒˆใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - ใƒชใƒใ‚ธใƒˆใƒชๅ…จไฝ“ใงๅ…ฑ้€šใฎ local module ใŒ็ฝฎใ‹ใ‚Œใฆใ„ใ‚‹ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช - ๅค‰ๆ›ดใ•ใ‚ŒใŸใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใŒๅฑžใ™ใ‚‹ๆœ€ๅˆใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช - CI ใซๅฟ…่ฆใชใ‚นใ‚ฏใƒชใƒ—ใƒˆใชใฉใŒใ‚ใ‚‹ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช sparse checkout ใซใ‚ˆใ‚Š checkout ใŒๆ•ฐ็ง’ใง็ต‚ใ‚ใ‚‹ใ‚ˆใ†ใซใชใ‚Šใ€ๅคงใใช้ซ˜้€ŸๅŒ–ใซ็น‹ใŒใ‚Šใพใ—ใŸใ€‚ #### ใƒ•ใ‚กใ‚คใƒซใ‚„ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใฎๅญ˜ๅœจใƒใ‚งใƒƒใ‚ฏใฎใŸใ‚ใ ใ‘ใซๆ…‹ใ€… checkout ใ—ใฆใ„ใŸใฎใ‚’ GitHub Content API ใซ็ฝฎใๆ›ใˆ [REST API endpoints for repository contents - GitHub Docs](https://docs.github.com/en/rest/repos/contents) GitHub CLI ใ‚’ไฝฟใˆใฐ็ฐกๅ˜ใซใƒ•ใ‚กใ‚คใƒซใƒปใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใฎๅญ˜ๅœจใƒใ‚งใƒƒใ‚ฏใ‚’่กŒใˆใพใ™ใ€‚ ``` gh api \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ /repos/OWNER/REPO/contents/PATH?ref=main ``` #### ็„ก้ง„ใชๅ‡ฆ็†ใฎๅ‰Š้™ค ็„ก้ง„ใซ actions/setup-node ใง Node.js ใ‚’ใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ—ใ—ใฆใ„ใŸใ‚Šใ—ใŸใฎใงๅ‰Š้™คใ—ใพใ—ใŸใ€‚ใใ‚Œใ ใ‘ใง 10 ๆ•ฐ็ง’ใฎ็Ÿญ็ธฎใซใชใ‚Šใพใ—ใŸใ€‚ ใใ‚Œไปฅๅค–ใซใ‚‚่‰ฒใ€…็„ก้ง„ใชๅ‡ฆ็†ใ‚’ใชใใ—ใŸใ‚Šใ—ใพใ—ใŸใ€‚ #### terrform plan ใŒ no change ใฎใจใ infracost ใ‚’ skip terraform plan ใฎ็ตๆžœใ‚’ [infracost](https://github.com/infracost/infracost) ใซๆธกใ—ใฆ็ตๆžœใ‚’ PR ใซใ‚ณใƒกใƒณใƒˆใ—ใฆใ„ใพใ™ใŒใ€ใ“ใ‚Œใซ็ตๆง‹ๆ™‚้–“ใŒใ‹ใ‹ใฃใฆใ„ใพใ™ใ€‚ Infracost ใฏใƒชใ‚ฝใƒผใ‚นใฎๆ“ไฝœใซใ‚ˆใฃใฆใฉใฎ็จ‹ๅบฆ้‡‘้Šญ็š„ใ‚ณใ‚นใƒˆใŒ็™บ็”Ÿใชใ„ใ—ๅ‰Šๆธ›ใ•ใ‚Œใ‚‹ใ‹ใ‚’ๅ‡บๅŠ›ใ—ใฆใใ‚Œใ‚‹ใƒ„ใƒผใƒซใงใ™ใ€‚ ใ“ใ‚ŒใŒ terraform plan ใฎ็ตๆžœใซใ‹ใ‹ใ‚ใ‚‰ใšๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ—ใŸใŒใ€ terraform plan ใฎ็ตๆžœใŒ No Change ใงใ‚ใ‚Œใฐๅฝ“็„ถใ‚ณใ‚นใƒˆใฎๅค‰ๅŒ–ใ‚‚ใชใ„ใฏใšใงใ€ๆ™‚้–“ใ‚’ใ‹ใ‘ใฆ infracost ใ‚’ๅฎŸ่กŒใ™ใ‚‹ๆ„ๅ‘ณใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ใใ“ใง terraform plan ใฎ็ตๆžœใŒ No change ใฎใจใใฏ infracost ใ‚’ skip ใ—ใฆ้ซ˜้€ŸๅŒ–ใ—ใพใ—ใŸใ€‚ ## ๆˆๆžœ ๆง˜ใ€…ใชๆ”นๅ–„ใ‚’่กŒใฃใŸ็ตๆžœใ€ CI ใ‚’ 2 ๅˆ†ไปฅไธŠ้ซ˜้€ŸๅŒ–ใ™ใ‚‹ใ“ใจใŒๅ‡บๆฅใพใ—ใŸใ€‚ ไปฅไธ‹ใฎๅ›ณใฏ terraform plan ใ‚’ๅฎŸ่กŒใ™ใ‚‹ workflow ใฎๅฎŸ่กŒๆ™‚้–“ใ‚’ๆ—ฅใ”ใจใซ 70 percentile ใงใƒ—ใƒญใƒƒใƒˆใ—ใŸใ‚‚ใฎใงใ™ใ€‚ ![](https://cdn-ak.f.st-hatena.com/images/fotolife/s/seli07/20241016/20241016154328.png) ๆ™‚้–“ใซไผดใ† CI ใฎๅฎŸ่กŒๆ™‚้–“ใฎ้ท็งป ็ธฆ่ปธใŒๅฎŸ่กŒๆ™‚้–“ใงๆจช่ปธใŒๆ—ฅไป˜ใงใ™ใ€‚ ไผ‘ๆ—ฅใฏ workflow ใŒๅฎŸ่กŒใ•ใ‚Œใฆใ„ใชใ„ใฎใงใƒ‡ใƒผใ‚ฟใŒๆฌ ่ฝใ—ใฆใ„ใพใ™ใŒใ€ๅ…จไฝ“ใจใ—ใฆๅณไธ‹ใŒใ‚Šใ€ใคใพใ‚ŠๅฎŸ่กŒๆ™‚้–“ใŒ็Ÿญ็ธฎใ•ใ‚Œใฆใ„ใ‚‹ใฎใŒใ‚ใ‹ใ‚‹ใ‹ใจๆ€ใ„ใพใ™ใ€‚ ใชใŠใ€ terraform plan ใฎๅฎŸ่กŒๆ™‚้–“ใฏๅฝ“็„ถๅฏพ่ฑกใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใง็ฎก็†ใ•ใ‚Œใฆใ„ใ‚‹ใƒชใ‚ฝใƒผใ‚นใซไพๅญ˜ใ™ใ‚‹ใŸใ‚ใ€ๅคšใใฎใƒชใ‚ฝใƒผใ‚นใ‚’็ฎก็†ใ—ใฆใ„ใ‚‹ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใŒไฟฎๆญฃใ•ใ‚Œใ‚Œใฐใใฎๅˆ†ๅฎŸ่กŒๆ™‚้–“ใฏไผธใณใพใ™ใ€‚ใใฎใŸใ‚ใ€ใ‚ฐใƒฉใƒ•ใŒใ‚ใ‚‹็จ‹ๅบฆไนฑ้ซ˜ไธ‹ใ™ใ‚‹ใฎใฏไป•ๆ–นใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ๅŒๅƒšใ‹ใ‚‰ใฏใ€ŒCI ใŒ็ˆ†้€ŸใซใชใฃใฆๅŠฉใ‹ใฃใฆใ„ใ‚‹ใ€ใจใƒใ‚ธใƒ†ใ‚ฃใƒ–ใชใ‚ณใƒกใƒณใƒˆใ‚’ๅคšใใ„ใŸใ ใพใ—ใŸใ€‚ ๅŠ ใˆใฆ CIAnalyzer ใซใ‚ˆใฃใฆใƒ€ใƒƒใ‚ทใƒฅใƒœใƒผใƒ‰ใ‚’ๆง‹็ฏ‰ใ—ใ€็ถ™็ถš็š„ใซ CI ใฎๅฎŸ่กŒๆ™‚้–“ใ‚’ๅฏ่ฆ–ๅŒ–ใ™ใ‚‹ใ“ใจใŒๅ‡บๆฅใพใ—ใŸใ€‚ ไปŠๅ›žใฏ Terraform Monorepo ใซ CIAnalyzer ใ‚’ๅฐŽๅ…ฅใ—ใพใ—ใŸใŒใ€้žๅธธใซไพฟๅˆฉใ ใฃใŸใŸใ‚ไป–ใฎใƒชใƒใ‚ธใƒˆใƒชใธใฎๅฑ•้–‹ใ‚‚ๆคœ่จŽใ—ใฆใ„ใพใ™ใ€‚ ## ใ•ใ„ใ”ใซ ไปŠๅ›ž CI ใฎ้ซ˜้€ŸๅŒ–ใซ้–ข้€ฃใ—ใฆไธ€ๅฎšใฎๆˆๆžœใ‚’ไธŠใ’ใ‚‹ใ“ใจใŒๅ‡บๆฅใพใ—ใŸใŒใ€ CI ใฎๆ”นๅ–„ใฎใŸใ‚ใซใ‚„ใ‚‹ใ“ใจใฏใพใ ใพใ ใ‚ใ‚Šใพใ™ใ€‚ ็พๅœจ้€ฒใ‚ใฆใ„ใ‚‹ๆ–ฝ็ญ–ใ‚‚ใ‚ใ‚‹ใฎใงใ„ใšใ‚ŒใพใŸใƒ–ใƒญใ‚ฐใชใฉใง็ดนไป‹ใงใใ‚Œใฐใจๆ€ใ„ใพใ™ใ€‚