Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
73168ac
Add versioned release bundle manifest
Staphylococcus Aug 30, 2026
a67cba9
Merge pull request #104 from Staphylococcus/issue-95-release-bundle-m…
Staphylococcus Aug 30, 2026
f292127
feat: add host upgrade compatibility preflight
Staphylococcus Aug 30, 2026
3a9d001
fix: harden upgrade preflight safety checks
Staphylococcus Aug 30, 2026
01a732b
fix: enforce upgrade preflight safety invariants
Staphylococcus Aug 30, 2026
514d683
fix: secure candidate bundle containment
Staphylococcus Aug 30, 2026
2ac38ab
Merge pull request #105 from Staphylococcus/issue-100-host-upgrade-pr…
Staphylococcus Aug 30, 2026
5dfbb08
feat: add release bundle upgrade mode
Staphylococcus Aug 30, 2026
45acea9
Merge pull request #106 from Staphylococcus/issue-96-installer-upgrad…
Staphylococcus Aug 30, 2026
24757e1
feat: securely acquire release bundles
Staphylococcus Aug 31, 2026
23bb208
test: replay release bundle responses offline
Staphylococcus Aug 31, 2026
ba3c447
test: satisfy current clippy byte slice lint
Staphylococcus Aug 31, 2026
af61408
Merge pull request #107 from Staphylococcus/issue-97-secure-release-b…
Staphylococcus Aug 31, 2026
4f28dc7
feat: add assisted update installation
Staphylococcus Sep 1, 2026
7a3ce64
Merge pull request #108 from Staphylococcus/issue-98-updates-install
Staphylococcus Sep 1, 2026
b15c49f
chore(release): prepare 1.4.0-beta.2
Staphylococcus Sep 1, 2026
2215839
Merge pull request #109 from Staphylococcus/release/v1.4.0-beta.2-prep
Staphylococcus Sep 1, 2026
a681626
ci: publish releases after promotion merges
Staphylococcus Sep 1, 2026
ca712f0
Merge pull request #111 from Staphylococcus/fix/merge-triggered-relea…
Staphylococcus Sep 1, 2026
77c8f46
Merge pull request #112 from Staphylococcus/dev
Staphylococcus Sep 1, 2026
f938e86
test: gate releases on cross-version upgrades
Staphylococcus Sep 1, 2026
478c622
Merge pull request #113 from Staphylococcus/issue-99-cross-version-up…
Staphylococcus Sep 1, 2026
0c9f4f7
Harden immutable release publication
Staphylococcus Sep 1, 2026
cf98e87
Merge pull request #114 from Staphylococcus/fix/immutable-draft-relea…
Staphylococcus Sep 1, 2026
628a01f
Simplify release discovery to newest publication
Staphylococcus Sep 2, 2026
ae420f8
Merge pull request #115 from Staphylococcus/fix/latest-published-rele…
Staphylococcus Sep 2, 2026
c9ccbeb
chore(release): prepare 1.4.0-beta.3
Staphylococcus Sep 2, 2026
60a7904
Merge pull request #116 from Staphylococcus/release/v1.4.0-beta.3-prep
Staphylococcus Sep 2, 2026
730f197
Merge pull request #117 from Staphylococcus/dev
Staphylococcus Sep 2, 2026
125a81c
chore(ci): update actions to Node 24
Staphylococcus Sep 2, 2026
29909c6
Merge pull request #118 from Staphylococcus/chore/refresh-github-actions
Staphylococcus Sep 2, 2026
38d132b
feat(screen): prefer native Wayland in auto mode
Staphylococcus Sep 2, 2026
a740aff
Merge pull request #119 from Staphylococcus/issue-86-native-wayland-auto
Staphylococcus Sep 2, 2026
a0f832c
feat(tv): default fresh profiles to native webOS
Staphylococcus Sep 2, 2026
857535a
Merge pull request #120 from Staphylococcus/issue-54-lg-webos-default
Staphylococcus Sep 2, 2026
db010c1
fix(lifecycle): retry NM-owned suspend failures
Staphylococcus Sep 2, 2026
b38f5a7
Merge pull request #122 from Staphylococcus/issue-121-nm-owned-retry
Staphylococcus Sep 2, 2026
a329472
fix(updates): support real host upgrade layouts
Staphylococcus Sep 2, 2026
8a3d68b
Merge pull request #124 from Staphylococcus/fix/real-host-upgrade-com…
Staphylococcus Sep 2, 2026
3266899
chore(release): prepare v1.4.0
Staphylococcus Sep 2, 2026
27c2eb8
Merge pull request #125 from Staphylococcus/release/v1.4.0-prep
Staphylococcus Sep 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 77 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
push:

