name: Release on: push: branches: - master - dev env: JAVA_VERSION: "17" ANDROID_SDK_ROOT: "${{ github.workspace }}/android-sdk" FLUTTER_CHANNEL: "stable" BUILD_WINDOWS: "false" # set to "true" when you actually want Windows builds jobs: meta: runs-on: ubuntu-latest outputs: base_version: ${{ steps.meta.outputs.base }} steps: - name: Checkout uses: actions/checkout@v4 - name: Determine version id: meta run: | RAW_VERSION=$(awk '/^version:/{print $2}' pubspec.yaml) BASE_VERSION=${RAW_VERSION%%+*} echo "base=${BASE_VERSION}" >> "$GITHUB_OUTPUT" android-build: runs-on: ubuntu-latest needs: meta steps: - name: Checkout uses: actions/checkout@v4 - name: Install OS deps (Android) run: | if command -v sudo >/dev/null 2>&1; then SUDO="sudo" else SUDO="" fi $SUDO apt-get update $SUDO apt-get install -y unzip xz-utils zip libstdc++6 liblzma-dev curl jq - name: Setup Java uses: actions/setup-java@v4 with: distribution: temurin java-version: ${{ env.JAVA_VERSION }} - name: Install Android SDK run: | mkdir -p "$ANDROID_SDK_ROOT"/cmdline-tools curl -fsSL https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -o /tmp/cli-tools.zip unzip -q /tmp/cli-tools.zip -d "$ANDROID_SDK_ROOT"/cmdline-tools mv "$ANDROID_SDK_ROOT"/cmdline-tools/cmdline-tools "$ANDROID_SDK_ROOT"/cmdline-tools/latest # Accept licences (ignore SIGPIPE exit 141) yes | "$ANDROID_SDK_ROOT"/cmdline-tools/latest/bin/sdkmanager --sdk_root="$ANDROID_SDK_ROOT" --licenses || true # Install required packages (also ignore SIGPIPE) yes | "$ANDROID_SDK_ROOT"/cmdline-tools/latest/bin/sdkmanager --sdk_root="$ANDROID_SDK_ROOT" \ "platform-tools" "platforms;android-33" "build-tools;33.0.2" || true echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> "$GITHUB_ENV" echo "$ANDROID_SDK_ROOT/platform-tools" >> "$GITHUB_PATH" echo "$ANDROID_SDK_ROOT/build-tools/33.0.2" >> "$GITHUB_PATH" - name: Setup Flutter uses: subosito/flutter-action@v2 with: channel: ${{ env.FLUTTER_CHANNEL }} - name: Allow all git directories (CI) run: git config --global --add safe.directory '*' - name: Flutter dependencies run: flutter pub get - name: Build APK (release) run: | flutter build apk --release cp build/app/outputs/flutter-apk/app-release.apk app-release.apk - name: Upload Android APK artifact uses: actions/upload-artifact@v4 with: name: android-apk path: app-release.apk linux-build: runs-on: ubuntu-latest needs: meta steps: - name: Checkout uses: actions/checkout@v4 - name: Install OS deps (Linux desktop) run: | if command -v sudo >/dev/null 2>&1; then SUDO="sudo" else SUDO="" fi $SUDO apt-get update $SUDO apt-get install -y unzip xz-utils zip libstdc++6 libglu1-mesa clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev curl jq - name: Setup Flutter uses: subosito/flutter-action@v2 with: channel: ${{ env.FLUTTER_CHANNEL }} - name: Allow all git directories (CI) run: git config --global --add safe.directory '*' - name: Flutter dependencies run: flutter pub get - name: Enable Linux desktop run: flutter config --enable-linux-desktop - name: Build Linux binary (release) run: | flutter build linux --release tar -C build/linux/x64/release/bundle -czf app-linux-x64.tar.gz . - name: Upload Linux artifact uses: actions/upload-artifact@v4 with: name: linux-bundle path: app-linux-x64.tar.gz windows-build: runs-on: windows-latest needs: meta # Job always runs; individual steps are gated so release jobs can still depend on it. steps: - name: Checkout if: env.BUILD_WINDOWS == 'true' uses: actions/checkout@v4 - name: Setup Flutter if: env.BUILD_WINDOWS == 'true' uses: subosito/flutter-action@v2 with: channel: ${{ env.FLUTTER_CHANNEL }} - name: Allow all git directories (CI) if: env.BUILD_WINDOWS == 'true' run: git config --global --add safe.directory '*' - name: Flutter dependencies if: env.BUILD_WINDOWS == 'true' run: flutter pub get - name: Enable Windows desktop if: env.BUILD_WINDOWS == 'true' run: flutter config --enable-windows-desktop - name: Build Windows binary (release) if: env.BUILD_WINDOWS == 'true' run: | flutter build windows --release powershell -Command "Compress-Archive -Path build/windows/x64/runner/Release/* -DestinationPath app-windows-x64.zip" - name: Upload Windows artifact if: env.BUILD_WINDOWS == 'true' uses: actions/upload-artifact@v4 with: name: windows-zip path: app-windows-x64.zip release-dev: if: github.ref_name == 'dev' runs-on: ubuntu-latest needs: - meta - android-build - linux-build - windows-build steps: - name: Download Android APK uses: actions/download-artifact@v4 with: name: android-apk path: artifacts - name: Download Linux bundle uses: actions/download-artifact@v4 with: name: linux-bundle path: artifacts - name: Download Windows bundle (optional) uses: actions/download-artifact@v4 with: name: windows-zip path: artifacts if-no-files-found: ignore - name: Prepare artefacts and tag id: bundle run: | BASE="${{ needs.meta.outputs.base_version }}" TAG="v${BASE}-dev" mv artifacts/app-release.apk "artifacts/app-${BASE}-dev.apk" mv artifacts/app-linux-x64.tar.gz "artifacts/app-linux-x64-${BASE}-dev.tar.gz" if [ -f artifacts/app-windows-x64.zip ]; then mv artifacts/app-windows-x64.zip "artifacts/app-windows-x64-${BASE}-dev.zip" fi FILES="artifacts/app-${BASE}-dev.apk" FILES="${FILES}"$'\n'"artifacts/app-linux-x64-${BASE}-dev.tar.gz" if [ -f "artifacts/app-windows-x64-${BASE}-dev.zip" ]; then FILES="${FILES}"$'\n'"artifacts/app-windows-x64-${BASE}-dev.zip" fi { echo "tag=${TAG}" echo 'files<> "$GITHUB_OUTPUT" - name: Create prerelease on Gitea uses: ncipollo/release-action@v1 with: tag: ${{ steps.bundle.outputs.tag }} name: ${{ steps.bundle.outputs.tag }} prerelease: true token: ${{ secrets.GITEA_TOKEN }} artifacts: ${{ steps.bundle.outputs.files }} release-master: if: github.ref_name == 'master' runs-on: ubuntu-latest needs: - meta - android-build - linux-build - windows-build steps: - name: Download Android APK uses: actions/download-artifact@v4 with: name: android-apk path: artifacts - name: Download Linux bundle uses: actions/download-artifact@v4 with: name: linux-bundle path: artifacts - name: Download Windows bundle (optional) uses: actions/download-artifact@v4 with: name: windows-zip path: artifacts if-no-files-found: ignore - name: Prepare artefacts and tag id: bundle run: | BASE="${{ needs.meta.outputs.base_version }}" TAG="v${BASE}" mv artifacts/app-release.apk "artifacts/app-${BASE}.apk" mv artifacts/app-linux-x64.tar.gz "artifacts/app-linux-x64-${BASE}.tar.gz" if [ -f artifacts/app-windows-x64.zip ]; then mv artifacts/app-windows-x64.zip "artifacts/app-windows-x64-${BASE}.zip" fi FILES="artifacts/app-${BASE}.apk" FILES="${FILES}"$'\n'"artifacts/app-linux-x64-${BASE}.tar.gz" if [ -f "artifacts/app-windows-x64-${BASE}.zip" ]; then FILES="${FILES}"$'\n'"artifacts/app-windows-x64-${BASE}.zip" fi { echo "tag=${TAG}" echo 'files<> "$GITHUB_OUTPUT" - name: Create release on Gitea uses: ncipollo/release-action@v1 with: tag: ${{ steps.bundle.outputs.tag }} name: ${{ steps.bundle.outputs.tag }} prerelease: false token: ${{ secrets.GITEA_TOKEN }} artifacts: ${{ steps.bundle.outputs.files }}