Flutter Build and Release #13
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Flutter Build and Release | |
on: | |
workflow_dispatch: | |
inputs: | |
tag_name: | |
description: 'Tag name for this release (e.g., v1.0.0)' | |
required: true | |
default: 'v1.0.0' | |
release_note: | |
description: 'Release notes for this version' | |
required: true | |
default: 'Initial release' | |
permissions: | |
contents: write | |
jobs: | |
build: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v3 | |
- name: Set up Flutter | |
uses: subosito/flutter-action@v2 | |
with: | |
flutter-version: '3.24.0' # Specify your Flutter version | |
- name: Install dependencies | |
run: flutter pub get | |
- name: Run tests | |
run: flutter test | |
- name: Set up JDK | |
uses: actions/setup-java@v3 | |
with: | |
distribution: 'zulu' # Use Zulu OpenJDK | |
java-version: '17' # Java 11 is required for signing | |
- name: Build for APK ABIs | |
run: flutter build apk --split-per-abi | |
- name: Build for APK | |
run: flutter build apk --release | |
- name: Build App Bundle | |
run: flutter build appbundle --release | |
- name: Setup Android SDK | |
uses: android-actions/setup-android@v3 | |
- name: Sign APK | |
run: | | |
echo "${{ secrets.ANDROID_KEYSTORE }}" | base64 -d > keystore.jks | |
echo "${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" > keystore_password.txt | |
echo "${{ secrets.ANDROID_KEY_ALIAS }}" > key_alias.txt | |
echo "${{ secrets.ANDROID_KEY_PASSWORD }}" > key_password.txt | |
LATEST_BUILD_TOOLS=$(ls $ANDROID_HOME/build-tools | sort -V | tail -n 1) | |
ZIPALIGN="$ANDROID_HOME/build-tools/$LATEST_BUILD_TOOLS/zipalign" | |
for apk in build/app/outputs/flutter-apk/*-release.apk; do | |
[ -f "$apk" ] || continue | |
filename=$(basename "$apk") | |
signed_name="${filename%.*}-signed.apk" | |
jarsigner -verbose \ | |
-keystore keystore.jks \ | |
-storepass $(cat keystore_password.txt) \ | |
-keypass $(cat key_password.txt) \ | |
"$apk" \ | |
$(cat key_alias.txt) | |
$ZIPALIGN -v 4 \ | |
"$apk" \ | |
"build/app/outputs/flutter-apk/$signed_name" | |
done | |
- name: Sign App Bundle | |
run: | | |
# We can reuse the keystore and password files from APK signing | |
jarsigner -verbose \ | |
-keystore keystore.jks \ | |
-storepass $(cat keystore_password.txt) \ | |
-keypass $(cat key_password.txt) \ | |
build/app/outputs/bundle/release/app-release.aab \ | |
$(cat key_alias.txt) | |
# Create a directory for the signed bundle | |
mkdir -p build/app/outputs/bundle/release/signed | |
# Move the signed bundle | |
mv build/app/outputs/bundle/release/app-release.aab \ | |
build/app/outputs/bundle/release/signed/app-release-signed.aab | |
- name: Upload Signed APK as artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: signed-apk | |
path: build/app/outputs/flutter-apk/*-signed.apk | |
- name: Upload App Bundle as artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: app-release.aab | |
path: build/app/outputs/bundle/release/signed/app-release-signed.aab | |
release: | |
runs-on: ubuntu-latest | |
needs: build | |
steps: | |
- name: Download Signed APK artifact | |
uses: actions/download-artifact@v3 | |
with: | |
name: signed-apk | |
path: build/apk | |
- name: Download App Bundle artifact | |
uses: actions/download-artifact@v3 | |
with: | |
name: app-release.aab | |
path: build/aab | |
- name: Release Signed APKs | |
uses: softprops/action-gh-release@v2 | |
with: | |
body: | | |
## Release Notes | |
${{ github.event.inputs.release_note }} | |
files: | | |
build/apk/*-signed.apk | |
build/aab/app-release-signed.aab | |
tag_name: ${{ github.event.inputs.tag_name }} # Use the dynamic tag_name input | |
name: Release ${{ github.event.inputs.tag_name }} # Use the dynamic tag_name input |