GitHubãŠãŒã¶ãŒã¯ããµãŒãã¹ã€ã³ãã©ã¹ãã©ã¯ãã£ã§GitHubã¢ã¯ã·ã§ã³ãå®è¡ããããã«æã«2000åãååŸããŸãããã®èªç±ãªæéãæå¹ã«æŽ»çšããŸãããã
Flutterã¢ããªã±ãŒã·ã§ã³ã®éçºè åãã«ãGitHubã¢ã¯ã·ã§ã³ã䜿çšããŠãã«ãªã¯ãšã¹ãããšã«ãã¹ããšã³ãŒãã¢ãã©ã€ã¶ãŒãå®è¡ããã¢ãŒãã£ãã¡ã¯ããäœæããŠFirebaseã§ãã¹ãããããã«ãããã€ããæ¹æ³ã説æããŸãã
人ã¯ããã«è¯ãããšã«æ £ããŸãããããŠã圌ã¯ããã«ãšãŠãæ £ããŠããã®ã§ãããããã€ããã®ããã§ã¯ãªãã£ããšããäºå®ã«ã€ããŠããèããŸãããç·ãšå±±çŸã«ã€ããŠã®å€ãéžè©±ãèšãããã«ã人çã®ãã¹ãŠã®åã³ã®å®çŸã¯ãããªãããããã®éåžžã«åã³ã奪ããããŸãã«ãã®ç¬éã«èµ·ãããŸãã
ããªãã®äœæ¥ãããžã§ã¯ããCI / CDã§ããŸããã£ãŠãããªããããªãã¯å¹žéãªäººã§ãã
ã¹ã¿ãŒãã¢ããã§äœæ¥ããŠããŠããã¹ãŠã®ãã€ãã©ã€ã³ãšããã¯ãèªåã®æã§æ éã«æ§æããŠãããããããŸããã
DevOpsããŒã å šäœãããªãã®å¹žçŠã管çããŠããå¯èœæ§ããããŸããæ¯æãæ°ããçµ±åãç®ã®åã§ã®ãã«ãæéã®æº¶è§£ãæ³åã絶ãããã¹ãŠã®å Žæã«ã¢ã»ã³ããªãå±éããããã®é«åºŠãªæè¡ã§æºè¶³ããŠããŸãã
ããã¯åé¡ã§ã¯ãããŸãããéèŠãªããšã¯ãã¢ã»ã³ããªãå®è¡å¯èœã§ããããšãåžžã«ç¢ºä¿¡ããŠãããšåæã«ãéçºè ãåžžã«ãã€ç ããã€ç ã«é¥ããããšããéåžžã«éå±ãªæ¥åžžæ¥åãèªåã§å ããããšã§ããã¡ãªã¿ã«ãæåŸã«Jiraã®åé¡ã®ã¹ããŒã¿ã¹ãæåã§å€æŽããã®ã¯ãã€ã§ããïŒã³ã¡ã³ããæžããŠããã ããã°å¹žãã§ãã
ããªãã®å¿«é©ãŸãŒã³ãé¢ãã
圌ãã¯ã©ãã§å¿«é©ãŸãŒã³ãé¢ããŸããããããŠæãéèŠãªã®ã¯ããªãã§ããïŒå€ãã®çç±ãå人ãããèªåã®ããŒçšã®å°ããªã¢ããªã±ãŒã·ã§ã³ã®äœæãæäŒã£ãŠã»ãããšé ŒãŸããŸãããããªãã¯ã€ãã«å€¢ã®ããããããžã§ã¯ããå®è£ ããæéãèŠã€ãããããããžã§ã¯ãã®äžç°ãšããŠèª€ã£ãŠäœæãããã©ã€ãã©ãªããªãªãŒã¹ããããšã«ããŸãããæåŸã«ãããªããšããªãã®ååã¯ãã¯ãŒã¯ã·ã§ããçšã®å°ããªãµã³ãã«ãããžã§ã¯ããæžãããšã«ããŸããã
ã©ã®ã·ããªãªã§ããæ°ããèå³æ·±ãã¿ã¹ã¯ããã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ã¯ãã空æ°ã®ãªãç°å¢ãã§ã®ãœãããŠã§ã¢éçºã®å³ããçŸå®ãšããã«è¡çªããã§ãããïŒã¯ããããæç¹ã§ã空æ°ã®ãããªã¹ããŒãã³ã¬ã¯ã¿ãŒãå¿ èŠã«ãªããŸãïŒã
ãCI / CDã¯é£ããâŠã
ãããªæãæ®æ®µã¯èªåã«äœãšèšã£ãŠããŸããïŒãããããŸããïŒããã³ããšã³ã/æºåž¯é»è©±ãæžããŠãããšããã§ãããããªãã®ãžã§ã³ãã³ã¹ã«ã€ããŠã¯äœãç¥ããŸããïŒããã®ãããªããšãç¥ãå¿ èŠã¯ãªããšèšã£ããã©ãããŸããïŒ
ã¯ããã³ã³ãœãŒã«ã³ãã³ãã䜿çšããŠãããžã§ã¯ãããã«ãã§ããå¿ èŠããããŸã-ããã ãã§ããããšããããå人çãªå°ããªãããžã§ã¯ãã§ãããIDEãæ¶åããã®ããã§ã«é£ãã巚倧ãªãã«ãã¢ãžã¥ãŒã«ã¢ã³ã¹ã¿ãŒã§ãªããŠããããªãã¯ããªãã®äººçã倧ãã«åçŽåããããšãã§ããŸãã
Github Actionsã¯ãšãŠãã·ã³ãã«ãªã®ã§ããã°ãã¡ããã§ãç°¡åã«ã»ããã¢ããã§ããŸãã
ããã§ã¯ãæçš¿ã¯äœã«ã€ããŠã§ããïŒ
ãã¹ãŠããšãŠãåçŽãªå Žåããªããã®äœåãèªãã§æéãç¡é§ã«ããã®ã§ããïŒç®æ¡æžãã§ãçãããŸãã
- Flutter. CI . , Flutter- . ,
- . Github Actions â . 2 000 ( ). - , .
- . Flutter Android iOS , - . , , , .
c CI/CD , . . ($).
Github Actions, !
Github Actionsã¯ããªããžããªã®ã¯ãŒã¯ãããŒãèªååã§ãããµãŒãã¹ã§ããã³ãŒããçŽæ¥èšè¿°ãã以å€ã«ããããžã§ã¯ãã§æåã§è¡ãããšã¯ãã¹ãŠãGithubã¢ã¯ã·ã§ã³ã«å§ä»»ã§ããŸããäžæ¬¡æ å ±æºã«ããã«ç²Ÿéãããå Žåã¯ãå ¬åŒããã¥ã¡ã³ãã«ã¢ã¯ã»ã¹ããŠãã ããã
å€ãã®å Žåãäœãèªååããå¿ èŠãããã®ãââãŸã£ããããããŸãããããŒã ã«ã¯ããµãŒãã¹ã®è€éãªAPIãç解ããŠããããœãªã¥ãŒã·ã§ã³ãæåããäœæããŠãããã°ããæéããããŸãããããŒã±ãããã¬ã€ã¹ã¯ãã®åé¡ã解決ããŸããå€ãã®äžè¬çãªã¿ã¹ã¯ã解決ããçŽ5000ã®æ¢è£œã®ã¢ã¯ã·ã§ã³ãå ¬éãããŠããŸãïŒããšãã°ãTelegramã§ã®ã€ãã³ãã«é¢ããéç¥ã®éä¿¡ããããžã§ã¯ããœãŒã¹ã®æè¡çè² åµã®åæãå€æŽããããã¡ã€ã«ã«å¿ããŠPRã«ã©ãã«ãèšå®ããŸãïŒãæªããã¥ãŒã¹ïŒãããã®å€ãã¯ã·ã§ã¢ãŠã§ã¢ã§ãããããªãå³ãã䜿çšå¶éããããŸãã
äœæ¥ããã»ã¹
Github Actionsã®ãã¹ãŠã¯ãã¯ãŒã¯ãããŒãäžå¿ã«å±éããŠããŸããåã¯ãŒã¯ãããŒã¯ãäœããããããã€è¡ãããšãã2ã€ã®è³ªåã«çããŸãã
äœããã¹ãããããã«ã¯ç¡æ°ã®ãªãã·ã§ã³ããããŸããæ¢è£œã®ã¹ã¯ãªãããŸãã¯èªåã§è¡ãã¹ã¯ãªããã䜿çšããŠããã«ãããã«ãããã¹ããããã³ãããã€ã§ããŸããã¯ãŒã¯ãããŒæ§æã®è©³çŽ°
ãã€å®è¡ãããããªããžããªã§çºçããã€ãã³ãã§ã¯ãŒã¯ãããŒãããªã¬ãŒã§ããŸãããã«ãªã¯ãšã¹ãã®äœæãã³ãããã¿ã°ã®ããã·ã¥ããŸãã¯ãããžã§ã¯ããžã®æ°ããã¹ã¿ãŒã®è¿œå ãããã¯ã®å®å šãªãªã¹ã
ã¯ãŒã¯ãããŒãã€ãã³ãã§ã¯ãªããç¹å®ã®æéãŸãã¯ç¹å®ã®é »åºŠã§å®è¡ããå¿ èŠãããå Žåã¯ãPOSIXcronæ§æãèªç±ã«äœ¿çšã§ããŸããå®æçãªã€ãã³ãã®è©³çŽ°
ãªããžããªã§ã¯ãå€ãã®ç°ãªãã¯ãŒã¯ãããŒãåæã«å ±åã§ããŸããåã¯ãŒã¯ãããŒã¯åå¥ã®YAMLãã¡ã€ã«ã«èšè¿°ãããŠãããåãã¡ã€ã«ã¯ãªããžããªã®ã«ãŒãã«ãã.github / workflowsãã£ã¬ã¯ããªã«ä¿åããå¿ èŠããããŸããã¯ãŒã¯ãããŒæ§æã®è©³çŽ°
å®è¡æç°å¢
Github Actionsã«ã¯ãã¯ãŒã¯ãããŒãå®è¡ããããã®2ã€ã®ãªãã·ã§ã³ããããŸãã
- Github-hosted runners â , . Windows, Linux macOS. , Codemagic, ( ). , , ;
- Self-hosted runners â , . Github , .
ç§ã®èšäºã§ã¯ãæåã®ãªãã·ã§ã³ã«çŠç¹ãåœãŠãŸããç§ãã¡ã¯å¯èœãªéãåçŽãªéããã©ã£ãŠããŸãããïŒ
Flutterã®åºæ¬çãªã¯ãŒã¯ãããŒã®èšå®
ã¯ãŒã¯ãããŒã®æ§æãéå§ããåã«ã2ã€ã®ããšã«åæããå¿ èŠããããŸãã
ãŸããã¯ãŒã¯ãããŒã®äž»ãªåœ¹å²ã¯ãã³ãŒãããŒã¹ã®å èš³ãè€éã«ããããšã§ãããã«ããããªããæœåšçãªåé¡ãå«ãŸããããŸãã¯ãã¹ãã«å€±æããã³ãŒãã¯ãäž»æµã«ãªãã¹ãã§ã¯ãããŸããã
第äºã«ïŒç§ã®æ§æã«ã¯ããªãã®ãããžã§ã¯ãã«é¢ä¿ã®ãªã埮åŠãªç¹ããããããããŸããã説æããããšæããŸãããã ãããã®èšäºãã¬ã€ããšããŠäœ¿çšããŠããå Žåã¯ãæ éã«åããŠãã ããã
æåŸã«ãã¯ãŒã¯ãããŒã§äœããã¹ããã決å®ããŸããããæ£ããæ¹åã«é²ãããã®èšç»ãå¿ èŠã§ãã
å®æããã¢ã»ã³ããªãžã®ã¹ããããã€ã¹ããã
äžèšã®èšç»ã¯ãç¬èªã®ã¯ãŒã¯ãããŒãèšå®ããéã®ãã§ãã¯ãªã¹ããšããŠäœ¿çšã§ããŸããããã¹ãïŒ
- ã¯ãŒã¯ãããŒã«æå³ã®ããååãä»ããŸãã
- ã¯ãŒã¯ãããŒãéå§ãããã€ãã³ãã瀺ããŸãã
- èµ·åããæ§æããã·ã³ã§æ±ºå®ããŸãã
- ã¯ãŒã¯ãããŒã®æ§ææé ã決å®ããŸãã
- ãããžã§ã¯ãããã§ãã¯ã¢ãŠããã
- Javaã®ã€ã³ã¹ããŒã«ã
- Flutterã®ã€ã³ã¹ããŒã«ïŒèŠããŠããããã«ãã¯ãªãŒã³ãªã€ã³ã¹ã¿ã³ã¹ãèªç±ã«äœ¿çšã§ããããã«ãªããã³ã«ïŒã
- ãããžã§ã¯ãããã±ãŒãžã®ããŠã³ããŒãã
- éçã¢ãã©ã€ã¶ãŒãèµ·åãã
- ãã¹ãã®å®è¡ã
- ãã«ãã¢ã»ã³ããªèªäœã
- ãã¹ã¿ãŒãå ¥æã§ããå Žæã«ãã«ãããããã€ããŸãã
ä»ãç§ãã¡ã®ä»äºã¯å ·äœçãªåœ¢ã«ãªã£ãŠããŸããå®è£ ã«ç§»ããŸãããã
ç§ãã¡ã®ã¯ãŒã¯ãããŒã¯æåŸã«ã©ã®ããã«èŠããã
â . , , .
name: Flutter PR
on:
pull_request:
branches:
- "dev/sprint-**"
paths-ignore:
- "docs/**"
- "openapi/**"
- ".vscode/**"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-java@v1
with:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
channel: "stable"
- run: sh ./scripts/flutter_pub_get.sh
- run: sh ./scripts/flutter_analyze.sh
- run: flutter test
- run: flutter build apk --release
- uses: actions/upload-artifact@v1
with:
name: APK for QA
path: build/app/outputs/apk/dev/debug/apk_name.apk
- name: Upload artifact to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{ secrets.FIREBASE_ANDROID_PROD_APP_ID }}
token: ${{ secrets.FIREBASE_TOKEN }}
groups: testers
file: build/app/outputs/apk/dev/debug/apk_name.apk
debug: true
åå
æããã«ãååããã®æ¬è³ªãã§ããã ãæ£ç¢ºã«åæ ããããã«ãã¯ãŒã¯ãããŒã«ååãä»ããå¿ èŠããããŸããååïŒdocsïŒã¯ãã¯ãŒã¯ãããŒã®å®è¡æã«ã¢ã¯ã·ã§ã³ã³ã³ãœãŒã«ã«æåã«è¡šç€ºããããã®ã§ããã¯ãŒã¯ãããŒã«ãã®ããã«ååãä»ããçç±ã¯ãããã«ããããŸãã
name: Flutter PR
ããªã¬ãŒã€ãã³ã
ãonã ãããã¯ïŒdocsïŒã䜿çšãããšãç»é²æã«ã¯ãŒã¯ãããŒãéå§ãã1ã€ä»¥äžã®ã€ãã³ããæå®ã§ããŸããããã«ãäžéšã®ã€ãã³ãã¯åŸ®èª¿æŽã§ããŸãã
ã©ã®ã€ãã³ããéžæããŸããïŒå èš³ãèŠéããªãããã«ãå°ãªããšãæ¢åã®ãã¹ãŠã®ã€ãã³ããæå®ã§ããŸãããã®åŸãã¢ã»ã³ããªã¯ã»ãŒç¶ç¶çã«å®è¡ãããŸããããããå¿ èŠã§ããïŒãããããã®å Žåã®ããã«ãç¡ææéãã©ã³ã®å¶éã¯çŽ æŽãããããã«çµäºããŸããæé©ãªãœãªã¥ãŒã·ã§ã³ãæ¢ããŸãã
ç§ãã¡ã®ãããžã§ã¯ããããã«ãªã¯ãšã¹ãã®äœæãéããŠã®ã¿ãã³ãŒãããããžã§ã¯ãã®ã¡ã€ã³ãã©ã³ãã«çŽæ¥ããã·ã¥ããããšã¯ã§ããªããšããåæã«æºæ ããŠãããšä»®å®ããŸããããã¯ãŒã¯ãããŒããã«ãªã¯ãšã¹ãã®äœæã«å¿çããå€æŽãããã³ãŒãããŒã¹ãããããžã§ã¯ãããã«ããããã©ããã¯è«ççã§ãã
on: pull_request
$ããã¯ä»äºã«ã¯ååã§ããã解決çã¯ãŸã ããŸãæé©ã§ã¯ãããŸããããã«ãã¯ããã«ãªã¯ãšã¹ããäœæããããã³ã«ããªã¬ãŒãããŸãããããžã§ã¯ãã®ã¡ã€ã³ãã©ã³ãã«åãããããã«ãªã¯ãšã¹ãã®ã¿ã«é¢å¿ããããããããã¯åé·ã§ããGithub Actionsã®æ§æã䜿çšãããšãé¢å¿ã®ãããã©ã³ãã®ååïŒãŸãã¯ãã¹ã¯ïŒãæå®ã§ããŸãã
on:
pull_request:
branches:
- "dev/sprint-**"
$ãããŠãŸããããã»ã¹ãæé©åããæ¹æ³ãæ¢ããŠããŸããçè«äžã§ãããããžã§ã¯ãã«å®³ãåãŒãããšã®ãªããã¡ã€ã«ããããŸãããããžã§ã¯ãããã¥ã¡ã³ããSwaggerãäžè¬çãªã³ãŒãã¹ã¿ã€ã«ã®èšå®ãIDEã§ãã幞ãããã¹ãã¹ã¯ã«ãã£ãŠãã®ãããªãã¡ã€ã«ãç¡èŠããããšãã§ããŸãããã®çµæããonããããã¯ã¯æ¬¡ã®ããã«ãªããŸãã
on:
pull_request:
branches:
- "dev/sprint-**"
paths-ignore:
- "docs/**"
- "drz-swagger/**"
- ".vscode/**"
éèŠïŒãã«ãªã¯ãšã¹ãã¯ãããŒãžããæºåãã§ããŠããå Žåã«ã®ã¿è¡ã£ãŠãã ãããäœææžã¿ã®ãã«ãªã¯ãšã¹ãã次ã«ããã·ã¥ãããã³ã«ãã¯ãŒã¯ãããŒãåéãããŸãã
ãžã§ãæ§æ
ããã§ããžã§ããæ§æããæºåãæŽããŸããïŒdocsïŒãä»ãããã¯ãŒã¯ãããŒã§ãžã§ããæãã圹å²ãæ確ã«ãããšãã§ãã
ãã¹ãŠã®ã¯ãŒã¯ãããŒã«ã¯ãå°ãªããšã1ã€ã®ãžã§ããå«ãŸããŠããå¿ èŠããããŸããããã¯ãã¹ããããã€ã¹ãããã®èª¬æãå«ããžã§ãã§ããã¹ãããç§ãã¡ã¯ç§ãã¡ã®ãããžã§ã¯ããå®è¡ããŸãã1ã€ã®ã¯ãŒã¯ãããŒã®ãžã§ãæ°ãããã³1ã€ã®ãžã§ãã®ã¹ãããæ°ã«å¶éã¯ãããŸãããããã©ã«ãã§ã¯ããããžã§ãã®å¥ã®çµæãžã®äŸåé¢ä¿ãæå®ãããŠããªãéãããã¹ãŠã®ãžã§ãã䞊è¡ããŠå®è¡ãããŸããç§ãã¡ã®ãããžã§ã¯ãã«ã¯ããããžã§ã¯ãã®æ§ç¯ãæ åœããåäžã®ä»äºããããŸãã
ç°å¢ã®ã»ããã¢ãã
ã¯ãªãŒã³ãªä»®æ³ãã·ã³ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãŒã¯ãããŒãå®è¡ããããã³ãéžæã§ããã®ã¯ããã®ãã·ã³ã«ã€ã³ã¹ããŒã«ããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã ãã§ããäœãéžã¶ïŒ
ã¿ãŒã²ãããã©ãããã©ãŒã ïŒAndroidãšiOSïŒçšã®Flutterã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšãèšç»ããŠãããããmacOSãéžæããã®ã¯é åçã§ããæªããã¥ãŒã¹ã macOSã§ã€ã³ã¹ã¿ã³ã¹ã䜿çšããå Žåã®1åéã¯ãUbuntuã§ã€ã³ã¹ã¿ã³ã¹ã䜿çšããå Žåã®10ïŒ10 !!!ïŒåãšããŠè«æ±ãããŸãã Windowsã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ããã®å ŽåãiOSã¢ã»ã³ããªãã¢ã»ã³ãã«ããããšã¯ãŸã äžå¯èœã§ããããã®äœ¿çšæéã¯Ubuntuã®ã€ã³ã¹ã¿ã³ã¹ã®2åã§ããããããŸã£ããæå³ããããŸããã$ã®è«æ±ã«ã€ããŠã®è©³çŽ°
2,000åã®ç¡ææéã200ã«ãªããªãããã«ããã«ã¯ã©ãããã°ããã§ããïŒè¯ã解決çã¯ãããŸããããã«ãªã¯ãšã¹ããäœæãããšãã«ãiOSã§ãã«ãããã«ãããªãããšã«ããŸãããããã¯ãiOSãã«ãã®å®å®æ§ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã劥åãªãã·ã§ã³ããããŸã-pubspec.yamlãŸãã¯/ iosãã£ã¬ã¯ããªããä»»æã®ãã¡ã€ã«ãå€æŽããå Žåã«ã®ã¿macOSã§iOSãã«ãããã«ããããããã以å€ã®å Žåã¯ãUbuntuã䜿çšããã€ã³ã¹ã¿ã³ã¹ã§Androidãã«ãã®ã¿ããã«ãããŸããããã¯ããonããããã¯ã®ç¡èŠãã¡ã€ã«ãèšå®ããæ¹æ³ãšåæ§ã«è¡ãããšãã§ããŸãã
jobs:
build:
runs-on: ubuntu-latest
æè¡ä»æ§ãšãã€ã³ã¹ããŒã«ãããŠãããããã«äœ¿çšã§ããããœãããŠã§ã¢ã®ãªã¹ãã 確èªã§ããŸããæ®å¿µãªãããFlutterãšJavaã¯ãã®ãªã¹ãã«å«ãŸããŠããŸãããã¯ãŒã¯ãããŒãå®è¡ãããã³ã«æåã§ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
æ ãŠãŠæ¥ãã§ã¯ãããŸãããæ¢æã®ã¢ã¯ã·ã§ã³ãç§ãã¡ã®å©ãã«ãªãããããç§ãã¡ã®ä»äºã®ã¹ãããã§äœ¿çšããããšãã§ããŸãã2ã€äœ¿çšããŸãã
- ã¢ã¯ã·ã§ã³/ã»ããã¢ãã-java -Javaç°å¢ãã»ããã¢ããããããã®å
¬åŒã¢ã¯ã·ã§ã³ã
- subosito / flutter-actionã¯ã FlutterSDKãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããããã®éå
¬åŒã®ã¢ã¯ã·ã§ã³ã§ããããèªäœãååã«èšŒæãããŠããŸããããšãã°ãç®çã®ãã¬ãŒã ã¯ãŒã¯ãã£ãã«ãæå®ããããç¹å®ã®SDKããŒãžã§ã³ã«åãæ¿ããããããªã©ãå¿
èŠãªããšããã¹ãŠå®è¡ã§ããŸãã
steps:
- uses: actions/setup-java@v1
with:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
channel: "stable"
ãªããžããªã®ã¯ããŒãã³ã°
Githubããæ°åéã¬ã³ã¿ã«ãããã·ã³ã®ã¯ãªãŒã³ãªã€ã³ã¹ã¿ã³ã¹ããããŸããåã®ã¹ãããã§ã¯ãå¿ èŠãªãã¹ãŠã®ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããŸããã次ã«ããããžã§ã¯ãã®ãœãŒã¹ãªããžããªã®ã¯ããŒã³ãäœæããå¿ èŠããããŸãããããè¡ãã«ã¯ãæ¢è£œã®ããŒã«ã䜿çšããŸãã
- ã¢ã¯ã·ã§ã³/ãã§ãã¯ã¢ãŠãã¯ãã»ãšãã©ã®å Žåã«å¿
èŠãšãããªã倧éã®èšå®ã䜿çšããŠãªããžããªãã¯ããŒã³åããããã®å
¬åŒã¢ã¯ã·ã§ã³ã§ããã¯ãŒã¯ãããŒã¯ã¯ããŒã³äœæããŠãããªããžããªã§çŽæ¥å®è¡ããããããæ瀺çã«æå®ããå¿
èŠã¯ãããŸããã
- uses: actions/checkout@v1
äŸåé¢ä¿ã®èªã¿èŸŒã¿
ãããŸã§ãç§ãã¡ã¯èªåãã¡ã®æã§æé ãå®è¡ããã®ã§ã¯ãªããç§ãæäŸããæ¢æã®ã¢ã¯ã·ã§ã³ã®ã¿ã䜿çšããŠããŸããã次ã«ããããžã§ã¯ãã®ã¢ã¯ãã£ããã«ããã§ãŒãºã®å®è£ ã«ç§»ããŸããããã§ã¯ãã¹ãããã®å®è£ ãèªåã§äœæãããšããæ¥ãŸããã
ãã«ãããåã«ãpubspec.yamlãã¡ã€ã«ã®äŸåé¢ä¿ãããã¯ã«ãªã¹ããããŠãããã¹ãŠã®ããã±ãŒãžãšããããã®ãã¹ãŠã®äžæçãªäŸåé¢ä¿ãããŠã³ããŒãããå¿ èŠããããŸãããããè¡ãããã«ãFlutterSDKã¯ããã«äœ¿çšã§ããç°¡åãªã³ãã³ããæäŸããŸã
flutter pub get
ãã¹ãããã®å®è£
ã¯ã1ã€ã®ç«¯æ«ã³ãã³ããåŒã³åºãããšã§æ§æã§ããŸãããã®å Žåã次ã®ã¹ãããã¯ããã®ã³ãã³ãã®å®äºæã«ã®ã¿åŒã³åºãããŸãã
- run: flutter pub get
ãããžã§ã¯ãã®æ§é ãè€éã§ãããŒã«ã«ã«æ¥ç¶ãããŠããå€æ°ã®ããŒãããã±ãŒãžãå«ãŸããŠããå Žåãåé¡ãçºçããŸãã
flutter pub get
ãããã®åããã±ãŒãžãæ瀺çã«åŒã³åºããã«ãããžã§ã¯ããæ§ç¯ããããšã¯äžå¯èœã§ããç§ã®ãããžã§ã¯ãã§ã¯ããã®ãããªããã±ãŒãžã¯ã«ãŒããã£ã¬ã¯ããªã«ãã/ coreãã©ã«ããŒã«åéãããŸãã以äžã¯ããã®åé¡ã解決ããã¹ã¯ãªããã§ããããã¯ãåãã«ãŒããã£ã¬ã¯ããªã®/ scriptsãã©ã«ããŒã«ããflutter_pub_get.shãã¡ã€ã«ã«èšè¿°ãããŠããŸãã
flutter pub get
cd core
for dir in */ ; do
echo ${dir}
cd ${dir}
pwd
flutter pub get
cd ..
pwd
if [ "$#" -gt 0 ]; then shift; fi
# shift
done
stepã®å®è£ ã¯ä»»æã®ç«¯æ«ã³ãã³ãã«ããããšãã§ãããããã·ã§ã«ã¹ã¯ãªããã®å®è¡ã劚ãããã®ã¯äœããããŸããã
- run: sh ./scripts/flutter_pub_get.sh
éçã³ãŒãåæ
Flutterã¯ãçµã¿èŸŒã¿ã³ãã³ãã䜿çšã
flutter analyze
ãŠéçã¢ãã©ã€ã¶ãŒãå®è¡ããããã«å§ããŠããŸããããã¯ãã³ãŒãããŒã¹ã®æœåšçãªåé¡ãæ©ã段éã§ç¹å®ããã®ã«åœ¹ç«ã¡ãŸãããã°ãæ¬çªç°å¢ã«å°éããåããŸãã¯ã³ãŒããèªã¿åãäžèœã§ãµããŒããããŠããªãæ··ä¹±ã«å€ããåã§ãã
ããã«äœ¿çšã§ããæ©èœãå©çšããããšãã§ããŸããããæ®å¿µãªãããããã©ã«ãã®ããŒã åäœ
flutter analyze
ã«ã¯æ¬ é¥ããããééã£ãã¿ã€ãã³ã°ã§ã¯ãŒã¯ãããŒãå°ç¡ãã«ãªããŸãã
ã¢ãã©ã€ã¶ãŒã«ãã£ãŠæ€åºãããåé¡ã¯ãæ å ±ãèŠåããšã©ãŒã®3ã€ã®é倧床ã¬ãã«ã«åé¡ãããŸãããã®å·ã§ã¯åæäžã«æ å ±ã¯ã©ã¹ã®åé¡ã®ã¿ãèŠã€ãã£ãå Žåã§ãïŒãããŠä»ããã§ããããä¿®æ£ããããšã«æéãè²»ãã䟡å€ããããšã¯éããªãïŒãã³ãã³ãã¯ã³ãŒãã1ããè¿ãããã®çµæãã¢ã»ã³ããªãã¯ã©ãã·ã¥ããããšã説æãããŠããŸãã
äžæçãªè§£æ±ºçãšããŠã次ã®ã¹ã¯ãªããã䜿çšããããšããå§ãããŸããä»åŸããšã©ãŒã¬ãã«ã«åé¡ãããå Žåã«ã®ã¿ãã¢ã»ã³ããªãã¯ã©ãã·ã¥ããŸãã
OUTPUT="$(flutter analyze)"
echo "$OUTPUT"
echo
if grep -q "error â¢" echo "$OUTPUT"; then
echo "flutter analyze found errors"
exit 1
else
echo "flutter analyze didn't find any errors"
exit 0
fi
ã¯ãŒã¯ãããŒã®æ¬¡ã®ã¹ãããã§ã·ã§ã«ã¹ã¯ãªãããå®è¡ããŸãã
- run: sh ./scripts/flutter_analyze.sh
ãã¹ãã®å®è¡
ãããžã§ã¯ãã«ãã¹ããããå Žåã¯ãæ£ããæ¹åã«é²ãã§ããŸãããã¹ããæ©èœããã«ã¯ããã¹ããäœæããã ãã§ã¯äžååã§ããå®è£ ã®æ¬ é¥ãæéå ã«ä¿®æ£ããããå¿ èŠã«å¿ããŠæŽæ°ãããããããã«ããã¹ããå®æçã«å®è¡ããå¿ èŠããããŸãããããã£ãŠã次ã®ã¹ãããã§ã¯ãå®è£ ããŸã
- run: flutter test
泚æïŒå®è£ ããããã¹ããå«ãŸãªã空ã®ãã¹ãã¯ã©ã¹ã¯ãã¯ãŒã¯ãããŒå šäœãã¯ã©ãã·ã¥ãããŸããå¯äžã®æ¹æ³ããããŸããå°ãªããšã1ã€ã®ãã¹ããå®è£ ããæºåãã§ãããŸã§ããã¹ãã¯ã©ã¹ã宣èšããªãã§ãã ããã
æ§ç¯ããŠçœ²åãã
ãã¹ãŠã®æºåäœæ¥ã¯çµäºããŸãããã³ãŒãã«æãããªåé¡ãå«ãŸããŠããªãå¯èœæ§ãé«ãããšã確èªããŸããã次ã«ãæãéèŠãªæ®µéã§ããã¢ãŒãã£ãã¡ã¯ãã®äœæã«ç§»ããŸããã€ãŸããAPKãæ§ç¯ããŸãã
ã¢ã»ã³ããªèªäœã®å®è£ ã¯éåžžã«ç°¡åã§ããã¿ãŒããã«ã³ãã³ãã®ãã©ãã¿ãŒãã«ããèªç±ã«äœ¿çšã§ããŸããããã¯éåžžã«æ·±ãæ§æå¯èœã§ãç¹å®ã®ãã¬ãŒããŒãã¡ã€ã³ãã¡ã€ã«ãABIã®ã¢ãŒãã£ãã¡ã¯ãããã«ãã§ããŸãããã®èšäºã§ã¯ãããã®ãã¥ã¢ã³ã¹ã«ã€ããŠã¯èª¬æããŠããŸãããå¿ èŠã«å¿ããŠãè¿œå ã®ã³ãã³ããã©ã°ã䜿çšããŠãã ããã
- run: flutter build apk --release
ç§ãã¡ã®ç®æšã¯ããªãªãŒã¹ããŒã§ã¢ã»ã³ããªã«çœ²åããããšã§ãããããŠããã®æ®µéã§ã¯ããªãªãŒã¹ããŒã¹ãã¢ãšãã®ãã¹ãŠã®ãšã€ãªã¢ã¹ãšãã¹ã¯ãŒããã©ããã«ä¿åããå¿ èŠããããããã»ãã¥ãªãã£ã®åé¡ã解決ããå¿ èŠããããŸãã
Githubã䜿çšãããšãæååå€ãå°çšã®ã·ãŒã¯ã¬ãããªããžããªã«å®å šã«ä¿åã§ããŸããããã§å©çšå¯èœãªããŒã¿ã¯é©åãªãªããžããªã«ä¿åãããã¯ãŒââã¯ãããŒã®ä»»æã®ã¹ãããããããã°ã©ã ã§èªã¿åãããšãã§ããŸããåæã«ãå€ã¯GithubWebã€ã³ã¿ãŒãã§ã€ã¹ããã¯è¡šç€ºãããŸãããåé€ãŸãã¯äžæžãã®ã¿ãèš±å¯ãããŸãã
ããã¯ãç¹ã«ç¬èªã®ã»ãã¥ãªãã£ãµãŒãã¹ã®å Žåããšã€ãªã¢ã¹ãšãã¹ã¯ãŒãã«é©ãããœãªã¥ãŒã·ã§ã³ã®ããã«èŠããŸããã*ãjksãã¡ã€ã«èªäœã¯ã©ãã§ããããããªããžããªããã©ã€ããŒãã§ãã£ãŠãããªããžããªã«ããã·ã¥ããã®ã¯è¯ãèãã§ã¯ãªãããã§ããæ®å¿µãªãããGithubã¯ãã¡ã€ã«ãä¿åããå®å šãªæ¹æ³ãæäŸããŠããªããããåé¿ããå¿ èŠããããŸãã
ããŒã¹ãã¢ãã¡ã€ã«ãæååãšããŠè¡šããšäŸ¿å©ã§ãããããŠããã¯æ¬ç©ã§ã-ããªãã¯ãããbase64ã§ãšã³ã³ãŒãããå¿ èŠããããŸãããããè¡ãã«ã¯ã* .jksãã¡ã€ã«ãå«ããã£ã¬ã¯ããªã§ã¿ãŒããã«ãéãã次ã®ã³ãã³ããå®è¡ããŸãã次ã«ãããŒã¹ãã¢ã®base64è¡šçŸãã³ããŒã§ããããã¹ããã¡ã€ã«ãäœæãããGithubã·ãŒã¯ã¬ããã«ä¿åãããŸãã
openssl base64 < key_store_filename.jks | tr -d '\n' | tee keystore.jks.base64.txt
ã¢ã»ã³ããªã«æ£åžžã«çœ²åããããã«å¿ èŠãªãã¹ãŠã®èŠçŽ ãæã£ãã®ã§ãã¹ãããã®æ§æã«é²ã¿ãŸãã envãããã¯ã§ã¯ããã®ç¹å®ã®ã¹ãããã®ãã¹ãŠã®ç°å¢å€æ°ã宣èšããŸããã·ãŒã¯ã¬ãããããããã®å€æ°ã®å€ãååŸããŸãã
- run: flutter build apk --release
env:
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
STORE_FILE: ${{ secrets.STORE_FILE }}
Androidãã¹ãã§ã¯ã眲åãããã¢ã»ã³ããªãããŒã«ã«ã§æ§ç¯ããæ©èœã倱ãããšãªããCIã§ã* .apkãã¡ã€ã«ã«çœ²åã§ããããã«ã¢ã»ã³ããªæ§æãèšè¿°ããå¿ èŠããããŸããkeystoreConfig.gradleãã¡ã€ã«ããã®ç¬éãæ åœããŸããkeystore_release.propertiesãã¡ã€ã«ãèŠã€ãã£ã
å Žåããã«ãã¯ããŒã«ã«ã§è¡ãããããšãããã£ãŠããŸããã€ãŸãããã¡ã€ã«ããèªã¿åãã ãã§ãkeystoreConfigã®ãã¹ãŠã®ããããã£ãåæåã§ããŸãããã以å€ã®å Žåãã¢ã»ã³ããªã¯CIã§è¡ãããŸããã€ãŸããæ©å¯ããŒã¿ã®å¯äžã®ãœãŒã¹ã¯Githubã·ãŒã¯ã¬ããã§ãã
ext {
def releaseKeystorePropsFile = rootProject.file("keystore/keystore_release.properties")
if (releaseKeystorePropsFile.exists()) {
println "Start extract release keystore config from keystore_release.properties"
def keystoreProps = new Properties()
keystoreProps.load(new FileInputStream(releaseKeystorePropsFile))
keystoreConfig = [
storePassword: keystoreProps['storePassword'],
keyPassword : keystoreProps['keyPassword'],
keyAlias : keystoreProps['keyAlias'],
storeFile : keystoreProps['storeFile']
]
} else {
println "Start extract release keystore config from global vars"
keystoreConfig = [
storePassword: "$System.env.STORE_PASSWORD",
keyPassword : "$System.env.KEY_PASSWORD",
keyAlias : "$System.env.KEY_ALIAS",
storeFile : "$System.env.STORE_FILE"
]
}
println "Extracted keystore config: $keystoreConfig"
}
ãããŠãããã¯keystore_release.propertiesãã¡ã€ã«ãã©ã®ããã«èŠãããã§ãïŒ
storePassword={___}
keyPassword={___}
keyAlias={___}
storeFile=../keystore/keystore.jks
Androidãã¹ãã®build.gradleãã¡ã€ã« ã®æåŸã®ã¹ãããã¯ãkeystoreConfigãã¡ã€ã«ããªãªãŒã¹ãã«ã眲åæ§æã«é©çšããããšã§ãã
android {
signingConfigs {
release {
apply from: '../keystore/keystoreConfig.gradle'
keyAlias keystoreConfig.keyAlias
keyPassword keystoreConfig.keyPassword
storeFile file(keystoreConfig.storeFile)
storePassword keystoreConfig.storePassword
}
}
}
眲åãããã¢ã»ã³ããªã¯ãã§ã«ç§ãã¡ã®æã«ãããŸãïŒãããããã¹ãã®ããã«ãããååã«ã©ã®ããã«æ¡åŒµããŸããïŒ
è·éãã
Github Actionsã䜿çšãããšãã¢ã»ã³ããªãé åžããããã®ã»ãŒãã¹ãŠã®æ¢ç¥ã®ããŒã«ãžã®ã¢ãŒãã£ãã¡ã¯ãã®ã¢ããããŒããæ§æã§ããŸãããæ€èšãããªãã·ã§ã³ã¯2ã€ã ãã§ãã
- Githubã¹ãã¬ãŒãž-ã¢ã»ã³ããªãç¬èªã®Githubã¹ãã¬ãŒãžã«ã¢ããããŒãããæãç°¡åãªæ¹æ³ãç®±ããåºããŠããã«æ©èœããŸãããããã€ãã®å¶éããããŸãã
- Firebase App Distributionã¯ãBetaãCrashlyticsã«çœ®ãæããFirebaseãšã³ã·ã¹ãã ã®ãµãŒãã¹ã§ããçµ±åã®æ§æã¯å°ãé£ããã§ããããµãŒãã¹èªäœã®æ¹ãã¯ããã«äŸ¿å©ã§ãã
Github Storage
Github Storageã¯ãå ¬åŒã¢ã¯ã·ã§ã³ãéããŠç°¡åã«çµ±åã§ããŸããååãWebã€ã³ã¿ãŒãã§ã€ã¹ã«è¡šç€ºããã¢ã»ã³ããªã®ååãšãCIã§ã¢ã»ã³ãã«ããã* .apkãã¡ã€ã«ãžã®ãã¹ãæå®ããå¿ èŠããããŸãã
- uses: actions/upload-artifact@v1
with:
name: APK for QA
path: build/app/outputs/apk/dev/debug/apk_name.apk
äž»ãªåé¡ã¯ãéãããã¹ãã¬ãŒãžã¹ããŒã¹ã§ããç¡æãã©ã³ã§ã¯ã500MBããæäŸãããŸãããæãå¥åŠãªããšã¯ãWebã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã¹ãã¬ãŒãžå šäœãäžåºŠã«æåã§ã¯ãªã¢ããæ¹æ³ãèŠã€ãããªãã£ããããèãããã¢ãŒãã£ãã¡ã¯ãããã¹ãã¬ãŒãžãã¯ãªã¢ããããšã ããæ åœããå¥ã®ã¯ãŒã¯ãããŒãäœæããããšã§ç¶æ³ããæãåºããŸããã
ã¯ãŒã¯ãããŒã¯æ¯æ¥åå1æã«å®è¡ããã1é±éããå€ããã¹ãŠã®ã¢ãŒãã£ãã¡ã¯ããåé€ããŸãã
name: Github Storage clear
on:
schedule:
- cron: '0 1 * * *'
jobs:
remove-old-artifacts:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Remove old artifacts
uses: c-hive/gha-remove-artifacts@v1
with:
age: '1 week'
Firebase App Distribution
Firebase App Distributionã«ã€ããŠã¯ãæ¢è£œã®ã¢ã¯ã·ã§ã³wzieba / Firebase-Distribution-Github-Actionã䜿çšããŠçµ±åããŸããã
- name: Upload artifact to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{ secrets.FIREBASE_ANDROID_PROD_APP_ID }}
token: ${{ secrets.FIREBASE_TOKEN }}
groups: testers
file: build/app/outputs/apk/dev/debug/apk_name.apk
debug: true
ã¢ã¯ã·ã§ã³ãæ£ããæ©èœããã«ã¯ã次ã®ãã©ã¡ãŒã¿ãæž¡ãå¿ èŠããããŸãã
- appId -Firebaseãããžã§ã¯ãã®èšå®ã«ããã¢ããªã±ãŒã·ã§ã³èå¥åã
- ããŒã¯ã³-ãµãŒãã¹ã«ã¢ã»ã³ããªãããŒãããããã«å¿
èŠãšãããããªãã®FIrebaseãããžã§ã¯ããžã®èªèšŒçšããŒã¯ã³ãããŒã¯ã³ã¯FirebaseCLIãä»ããŠã®ã¿ååŸã§ããŸãã詳现ã«ã€ããŠã¯ãå
¬åŒããã¥ã¡ã³ããåç
§ããŠãã ããã
- file -CIäžã®ã³ã³ãã€ã«æžã¿* .apkãã¡ã€ã«ãžã®ãã¹ã
- groups-ãã®ãã©ã¡ãŒã¿ãŒã¯ãªãã·ã§ã³ã§ãããã¢ããããŒããããã¢ã»ã³ããªãèªåçã«å
±æããããã¹ã¿ãŒã°ã«ãŒãã®ãšã€ãªã¢ã¹ãæå®ã§ããŸãã
æã¡äžããšèŠ³å¯
æãåçŽãªã¯ãŒã¯ãããŒã®æºåãæŽããŸãããããšã¯ãããªã¬ãŒã€ãã³ããçºçãããŠãã¯ãŒã¯ãããŒã®é²è¡ç¶æ³ãç£èŠããã ãã§ãã
ã¢ããã€ã¹ãšå¥ãã®èšè
ããã§ããµã€ãºãéçºåŒ·åºŠããŸãã¯ãŠã©ã¬ããã«é¢ä¿ãªããFlutterãããžã§ã¯ãã§åçŽãªCI / CDã¡ã«ããºã ã®ãã¹ãŠã®å©ç¹ã享åã§ããŸãã
æåŸã«ããã®ã¯ãŒã¯ãããŒã®äœæ¥äžã«æãã€ãããã³ããšæèŠã次ã«ç€ºããŸãã
- workflow . workflow , , . - . , - workflow , .
- stepâ shell-. workflow . . .
- Run Duration workflow. workflow , . workflow , stepâ. . Flutter SDK . â 5-6 .
ãŸã ãŸã ããããã®æœåšçãªæ¹åãšæ¹åããããŸããã¯ãŒã¯ãããŒãæ¹åããããã®ã¢ã€ãã¢ãã³ã¡ã³ãã«æžã蟌ãã§ãã ãããå人çã«äœãæ¬ ããŠããŸããïŒãããããèªè ã®æãèå³æ·±ãã¢ã€ãã¢ã®å®è£ ã¯ããã®ãããã¯ã«é¢ãã次ã®èšäºã®åºç€ã圢æããã§ãããã
ãã¹ãŠã®ã¹ã¯ãªãããšã¯ãŒã¯ãããŒã¯ããã¹ãã¢ããªã±ãŒã·ã§ã³ã®ãªããžããªã«ãããŸãã
æž èŽããããšãããããŸããã
PSç§ãã¡ã®SurfããŒã ã¯ãFlutterã«åœ¹ç«ã€å€ãã®ã©ã€ãã©ãªããªãªãŒã¹ããŠããŸããããããSurfGearãªããžããªã«ã¢ããããŒãããŸãã