permissions:
checks: read
contents: read

jobs:
Expand All @@ -13,15 +14,15 @@ jobs:

steps:
- name: Check out repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.x"

Expand All @@ -38,40 +39,107 @@ jobs:
run: cargo clippy -p lg-buddy --all-targets --all-features -- -D warnings

- name: Validate shell scripts
run: bash -n install.sh uninstall.sh configure.sh bin/LG_Buddy_Common scripts/build-release-bundle.sh scripts/test-release-bundle.sh scripts/publish-release-assets.sh
run: bash -n install.sh uninstall.sh configure.sh bin/LG_Buddy_Common scripts/build-release-bundle.sh scripts/test-release-bundle.sh scripts/test-cross-version-upgrade.sh scripts/test-production-upgrade-canary.sh scripts/publish-release-assets.sh

- name: Validate release promotion contract
run: python3 scripts/test_release_promotion.py

- name: Validate release publication contract
run: python3 scripts/test_publish_release_assets.py

- name: Validate release bundle manifest contract
run: python3 scripts/test_release_bundle_manifest.py

- name: Validate GitHub response recorder
run: python3 scripts/test_record_github_release_responses.py

- name: Require successful production prerelease canary for stable promotion
if: github.event_name == 'pull_request' && github.base_ref == 'main'
env:
GH_TOKEN: ${{ github.token }}
run: |
prerelease_sha="$(gh api "repos/$GITHUB_REPOSITORY/git/ref/heads/prerelease" --jq .object.sha)"
[ "$prerelease_sha" != "${{ github.event.pull_request.base.sha }}" ] || {
echo "Stable promotion requires a distinct prerelease candidate."
exit 1
}
matching_checks="$(gh api \
-H 'Accept: application/vnd.github+json' \
"repos/$GITHUB_REPOSITORY/commits/$prerelease_sha/check-runs?per_page=100" \
--jq '[.check_runs[] | select(.name == "production-prerelease-canary" and .status == "completed" and .conclusion == "success" and .app.slug == "github-actions")] | length')"
[ "$matching_checks" -gt 0 ] || {
echo "No successful production-prerelease canary exists for $prerelease_sha."
exit 1
}

bundle-smoke-test:
runs-on: ubuntu-latest
needs: verify
env:
SMOKE_VERSION: 1.4.0-beta.2.ci

steps:
- name: Check out repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-musl

- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.x"

- name: Install smoke-test prerequisites
run: sudo apt-get update && sudo apt-get install -y musl-tools zenity
run: sudo apt-get update && sudo apt-get install -y musl-tools strace zenity

- name: Build lg-buddy release binary
env:
LG_BUDDY_BUILD_COMMIT: ${{ github.sha }}
LG_BUDDY_RELEASE_VERSION: ${{ env.SMOKE_VERSION }}
run: cargo build --release -p lg-buddy --target x86_64-unknown-linux-musl

- name: Create release bundle
run: ./scripts/build-release-bundle.sh --target x86_64-unknown-linux-musl --version ci-smoke --output-dir dist
run: |
umask 0002
./scripts/build-release-bundle.sh --target x86_64-unknown-linux-musl --version "$SMOKE_VERSION" --output-dir dist

- name: Smoke test release bundle
run: ./scripts/test-release-bundle.sh --skip-pip-install --archive dist/lg-buddy-ci-smoke-x86_64-unknown-linux-musl.tar.gz
run: |
./scripts/test-release-bundle.sh \
--skip-pip-install \
--archive "dist/lg-buddy-${SMOKE_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
--expected-tag "v${SMOKE_VERSION}" \
--expected-version "$SMOKE_VERSION" \
--expected-channel prerelease \
--expected-target x86_64-unknown-linux-musl \
--expected-commit "${{ github.sha }}"

