diff --git a/.github/workflows/nightly_build.yaml b/.github/workflows/nightly_build.yaml index 307dbf8d..4652cbd1 100644 --- a/.github/workflows/nightly_build.yaml +++ b/.github/workflows/nightly_build.yaml @@ -4,6 +4,9 @@ run-name: Building the Android and iOS app bundles 🚀 on: workflow_dispatch: + push: + branches: + - workflows schedule: - cron: '0 0 * * *' # Runs every day at midnight UTC diff --git a/.github/workflows/pre_release.yaml b/.github/workflows/pre_release.yaml new file mode 100644 index 00000000..3d3f4bd3 --- /dev/null +++ b/.github/workflows/pre_release.yaml @@ -0,0 +1,168 @@ +name: Build and Release Pre-Release + +run-name: Creating pre-release 🚀 + +on: + workflow_dispatch: + push: + tags: + - '*-beta' + +jobs: + + BuildAndroidRelease: + runs-on: ubuntu-latest + environment: production + permissions: + contents: write + + steps: + - uses: actions/checkout@v3 + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: '17' + cache: 'gradle' + check-latest: true + + - name: Checkout app code + uses: actions/checkout@v3 + + - uses: subosito/flutter-action@v1 + with: + channel: "stable" + + - run: flutter doctor -v + + - run: flutter pub get + + - name: Download Android keystore + id: android_keystore + uses: timheuer/base64-to-file@v1.0.3 + with: + fileName: upload-keystore.jks + encodedString: ${{ secrets.KEYSTORE_FILE_BASE64 }} + + - name: Create key.properties + run: | + echo "storeFile=${{ steps.android_keystore.outputs.filePath }}" > android/key.properties + echo "storePassword=${{ secrets.KEYSTORE_PASSWORD }}" >> android/key.properties + echo "keyPassword=${{ secrets.KEYSTORE_KEY_PASSWORD }}" >> android/key.properties + echo "keyAlias=${{ secrets.KEYSTORE_KEY_ALIAS }}" >> android/key.properties + + - name: Build Android Release APK + run: flutter build apk --release + + - name: Build Android Release AppBundle + run: flutter build appbundle + + - name: Upload APK Artifact + uses: actions/upload-artifact@v3 + with: + name: release-apk + path: build/app/outputs/apk/release/app-release.apk + + - name: Upload Android AppBundle Artifact + uses: actions/upload-artifact@v3 + with: + name: release-aab + path: build/app/outputs/bundle/release/app-release.aab + + BuildiOSRelease: + runs-on: macos-latest + environment: production + needs: GetVersionNumber + permissions: + contents: write + steps: + + - name: Checkout repository + uses: actions/checkout@v3 + + - uses: subosito/flutter-action@v1 + with: + channel: "stable" + + - run: flutter doctor -v + + - run: flutter pub get + + # Install the Apple certificate and provisioning profile + - name: Install the Apple certificate and provisioning profile + env: + BUILD_CERTIFICATE_BASE64: ${{ secrets.APPSTORE_CERT_BASE64 }} + P12_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} + BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.MOBILEPROVISION_BASE64 }} + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + EXPORT_OPTIONS_PLIST: ${{ secrets.EXPORT_OPTIONS_PLIST }} + run: | + # create variables + CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 + PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db + # import certificate and provisioning profile from secrets + echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode --output $CERTIFICATE_PATH + echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode --output $PP_PATH + # create temporary keychain + security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + security set-keychain-settings -lut 21600 $KEYCHAIN_PATH + security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + # import certificate to keychain + security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH + security list-keychain -d user -s $KEYCHAIN_PATH + # apply provisioning profile + mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles + cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles + EXPORT_OPTS_PATH=$RUNNER_TEMP/ExportOptions.plist + echo -n "$EXPORT_OPTIONS_PLIST" | base64 --decode -o $EXPORT_OPTS_PATH + + # Build and sign the ipa using a single flutter command + - name: Building IPA + run: flutter build ipa --release --export-options-plist=$RUNNER_TEMP/ExportOptions.plist + + # Collect the file and upload as artifact + - name: Upload IPA Artifact + uses: actions/upload-artifact@v3 + with: + name: release-ipa + path: build/ios/ipa/*.ipa + + - name: Clean up keychain and provisioning profile + if: ${{ always() }} + run: | + security delete-keychain $RUNNER_TEMP/app-signing.keychain-db + rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision + + CreateDraftRelease: + runs-on: ubuntu-latest + needs: [BuildAndroidRelease, BuildiOSRelease] + permissions: + contents: write + steps: + + - name: Download Android APK Artifact + uses: actions/download-artifact@v3 + with: + name: release-apk + + - name: Download Android AAB Artifact + uses: actions/download-artifact@v3 + with: + name: release-aab + + - name: Download iOS IPA Artifact + uses: actions/download-artifact@v3 + with: + name: release-ipa + + - name: Create Draft Release + uses: ncipollo/release-action@v1.13.0 + with: + artifacts: "app-release.aab, app-release.apk, workout_timer.ipa" + draft: true + tag: ${{ github.ref_name }} + generateReleaseNotes: true + skipIfReleaseExists: true + prerelease: true