mirror of
https://github.com/KRTirtho/spotube.git
synced 2026-11-04 10:13:59 +00:00
Compare commits
No commits in common. "069b586d445632776a7455572aabbc8ccc4c5347" and "2f7eb742cfc8087be6f54426d29c8af03697a499" have entirely different histories.
069b586d44
...
2f7eb742cf
101
.github/workflows/spotube-release-binary.yml
vendored
101
.github/workflows/spotube-release-binary.yml
vendored
@ -22,18 +22,17 @@ on:
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
# Read-only by default; only create-release gets write access
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
# Never cancel a running release when another is dispatched, and let stable and nightly run side by side
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.release_type }}
|
||||
cancel-in-progress: false
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
COMPOSE_WEBVIEW_REPO: KRTirtho/ComposeNativeWebview
|
||||
COMPOSE_WEBVIEW_COMMIT: cbd36f88927298a28a2d64c6acf7ec3b2def6f9d
|
||||
GRADLE_PLUGIN_REPO: team-spotube/gradle-plugin
|
||||
VLCJ_BUNDLER_REPO: team-spotube/vlcj-bundler-gradle-plugin
|
||||
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit on shared runners
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
jobs:
|
||||
prepare-deps:
|
||||
@ -48,6 +47,20 @@ jobs:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
path: compose-webview
|
||||
|
||||
- name: Checkout gradle-plugin
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
repository: ${{ env.GRADLE_PLUGIN_REPO }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
path: gradle-plugin
|
||||
|
||||
- name: Checkout vlcj-bundler
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
repository: ${{ env.VLCJ_BUNDLER_REPO }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
path: vlcj-bundler
|
||||
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v6
|
||||
with:
|
||||
@ -69,6 +82,18 @@ jobs:
|
||||
chmod +x gradlew
|
||||
./gradlew publishToMavenLocal
|
||||
|
||||
- name: Publish gradle-plugin to mavenLocal
|
||||
working-directory: gradle-plugin
|
||||
run: |
|
||||
chmod +x gradlew
|
||||
./gradlew publishToMavenLocal
|
||||
|
||||
- name: Publish vlcj-bundler to mavenLocal
|
||||
working-directory: vlcj-bundler
|
||||
run: |
|
||||
chmod +x gradlew
|
||||
./gradlew publishToMavenLocal
|
||||
|
||||
- name: Upload maven local
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
@ -78,7 +103,6 @@ jobs:
|
||||
build-android:
|
||||
name: Android
|
||||
needs: prepare-deps
|
||||
timeout-minutes: 120
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
@ -105,23 +129,17 @@ jobs:
|
||||
run: chmod +x gradlew
|
||||
|
||||
- name: Decode keystore
|
||||
env:
|
||||
KEYSTORE: ${{ secrets.KEYSTORE }}
|
||||
run: |
|
||||
echo "$KEYSTORE" | base64 --decode > "${{ github.workspace }}/composeApp/upload-keystore.jks"
|
||||
echo '${{ secrets.KEYSTORE }}' | base64 --decode > "${{ github.workspace }}/composeApp/upload-keystore.jks"
|
||||
|
||||
- name: Configure Android signing
|
||||
working-directory: composeApp
|
||||
env:
|
||||
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
|
||||
KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
|
||||
KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
|
||||
run: |
|
||||
cat >> local.properties <<EOF
|
||||
release.signing.storeFile=${{ github.workspace }}/composeApp/upload-keystore.jks
|
||||
release.signing.storePassword=${KEYSTORE_PASSWORD}
|
||||
release.signing.keyAlias=${KEYSTORE_KEY_ALIAS}
|
||||
release.signing.keyPassword=${KEYSTORE_KEY_PASSWORD}
|
||||
release.signing.storePassword=${{ secrets.KEYSTORE_PASSWORD }}
|
||||
release.signing.keyAlias=${{ secrets.KEYSTORE_KEY_ALIAS }}
|
||||
release.signing.keyPassword=${{ secrets.KEYSTORE_KEY_PASSWORD }}
|
||||
EOF
|
||||
|
||||
- name: Assemble Release
|
||||
@ -152,7 +170,6 @@ jobs:
|
||||
build-linux:
|
||||
name: Linux Desktop
|
||||
needs: prepare-deps
|
||||
timeout-minutes: 120
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
@ -187,13 +204,9 @@ jobs:
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.gradle/nucleus/graalvm
|
||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('gradle/libs.versions.toml', 'composeApp/build.gradle.kts') }}
|
||||
restore-keys: graalvm-${{ runner.os }}-${{ runner.arch }}-
|
||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}
|
||||
|
||||
- name: Package Linux
|
||||
env:
|
||||
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: ./gradlew :composeApp:packageGraalvmDeb :composeApp:packageGraalvmRpm -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||
|
||||
- name: Rename Linux artifacts
|
||||
@ -224,7 +237,6 @@ jobs:
|
||||
build-linux-arm64:
|
||||
name: Linux Desktop (aarch64)
|
||||
needs: prepare-deps
|
||||
timeout-minutes: 120
|
||||
runs-on: ubuntu-24.04-arm
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
@ -266,14 +278,10 @@ jobs:
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.gradle/nucleus/graalvm
|
||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('gradle/libs.versions.toml', 'composeApp/build.gradle.kts') }}
|
||||
restore-keys: graalvm-${{ runner.os }}-${{ runner.arch }}-
|
||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}
|
||||
|
||||
- name: Package Linux
|
||||
env:
|
||||
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: ./gradlew :composeApp:packageGraalvmDeb :composeApp:packageGraalvmRpm -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||
run: ./gradlew :composeApp:packageGraalvmDeb :composeApp:packageGraalvmRpm --stacktrace -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||
|
||||
- name: Rename Linux artifacts
|
||||
run: |
|
||||
@ -303,7 +311,6 @@ jobs:
|
||||
build-windows:
|
||||
name: Windows Desktop
|
||||
needs: prepare-deps
|
||||
timeout-minutes: 120
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
@ -334,13 +341,9 @@ jobs:
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.gradle/nucleus/graalvm
|
||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('gradle/libs.versions.toml', 'composeApp/build.gradle.kts') }}
|
||||
restore-keys: graalvm-${{ runner.os }}-${{ runner.arch }}-
|
||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}
|
||||
|
||||
- name: Package EXE
|
||||
env:
|
||||
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: ./gradlew :composeApp:packageGraalvmExe -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||
|
||||
- name: Rename Windows artifacts
|
||||
@ -366,7 +369,6 @@ jobs:
|
||||
build-macos:
|
||||
name: macOS Desktop
|
||||
needs: prepare-deps
|
||||
timeout-minutes: 120
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
@ -396,13 +398,9 @@ jobs:
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.gradle/nucleus/graalvm
|
||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('gradle/libs.versions.toml', 'composeApp/build.gradle.kts') }}
|
||||
restore-keys: graalvm-${{ runner.os }}-${{ runner.arch }}-
|
||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}
|
||||
|
||||
- name: Package DMG
|
||||
env:
|
||||
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: ./gradlew :composeApp:packageGraalvmDmg -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||
|
||||
- name: Rename macOS artifact
|
||||
@ -432,8 +430,6 @@ jobs:
|
||||
- build-windows
|
||||
- build-macos
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
|
||||
@ -479,7 +475,7 @@ jobs:
|
||||
run: |
|
||||
echo "## Downloads" > release-notes.md
|
||||
echo "" >> release-notes.md
|
||||
for dir in android-apk linux-deb linux-rpm linux-deb-arm64 linux-rpm-arm64 windows-exe macos-dmg; do
|
||||
for dir in android-apk android-aab linux-deb linux-rpm linux-appimage linux-deb-arm64 linux-rpm-arm64 windows-msi windows-exe macos-dmg; do
|
||||
if [ -d "$dir" ]; then
|
||||
echo "### $dir" >> release-notes.md
|
||||
for f in "$dir"/*; do
|
||||
@ -489,29 +485,22 @@ jobs:
|
||||
fi
|
||||
done
|
||||
|
||||
# The rolling nightly tag already exists, and the release action never moves an existing tag
|
||||
- name: Move nightly tag to this commit
|
||||
if: ${{ inputs.release_type == 'nightly' }}
|
||||
run: |
|
||||
git tag -f nightly "$GITHUB_SHA"
|
||||
git push -f origin refs/tags/nightly
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v3
|
||||
with:
|
||||
tag_name: ${{ steps.vars.outputs.tag }}
|
||||
# A new tag (stable) would otherwise point at the default branch instead of the built commit
|
||||
target_commitish: ${{ github.sha }}
|
||||
fail_on_unmatched_files: true
|
||||
name: ${{ steps.vars.outputs.release_name }}
|
||||
body_path: release-notes.md
|
||||
draft: ${{ steps.vars.outputs.is_draft }}
|
||||
prerelease: ${{ steps.vars.outputs.is_prerelease }}
|
||||
files: |
|
||||
android-apk/*.apk
|
||||
android-aab/*.aab
|
||||
linux-deb/*.deb
|
||||
linux-rpm/*.rpm
|
||||
linux-appimage/*.AppImage
|
||||
linux-deb-arm64/*.deb
|
||||
linux-rpm-arm64/*.rpm
|
||||
windows-msi/*.msi
|
||||
windows-exe/*.exe
|
||||
macos-dmg/*.dmg
|
||||
|
||||
@ -59,7 +59,9 @@
|
||||
|
||||
## Release workflow (`.github/workflows/release.yml`)
|
||||
- Triggered by `workflow_dispatch` with a `release_type` choice input (`stable` | `nightly`).
|
||||
- `prepare-deps` job checks out & publishes `kdroidFilter/ComposeNativeWebview` (compose-webview) to `mavenLocal`. The spotube gradle plugin and vlcj-bundler now come from Maven Central.
|
||||
- `prepare-deps` job checks out & publishes to `mavenLocal`:
|
||||
- `kdroidFilter/ComposeNativeWebview` (compose-webview)
|
||||
- `team-spotube/gradle-plugin` (spotubeGradle + vlcjBundler plugins)
|
||||
- Build jobs per platform (Android, Linux, Windows, macOS), all `needs: prepare-deps`. Desktop jobs ship GraalVM native installers (`packageGraalvm{Deb,Rpm,Exe,Dmg}`, output in `composeApp/build/compose/binaries/main/graalvm-<format>/`), not jpackage/JVM ones.
|
||||
- **Stable**: reads `versionName` from `composeApp/build.gradle.kts`, tag = `v{version}`, draft release.
|
||||
- **Nightly**: builds with `-PversionName=nightly`, tag = `nightly` (updates existing), prerelease.
|
||||
|
||||
@ -54,8 +54,10 @@ Spotube is a Kotlin Multiplatform + Compose Multiplatform app. The desktop app i
|
||||
- **JDK 21** to run Gradle. The Gradle daemon JDK and the GraalVM toolchain are provisioned automatically.
|
||||
- **Rust** (`rustup` + `cargo`). The `composeApp` Rust library is built through [Gobley](https://gobley.dev).
|
||||
- **Android SDK**, only for Android builds.
|
||||
- **Unpublished dependency.** One dependency isn't on Maven Central yet. Clone it and run `./gradlew publishToMavenLocal` in it:
|
||||
- **Unpublished dependencies.** Three dependencies aren't on Maven Central yet. Clone each one and run `./gradlew publishToMavenLocal` in it:
|
||||
- [kdroidFilter/ComposeNativeWebview](https://github.com/kdroidFilter/ComposeNativeWebview), at the commit pinned in [`spotube-release-binary.yml`](.github/workflows/spotube-release-binary.yml) (`COMPOSE_WEBVIEW_COMMIT`)
|
||||
- [team-spotube/gradle-plugin](https://github.com/team-spotube/gradle-plugin)
|
||||
- [team-spotube/vlcj-bundler-gradle-plugin](https://github.com/team-spotube/vlcj-bundler-gradle-plugin)
|
||||
- **Linux runtime:** `webkit2gtk-4.1` for the embedded webview.
|
||||
|
||||
Always use the Gradle wrapper (`./gradlew`, or `gradlew.bat` on Windows).
|
||||
|
||||
@ -550,12 +550,6 @@ run {
|
||||
val isLinuxArm64Host = System.getProperty("os.name").lowercase().contains("linux") &&
|
||||
System.getProperty("os.arch").lowercase() in setOf("aarch64", "arm64")
|
||||
if (isLinuxArm64Host) {
|
||||
// Gobley generates the UniFFI bindings from the first Android build's library by default; use the host's.
|
||||
uniffi {
|
||||
generateFromLibrary {
|
||||
build = GobleyHost.current.rustTarget
|
||||
}
|
||||
}
|
||||
tasks.matching { it.name.startsWith("cargoBuildAndroid") || it.name.startsWith("rustUpTargetAddAndroid") }
|
||||
.configureEach { enabled = false }
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user