Share
Embed
Transcript
31 slides
-
ࣗݾհ • YORIFUJI MITSUNORI • @yorifuji on X / GitHub
/ Zenn • ۚ༥ܥελʔτΞοϓͷiOSΤϯδχΞ • ݸਓ͚ࢿΞϓϦʢSwiftʣۚ༥ػ͚ؔͷۀΞϓϦʢFlutterʣͷ։ൃ • લ৬௨৴ձࣾͷSIerͰB2BαʔϏεͷ։ൃͳͲ͍Ζ͍Ζʢ10ʙʣ • Flutterྺ2ఔɺFlutterେֶ1΄Ͳલʹೖձ -> Ұୀձͯ͠࠶Join • #ڞಉ։ൃ14_sansen ʹࢀઓͯ͠·͢ -
֤ࣾͷCIαʔϏεͷಛʢݸਓͷײʣ • Bitrise • ฮɺ҆ఆ͍ͯͯ͠ރΕ͍ͯΔɺAndroidiOSωΠςΟϒͷ͕ࣝ׆͔ͤΔ • Codemagic • ޙൃɺFlutterʹಛԽͯ͠ΔʢFlutter SDK͕ΠϯετʔϧࡁΈʣɺ͕ҙ֎ͱ͕݀͋ΔʢރΕ͍ͯͳ͍ʣ
• GitHub Actions • ΦʔϧϚΠςΟɺpublicϦϙδτϦͰͷར༻ແྉɺGitHubͱͷ࿈ܞ͕ڧΈ • Xcode Cloud • Apple७ਖ਼CIɺূ໌ॻཧ͕ෆཁɺXcode࿈ܞɺ͍҆ɺFlutterʹෆ͖ -
GitHub ActionsͰ fl utter testΛ ࣮ߦ͢ΔϫʔΫϑϩʔͷྫ ʢyamlϑΝΠϧʣ name: check on:
pull_request permissions: contents: read jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2 - run: flutter pub get - run: flutter test -
ࠓ͢ͷϫʔΫϑϩʔͰ ར༻͢ΔΞΫγϣϯͷํ name: check on: pull_request permissions: contents: read jobs:
test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2 - run: flutter pub get - run: flutter test -
Flutterͷ੩తղੳ • VSCode fl utter analyzeίϚϯυͰग़ྗ͞ΕΔίϨ • Error / Warning
/ Info ͷ3Ϩϕϧ • ඪ४Ͱ fl utter_lintsʹఆٛ͞Εͨϧʔϧʹج͍ͮͯղੳ • pedantic_monovery_good_analysis͕͓͢͢Ί -
͍ํstepʹՃ͢Δ ͚ͩ name: flutter-analyze-commenter example on: pull_request permissions: contents: read
pull-requests: write jobs: flutter-analyze: runs-on: ubuntu-latest steps: ... - run: flutter analyze --write=flutter_analyze.log - uses: yorifuji/flutter-analyze-commenter@v1 if: ${{ !cancelled() }} with: analyze_log: flutter_analyze.log -
GitHub Marketplace • GitHubެࣜɾOSSɾݸਓ͕࡞ͨ͠GitHub AppsΞΫγϣϯ͕ެ։͞ Ε͍ͯΔ • ΞΫγϣϯͰݕࡧ͢Δͱ 20,940 results
• ඞཁͳͷେମ͋Δ͕⭐͕গͳ͍ϚΠφʔͳActionΛར༻͢Δͱ͖ ηΩϡϦςΟϦεΫͳͲʹҙ͕ඞཁ -
ࣗ࡞ͷΞΫγϣϯΛMarketplaceʹొ͢Δखॱ • खॱ • GitHubʹpublic repositoryΛ࡞ • ΞΫγϣϯͷఆٛΛॻ͍ͨaction.ymlΛ࡞ • ΧελϜΞΫγϣϯͷ༰Λ࣮
• GitHub ্ͰReleaseΛ࡞ͯ͠ެ։ • ৄ͍͠खॱͪ͜Β • https://docs.github.com/ja/actions/creating-actions/about-custom-actions • ॳճʹར༻نͷಉҙ͕ඞཁ • https://docs.github.com/en/site-policy/github-terms/github-marketplace-developer-agreement -
࣮ࡍͷaction.yml ͷྫ ࠨɿΧελϜΞΫγϣϯͷఆٛɺӈɿCIͰݺͼग़͢ίʔυͷྫ name: "Flutter Analyze Commenter" author: "yorifuji" inputs:
analyze_log: description: "Path to the Flutter analyze log" required: true verbose: description: "Enable verbose logging" default: false runs: using: composite steps: - uses: actions/github-script@v7 env: ANALYZE_LOG: ${{ inputs.analyze_log }} VERBOSE: ${{ inputs.verbose }} with: script: | const analyzeLog = process.env.ANALYZE_LOG; ... jobs: flutter-analyze: runs-on: ubuntu-latest steps: ... - run: flutter analyze --write=flutter_analyze.log - uses: yorifuji/flutter-analyze-commenter@v1 with: analyze_log: flutter_analyze.log -
ΧελϜΞΫγϣϯͷ࣮ํ๏ • Docker ίϯςφʔ ΞΫγϣϯ • DockerΛ࣮ͬͯߦڥΛύοέʔδԽ͢ΔͷͰඞཁͳπʔϧґଘؔΛίϯςφͰཧͰ͖ΔͷͰҰ؏ੑͱ৴པੑΛ୲ อ͍͢͠ • ͨͩ͠ݱঢ়Linuxʢubuntuʣ
ͷϥϯφʔͰͷΈར༻Ͱ͖ΔʢmacOSWindowsར༻ෆՄʣ • JavaScript ΞΫγϣϯ • Node.jsΛͬͯJavaScriptͷίʔυΛ࣮ߦ͢Δ • TypeScriptͰͷ։ൃՄೳʢ࠷ऴతʹJavaScript͕ੜͰ͖ΔͳΒͳΜͰྑ͍ʣɺෳࡶͳ࣮Λ͢ΔͳΒ͓͢͢Ί • ෳ߹ΞΫγϣϯʢComosite Actionʣ • ௨ৗͷGitHub ActionsͷJob͔ΒSetpͷҰ෦ΛΓग़ͨ͠Πϝʔδ • uses: ͕ར༻ՄೳͳͷͰطଘͷΞΫγϣϯར༻Ͱ͖Δ -
actions/github-script // hello world - uses: actions/github-script@v7 with: script: console.log('Hello,
JavaScript') // use github rest api - uses: actions/github-script@v7 with: script: | github.rest.issues.get({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, }) // run separate file - uses: actions/github-script@v7 with: script: | const script = require('./path/to/script.js') console.log(script({github, context})) // in script.js module.exports = ({github, context}) => { return 'Hello, JavaScript' } • GitHub ActionsͰJavaScriptΛ࣮ߦ͢Δ ΞΫγϣϯ -
--writeΦϓγϣϯͰग़ྗ͞ΕΔ༰ͷྫ [error] A value of type 'int' can't be assigned
to a variable of type 'String' (/Users/yorifuji/git/ flutter_analyze_commenter_ci/lib/main.dart:4:20) [warning] The value of the local variable 'x' isn't used (/Users/yorifuji/git/ flutter_analyze_commenter_ci/lib/main.dart:4:16) [info] Use 'const' for final variables initialized to a constant value (/Users/yorifuji/git/ flutter_analyze_commenter_ci/lib/main.dart:4:3) -
ࠓճͷΧελϜΞΫγϣϯͷ࣮ͷৄࡉ • GitHubͷPRʹରͯ͠ίϝϯτΛॻ͖ࠐΉ • GitHubʹREST API͕༻ҙ͞Ε͍ͯͯGUIͰͰ͖Δ͜ͱେମAPI͔ΒͰ͖Δ • APIΛͬͯPRͷίʔυͷࠩʢdiffʣΛऔಘͯ͠ɺՃআ͞ΕͨϑΝΠϧ໊ߦ൪߸Λऔ ಘ͢Δ •
fl utter analyzeͷղੳ༰ͱdiffͷ༰ΛϑΝΠϧ໊ͱߦ൪߸Λݩʹಥ͖߹ΘͤΔͱPRͰࠞ ೖͨ͠ίʔυɾܯࠂͱϑΝΠϧ໊ɾߦ൪߸͕ಛఆͰ͖Δ • APIΛͬͯPRͷ൪߸ɺϑΝΠϧ໊ɺߦ൪߸ɺϝοηʔδͳͲΛࢦఆͯ͠ॻ͖ࠐΈΛߦ • PRʹίϝϯτ͕ө͞ΕΔ -
ࠓճͷΧελϜΞΫγϣϯͷ࣮ͷৄࡉ • ݹ͘ͳͬͨίϝϯτͷআ • PRʹରͯ͠Ճʢमਖ਼ʣίϛοτͰͷ͋ͬͨίʔυ͕আڈ͞ΕΔΑ͏ͳέʔε • fl utter analyzeͷ݁Ռ͔Β֘Օॴͷग़ྗ͕ফ͑Δ •
ίϝϯτΛআ͢Δ༷ʹ͍ͯ͠Δ • APIΛͬͯPRͷίϝϯτΛશ݅औಘͯ͠ɺ࠷৽ͷanalyzeͷ݁Ռͱ͖߹Θͤͯෆཁʹͳͬ ͨίϝϯτΛAPIܦ༝Ͱআ͍ͯ͠Δ • ਓ͕ؒॻ͖ࠐΜͩίϝϯτͱ۠ผ͢ΔͨΊʹ༧ΊΞΫγϣϯ͔ΒίϝϯτΛॻ͖ࠐΉࡍʹ ඇදࣔͷςΩετΛؚ·͍ͤͯΔʢ<!--- hogefuga --->ͷΑ͏ͳςΩετʣ -
ςετʹ͍ͭͯ • ݱঢ়ͰςετΛॻ͍͍ͯͳ͍🤯 • ΘΓʹE2EςετΛ͍ͯ͠Δ • fl utterΞϓϦͷϦϙδτϦͰࠓճ࡞ͨ͠ΞΫγϣϯΛؚΉCI͕ظ ௨Γʹಈ͘͜ͱΛ֬ೝ͍ͯ͠Δ •
ΧελϜΞΫγϣϯଆͷmain/develop/v1ϒϥϯνʹରͯ͠ubuntu/ macOS/windowsͷϚτϦοΫεͰE2Eςετ࣮ࢪ -
՝ࠓޙͷ༧ఆ • ར༻࣮͕গͳ͍ͷͰαΠυϓϩδΣΫτͳͲͰͬͯΈ͍ͯͩ͘͞ʢόάใࠂܴͰ͢ʣ • ςετΛॻ͘ • Pure-JavaScript͔ΒTypeScriptʹҠߦ͍ͨ͠ • JavaScriptΞΫγϣϯʢnpmʣͷҠߦ •
ݱঢ়ෳ߹ΞΫγϣϯʴJavaScriptͱ͍͏ߏ • easyͰ͋Δ͕نΛେ͖ͨ͘͠Γ֦ு͢Δࡍʹੜ࢈ੑ͕ྑ͘ͳ͍ • ͏ͪΐͬͱ໘ന͍͜ͱΛ͍ͨ͠ • ͷ͋ΔίʔυΛAI͕ࣗಈతʹमਖ਼ʢఏҊʣͯ͘͠ΕΔͱخ͔ͬͨ͠Γ...ʁ -
༨ஊɿ։ൃͨ͠Ϟνϕʔγϣϯ • ݩʑDangerͱ͍͏πʔϧΛ͍ͬͯͨ • ϓϧϦΫΤετͷମࡋ༰ΛνΣοΫ͢Δπʔϧ • SwiftΞϓϦͳͲͰΘΕ͍ͯͯ༗໊ͰރΕ͍ͯΔ • ҎԼͷͰෆຬ͕͋ͬͨ •
DangerΛಋೖ͢Δతͷઆ໌͕ඞཁ • RubyͰ࣮ߦ࣌ʹgemͷΠϯετʔϧ͕ඞཁ • ߴػೳ͚ͩͲFlutterͷ੩తղੳͷతͰΦʔόʔεϖοΫ • ΧελϜΞΫγϣϯΛ࡞ͬͯOSSͱͯ͠ެ։ͯ͠Έ͔ͨͬͨ