name: Spotube Release Binary on: workflow_dispatch: inputs: version: description: Version to release (x.x.x) default: 3.6.0 required: true channel: type: choice description: Release Channel required: true options: - stable - nightly default: nightly debug: description: Debug on failed when channel is nightly required: true type: boolean default: false dry_run: description: Dry run required: true type: boolean default: true env: FLUTTER_VERSION: '3.19.5' jobs: windows: runs-on: windows-latest steps: - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2.12.0 with: cache: true flutter-version: ${{ env.FLUTTER_VERSION }} - name: Replace pubspec version and BUILD_VERSION Env (nightly) if: ${{ inputs.channel == 'nightly' }} run: | choco install sed make yq -y yq -i '.version |= sub("\+\d+", "+${{ inputs.channel }}.")' pubspec.yaml yq -i '.version += strenv(GITHUB_RUN_NUMBER)' pubspec.yaml "BUILD_VERSION=${{ inputs.version }}+${{ inputs.channel }}.${{ github.run_number }}" >> $env:GITHUB_ENV - name: BUILD_VERSION Env (stable) if: ${{ inputs.channel == 'stable' }} run: | "BUILD_VERSION=${{ inputs.version }}" >> $env:GITHUB_ENV - name: Replace version in files run: | choco install sed make -y sed -i "s/%{{SPOTUBE_VERSION}}%/${{ env.BUILD_VERSION }}/" windows/runner/Runner.rc sed -i "s/%{{SPOTUBE_VERSION}}%/${{ env.BUILD_VERSION }}/" choco-struct/tools/VERIFICATION.txt sed -i "s/%{{SPOTUBE_VERSION}}%/${{ env.BUILD_VERSION }}/" choco-struct/spotube.nuspec - name: Create Stable .env if: ${{ inputs.channel == 'stable' }} run: echo '${{ secrets.DOTENV_RELEASE }}' > .env - name: Create Nightly .env if: ${{ inputs.channel == 'nightly' }} run: echo '${{ secrets.DOTENV_NIGHTLY }}' > .env - name: Generating Secrets run: | flutter config --enable-windows-desktop flutter pub get dart run build_runner build --delete-conflicting-outputs - name: Build Windows Executable run: | dart pub global activate flutter_distributor make innoinstall flutter_distributor package --platform=windows --targets=exe --skip-clean mv dist/**/spotube-*-windows-setup.exe dist/Spotube-windows-x86_64-setup.exe - name: Create Chocolatey Package and set hash if: ${{ inputs.channel == 'stable' }} run: | Set-Variable -Name HASH -Value (Get-FileHash dist\Spotube-windows-x86_64-setup.exe).Hash sed -i "s/%{{WIN_SHA256}}%/$HASH/" choco-struct/tools/VERIFICATION.txt make choco mv dist/spotube.*.nupkg dist/Spotube-windows-x86_64.nupkg - name: Upload Artifact uses: actions/upload-artifact@v3 with: if-no-files-found: error name: Spotube-Release-Binaries path: | dist/Spotube-windows-x86_64.nupkg dist/Spotube-windows-x86_64-setup.exe - name: Debug With SSH When fails if: ${{ failure() && inputs.debug && inputs.channel == 'nightly' }} uses: mxschmitt/action-tmate@v3 with: limit-access-to-actor: true linux: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2.12.0 with: cache: true flutter-version: ${{ env.FLUTTER_VERSION }} - name: Get current date id: date run: echo "::set-output name=date::$(date +'%Y-%m-%d')" - name: Install Dependencies run: | sudo apt-get update -y sudo apt-get install -y tar clang cmake ninja-build pkg-config libgtk-3-dev make python3-pip python3-setuptools desktop-file-utils libgdk-pixbuf2.0-dev fakeroot strace fuse libunwind-dev locate patchelf gir1.2-appindicator3-0.1 libappindicator3-1 libappindicator3-dev libsecret-1-0 libjsoncpp25 libsecret-1-dev libjsoncpp-dev libnotify-bin libnotify-dev mpv libmpv-dev - name: Install AppImage Tool run: | wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" chmod +x appimagetool mv appimagetool /usr/local/bin/ - name: Replace pubspec version and BUILD_VERSION Env (nightly) if: ${{ inputs.channel == 'nightly' }} run: | curl -sS https://webi.sh/yq | sh yq -i '.version |= sub("\+\d+", "+${{ inputs.channel }}.")' pubspec.yaml yq -i '.version += strenv(GITHUB_RUN_NUMBER)' pubspec.yaml echo "BUILD_VERSION=${{ inputs.version }}+${{ inputs.channel }}.${{ github.run_number }}" >> $GITHUB_ENV - name: BUILD_VERSION Env (stable) if: ${{ inputs.channel == 'stable' }} run: | echo "BUILD_VERSION=${{ inputs.version }}" >> $GITHUB_ENV - name: Create Stable .env if: ${{ inputs.channel == 'stable' }} run: echo '${{ secrets.DOTENV_RELEASE }}' > .env - name: Create Nightly .env if: ${{ inputs.channel == 'nightly' }} run: echo '${{ secrets.DOTENV_NIGHTLY }}' > .env - name: Replace Version in files run: | sed -i 's|%{{APPDATA_RELEASE}}%||' linux/com.github.KRTirtho.Spotube.appdata.xml - name: Generate Secrets run: | flutter config --enable-linux-desktop flutter pub get dart run build_runner build --delete-conflicting-outputs - name: Build Linux Packages run: | dart pub global activate flutter_distributor alias dpkg-deb="dpkg-deb --Zxz" flutter_distributor package --platform=linux --targets=deb flutter_distributor package --platform=linux --targets=rpm - name: Create tar.xz (stable) if: ${{ inputs.channel == 'stable' }} run: make tar VERSION=${{ env.BUILD_VERSION }} ARCH=x64 PKG_ARCH=x86_64 - name: Create tar.xz (nightly) if: ${{ inputs.channel == 'nightly' }} run: make tar VERSION=nightly ARCH=x64 PKG_ARCH=x86_64 - name: Move Files to dist run: | mv build/spotube-linux-*-x86_64.tar.xz dist/ mv dist/**/spotube-*-linux.deb dist/Spotube-linux-x86_64.deb mv dist/**/spotube-*-linux.rpm dist/Spotube-linux-x86_64.rpm - uses: actions/upload-artifact@v3 if: ${{ inputs.channel == 'stable' }} with: if-no-files-found: error name: Spotube-Release-Binaries path: | dist/Spotube-linux-x86_64.deb dist/Spotube-linux-x86_64.rpm dist/spotube-linux-${{ env.BUILD_VERSION }}-x86_64.tar.xz - uses: actions/upload-artifact@v3 if: ${{ inputs.channel == 'nightly' }} with: if-no-files-found: error name: Spotube-Release-Binaries path: | dist/Spotube-linux-x86_64.deb dist/Spotube-linux-x86_64.rpm dist/spotube-linux-nightly-x86_64.tar.xz - name: Debug With SSH When fails if: ${{ failure() && inputs.debug && inputs.channel == 'nightly' }} uses: mxschmitt/action-tmate@v3 with: limit-access-to-actor: true linux_arm: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Get current date id: date run: echo "::set-output name=date::$(date +'%Y-%m-%d')" - name: Install Dependencies run: | sudo apt-get update -y sudo apt-get install -y pkg-config make python3-pip python3-setuptools - name: Replace pubspec version and BUILD_VERSION Env (nightly) if: ${{ inputs.channel == 'nightly' }} run: | curl -sS https://webi.sh/yq | sh yq -i '.version |= sub("\+\d+", "+${{ inputs.channel }}.")' pubspec.yaml yq -i '.version += strenv(GITHUB_RUN_NUMBER)' pubspec.yaml echo "BUILD_VERSION=${{ inputs.version }}+${{ inputs.channel }}.${{ github.run_number }}" >> $GITHUB_ENV - name: BUILD_VERSION Env (stable) if: ${{ inputs.channel == 'stable' }} run: | echo "BUILD_VERSION=${{ inputs.version }}" >> $GITHUB_ENV - name: Create Stable .env if: ${{ inputs.channel == 'stable' }} run: echo '${{ secrets.DOTENV_RELEASE }}' > .env - name: Create Nightly .env if: ${{ inputs.channel == 'nightly' }} run: echo '${{ secrets.DOTENV_NIGHTLY }}' > .env - name: Replace Version in files run: | sed -i 's|%{{APPDATA_RELEASE}}%||' linux/com.github.KRTirtho.Spotube.appdata.xml - name: Build Binaries (stable) if: ${{ inputs.channel == 'stable' }} run: | docker buildx build --platform=linux/arm64 -f .github/Dockerfile . --build-arg FLUTTER_VERSION=${{env.FLUTTER_VERSION}} --build-arg BUILD_VERSION=${{env.BUILD_VERSION}} -t krtirtho/spotube_linux_arm:latest --load - name: Build Binaries (nightly) if: ${{ inputs.channel == 'nightly' }} run: | docker buildx build --platform=linux/arm64 -f .github/Dockerfile . --build-arg FLUTTER_VERSION=${{env.FLUTTER_VERSION}} --build-arg BUILD_VERSION=nightly -t krtirtho/spotube_linux_arm:latest --load - name: Copy the built packages run: | docker images ls docker create --name spotube_linux_arm krtirtho/spotube_linux_arm:latest docker cp spotube_linux_arm:/app/dist/ dist/ - uses: actions/upload-artifact@v3 if: ${{ inputs.channel == 'stable' }} with: if-no-files-found: error name: Spotube-Release-Binaries path: | dist/Spotube-linux-aarch64.deb dist/spotube-linux-${{ env.BUILD_VERSION }}-aarch64.tar.xz - uses: actions/upload-artifact@v3 if: ${{ inputs.channel == 'nightly' }} with: if-no-files-found: error name: Spotube-Release-Binaries path: | dist/Spotube-linux-aarch64.deb dist/spotube-linux-nightly-aarch64.tar.xz - name: Debug With SSH When fails if: ${{ failure() && inputs.debug && inputs.channel == 'nightly' }} uses: mxschmitt/action-tmate@v3 with: limit-access-to-actor: true android: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2.12.0 with: cache: true flutter-version: ${{ env.FLUTTER_VERSION }} - name: Setup Java uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: '17' cache: 'gradle' check-latest: true - name: Install Dependencies run: | sudo apt-get update -y sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev make python3-pip python3-setuptools patchelf desktop-file-utils libgdk-pixbuf2.0-dev fakeroot strace fuse xmlstarlet - name: Replace pubspec version and BUILD_VERSION Env (nightly) if: ${{ inputs.channel == 'nightly' }} run: | curl -sS https://webi.sh/yq | sh yq -i '.version |= sub("\+\d+", "+${{ inputs.channel }}.")' pubspec.yaml yq -i '.version += strenv(GITHUB_RUN_NUMBER)' pubspec.yaml echo "BUILD_VERSION=${{ inputs.version }}+${{ inputs.channel }}.${{ github.run_number }}" >> $GITHUB_ENV - name: BUILD_VERSION Env (stable) if: ${{ inputs.channel == 'stable' }} run: | echo "BUILD_VERSION=${{ inputs.version }}" >> $GITHUB_ENV - name: Create Stable .env if: ${{ inputs.channel == 'stable' }} run: echo '${{ secrets.DOTENV_RELEASE }}' > .env - name: Create Nightly .env if: ${{ inputs.channel == 'nightly' }} run: echo '${{ secrets.DOTENV_NIGHTLY }}' > .env - name: Generate Secrets run: | flutter pub get dart run build_runner build --delete-conflicting-outputs - name: Sign Apk run: | echo '${{ secrets.KEYSTORE }}' | base64 --decode > android/app/upload-keystore.jks echo '${{ secrets.KEY_PROPERTIES }}' > android/key.properties - name: Build Apk run: | flutter build apk --flavor ${{ inputs.channel }} mv build/app/outputs/flutter-apk/app-${{ inputs.channel }}-release.apk build/Spotube-android-all-arch.apk - name: Build Playstore AppBundle run: | echo 'ENABLE_UPDATE_CHECK=0' >> .env dart run build_runner build --delete-conflicting-outputs export MANIFEST=android/app/src/main/AndroidManifest.xml xmlstarlet ed -d '//meta-data[@android:name="com.google.android.gms.car.application"]' $MANIFEST > $MANIFEST.tmp mv $MANIFEST.tmp $MANIFEST flutter build appbundle --flavor ${{ inputs.channel }} mv build/app/outputs/bundle/${{ inputs.channel }}Release/app-${{ inputs.channel }}-release.aab build/Spotube-playstore-all-arch.aab - uses: actions/upload-artifact@v3 with: if-no-files-found: error name: Spotube-Release-Binaries path: | build/Spotube-android-all-arch.apk build/Spotube-playstore-all-arch.aab - name: Debug With SSH When fails if: ${{ failure() && inputs.debug && inputs.channel == 'nightly' }} uses: mxschmitt/action-tmate@v3 with: limit-access-to-actor: true macos: runs-on: macos-14 steps: - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2.12.0 with: cache: true flutter-version: ${{ env.FLUTTER_VERSION }} - name: Replace pubspec version and BUILD_VERSION Env (nightly) if: ${{ inputs.channel == 'nightly' }} run: | brew install yq yq -i '.version |= sub("\+\d+", "+${{ inputs.channel }}.")' pubspec.yaml yq -i '.version += strenv(GITHUB_RUN_NUMBER)' pubspec.yaml echo "BUILD_VERSION=${{ inputs.version }}+${{ inputs.channel }}.${{ github.run_number }}" >> $GITHUB_ENV - name: BUILD_VERSION Env (stable) if: ${{ inputs.channel == 'stable' }} run: | echo "BUILD_VERSION=${{ inputs.version }}" >> $GITHUB_ENV - name: Create Stable .env if: ${{ inputs.channel == 'stable' }} run: echo '${{ secrets.DOTENV_RELEASE }}' > .env - name: Create Nightly .env if: ${{ inputs.channel == 'nightly' }} run: echo '${{ secrets.DOTENV_NIGHTLY }}' > .env - name: Generate Secrets run: | dart pub global activate flutter_distributor flutter pub get dart run build_runner build --delete-conflicting-outputs - name: Build Macos App run: | flutter config --enable-macos-desktop flutter build macos du -sh build/macos/Build/Products/Release/spotube.app - name: Package Macos App run: | brew install python-setuptools npm install -g appdmg mkdir -p build/${{ env.BUILD_VERSION }} appdmg appdmg.json build/Spotube-macos-universal.dmg flutter_distributor package --platform=macos --targets pkg --skip-clean mv dist/**/spotube-*-macos.pkg build/Spotube-macos-universal.pkg - uses: actions/upload-artifact@v3 with: if-no-files-found: error name: Spotube-Release-Binaries path: | build/Spotube-macos-universal.dmg build/Spotube-macos-universal.pkg - name: Debug With SSH When fails if: ${{ failure() && inputs.debug && inputs.channel == 'nightly' }} uses: mxschmitt/action-tmate@v3 with: limit-access-to-actor: true iOS: runs-on: macos-14 steps: - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2.10.0 with: cache: true flutter-version: ${{ env.FLUTTER_VERSION }} - name: Replace pubspec version and BUILD_VERSION Env (nightly) if: ${{ inputs.channel == 'nightly' }} run: | brew install yq yq -i '.version |= sub("\+\d+", "+${{ inputs.channel }}.")' pubspec.yaml yq -i '.version += strenv(GITHUB_RUN_NUMBER)' pubspec.yaml echo "BUILD_VERSION=${{ inputs.version }}+${{ inputs.channel }}.${{ github.run_number }}" >> $GITHUB_ENV - name: BUILD_VERSION Env (stable) if: ${{ inputs.channel == 'stable' }} run: | echo "BUILD_VERSION=${{ inputs.version }}" >> $GITHUB_ENV - name: Create Stable .env if: ${{ inputs.channel == 'stable' }} run: echo '${{ secrets.DOTENV_RELEASE }}' > .env - name: Create Nightly .env if: ${{ inputs.channel == 'nightly' }} run: echo '${{ secrets.DOTENV_NIGHTLY }}' > .env - name: Generate Secrets run: | flutter pub get dart run build_runner build --delete-conflicting-outputs - name: Build iOS iPA run: | flutter build ios --release --no-codesign --flavor ${{ inputs.channel }} ln -sf ./build/ios/iphoneos Payload zip -r9 Spotube-iOS.ipa Payload/${{ inputs.channel }}.app - uses: actions/upload-artifact@v3 with: if-no-files-found: error name: Spotube-Release-Binaries path: | Spotube-iOS.ipa - name: Debug With SSH When fails if: ${{ failure() && inputs.debug && inputs.channel == 'nightly' }} uses: mxschmitt/action-tmate@v3 with: limit-access-to-actor: true upload: runs-on: ubuntu-latest needs: - windows - linux - linux_arm - android - macos - iOS steps: - uses: actions/download-artifact@v3 with: name: Spotube-Release-Binaries path: ./Spotube-Release-Binaries - name: Install dependencies run: sudo apt-get install tree -y - name: Generate Checksums run: | tree . md5sum Spotube-Release-Binaries/* >> RELEASE.md5sum sha256sum Spotube-Release-Binaries/* >> RELEASE.sha256sum sed -i 's|Spotube-Release-Binaries/||' RELEASE.sha256sum RELEASE.md5sum - uses: actions/upload-artifact@v3 with: if-no-files-found: error name: Spotube-Release-Binaries path: | RELEASE.md5sum RELEASE.sha256sum - name: Upload Release Binaries (stable) if: ${{ !inputs.dry_run && inputs.channel == 'stable' }} uses: ncipollo/release-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} tag: v${{ inputs.version }} # mind the "v" prefix omitBodyDuringUpdate: true omitNameDuringUpdate: true omitPrereleaseDuringUpdate: true allowUpdates: true artifacts: Spotube-Release-Binaries/*,RELEASE.sha256sum,RELEASE.md5sum - name: Upload Release Binaries (nightly) if: ${{ !inputs.dry_run && inputs.channel == 'nightly' }} uses: ncipollo/release-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} tag: nightly omitBodyDuringUpdate: true omitNameDuringUpdate: true omitPrereleaseDuringUpdate: true allowUpdates: true artifacts: Spotube-Release-Binaries/*,RELEASE.sha256sum,RELEASE.md5sum