From a4107c82c4e7e1fd273ff35c841e52cf42ac6622 Mon Sep 17 00:00:00 2001 From: Hamlet Jiang Su Date: Mon, 6 Jan 2025 20:57:57 -0800 Subject: [PATCH] feat: add build workflow for Android --- .github/workflows/release.yml | 90 +++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..07eeecb28 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,90 @@ +name: release + +on: + push: + tags: + - '*.*.*' + branches: + - feat/build-workflow + workflow_dispatch: + inputs: + dry_run: + type: boolean + description: Is this a dry run (do not generate draft release)? + default: true + +jobs: + build_android: + runs-on: ubuntu-latest + environment: production + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: 'recursive' + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.27.x' # When updating this, also update the corresponding f-droid metadata file + channel: 'stable' + cache: true + + - name: Read pubspec.yaml version + id: extract-version + uses: NiklasLehnfeld/flutter-version-number-action@main + with: + file-path: pubspec.yaml + + - name: Generate version information + id: generate-version-info + run: | + VERSION=${{ steps.extract-version.outputs.version-number }} + VERSION=$(echo "$VERSION" | cut -d '+' -f 1) + echo "version=$VERSION" >> $GITHUB_OUTPUT + PRERELEASE=false + if [[ "$VERSION" == *-* ]]; then + PRERELEASE=true + fi + echo "prerelease=$PRERELEASE" >> $GITHUB_OUTPUT + TAG="$VERSION" + echo "tag=$TAG" >> $GITHUB_OUTPUT + echo "Info: version=$VERSION | tag=${TAG} | prerelease=$PRERELEASE" + + - name: Build Android APK (unsigned) + run: | + sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle + flutter build apk --release --flavor production --no-tree-shake-icons + rm ./build/app/outputs/flutter-apk/*.sha1 + ls -l ./build/app/outputs/flutter-apk/ + + - name: Sign Android APKs + env: + KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + run: | + echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore + for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do + unsignedFn=${apk/-release/-unsigned} + mv "$apk" "$unsignedFn" + ${ANDROID_HOME}/build-tools/$(ls ${ANDROID_HOME}/build-tools/ | tail -1)/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" + echo "${apk} | $(shasum -a 256 ${apk} | cut -d " " -f 1)" + done + rm apksign.keystore + echo "Finished signing Android APKs" + + - uses: actions/upload-artifact@v4 + with: + path: ./build/app/outputs/flutter-apk/ + + - name: Create draft release and upload artifacts + if: ${{ inputs.dry_run }} == 'false' + uses: ncipollo/release-action@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + tag: "${{ steps.generate-version-info.outputs.tag }}" + prerelease: ${{ steps.generate-version-info.outputs.prerelease }} + draft: true + artifacts: ./build/app/outputs/flutter-apk/*-release*.apk + generateReleaseNotes: true \ No newline at end of file