diff options
| -rw-r--r-- | .github/workflows/build.yml | 37 | ||||
| -rwxr-xr-x | build_files/build.sh | 13 | ||||
| -rwxr-xr-x | build_files/patch-bazzite-os-branch-select.sh | 58 |
3 files changed, 105 insertions, 3 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c662b02..404bdbd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -322,3 +322,40 @@ jobs: with: release_tag: ${{ needs.build_push.outputs.release_tag }} handwritten: ${{ inputs.handwritten }} + + kickoff_gamemode_news: + name: Refresh Game Mode announcements + needs: [generate_release] + if: github.ref_name == github.event.repository.default_branch || github.ref_name == 'testing' + runs-on: ubuntu-24.04 + permissions: + contents: read + steps: + - name: Resolve announcement branch + id: target + run: | + branch="${GITHUB_REF_NAME}" + [[ "${branch}" == "main" ]] && branch="stable" + echo "branch=${branch}" >> "$GITHUB_OUTPUT" + + - name: Check dispatch token + id: token + env: + DISPATCH_PAT: ${{ secrets.PAT }} + run: | + if [[ -z "${DISPATCH_PAT}" ]]; then + echo "::warning::Skipping Game Mode announcements dispatch: configure the PAT secret." + echo "available=false" >> "$GITHUB_OUTPUT" + else + echo "available=true" >> "$GITHUB_OUTPUT" + fi + + - name: Kickoff Game Mode announcements + if: steps.token.outputs.available == 'true' + uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4 + continue-on-error: true + with: + token: ${{ secrets.PAT }} + repository: AeroCore-IO/aerocore-os-gamemode-news + event-type: build-announcements + client-payload: '{"branch": "${{ steps.target.outputs.branch }}"}' diff --git a/build_files/build.sh b/build_files/build.sh index 988b7f0..94a5ef5 100755 --- a/build_files/build.sh +++ b/build_files/build.sh @@ -14,17 +14,23 @@ esac # Copy the contents of system_files/ of the git repo to / cp -avf "/ctx/system_files"/. / -# Keep Bazzite's game mode news hook unchanged; only switch its feed URL. +# Keep Bazzite's game mode news hook unchanged; select the matching feed branch. NEWS_HOOK_CONFIG=/etc/gamemode-news-hook.conf if [[ ! -f "${NEWS_HOOK_CONFIG}" ]]; then echo "Unable to locate game mode news hook config: ${NEWS_HOOK_CONFIG}" >&2 exit 1 fi +NEWS_BRANCH="${IMAGE_BRANCH:-stable}" +case "${NEWS_BRANCH}" in + testing|unstable) ;; + *) NEWS_BRANCH=stable ;; +esac +NEWS_FEED_URL="https://git.mirror.aerocore.com.cn/AeroCore-IO/aerocore-os-gamemode-news/plain/announcements.json?h=${NEWS_BRANCH}" sed -i \ - 's|^github = .*|github = https://git.mirror.aerocore.com.cn/AeroCore-IO/aerocore-os-gamemode-news/plain/announcements.json?h=testing|' \ + "s|^github = .*|github = ${NEWS_FEED_URL}|" \ "${NEWS_HOOK_CONFIG}" grep -Fxq \ - 'github = https://git.mirror.aerocore.com.cn/AeroCore-IO/aerocore-os-gamemode-news/plain/announcements.json?h=testing' \ + "github = ${NEWS_FEED_URL}" \ "${NEWS_HOOK_CONFIG}" # Bazzite's Kinoite/Plasma desktop shortcut used to start a privileged @@ -170,3 +176,4 @@ find /etc/environment.d /etc/skel/.config/environment.d -name 99-aerocore-mirror /ctx/install-instruments.sh /ctx/patch-bazzite-deck-identity.sh /ctx/patch-bazzite-rollback-helper.sh +/ctx/patch-bazzite-os-branch-select.sh diff --git a/build_files/patch-bazzite-os-branch-select.sh b/build_files/patch-bazzite-os-branch-select.sh new file mode 100755 index 0000000..a360a2e --- /dev/null +++ b/build_files/patch-bazzite-os-branch-select.sh @@ -0,0 +1,58 @@ +#!/usr/bin/bash + +set -euo pipefail + +file=/usr/libexec/os-branch-select + +if [[ ! -f "$file" ]]; then + echo "Unable to locate Bazzite OS branch selector: $file" >&2 + exit 1 +fi + +old=' branch=$(cut -d ":" -f4 <<< "$(rpm-ostree status --booted | grep -m 1 $ID)")' +if ! grep -Fxq "$old" "$file"; then + echo "Bazzite OS branch selector changed; review the downstream patch" >&2 + exit 1 +fi + +patched_file=$(mktemp) +awk -v old="$old" ' + $0 == old { + print " # Read the booted deployment directly; its image name need not match os-release ID." + print " image_ref=$(rpm-ostree status --booted --json | jq -r '\''[.deployments[] | select(.booted) | .[\"container-image-reference\"] // empty][0] // empty'\'')" + print " branch=\"\"" + print " if [[ $image_ref =~ :([^/:]+)$ ]]; then" + print " branch=${BASH_REMATCH[1]}" + print " fi" + found++ + next + } + { print } + END { if (found != 1) exit 1 } +' "$file" > "$patched_file" + +install -m 0755 "$patched_file" "$file" +rm -f "$patched_file" + +# Match the channel names used by Bazzite's Game Mode announcement feeds. +# Steam's rc/beta and bc/main aliases still select the same image branches. +python3 - "$file" <<'PY' +from pathlib import Path +import sys + +path = Path(sys.argv[1]) +text = path.read_text() +replacements = { + " testing)\n echo rc\n": " testing)\n echo beta\n", + " unstable)\n echo main\n": " unstable)\n echo preview\n", + " echo rc\n echo beta\n echo bc\n echo main\n": + " echo rc\n echo beta\n echo bc\n echo preview\n echo main\n", + " bc|main|unstable)\n": " bc|preview|main|unstable)\n", +} +for old in replacements: + if text.count(old) != 1: + raise SystemExit(f"Bazzite branch selector changed; expected exactly one {old!r}") +for old, new in replacements.items(): + text = text.replace(old, new, 1) +path.write_text(text) +PY |
