Saluran Automatik dengan Fastlane dan GitHub Actions
Bina, tandatangani dan hantar ke gedung secara automatik menggunakan laluan Fastlane serta aliran kerja Actions.
Saluran Automatik dengan Fastlane dan GitHub Actions ialah pelajaran Pembangunan Aplikasi Mudah Alih Flutter percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pembangunan Aplikasi Mudah Alih Flutter, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pembangunan Aplikasi Mudah Alih Flutter merangkumi sejumlah 4 pelajaran.
Mengapa Keluaran Flutter Perlu Diautomasikan
Menghantar aplikasi Flutter ke kedua-dua gedung secara manual adalah lambat dan mudah menyebabkan kesilapan: menaikkan versi, membina IPA/AAB, menandatangani, memuat naik dan menulis nota keluaran untuk setiap platform.
Alur kerja CI/CD menukarkan semua ini kepada satu pencetus. Kami menggabungkan dua alat:
- Fastlane — automasi berasaskan Ruby untuk langkah gedung iOS dan Android (menandatangani, membina dan memuat naik ke TestFlight / Play Console).
- GitHub Actions — penyelaras yang mendapatkan kod, menyediakan Flutter dan memanggil Fastlane pada pelaksana yang dihoskan.
Anggap GitHub Actions sebagai konduktor dan lorong Fastlane sebagai pemain muzik bagi setiap platform.
Strategi Nombor Versi dan Binaan
Kedai menolak muat naik yang menggunakan semula nombor binaan. Saluran paip anda mesti mengira nombor baharu yang sentiasa meningkat pada setiap pelaksanaan.
Dalam Flutter, pubspec.yaml menyimpan version: 1.4.0+57, dengan 1.4.0 sebagai nama yang dilihat pengguna dan 57 sebagai nombor binaan. Corak CI yang biasa adalah dengan memasukkan nombor pelaksanaan GitHub Actions ke dalam binaan.
Berikut ialah pembantu Dart ringkas yang memperoleh rentetan versi penuh daripada nama asas dan pembilang CI.
void main() {
String buildVersion(String name, int ciRunNumber) {
if (ciRunNumber < 1) {
throw ArgumentError('Build number must be >= 1');
}
return '$name+$ciRunNumber';
}
print(buildVersion('1.4.0', 57)); // 1.4.0+57
print(buildVersion('2.0.0', 120)); // 2.0.0+120
}Anatomi Lorong Fastlane
Konfigurasi Fastlane berada dalam Fastfile (Ruby). lorong ialah urutan tindakan bernama untuk satu tugas pada satu platform.
Untuk Android, lorong keluaran biasanya membina App Bundle dengan Flutter, kemudian memuat naiknya ke trek Play Console:
sh 'flutter build appbundle --release'— menghasilkan.aabyang ditandatangani.upload_to_play_store— menolak binaan itu ke trek internal atau production.
Parameter track ialah keputusan utama: mulakan dengan internal untuk QA, kemudian naik taraf ke production.
Lorong Fastlane Android
Ini ialah android/fastlane/Fastfile yang biasa. Fastlane dijalankan dari direktori android/, jadi kita memanggil Flutter dari akar projek menggunakan ...
Perhatikan bahawa lorong ini memuat naik ke trek internal terlebih dahulu dan melangkau muat naik metadata/imej, sekali gus mengelakkan perubahan tidak sengaja pada penyenaraian kedai daripada CI.
default_platform(:android)
platform :android do
desc 'Build and upload AAB to the internal track'
lane :beta do
sh 'flutter build appbundle --release'
upload_to_play_store(
track: 'internal',
aab: '../build/app/outputs/bundle/release/app-release.aab',
skip_upload_metadata: true,
skip_upload_images: true,
skip_upload_screenshots: true
)
end
endLorong Fastlane iOS
Lorong iOS membina IPA dan menghantarnya ke TestFlight. Penandatanganan kod pada CI menggunakan match, yang menyimpan sijil dan profil peruntukan dalam repositori Git peribadi serta memasangnya pada pelaksana.
setup_ci— mencipta rantai kunci sementara supaya penandatanganan berfungsi pada pelaksana sementara.match(type: 'appstore', readonly: true)— mendapatkan aset penandatanganan tanpa menjana semulanya.upload_to_testflight— mengedarkan binaan kepada penguji dalaman.
default_platform(:ios)
platform :ios do
desc 'Build and upload to TestFlight'
lane :beta do
setup_ci
match(type: 'appstore', readonly: true)
sh 'flutter build ipa --release --export-options-plist=ExportOptions.plist'
upload_to_testflight(
ipa: '../build/ios/ipa/Runner.ipa',
skip_waiting_for_build_processing: true
)
end
endRahsia Hendaklah Disimpan dalam Peti Besi
Jangan sekali-kali lakukan komit kunci penandatanganan, JSON akaun perkhidmatan Play atau kunci API App Store Connect. Simpan semuanya sebagai rahsia GitHub Actions yang disulitkan dan masukkannya sebagai pemboleh ubah persekitaran semasa pelaksanaan.
Rahsia yang biasa untuk saluran paip Flutter:
PLAY_STORE_JSON_KEY— kelayakan akaun perkhidmatan Google Play.APP_STORE_CONNECT_API_KEY— kunci ASC untuk muat naik TestFlight.MATCH_PASSWORDdanMATCH_GIT_BASIC_AUTH— untuk menyahsulit repositori match.ANDROID_KEYSTORE_BASE64— stor kunci muat naik anda yang dikodkan dalam base64.
Pengesah Dart ringkas boleh menggagalkan proses dengan segera jika pemboleh ubah yang diperlukan tiada sebelum sebarang langkah binaan yang mahal dijalankan.
void main() {
List<String> missingSecrets(Map<String, String?> env, List<String> required) {
return required.where((k) {
final v = env[k];
return v == null || v.trim().isEmpty;
}).toList();
}
final fakeEnv = {
'PLAY_STORE_JSON_KEY': '{...}',
'MATCH_PASSWORD': '',
};
final required = ['PLAY_STORE_JSON_KEY', 'MATCH_PASSWORD', 'ASC_KEY'];
final missing = missingSecrets(fakeEnv, required);
if (missing.isNotEmpty) {
print('Missing secrets: ${missing.join(', ')}');
} else {
print('All secrets present');
}
}Aliran Kerja GitHub Actions
YAML aliran kerja berada dalam .github/workflows/release.yml. Fail ini mentakrifkan bila saluran paip dijalankan dan pelaksana mana yang menjalankannya.
Pilihan utama:
- Pencetus: jalankan apabila tag seperti
v*ditolak supaya hanya keluaran yang disengajakan dicetuskan. - Pelaksana: tugas Android boleh menggunakan
ubuntu-latest; iOS mesti menggunakanmacos-latestkerana Xcode diperlukan. - Matriks atau tugas berasingan membolehkan kedua-dua platform dibina secara selari.
Setiap tugas mendapatkan kod, menjalankan subosito/flutter-action untuk memasang SDK, kemudian memanggil lorong Fastlane yang sepadan.
YAML Aliran Kerja Keluaran
Aliran kerja ini dicetuskan oleh tag versi dan membina kedua-dua platform dalam tugas selari. Perhatikan bahawa tugas iOS dijalankan pada macOS manakala tugas Android dijalankan pada Ubuntu.
Rahsia disalurkan melalui blok env, jadi Fastlane dan match boleh membacanya tanpa sebarang nilai ditulis ke cakera dalam teks biasa.
name: Release
on:
push:
tags: ['v*']
jobs:
android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with: { channel: stable }
- run: flutter pub get
- run: bundle exec fastlane beta
working-directory: android
env:
PLAY_STORE_JSON_KEY: ${{ secrets.PLAY_STORE_JSON_KEY }}
ios:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with: { channel: stable }
- run: flutter pub get
- run: bundle exec fastlane beta
working-directory: ios
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}Kawal Saluran Paip dengan Ujian
Saluran paip keluaran tidak sepatutnya menghantar binaan yang gagal. Jalankan flutter analyze dan flutter test dalam tugas awal, kemudian jadikan tugas binaan bergantung padanya melalui needs:.
Jika mana-mana langkah keluar dengan kod bukan sifar, GitHub Actions menghentikan saluran paip. Anda boleh meniru logik kawalan ini dalam Dart: keluaran hanya dibenarkan apabila analisis bersih dan semua ujian lulus.
void main() {
bool canRelease({
required bool analyzeClean,
required int testsPassed,
required int testsTotal,
}) {
return analyzeClean && testsTotal > 0 && testsPassed == testsTotal;
}
print(canRelease(analyzeClean: true, testsPassed: 42, testsTotal: 42));
print(canRelease(analyzeClean: true, testsPassed: 41, testsTotal: 42));
print(canRelease(analyzeClean: false, testsPassed: 42, testsTotal: 42));
}Kebolehcerapan: Pelaporan Ranap dan Binaan
Penghantaran hanyalah separuh daripada cerita — anda perlu mengetahui perkara yang berlaku selepas keluaran. Sediakan kebolehcerapan di dua tempat:
- Sisi aplikasi: integrasikan Firebase Crashlytics atau Sentry supaya ranap dalam pengeluaran dilaporkan bersama jejak tindanan dan nombor binaan yang tepat.
- Sisi saluran paip: muat naik fail simbol dSYM/ProGuard semasa lorong Fastlane, contohnya
upload_symbols_to_crashlytics, supaya laporan ranap dinyahkaburkan.
Sentiasa tandakan laporan dengan nombor binaan yang sama seperti yang dijana oleh saluran paip anda, supaya ranap dapat dipautkan semula kepada komit dan pelaksanaan CI tertentu.
import 'dart:async';
void main() {
runZonedGuarded(() {
// Simulated app start that throws in production code.
throw StateError('Null user session at startup');
}, (error, stack) {
// In a real app this would call Crashlytics.recordError.
final report = {
'build': 57,
'error': error.toString(),
'firstFrame': stack.toString().split('\n').first,
};
print('Reported crash: $report');
});
}Promosi dan Pelancaran Berperingkat
Saluran paip yang matang tidak menolak keluaran terus kepada 100% pengguna. Dua corak keselamatan:
- Promosi trek: CI memuat naik ke
internal; tugas berasingan yang dicetuskan secara manual mempromosikan artifak yang sama keproduction. - Pelancaran berperingkat: keluarkan kepada sebahagian pengguna dahulu, kemudian tingkatkan jumlahnya.
upload_to_play_storeFastlane menerimarollout: '0.1'untuk permulaan 10%.
Coretan Dart ini memodelkan jadual pelancaran yang menggandakan pendedahan setiap hari, dengan had maksimum 100%.
void main() {
List<double> rolloutSchedule(double start, int days) {
final stages = <double>[];
var pct = start;
for (var i = 0; i < days; i++) {
stages.add(double.parse(pct.clamp(0.0, 1.0).toStringAsFixed(2)));
pct *= 2;
}
return stages;
}
print(rolloutSchedule(0.1, 5)); // [0.1, 0.2, 0.4, 0.8, 1.0]
}Semakan Pantas: Pilihan Pelaksana
Uji pemahaman anda tentang kekangan platform dalam saluran paip keluaran Flutter.
Ringkasan
Anda telah membina model mental tentang saluran paip keluaran Flutter untuk pengeluaran:
- GitHub Actions menyelaraskan proses; lorong Fastlane mengendalikan urusan kedai bagi setiap platform.
- Peroleh nombor binaan unik bagi setiap pelaksanaan daripada pembilang CI dan
pubspec.yaml. - Lorong Android membina
.aabdan menggunakanupload_to_play_store; lorong iOS menggunakanmatch+upload_to_testflight. - Simpan kunci dalam rahsia yang disulitkan; sahkan kewujudannya sebelum membina.
- Jalankan pada pelaksana yang betul — macos-latest untuk iOS, Ubuntu untuk Android.
- Kawal keluaran menggunakan
flutter analyzedanflutter testdenganneeds:. - Lengkapkan kitaran dengan pelaporan ranap, muat naik simbol dan pelancaran berperingkat.
Tag satu komit dengan v1.4.0 dan keseluruhan keluaran anda akan berjalan sendiri.
Pelajari Dart dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 22
- Pelajaran
- 88
Soalan Lazim
Adakah pelajaran “Saluran Automatik dengan Fastlane dan GitHub Actions” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Pembangunan Aplikasi Mudah Alih Flutter, termasuk “Saluran Automatik dengan Fastlane dan GitHub Actions”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Pembangunan Aplikasi Mudah Alih Flutter merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Saluran Automatik dengan Fastlane dan GitHub Actions”?
Bina, tandatangani dan hantar ke gedung secara automatik menggunakan laluan Fastlane serta aliran kerja Actions. Anda berlatih Pembangunan Aplikasi Mudah Alih Flutter menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Pembangunan Aplikasi Mudah Alih Flutter?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Pembangunan Aplikasi Mudah Alih Flutter di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Saluran Automatik dengan Fastlane dan GitHub Actions” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pembangunan Aplikasi Mudah Alih Flutter ini?
Ya. Setiap pelajaran Pembangunan Aplikasi Mudah Alih Flutter menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Variasi Binaan dan Konfigurasi Persekitaran
- Saluran Automatik dengan Fastlane dan GitHub Actions
- Pelaporan Ranap dan Jejak Timbunan Bersimbol
- Konfigurasi Jauh, Bendera Ciri dan Pelancaran Berperingkat