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 GITEA_BASE_URL: https://git.tgj.services 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@v3 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@v3 with: name: linux-bundle path: app-linux-x64.tar.gz release-dev: runs-on: ubuntu-latest needs: - meta - android-build - linux-build steps: - name: Install jq run: | if command -v sudo >/dev/null 2>&1; then SUDO="sudo" else SUDO="" fi $SUDO apt-get update $SUDO apt-get install -y jq - name: Download Android APK if: ${{ github.ref == 'refs/heads/dev' }} uses: actions/download-artifact@v3 with: name: android-apk path: artifacts - name: Download Linux bundle if: ${{ github.ref == 'refs/heads/dev' }} uses: actions/download-artifact@v3 with: name: linux-bundle path: artifacts - name: Download Windows bundle (optional) if: ${{ github.ref == 'refs/heads/dev' && env.BUILD_WINDOWS == 'true' }} uses: actions/download-artifact@v3 with: name: windows-zip path: artifacts - name: Prepare artefacts and tag if: ${{ github.ref == 'refs/heads/dev' }} 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 echo "tag=${TAG}" >> "$GITHUB_OUTPUT" echo "files=artifacts/*" >> "$GITHUB_OUTPUT" - name: Create prerelease on Gitea if: ${{ github.ref == 'refs/heads/dev' }} uses: ncipollo/release-action@v1 with: tag: v${{ needs.meta.outputs.base_version }}-dev.${{ github.run_number }} name: v${{ needs.meta.outputs.base_version }}-dev build ${{ github.run_number }} prerelease: true commit: ${{ github.sha }} token: ${{ secrets.GITEA_TOKEN }} # NOTE: no `artifacts:` here - name: Attach artefacts to Gitea release if: ${{ github.ref == 'refs/heads/dev' }} run: | set -euo pipefail BASE="${{ needs.meta.outputs.base_version }}" TAG="v${BASE}-dev.${{ github.run_number }}" # 1. Find release ID by tag RELEASE_JSON=$(curl -sS \ -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ "${GITEA_BASE_URL}/api/v1/repos/${{ github.repository }}/releases/tags/${TAG}") RELEASE_ID=$(echo "$RELEASE_JSON" | jq -r '.id') echo "Release ID: $RELEASE_ID" # 2. Upload each artefact with multipart/form-data for f in artifacts/*; do [ -f "$f" ] || continue NAME=$(basename "$f") echo "Uploading $NAME" curl -sS -X POST \ -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ -F "attachment=@${f}" \ -F "name=${NAME}" \ "${GITEA_BASE_URL}/api/v1/repos/${{ github.repository }}/releases/${RELEASE_ID}/assets" \ >/dev/null done release-master: runs-on: ubuntu-latest needs: - meta - android-build - linux-build steps: - name: Download Android APK if: ${{ github.ref == 'refs/heads/master' }} uses: actions/download-artifact@v3 with: name: android-apk path: artifacts - name: Download Linux bundle if: ${{ github.ref == 'refs/heads/master' }} uses: actions/download-artifact@v3 with: name: linux-bundle path: artifacts - name: Download Windows bundle (optional) if: ${{ github.ref == 'refs/heads/master' && env.BUILD_WINDOWS == 'true' }} uses: actions/download-artifact@v3 with: name: windows-zip path: artifacts - name: Prepare artefacts and tag if: ${{ github.ref == 'refs/heads/master' }} 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 echo "tag=${TAG}" >> "$GITHUB_OUTPUT" echo "files=artifacts/*" >> "$GITHUB_OUTPUT" - name: Create release on Gitea if: ${{ github.ref == 'refs/heads/master' }} 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 }}