-
Flutter Fastlane CI/CD(2) - AndroidFlutter ํ ํฌ 2023. 3. 7. 01:08
1. Fastlane init
cd android/ fastlane initโ
Android ํด๋๋ก ์ด๋ํ์ ์, init ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํฉ๋๋ค.
์ด๊ธฐ์ ํจํค์ง ์ด๋ฆ์ ์ ๋ ฅํ๋ผ๊ณ ๋์ต๋๋ค. ํจํค์ง ์ด๋ฆ(com.example.example)์ด ๊ธฐ์ต๋์ง ์์ผ์ ๋ค๋ฉด, app/build.gradle ํ์ผ ๊ฐ์ ์ applicationId ํญ๋ชฉ์ ์๋ ํจํค์ง ์ด๋ฆ์ ๊ฐ์ ธ์ต๋๋ค.
2. Json Secret File
ํจํค์ง ์ด๋ฆ์ ์ ๋ ฅํ๋ฉด, json secret file ๊ฒฝ๋ก๋ฅผ ๋ฃ์ผ๋ผ๊ณ ํฉ๋๋ค. (json_secret_file? Fastlane Android ๊ณต์๋ฌธ์ Collect your Google credentials ์น์ )
2-1. GCP ์ ์
Google Cloud Platform ์ฌ์ดํธ์ IAM ๋ฐ ๊ด๋ฆฌ์ > ์๋น์ค ๊ณ์ , ํ์ด์ง ์ผ์ชฝ ์๋จ ์์ ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
2-2. ์๋น์ค ๊ณ์ ์ธ๋ถ์ ๋ณด ์ ๋ ฅ
Fastlane ์ ์ํด ๋ง๋๋ ์๋น์ค ๊ณ์ ์ด๋ผ, ์ด๋ฆ์ fastlane ์ผ๋ก ์ค์ ํ์ต๋๋ค.
2-3. ์ก์ธ์ค ๊ถํ ๋ถ์ฌ
์ญํ ์ ํ์๋ก ์๋น์ค ๊ณ์ ์ฌ์ฉ์๋ก ํด์ฃผ์ ์ผ ํฉ๋๋ค.
3-3. ์ฌ์ฉ์ ์ก์ธ์ค ๊ถํ ๋ถ์ฌ
ํด๋น ํ๋๋ค์ ๋น์๋๊ณ ์์ฑํฉ๋๋ค
3-4. ํค ์์ฑ
์๋น์ค ๊ณ์ ์ชฝ์ ํ์ธํด๋ณด์๋ฉด, ๋ฐฉ๊ธ ๋ง๋ ๊ณ์ ์ด ์์ฑ๋์ด ์์๊ฒ๋๋ค. ๊ณ์ ์ ๋๋ฅด๊ณ ๋ค์ด๊ฐ ๋ค, ํค ์ถ๊ฐ๋ฒํผ์ ๋๋ฌ ํค๋ฅผ ์์ฑํฉ๋๋ค. JSON ์ผ๋ก ์ ํํ๊ณ ๋ง๋ญ๋๋ค.
3-5. ํค ์ ์ฅ ๋ฐ json secret file ์ ๋ ฅ
์ด์ ํค๋ฅผ ์ ์ฅํ๊ณ , Google Play Console ๋ก ๋์๊ฐ์ ์, ์ฌ์ฉ์ ๋ฐ ๊ถํ ์ ๋ณด์๋ฉด ์์ฑํ ์๋น์ค ๊ณ์ ์ด ์ถ๊ฐ ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์๋ง์ ๊ถํ์ ๋ถ์ฌํด์ค๋๋ค.
๋ถ์ฌํ ๋ค, ๋ฐ์ JSON ํค๋ฅผ ์์ ํ ๊ณณ์ ์ ์ฅํฉ๋๋ค. ํ์ฌ๋ json ํค๋ฅผ serviceAccount.json ์ผ๋ก ์ ์ฅํ์๊ณ , ๊ฒฝ๋ก๋ android/app/ ์ ์ ์ฅํ์์ต๋๋ค.
์ฑ ์ฝ๋ ๋ด์ ํค ํ์ผ์ ์ ์ฅํ๊ฒ git ์ ์ฌ๋ผ๊ฐ๋ฉด ์๋๋, gitignore ์ถ๊ฐํฉ๋๋ค.metadata setup ํ ๊ฑฐ๋๊ณ ๋ฌผ์ด๋ณด๋๋ฐ, ์คํ ์ด์ ์ฌ๋ฆด ๋ ํ์ํ data ์ด๋ฏ๋ก y ํด์ฃผ๊ณ ๋ค์ด๋ฐ์ต๋๋ค.
4. Fastlane Firebase Distribution ์ค์
Fastlane ์ ์ด์ฉํ์ฌ Firebase App Distribution ์ ๋ฐฐํฌํ๋ ค๋ฉด ํ๋ฌ๊ทธ์ธ ์ค์น, ์ธ์ฆ ๋ฑ์ ํด์ผ ํฉ๋๋ค.
4-1. Firebase Plugin ์ค์น
fastlane add_plugin firebase_app_distribution
Firebase ํ๋ฌ๊ทธ์ธ์ ์ค์นํ ๋ Your user account isn't allowed... ๋ผ๋ ๋ฉ์ธ์ง๊ฐ ๋์ค๋ฉด์ Password ๋ฅผ ์ ๋ ฅํ๋ผ๊ณ ํ ์๋ ์๋๋ฐ, Mac password ์ ๋ ฅํฉ๋๋ค.
4-2. Firebase ๋ก๊ทธ์ธ
fastlane run firebase_app_distribution_login
CLI๋ก Firebase ์ ๋ก๊ทธ์ธ ํ๋ ๊ณผ์ ์ ๋๋ค. ์ปค๋งจ๋ ์ ๋ ฅ ์ ์ ์ํ ์ ์๋ ๋งํฌ URL ์ด ํฐ๋ฏธ๋์ ๋ณด์ผํ ๋ฐ, ์ ์ํด์ Firebase ์ธ์ฆ ํด์ฃผ์๋ฉด Refresh Token ์ด ๋ ์์ต๋๋ค. ํด๋น ํ ํฐ์ ์ ๋ณด๊ดํด์ฃผ์ธ์.
5. ํ๊ฒฝ๋ณ์[ENV] ์ค์
๊ฐ ๊ฐ๋ฐ์ ๋ง๋ค Firebase Refresh Token ์ด ํ๊ฒฝ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋๋ฐ, Fastlane ์์๋ .envํ์ผ๋ก ํ๊ฒฝ๋ณ์๋ฅผ ๊ด๋ฆฌํ์ฌ ์๋ก ๋ค๋ฅธ ํ๊ฒฝ์์๋ ๋์ผํ Lane ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# Appfile json_key_file(ENV["JSON_KEY_FILE_PATH"]) # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one package_name("com.test.test") # e.g. com.krausefx.app # .env JSON_KEY_FILE_PATH="/Users/jangseung-gyun/Documents/GitHub/frontend/android/app/serviceAccount.json"
Fastlane ํด๋ ์์ Appfile ์ ๋๋ค. package_name ์ ์ด๋ ํ๊ฒฝ์์๋ ๋์ผํ์ง๋ง, json_key_file ๋ ๊ฐ๋ฐ์ ๋ง๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ๊ฒฝ๋ณ์๋ก ์นํํฉ๋๋ค.
6. Firebase Distribution Lane ์์ฑ
default_platform(:android) platform :android do desc "Upload Debug APK to Firebase Distribution" lane :firebase_debug do |options| gradle_build firebase_upload(release_note: options[:release_note]) end desc "Upload Release APK to Firebase Distribution" lane :firebase_release do gradle_build(release: true) firebase_upload(release: true) end desc "Get Flutter version from pubspec.yaml" private_lane :get_version_info do yaml_file_path = "yaml_file_path์ ๋ ฅ" data = YAML.load_file(yaml_file_path) version = data["version"] version_name = version.split("+")[0] version_code = version.split("+")[1].to_i {version_name: version_name, version_code: version_code} end private_lane :gradle_build do |options| version = get_version_info version_name = version[:version_name] version_code = version[:version_code] gradle( task: "assemble", build_type: options[:release] ? "Release" : "Debug", properties: { "android.injected.version.name" => version_name, "android.injected.version.code" => version_code } ) end private_lane :firebase_upload do |options| firebase_app_distribution( app: "์ฑ id์ด๋ฉฐ Firebase์ ํ๋ก์ ํธ ์ค์ ์ผ๋ฐ ํญ์ ์์ต๋๋ค", firebase_cli_token: '4-2์์ ๋ฐ์ Refresh Token', groups: "test", debug: options[:release], android_artifact_type: "APK", release_notes: options[:release] ? "firebase_upload release" : "firebase_upload debug", apk_path: options[:release] ? "app-release.apk๋ฅผ ์ ์ฅํ ํ์ผ ๊ฒฝ๋ก /Users/jangseung-gyun/Documents/GitHub/frontend/build/app/outputs/flutter-apk/app-release.apk" : "app-debug.apk๋ฅผ ์ ์ฅํ ํ์ผ ๊ฒฝ๋ก /Users/jangseung-gyun/Documents/GitHub/frontend/build/app/outputs/flutter-apk/app-debug.apk" ) end desc "Lane for distribution" lane :firebase_aos do gradle( task: "assemble", build_type: "Debug", ) firebase_app_distribution( app: "์ฑ id์ด๋ฉฐ Firebase์ ํ๋ก์ ํธ ์ค์ ์ผ๋ฐ ํญ์ ์์ต๋๋ค", firebase_cli_token: '4-2์์ ๋ฐ์ Refresh Token', groups: "test", debug: true, android_artifact_type: "APK", release_notes: "fastlane test", apk_path: "app-debug.apk๋ฅผ ์ ์ฅํ ํ์ผ ๊ฒฝ๋ก /Users/jangseung-gyun/Documents/GitHub/frontend/build/app/outputs/flutter-apk/app-debug.apk" ) endend
[lane ์ค๋ช ]
firebase_debug ๋ ์ธ์ debug๋ชจ๋๋ก Firebase์ ๋ฐฐํฌํฉ๋๋ค(Firebase์ firebase_upload debug๋ก ํ์๋ฉ๋๋ค)
firebase_release๋ ์ธ์ release๋ชจ๋๋ก Firebase์ ๋ฐฐํฌํฉ๋๋ค (Firebase์ firebase_upload release๋ก ํ์๋ฉ๋๋ค)
'Flutter ํ ํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Flutter + Firebase ์ฐ๋ (0) 2023.11.24 Flutter + FCM ์ฐ๋ (Flutter 3.0์ด์, ์๋ก์ดFCM์ ์ฉ๋ฒ์ , 3.0์ด์์ด ์๋์ฌ๋ ๊ฐ๋ฅํฉ๋๋ค) (0) 2023.11.24 Flutter Fastlane CI/CD(1) - iOS (0) 2023.03.07 [Flutter] YouTube player (0) 2022.08.25 [Flutter] host platform ๊ตฌ๋ณ (Web, Phone) (0) 2022.07.26