- name: Download pinned cross-version baseline
run: |
curl --fail --silent --show-error --location \
--proto '=https' --tlsv1.2 \
--output "$RUNNER_TEMP/lg-buddy-1.4.0-beta.2-x86_64-unknown-linux-musl.tar.gz" \
https://github.com/Staphylococcus/LG_Buddy/releases/download/v1.4.0-beta.2/lg-buddy-1.4.0-beta.2-x86_64-unknown-linux-musl.tar.gz

- name: Smoke test cross-version upgrade
run: |
./scripts/test-cross-version-upgrade.sh \
--previous-archive "$RUNNER_TEMP/lg-buddy-1.4.0-beta.2-x86_64-unknown-linux-musl.tar.gz" \
--previous-sha256 883e6cb869cbe60988a195acac2e15864d904797edfefbb7d90052eff9a17d32 \
--previous-tag v1.4.0-beta.2 \
--previous-version 1.4.0-beta.2 \
--previous-channel prerelease \
--previous-target x86_64-unknown-linux-musl \
--previous-commit 77c8f46c66b9e385f3d90c15dee33d775639bbeb \
--candidate-archive "dist/lg-buddy-${SMOKE_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
--candidate-tag "v${SMOKE_VERSION}" \
--candidate-version "$SMOKE_VERSION" \
--candidate-channel prerelease \
--candidate-target x86_64-unknown-linux-musl \
--candidate-commit "${{ github.sha }}"

- name: Generate checksums
run: |
Expand All @@ -86,4 +154,4 @@ jobs:
- name: Dry-run publish release assets
env:
GH_RELEASE_DRY_RUN: "1"
run: ./scripts/publish-release-assets.sh --dist-dir dist --tag v0.0.0-ci-smoke
run: ./scripts/publish-release-assets.sh --dist-dir dist --tag "v${SMOKE_VERSION}" --commit "${{ github.sha }}"
27 changes: 24 additions & 3 deletions .github/workflows/promotion-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ on:
- ready_for_review

permissions:
checks: read
contents: read
pull-requests: read

Expand All @@ -32,7 +33,7 @@ jobs:
exit 1
}
[ "$HEAD_REF" = "dev" ] || {
echo "Only the exact dev branch may target $BASE_REF."
echo "Only the dev branch may target $BASE_REF."
exit 1
}
case "$BASE_REF" in
Expand All @@ -48,14 +49,14 @@ jobs:
}

- name: Check out trusted promotion validator
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
ref: ${{ github.event.pull_request.base.sha }}
fetch-depth: 0
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.x"

Expand Down Expand Up @@ -95,3 +96,23 @@ jobs:
[ "$CHANNEL" = "stable" ] || expected_prerelease="true"
[ "$(printf '%s' "$release_state" | jq -r .isPrerelease)" = "$expected_prerelease" ]
fi

- name: Require production prerelease upgrade canary
if: github.event.pull_request.base.ref == 'main'
env:
GH_TOKEN: ${{ github.token }}
MAIN_SHA: ${{ steps.contract.outputs.main_sha }}
PRERELEASE_SHA: ${{ steps.contract.outputs.prerelease_sha }}
run: |
[ "$PRERELEASE_SHA" != "$MAIN_SHA" ] || {
echo "Stable promotion requires a distinct prerelease candidate."
exit 1
}
matching_checks="$(gh api \
-H 'Accept: application/vnd.github+json' \
"repos/$GITHUB_REPOSITORY/commits/$PRERELEASE_SHA/check-runs?per_page=100" \
--jq '[.check_runs[] | select(.name == "production-prerelease-canary" and .status == "completed" and .conclusion == "success" and .app.slug == "github-actions")] | length')"
[ "$matching_checks" -gt 0 ] || {
echo "No successful production-prerelease canary exists for $PRERELEASE_SHA."
exit 1
}
Loading
Loading