Flutter CICD 使用 Gitlab Runner 和 App Center 實作 part.2
這篇寫於 2022 年。工具和 API 變化很快,部分步驟可能已經不適用。
原來 CICD 這麼有幫助,快來學習吧~
上一篇我們進行了 Apple、Gitlab Runner、iOS、App Center 設定,完成所需的前置作業。而本文是很重要的一環,要撰寫機器運行的工作內容,要請它幫我們處理一些事情,最後將APP部署到指定平台,讓大家可以下載使用。
Flutter CICD 使用 Gitlab Runner 和 App Center 實作 part.1原來 CICD 這麼有幫助,快來學習吧~yii · writing
AppCenter CLI 設定#
必須在運行 Runner 前準備好 AppCenter CLI,在進行部署時需透過指令存取 App Center
安裝#
npm install --location=global appcenter-clib
Gitlab Runner 運行文件撰寫#
需要在 Flutter 專案根目錄新建 .gitlab-ci.yml,描述每個任務的內容與流程
相關參數:
extends→ 繼承 Job,使用它的東西stage→ 執行階段,一個易讀的名稱,可以多個 Job 綁定相同 stagevariables→ 使用到的變數dependencies→ 需要依賴的 Job 運行成功後才會繼續,可以使用它們的東西,例如:artifacts 檔案rule→ 設定執行條件before_script→ 執行 script 之前,做一些前置處理script→ 執行主要 scriptafter_script→ 完成 script 之後,做一些收尾的動作artifacts→ 生產物描述,以 path 聲明檔案的路徑tags→ Runner 標籤。可以指定運行某些 Runner,允許他們可以跑這個工作,根據當初建立時給予的 tag
Job: flutter_test,測試#
flutter_test: #工作名稱
stage: test #工作類型
script:
- flutter test
tags:
- flutter
Job: flutter_build_android,建置 Android#
flutter_build_android:
stage: build
dependencies:
- flutter_test
before_script:
#下載並取得套件
- flutter packages get
#刪除緩存,清出空間
- flutter clean
script:
#創建一個未簽署的.apk安裝檔,可以給任何Android設備安裝使用
- flutter build apk
after_script:
#更新檔案路徑與名稱,這邊看個人需求
- mv build/app/outputs/apk/release/app-release.apk ./android-release.apk
artifacts:
#聲明檔案路徑
paths:
- ./android-release.apk
tags:
#指定運行的Runner,不一定要設置
- flutter
Job: flutter_build_ios,建置 iOS#
flutter_build_ios:
stage: build
dependencies:
- flutter_test
variables:
FLUTTER_PROJECT_NAME: "cicdtest02"
WORKSPACE_PATH: "ios/Runner.xcworkspace"
ARCHIVE_PATH: "ios/RunnerArchive.xcarchive"
EXPORT_OPTIONS_PATH: "ios/ExportOptions.plist"
FINAL_EXPORT_PATH: "./build/ios"
FILE_NAME: "ios-release.ipa"
before_script:
- flutter packages get
- flutter clean
script:
#執行iOS建置
- flutter build ios
#執行iOS存擋
- xcodebuild clean archive -workspace $WORKSPACE_PATH -scheme Runner -archivePath $ARCHIVE_PATH -destination "generic/platform=iOS"
#執行檔案簽署並產出.ipa安裝檔
- xcodebuild -exportArchive -archivePath $ARCHIVE_PATH -exportOptionsPlist $EXPORT_OPTIONS_PATH -exportPath $FINAL_EXPORT_PATH
after_script:
- mv $FINAL_EXPORT_PATH/$FLUTTER_PROJECT_NAME.ipa ./$FILE_NAME
artifacts:
paths:
- ./$FILE_NAME
tags:
- flutter
Job: deploy_android,部署 Android#
deploy_android:
stage: deploy
dependencies:
#依賴stage(flutter_build_android),使用它產出的artifacts檔案
- flutter_build_android
variables:
APP_CENTER_USER_NAME: "yii"
APP_CENTER_PROJECT_NAME: "Test-Android"
APP_CENTER_GROUP_NAME: "Collaborators"
FILE_PATH: "./android-release.apk"
before_script:
#透過API token登入App Center
- appcenter login --token $APP_CENTER_API_TOKEN
#設置App Center要部署的專案資訊,username、project需修改成自己的資料
- appcenter apps set-current $APP_CENTER_USER_NAME/$APP_CENTER_PROJECT_NAME
script:
#發布Android的apk安裝檔到App center
- appcenter distribute release --file $FILE_PATH --group $APP_CENTER_GROUP_NAME
tags:
- flutter
Job: deploy_ios,部署 iOS#
deploy_ios:
stage: deploy
dependencies:
#依賴stage(flutter_build_ios),使用它產出的artifacts檔案
- flutter_build_ios
variables:
APP_CENTER_USER_NAME: "yii"
APP_CENTER_PROJECT_NAME: "Test-iOS"
APP_CENTER_GROUP_NAME: "Heros"
FILE_PATH: "./ios-release.ipa"
before_script:
- appcenter login --token $APP_CENTER_API_TOKEN
- appcenter apps set-current $APP_CENTER_USER_NAME/$APP_CENTER_PROJECT_NAME
script:
#發布iOS的ipa安裝檔到App center
- appcenter distribute release --file $FILE_PATH --group $APP_CENTER_GROUP_NAME
tags:
- flutter
聲明要執行哪些 stage#
本文範例的運行流程為
test測試build建置deploy部署
開始 Gitlab Runner CICD#
開啟 Terminal,執行 Runner,會持續檢查Repo是否有更新
提醒:因為不是 root 執行,有些目錄權限可能需要設定為777或755
gitlab-runner run
在 Gitlab 上的 Runner 頁會顯示運行狀態
Repo 更新後,Runner 就會開始執行 gtltab-ci.yml 設定好的 CICD 流程。當然大部分情境應該會設置指定的 tag,才不會導致每次 push 都建置新版。
完成 CICD#
檢查工作是否都有綠色勾勾,並顯示 passed
雙平台部署成功
群組內的成員會收到App新版通知,方便安裝使用
Gitlab Runner 其他設定#
移除 Runer#
gitlab-runner verify --delete -t <token> -u https://gitlab.com/
細部調整#
檔案路徑:~/.gitlab-runner/config.toml
concurrent→ 設置同時可運行幾個 Runnercheck_interval→ 設置多久檢查一次是否有新的 Job 要執行,單位:秒
到這邊 Flutter CICD 就完成了,不會很難對吧,我只是提供一種實作方式,不要太侷限於文中的每個設定與細節,過程中你想要做其他事情,另起一些服務也可以,取決於你的需求和專案。
有什麼 CICD 的想法也能跟我分享和討論,我很樂於吸收新知,希望有幫助到大家~
其他文章#
- Flutter CICD 使用 Gitlab Runner 和 App Center 實作 part.1
- 使用 CodeMagic 和 Firebase 實現 Flutter CICD
- 輕鬆完成Flutter開發環境,最新版!
- 實作Flutter多變有趣的滾動效果CustomScrollView!
- 如何在Flutter使用 Makefile 節省你的時間?
- Easily understand StatefulWidget LifeCycle of Flutter
- “freezed” makes model class strong and easily
- 提高Flutter性能的小技巧!(一)
- 提高Flutter性能的小技巧!(二)
- 提高Flutter性能的小技巧!(三)
- What are Async and Isolates in Flutter?
- LoadBalancer is optimization for Isolates in Flutter
- Riverpod 輕鬆學,原來這麼好用!
- Riverpod 輕鬆學(二),一些進階用法!
關於我#
- GitHub: chyiiiiiiiiiiii
- Instagram: flutterluvr.yii
- Linkedin: yiichenhi
- Youtube: Yii
- Youtube: 一起饅頭(美食頻道)
- Email: ab20803@gmail.com
贊助#
謝謝你花費時間看完,非常感謝!
如果覺得文章不錯的話可以贊助,讓我有更多動力和熱情分享學習紀錄和生活!請我喝一杯咖啡吧~
最後#
希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章~
本文原刊登於 Medium。