mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
Bumps the actions-core group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [actions/setup-go](https://github.com/actions/setup-go). Updates `actions/checkout` from 7.0.0 to 7.0.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/releases">actions/checkout's releases</a>.</em></p> <blockquote> <h2>v7.0.1</h2> <h2>What's Changed</h2> <ul> <li>skip running unsafe pr check if input is default by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2518">actions/checkout#2518</a></li> <li>trim only ascii whitespace for branch by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2521">actions/checkout#2521</a></li> <li>escape values passed to --unset by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2530">actions/checkout#2530</a></li> <li>Various dependency updates</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v7...v7.0.1">https://github.com/actions/checkout/compare/v7...v7.0.1</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/blob/main/CHANGELOG.md">actions/checkout's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <h2>v7.0.1</h2> <ul> <li>Skip running unsafe pr check if input is default by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2518">actions/checkout#2518</a></li> <li>Trim only ascii whitespace for branch by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2521">actions/checkout#2521</a></li> <li>Escape values passed to --unset by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2530">actions/checkout#2530</a></li> <li>Various dependency updates</li> </ul> <h2>v7.0.0</h2> <ul> <li>Block checking out fork PR for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Various dependency updates</li> </ul> <h2>v6.0.3</h2> <ul> <li>Fix checkout init for SHA-256 repositories by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li> <li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> </ul> <h2>v6.0.2</h2> <ul> <li>Fix tag handling: preserve annotations and explicit fetch-tags by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2356">actions/checkout#2356</a></li> </ul> <h2>v6.0.1</h2> <ul> <li>Add worktree support for persist-credentials includeIf by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2327">actions/checkout#2327</a></li> </ul> <h2>v6.0.0</h2> <ul> <li>Persist creds to a separate file by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2286">actions/checkout#2286</a></li> <li>Update README to include Node.js 24 support details and requirements by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2248">actions/checkout#2248</a></li> </ul> <h2>v5.0.1</h2> <ul> <li>Port v6 cleanup to v5 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2301">actions/checkout#2301</a></li> </ul> <h2>v5.0.0</h2> <ul> <li>Update actions checkout to use node 24 by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li> </ul> <h2>v4.3.1</h2> <ul> <li>Port v6 cleanup to v4 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2305">actions/checkout#2305</a></li> </ul> <h2>v4.3.0</h2> <ul> <li>docs: update README.md by <a href="https://github.com/motss"><code>@motss</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li> <li>Add internal repos for checking out multiple repositories by <a href="https://github.com/mouismail"><code>@mouismail</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li> <li>Documentation update - add recommended permissions to Readme by <a href="https://github.com/benwells"><code>@benwells</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li> <li>Adjust positioning of user email note and permissions heading by <a href="https://github.com/joshmgross"><code>@joshmgross</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li> <li>Update README.md by <a href="https://github.com/nebuk89"><code>@nebuk89</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li> <li>Update CODEOWNERS for actions by <a href="https://github.com/TingluoHuang"><code>@TingluoHuang</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li> <li>Update package dependencies by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li> </ul> <h2>v4.2.2</h2> <ul> <li><code>url-helper.ts</code> now leverages well-known environment variables by <a href="https://github.com/jww3"><code>@jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li> <li>Expand unit test coverage for <code>isGhes</code> by <a href="https://github.com/jww3"><code>@jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li> </ul> <h2>v4.2.1</h2> <ul> <li>Check out other refs/* by commit if provided, fall back to ref by <a href="https://github.com/orhantoy"><code>@orhantoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/checkout/commit/3d3c42e5aac5ba805825da76410c181273ba90b1"><code>3d3c42e</code></a> prep v7.0.1 release (<a href="https://redirect.github.com/actions/checkout/issues/2531">#2531</a>)</li> <li><a href="https://github.com/actions/checkout/commit/28802689a136bfcdb721715abd713740beecbe07"><code>2880268</code></a> escape values passed to --unset (<a href="https://redirect.github.com/actions/checkout/issues/2530">#2530</a>)</li> <li><a href="https://github.com/actions/checkout/commit/12cd2235efa0937479335606d7c3ac9f6c0973b1"><code>12cd223</code></a> trim only ascii whitespace for branch (<a href="https://redirect.github.com/actions/checkout/issues/2521">#2521</a>)</li> <li><a href="https://github.com/actions/checkout/commit/62661c4e71a304b2823ed026347b8d34c3eac541"><code>62661c4</code></a> skip running unsafe pr check if input is default (<a href="https://redirect.github.com/actions/checkout/issues/2518">#2518</a>)</li> <li><a href="https://github.com/actions/checkout/commit/e8d4307400f9427dba7cb98e488d6ab85f1cec5f"><code>e8d4307</code></a> Bump the minor-actions-dependencies group with 2 updates (<a href="https://redirect.github.com/actions/checkout/issues/2499">#2499</a>)</li> <li><a href="https://github.com/actions/checkout/commit/631c942040754b6e095e929c1677c07e10ed4f87"><code>631c942</code></a> eslint 9 (<a href="https://redirect.github.com/actions/checkout/issues/2474">#2474</a>)</li> <li><a href="https://github.com/actions/checkout/commit/4f1f4aec02e41874fa0262ea8ff5172d7978ad1e"><code>4f1f4ae</code></a> Bump actions/upload-artifact from 4 to 7 (<a href="https://redirect.github.com/actions/checkout/issues/2476">#2476</a>)</li> <li><a href="https://github.com/actions/checkout/commit/ba097532fb203f7e88c9c3c0b899b49469908a92"><code>ba09753</code></a> Bump actions/checkout from 6 to 7 (<a href="https://redirect.github.com/actions/checkout/issues/2488">#2488</a>)</li> <li><a href="https://github.com/actions/checkout/commit/b9e0990d219a03df7633c93f6f005a8fecbcab22"><code>b9e0990</code></a> Bump docker/login-action from 3.3.0 to 4.2.0 (<a href="https://redirect.github.com/actions/checkout/issues/2479">#2479</a>)</li> <li><a href="https://github.com/actions/checkout/commit/e8cb398be4a550817e382abf69e4c12c76fce1f2"><code>e8cb398</code></a> Bump docker/build-push-action from 6.5.0 to 7.2.0 (<a href="https://redirect.github.com/actions/checkout/issues/2478">#2478</a>)</li> <li>Additional commits viewable in <a href="https://github.com/actions/checkout/compare/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0...3d3c42e5aac5ba805825da76410c181273ba90b1">compare view</a></li> </ul> </details> <br /> Updates `actions/setup-go` from 6.5.0 to 7.0.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/setup-go/releases">actions/setup-go's releases</a>.</em></p> <blockquote> <h2>v7.0.0</h2> <h2>What's Changed</h2> <ul> <li>Migrate to ESM and upgrade dependencies by <a href="https://github.com/priyagupta108"><code>@priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-go/pull/763">actions/setup-go#763</a></li> <li>chore(deps): bump <code>@actions/cache</code> to 6.2.0 by <a href="https://github.com/philip-gai"><code>@philip-gai</code></a> in <a href="https://redirect.github.com/actions/setup-go/pull/771">actions/setup-go#771</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/philip-gai"><code>@philip-gai</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-go/pull/771">actions/setup-go#771</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-go/compare/v6...v7.0.0">https://github.com/actions/setup-go/compare/v6...v7.0.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/setup-go/commit/b7ad1dad31e06c5925ef5d2fc7ad053ef454303e"><code>b7ad1da</code></a> chore(deps): bump <code>@actions/cache</code> to 6.2.0 (<a href="https://redirect.github.com/actions/setup-go/issues/771">#771</a>)</li> <li><a href="https://github.com/actions/setup-go/commit/0778a10ce47b5d450cf60fb94fafad4330008a35"><code>0778a10</code></a> Migrate to ESM and upgrade dependencies (<a href="https://redirect.github.com/actions/setup-go/issues/763">#763</a>)</li> <li>See full diff in <a href="https://github.com/actions/setup-go/compare/924ae3a1cded613372ab5595356fb5720e22ba16...b7ad1dad31e06c5925ef5d2fc7ad053ef454303e">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
540 lines
20 KiB
YAML
540 lines
20 KiB
YAML
name: Release
|
|
|
|
on:
|
|
release:
|
|
types: [published]
|
|
workflow_dispatch:
|
|
inputs:
|
|
tag:
|
|
description: "Tag to release (e.g., v1.0.0)"
|
|
required: true
|
|
default: "v1.0.0"
|
|
|
|
permissions:
|
|
contents: write
|
|
actions: read
|
|
packages: write
|
|
|
|
env:
|
|
GO_VERSION_FILE: "go.mod"
|
|
|
|
jobs:
|
|
validate:
|
|
name: Validate Release
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
tag: ${{ steps.version.outputs.tag }}
|
|
version: ${{ steps.version.outputs.version }}
|
|
is_prerelease: ${{ steps.version.outputs.is_prerelease }}
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
# Both triggers resolve to the same thing: the release tag. On a
|
|
# `release` event inputs.tag is empty, so this falls back to the
|
|
# published release's tag. Every other job checks out this same
|
|
# tag (via needs.validate.outputs.tag) so the build is always the
|
|
# tagged commit, never whatever branch the dispatch ran on (#525).
|
|
ref: ${{ github.event.inputs.tag || github.event.release.tag_name }}
|
|
fetch-depth: 0
|
|
|
|
- name: Validate tag format
|
|
id: version
|
|
run: |
|
|
# Single source of truth for the tag, regardless of trigger.
|
|
TAG_NAME="${{ github.event.inputs.tag || github.event.release.tag_name }}"
|
|
|
|
echo "Tag name: $TAG_NAME"
|
|
|
|
# Validate semantic versioning format
|
|
if [[ ! "$TAG_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?$ ]]; then
|
|
echo "❌ Invalid tag format: $TAG_NAME"
|
|
echo "Expected format: v1.2.3 or v1.2.3-beta.1"
|
|
exit 1
|
|
fi
|
|
|
|
# Confirm the tag actually exists in git. The dispatch path
|
|
# re-releases an existing tag; it never creates one from a branch.
|
|
if ! git rev-parse -q --verify "refs/tags/$TAG_NAME" >/dev/null; then
|
|
echo "❌ Tag $TAG_NAME does not exist in git. Push the tag first, then re-run."
|
|
exit 1
|
|
fi
|
|
|
|
echo "tag=$TAG_NAME" >> $GITHUB_OUTPUT
|
|
|
|
# Extract version without 'v' prefix
|
|
VERSION=${TAG_NAME#v}
|
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
|
|
# Check if prerelease (contains hyphen)
|
|
if [[ "$TAG_NAME" =~ - ]]; then
|
|
echo "is_prerelease=true" >> $GITHUB_OUTPUT
|
|
echo "📦 Prerelease detected: $TAG_NAME"
|
|
else
|
|
echo "is_prerelease=false" >> $GITHUB_OUTPUT
|
|
echo "🚀 Stable release detected: $TAG_NAME"
|
|
fi
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
|
|
with:
|
|
go-version-file: ${{ env.GO_VERSION_FILE }}
|
|
|
|
- name: Install libpcap
|
|
run: sudo apt-get install -y libpcap-dev
|
|
|
|
- name: Run tests before release
|
|
run: |
|
|
echo "Running final tests before release..."
|
|
go test -v ./...
|
|
echo "✅ All tests passed"
|
|
|
|
build:
|
|
name: Build Release Binaries
|
|
runs-on: ubuntu-latest
|
|
needs: validate
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- goos: linux
|
|
goarch: amd64
|
|
- goos: linux
|
|
goarch: arm64
|
|
- goos: linux
|
|
goarch: arm
|
|
goarm: 7
|
|
- goos: darwin
|
|
goarch: amd64
|
|
- goos: darwin
|
|
goarch: arm64
|
|
- goos: windows
|
|
goarch: amd64
|
|
- goos: freebsd
|
|
goarch: amd64
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
ref: ${{ needs.validate.outputs.tag }}
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
|
|
with:
|
|
go-version-file: ${{ env.GO_VERSION_FILE }}
|
|
|
|
- name: Cache Go modules
|
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
with:
|
|
path: |
|
|
~/.cache/go-build
|
|
~/go/pkg/mod
|
|
key: ${{ runner.os }}-go-${{ hashFiles('**/go.mod') }}-${{ hashFiles('**/go.sum') }}
|
|
|
|
- name: Build binaries
|
|
env:
|
|
GOOS: ${{ matrix.goos }}
|
|
GOARCH: ${{ matrix.goarch }}
|
|
GOARM: ${{ matrix.goarm }}
|
|
CGO_ENABLED: 0
|
|
run: |
|
|
# Common variables
|
|
# Single build timestamp shared across every binary in this job.
|
|
BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
# Commit of the checked-out tag (not GITHUB_SHA, which on a manual
|
|
# dispatch is the branch HEAD the run started from, not the tag).
|
|
COMMIT_SHA="$(git rev-parse HEAD)"
|
|
ARCH_SUFFIX="${{ matrix.goos }}-${{ matrix.goarch }}"
|
|
if [[ "${{ matrix.goarm }}" != "" ]]; then
|
|
ARCH_SUFFIX="${ARCH_SUFFIX}v${{ matrix.goarm }}"
|
|
fi
|
|
|
|
# Function to build a binary
|
|
build_binary() {
|
|
local BINARY_NAME=$1
|
|
local CMD_PATH=$2
|
|
local OUTPUT_NAME
|
|
|
|
# Ensure build directory exists
|
|
mkdir -p build
|
|
|
|
if [[ "${{ matrix.goos }}" == "windows" ]]; then
|
|
OUTPUT_NAME="build/${BINARY_NAME}-v${{ needs.validate.outputs.version }}-${ARCH_SUFFIX}.exe"
|
|
else
|
|
OUTPUT_NAME="build/${BINARY_NAME}-v${{ needs.validate.outputs.version }}-${ARCH_SUFFIX}"
|
|
fi
|
|
|
|
echo "Building $BINARY_NAME: $OUTPUT_NAME"
|
|
|
|
# Ensure clean build environment for this binary
|
|
rm -f "$OUTPUT_NAME" "$OUTPUT_NAME.sha256" "$OUTPUT_NAME.sha512"
|
|
|
|
# Inject the validated version (plus commit/date) so the binary
|
|
# reports the right version regardless of git checkout state.
|
|
# Relying on Go's VCS stamping alone yields v0.0.0-… when built
|
|
# from a shallow checkout or a non-tagged commit (see #525).
|
|
if ! go build \
|
|
-trimpath \
|
|
-ldflags="-s -w -X main.version=${{ needs.validate.outputs.tag }} -X main.commit=${COMMIT_SHA} -X main.date=${BUILD_DATE}" \
|
|
-o "$OUTPUT_NAME" \
|
|
"$CMD_PATH"; then
|
|
echo "❌ Build failed for $BINARY_NAME"
|
|
exit 1
|
|
fi
|
|
|
|
# Verify binary was created
|
|
ls -la "$OUTPUT_NAME"
|
|
echo "$BINARY_NAME=$OUTPUT_NAME" >> $GITHUB_OUTPUT
|
|
}
|
|
|
|
# Build CLI
|
|
build_binary "soundtouch-cli" "./cmd/soundtouch-cli"
|
|
|
|
# Build Service
|
|
build_binary "soundtouch-service" "./cmd/soundtouch-service"
|
|
|
|
# Build Player (formerly soundtouch-web)
|
|
build_binary "soundtouch-player" "./cmd/soundtouch-player"
|
|
|
|
# Build Backup
|
|
build_binary "soundtouch-backup" "./cmd/soundtouch-backup"
|
|
id: build
|
|
|
|
- name: Generate individual checksums
|
|
run: |
|
|
CLI_NAME="${{ steps.build.outputs.soundtouch-cli }}"
|
|
SVC_NAME="${{ steps.build.outputs.soundtouch-service }}"
|
|
PLAYER_NAME="${{ steps.build.outputs.soundtouch-player }}"
|
|
BCK_NAME="${{ steps.build.outputs.soundtouch-backup }}"
|
|
|
|
# Use atomic operations to avoid conflicts
|
|
TEMP_DIR=$(mktemp -d)
|
|
|
|
generate_checksums() {
|
|
local FILE=$1
|
|
echo "Building checksums for: $FILE"
|
|
sha256sum "$FILE" > "${TEMP_DIR}/$(basename "$FILE").sha256"
|
|
sha512sum "$FILE" > "${TEMP_DIR}/$(basename "$FILE").sha512"
|
|
mv "${TEMP_DIR}/$(basename "$FILE").sha256" "$FILE.sha256"
|
|
mv "${TEMP_DIR}/$(basename "$FILE").sha512" "$FILE.sha512"
|
|
}
|
|
|
|
generate_checksums "$CLI_NAME"
|
|
generate_checksums "$SVC_NAME"
|
|
generate_checksums "$PLAYER_NAME"
|
|
generate_checksums "$BCK_NAME"
|
|
|
|
# Cleanup
|
|
rm -rf "$TEMP_DIR"
|
|
echo "✅ Checksums generated successfully"
|
|
|
|
- name: Upload build artifact
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: binaries-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.goarm }}
|
|
path: |
|
|
build/soundtouch-cli-v*
|
|
build/soundtouch-service-v*
|
|
build/soundtouch-player-v*
|
|
build/soundtouch-backup-v*
|
|
retention-days: 1
|
|
|
|
checksums:
|
|
name: Generate Checksums
|
|
runs-on: ubuntu-latest
|
|
needs: [validate, build]
|
|
|
|
steps:
|
|
- name: Download binary artifacts
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
pattern: binaries-*
|
|
path: ./binaries
|
|
|
|
- name: Generate checksums
|
|
run: |
|
|
cd binaries
|
|
|
|
# Debug: Show the downloaded structure
|
|
echo "📁 Downloaded artifact structure:"
|
|
ls -R
|
|
|
|
# Create a collection directory to avoid naming conflicts
|
|
mkdir -p release-files
|
|
|
|
# Move all files from subdirectories to the collection directory
|
|
find . -mindepth 2 -type f \( -name "soundtouch-cli-*" -o -name "soundtouch-service-*" -o -name "soundtouch-player-*" -o -name "soundtouch-backup-*" \) -exec mv {} release-files/ \;
|
|
|
|
# Remove empty directories
|
|
find . -type d -empty -delete
|
|
|
|
# Move to the collection directory for the rest of the processing
|
|
cd release-files
|
|
|
|
# Debug: Show flattened structure
|
|
echo "📁 Flattened structure:"
|
|
ls -la soundtouch-* || echo "No files found matching pattern"
|
|
|
|
# Generate combined checksums (exclude individual .sha256/.sha512 files)
|
|
if ls soundtouch-* 1> /dev/null 2>&1; then
|
|
# Only checksum the actual binaries, not the .sha256/.sha512 files
|
|
ls soundtouch-cli-* soundtouch-service-* soundtouch-player-* soundtouch-backup-* | grep -v '\.sha256$' | grep -v '\.sha512$' | xargs sha256sum > checksums.sha256
|
|
ls soundtouch-cli-* soundtouch-service-* soundtouch-player-* soundtouch-backup-* | grep -v '\.sha256$' | grep -v '\.sha512$' | xargs sha512sum > checksums.sha512
|
|
|
|
echo "📋 Generated combined checksums:"
|
|
cat checksums.sha256
|
|
|
|
# Verify all expected files are present (binaries only, not checksum files)
|
|
EXPECTED_COUNT=28 # 7 platforms * 4 binaries
|
|
ACTUAL_COUNT=$(ls soundtouch-* | grep -v '\.sha256$' | grep -v '\.sha512$' | wc -l)
|
|
|
|
if [[ $ACTUAL_COUNT -ne $EXPECTED_COUNT ]]; then
|
|
echo "❌ Expected $EXPECTED_COUNT binaries, found $ACTUAL_COUNT"
|
|
ls -la
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ All $ACTUAL_COUNT binaries present"
|
|
else
|
|
echo "❌ No binary files found"
|
|
echo "Directory contents:"
|
|
ls -la
|
|
exit 1
|
|
fi
|
|
|
|
- name: Upload checksums
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: checksums
|
|
path: |
|
|
binaries/release-files/checksums.sha256
|
|
binaries/release-files/checksums.sha512
|
|
binaries/release-files/*.sha256
|
|
binaries/release-files/*.sha512
|
|
retention-days: 1
|
|
|
|
- name: Upload all release assets
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: release-assets
|
|
path: binaries/release-files/
|
|
retention-days: 1
|
|
|
|
create_release:
|
|
name: Create GitHub Release
|
|
runs-on: ubuntu-latest
|
|
needs: [validate, checksums]
|
|
if: github.event_name == 'workflow_dispatch'
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
ref: ${{ needs.validate.outputs.tag }}
|
|
fetch-depth: 0
|
|
|
|
- name: Download release assets
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: release-assets
|
|
path: ./release-assets
|
|
|
|
- name: Generate release notes
|
|
id: release_notes
|
|
run: |
|
|
TAG_NAME="${{ needs.validate.outputs.tag }}"
|
|
VERSION="${TAG_NAME#v}"
|
|
|
|
# Short, accurate header. GitHub's auto-generated "What's Changed"
|
|
# + "Full Changelog" are appended after this (generate_release_notes).
|
|
cat > release_notes.md << EOF
|
|
# AfterTouch $TAG_NAME
|
|
|
|
**Bose SoundTouch Toolkit.** Keep your Bose SoundTouch speakers alive after the Bose cloud shutdown. No Bose infrastructure required.
|
|
|
|
## What's included
|
|
|
|
Pre-built binaries for Linux (amd64, arm64, armv7), macOS (Intel & Apple Silicon), Windows (amd64), and FreeBSD (amd64):
|
|
|
|
- **soundtouch-service**: local server that replaces the Bose cloud. Point your speaker at it and you keep full control; the built-in web UI on port 8000 handles setup.
|
|
- **soundtouch-player**: standalone LAN web UI for device control: play/pause, volume, presets, live status. (Formerly \`soundtouch-web\`.)
|
|
- **soundtouch-cli**: command-line control of any device: playback, presets, sources, multiroom zones, discovery, and migration. Good for scripting and home automation.
|
|
- **soundtouch-backup**: back up your Bose cloud account and each speaker's local state. \`soundtouch-backup all\` captures everything in one step.
|
|
|
|
Not sure which file to grab? The [Downloads page](https://gesellix.github.io/Bose-SoundTouch/docs/downloads/) explains which tool you need and which \`<os>-<arch>\` build matches your computer.
|
|
|
|
## Documentation
|
|
|
|
Full guides, setup walkthroughs, and troubleshooting: https://gesellix.github.io/Bose-SoundTouch/
|
|
|
|
## Use as a Go library
|
|
|
|
The core client is also importable:
|
|
|
|
\`\`\`bash
|
|
go get github.com/gesellix/bose-soundtouch@$TAG_NAME
|
|
\`\`\`
|
|
|
|
## Verifying downloads
|
|
|
|
Each binary has its own \`.sha256\`/\`.sha512\`, and combined \`checksums.sha256\` / \`checksums.sha512\` cover all of them:
|
|
|
|
\`\`\`bash
|
|
sha256sum -c checksums.sha256 --ignore-missing
|
|
\`\`\`
|
|
EOF
|
|
|
|
echo "release_notes_file=release_notes.md" >> $GITHUB_OUTPUT
|
|
|
|
- name: Create GitHub Release
|
|
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
|
|
with:
|
|
tag_name: ${{ needs.validate.outputs.tag }}
|
|
name: ${{ needs.validate.outputs.tag }}
|
|
body_path: ${{ steps.release_notes.outputs.release_notes_file }}
|
|
generate_release_notes: true
|
|
draft: false
|
|
prerelease: ${{ needs.validate.outputs.is_prerelease == 'true' }}
|
|
files: |
|
|
release-assets/soundtouch-cli-v*
|
|
release-assets/soundtouch-service-v*
|
|
release-assets/soundtouch-player-v*
|
|
release-assets/soundtouch-backup-v*
|
|
release-assets/checksums.sha256
|
|
release-assets/checksums.sha512
|
|
fail_on_unmatched_files: true
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
update_release:
|
|
name: Update Existing Release
|
|
runs-on: ubuntu-latest
|
|
needs: [validate, checksums]
|
|
if: github.event_name == 'release' && github.event.action == 'published'
|
|
|
|
steps:
|
|
- name: Download release assets
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: release-assets
|
|
path: ./release-assets
|
|
|
|
- name: Upload additional assets to existing release
|
|
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
|
|
with:
|
|
tag_name: ${{ needs.validate.outputs.tag }}
|
|
files: |
|
|
release-assets/soundtouch-cli-v*
|
|
release-assets/soundtouch-service-v*
|
|
release-assets/soundtouch-player-v*
|
|
release-assets/soundtouch-backup-v*
|
|
release-assets/checksums.sha256
|
|
release-assets/checksums.sha512
|
|
fail_on_unmatched_files: true
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
docker:
|
|
name: Build and Push Docker Image
|
|
runs-on: ubuntu-latest
|
|
needs: validate
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
ref: ${{ needs.validate.outputs.tag }}
|
|
|
|
- name: Set build metadata
|
|
id: build_date
|
|
run: |
|
|
echo "date=$(date -u +%Y-%m-%d)" >> $GITHUB_OUTPUT
|
|
# Commit of the checked-out tag, not github.sha (the dispatch HEAD).
|
|
echo "commit=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
|
|
|
|
- name: Log in to GitHub Container Registry
|
|
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Extract metadata (tags, labels) for soundtouch-service
|
|
id: meta-service
|
|
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
|
|
with:
|
|
images: ghcr.io/${{ github.repository }}
|
|
tags: |
|
|
type=semver,pattern={{version}},value=v${{ needs.validate.outputs.version }}
|
|
type=semver,pattern={{major}}.{{minor}},value=v${{ needs.validate.outputs.version }}
|
|
type=raw,value=latest,enable=${{ needs.validate.outputs.is_prerelease == 'false' }}
|
|
|
|
- name: Build and push soundtouch-service Docker image
|
|
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
|
with:
|
|
context: .
|
|
target: soundtouch-service
|
|
platforms: linux/amd64,linux/arm64,linux/arm64/v8,linux/arm/v7
|
|
push: true
|
|
tags: ${{ steps.meta-service.outputs.tags }}
|
|
labels: ${{ steps.meta-service.outputs.labels }}
|
|
build-args: |
|
|
VERSION=${{ needs.validate.outputs.tag }}
|
|
COMMIT=${{ steps.build_date.outputs.commit }}
|
|
DATE=${{ steps.build_date.outputs.date }}
|
|
cache-from: type=gha
|
|
cache-to: type=gha,mode=max
|
|
|
|
- name: Extract metadata (tags, labels) for soundtouch-player
|
|
id: meta-player
|
|
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
|
|
with:
|
|
images: ghcr.io/${{ github.repository }}-player
|
|
tags: |
|
|
type=semver,pattern={{version}},value=v${{ needs.validate.outputs.version }}
|
|
type=semver,pattern={{major}}.{{minor}},value=v${{ needs.validate.outputs.version }}
|
|
type=raw,value=latest,enable=${{ needs.validate.outputs.is_prerelease == 'false' }}
|
|
|
|
- name: Build and push soundtouch-player Docker image
|
|
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
|
with:
|
|
context: .
|
|
target: soundtouch-player
|
|
platforms: linux/amd64,linux/arm64,linux/arm64/v8,linux/arm/v7
|
|
push: true
|
|
tags: ${{ steps.meta-player.outputs.tags }}
|
|
labels: ${{ steps.meta-player.outputs.labels }}
|
|
build-args: |
|
|
VERSION=${{ needs.validate.outputs.tag }}
|
|
COMMIT=${{ steps.build_date.outputs.commit }}
|
|
DATE=${{ steps.build_date.outputs.date }}
|
|
cache-from: type=gha
|
|
cache-to: type=gha,mode=max
|
|
|
|
notify:
|
|
name: Post-Release Notifications
|
|
runs-on: ubuntu-latest
|
|
needs: [validate, create_release, update_release, docker]
|
|
if: always() && (needs.create_release.result == 'success' || needs.update_release.result == 'success' || needs.docker.result == 'success')
|
|
|
|
steps:
|
|
- name: Notify success
|
|
run: |
|
|
echo "🎉 Release ${{ needs.validate.outputs.version }} completed successfully!"
|
|
echo "📦 Binaries built for 7 platforms (CLI, Service, Player, and Backup)"
|
|
echo "🐳 Docker image published to ghcr.io"
|
|
echo "🔐 Checksums generated and verified"
|
|
echo "📋 Release notes automatically generated"
|
|
echo ""
|
|
TAG_NAME="${{ needs.validate.outputs.tag }}"
|
|
echo "🔗 Release URL: https://github.com/${{ github.repository }}/releases/tag/${TAG_NAME}"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo "- Monitor download metrics"
|
|
echo "- Update documentation if needed"
|
|
echo "- Announce to community (see scripts/post-release.md)"
|