From 7fbeafb68361b19dd4fdbce9dbc1b8b6af2008c5 Mon Sep 17 00:00:00 2001 From: debpalash Date: Thu, 27 Aug 2026 14:40:07 +0530 Subject: [PATCH 1/5] release: add native installer packages --- .github/workflows/release.yml | 257 +++++++++++++++------------- CHANGELOG.md | 9 + Cargo.lock | 8 +- Cargo.toml | 2 +- README.md | 9 +- assets/bootable-mark.png | Bin 0 -> 54062 bytes assets/bootable.ico | Bin 0 -> 370070 bytes packaging/Packager.toml | 36 ++++ scripts/install.sh | 2 +- scripts/package-linux.sh | 171 ++++++++++++++++++ scripts/package-macos.sh | 92 ++++++++++ scripts/package-windows.ps1 | 54 ++++++ scripts/verify-linux-packages.sh | 42 +++++ scripts/verify-macos-packages.sh | 35 ++++ scripts/verify-windows-packages.ps1 | 62 +++++++ site/src/components/Header.astro | 2 +- site/src/pages/download.astro | 36 ++-- site/src/pages/features.astro | 2 +- site/src/pages/index.astro | 22 +-- 19 files changed, 677 insertions(+), 164 deletions(-) create mode 100644 assets/bootable-mark.png create mode 100644 assets/bootable.ico create mode 100644 packaging/Packager.toml create mode 100755 scripts/package-linux.sh create mode 100755 scripts/package-macos.sh create mode 100644 scripts/package-windows.ps1 create mode 100755 scripts/verify-linux-packages.sh create mode 100755 scripts/verify-macos-packages.sh create mode 100644 scripts/verify-windows-packages.ps1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b53fb22..ed1ae41 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,6 +1,17 @@ name: Release on: + pull_request: + paths: + - '.github/workflows/release.yml' + - 'Cargo.lock' + - 'Cargo.toml' + - 'apps/**' + - 'assets/**' + - 'crates/**' + - 'packaging/**' + - 'scripts/package-*' + - 'scripts/verify-*' push: tags: ['v*'] @@ -10,145 +21,144 @@ permissions: attestations: write jobs: - build: - name: Package ${{ matrix.target }} - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-24.04 - target: x86_64-unknown-linux-gnu - archive: tar - - os: macos-14 - target: aarch64-apple-darwin - archive: tar - - os: windows-2025 - target: x86_64-pc-windows-msvc - archive: zip - runs-on: ${{ matrix.os }} + linux: + name: Package Linux x86-64 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: - targets: ${{ matrix.target }} + targets: x86_64-unknown-linux-gnu - uses: Swatinem/rust-cache@v2 with: - key: ${{ matrix.target }} - - name: Install Linux build dependencies - if: runner.os == 'Linux' + key: release-x86_64-unknown-linux-gnu + - name: Read and validate package version + shell: bash + run: | + version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)" + test -n "$version" + if [[ "$GITHUB_REF" == refs/tags/* && "$GITHUB_REF_NAME" != "v$version" ]]; then + echo "tag $GITHUB_REF_NAME does not match Cargo version $version" >&2 + exit 1 + fi + echo "BOOTABLE_VERSION=$version" >> "$GITHUB_ENV" + - name: Install build and packaging dependencies run: | sudo apt-get update - sudo apt-get install -y libfontconfig1-dev libxkbcommon-x11-dev pkg-config + sudo apt-get install -y libfontconfig1-dev libxkbcommon-x11-dev pkg-config rpm + - name: Download pinned AppImage tools + shell: bash + run: | + mkdir -p "$RUNNER_TEMP/appimage-tools" + curl -fsSLo "$RUNNER_TEMP/appimage-tools/linuxdeploy" \ + https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20251107-1/linuxdeploy-x86_64.AppImage + echo 'c20cd71e3a4e3b80c3483cef793cda3f4e990aca14014d23c544ca3ce1270b4d '"$RUNNER_TEMP/appimage-tools/linuxdeploy" | sha256sum -c - + curl -fsSLo "$RUNNER_TEMP/appimage-tools/appimagetool" \ + https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-x86_64.AppImage + echo 'ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0 '"$RUNNER_TEMP/appimage-tools/appimagetool" | sha256sum -c - + chmod 0755 "$RUNNER_TEMP/appimage-tools/linuxdeploy" "$RUNNER_TEMP/appimage-tools/appimagetool" - run: cargo test --workspace - - run: cargo build --release --workspace --target ${{ matrix.target }} - - name: Package Unix artifacts - if: matrix.archive == 'tar' + - run: cargo build --release --workspace --target x86_64-unknown-linux-gnu + - name: Build DEB, RPM, AppImage, and archive + env: + APPIMAGE_EXTRACT_AND_RUN: '1' + LINUXDEPLOY: ${{ runner.temp }}/appimage-tools/linuxdeploy + APPIMAGETOOL: ${{ runner.temp }}/appimage-tools/appimagetool + run: scripts/package-linux.sh "$BOOTABLE_VERSION" + - name: Verify Linux packages + run: scripts/verify-linux-packages.sh "$BOOTABLE_VERSION" + - uses: actions/attest-build-provenance@v2 + if: startsWith(github.ref, 'refs/tags/v') + with: + subject-path: dist/linux/* + - uses: actions/upload-artifact@v4 + with: + name: release-linux-x86_64 + path: dist/linux/* + if-no-files-found: error + + macos: + name: Package macOS Apple Silicon + runs-on: macos-14 + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-apple-darwin + - uses: Swatinem/rust-cache@v2 + with: + key: release-aarch64-apple-darwin + - name: Read and validate package version shell: bash run: | - version="${GITHUB_REF_NAME#v}" - asset="bootable-${version}-${{ matrix.target }}.tar.gz" - stage="$(mktemp -d)" - cp "target/${{ matrix.target }}/release/bootable" "$stage/" - cp "target/${{ matrix.target }}/release/bootable-desktop" "$stage/" - cp "target/${{ matrix.target }}/release/bootable-helper" "$stage/" - cp assets/bootable-mark.svg "$stage/bootable.svg" - if [ "$RUNNER_OS" = "Linux" ]; then - cp packaging/app.bootable.Bootable.desktop "$stage/" - cp packaging/app.bootable.write-media.policy "$stage/" + version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)" + test -n "$version" + if [[ "$GITHUB_REF" == refs/tags/* && "$GITHUB_REF_NAME" != "v$version" ]]; then + echo "tag $GITHUB_REF_NAME does not match Cargo version $version" >&2 + exit 1 fi - cp scripts/install.sh "$stage/" - cp README.md LICENSE "$stage/" - tar -C "$stage" -czf "$asset" . - sha256sum "$asset" > "${asset}.sha256" 2>/dev/null || shasum -a 256 "$asset" > "${asset}.sha256" - - name: Verify Unix release archive - if: matrix.archive == 'tar' + echo "BOOTABLE_VERSION=$version" >> "$GITHUB_ENV" + - run: cargo test --workspace + - run: cargo build --release --workspace --target aarch64-apple-darwin + - name: Build DMG and archive + run: scripts/package-macos.sh "$BOOTABLE_VERSION" + - name: Verify macOS packages + run: scripts/verify-macos-packages.sh "$BOOTABLE_VERSION" + - uses: actions/attest-build-provenance@v2 + if: startsWith(github.ref, 'refs/tags/v') + with: + subject-path: dist/macos/* + - uses: actions/upload-artifact@v4 + with: + name: release-macos-aarch64 + path: dist/macos/* + if-no-files-found: error + + windows: + name: Package Windows x86-64 + runs-on: windows-2025 + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-pc-windows-msvc + - uses: Swatinem/rust-cache@v2 + with: + key: release-x86_64-pc-windows-msvc + - name: Read and validate package version shell: bash run: | - set -euo pipefail - version="${GITHUB_REF_NAME#v}" - asset="bootable-${version}-${{ matrix.target }}.tar.gz" - verify="$(mktemp -d)" - trap 'rm -rf "$verify"' EXIT - if command -v sha256sum >/dev/null 2>&1; then - sha256sum -c "${asset}.sha256" - else - shasum -a 256 -c "${asset}.sha256" + version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)" + test -n "$version" + if [[ "$GITHUB_REF" == refs/tags/* && "$GITHUB_REF_NAME" != "v$version" ]]; then + echo "tag $GITHUB_REF_NAME does not match Cargo version $version" >&2 + exit 1 fi - tar -xzf "$asset" -C "$verify" - for executable in bootable bootable-desktop bootable-helper install.sh; do - test -x "$verify/$executable" - done - for file in README.md LICENSE bootable.svg; do - test -f "$verify/$file" - done - if [ "$RUNNER_OS" = "Linux" ]; then - test -f "$verify/app.bootable.Bootable.desktop" - test -f "$verify/app.bootable.write-media.policy" - fi - test "$("$verify/bootable" --version)" = "bootable $version" - "$verify/bootable" --help >/dev/null - - name: Package Windows artifacts - if: matrix.archive == 'zip' + echo "BOOTABLE_VERSION=$version" >> "$GITHUB_ENV" + - name: Install pinned cargo-packager + run: cargo install cargo-packager --locked --version 0.11.8 + - run: cargo test --workspace + - run: cargo build --release --workspace --target x86_64-pc-windows-msvc + - name: Build MSI, NSIS installer, portable executables, and archive shell: pwsh - run: | - $version = $env:GITHUB_REF_NAME.TrimStart('v') - $asset = "bootable-$version-${{ matrix.target }}.zip" - New-Item -ItemType Directory -Path stage - Copy-Item "target/${{ matrix.target }}/release/bootable.exe" stage/ - Copy-Item "target/${{ matrix.target }}/release/bootable-desktop.exe" stage/ - Copy-Item "target/${{ matrix.target }}/release/bootable-helper.exe" stage/ - Copy-Item scripts/install.ps1 stage/ - Copy-Item assets/bootable-mark.svg stage/bootable.svg - Copy-Item README.md,LICENSE stage/ - Compress-Archive -Path stage/* -DestinationPath $asset - $hash = (Get-FileHash $asset -Algorithm SHA256).Hash.ToLower() - "$hash $asset" | Set-Content -NoNewline "$asset.sha256" - - name: Verify Windows release archive - if: matrix.archive == 'zip' + run: scripts/package-windows.ps1 -Version $env:BOOTABLE_VERSION + - name: Verify Windows packages shell: pwsh - run: | - $version = $env:GITHUB_REF_NAME.TrimStart('v') - $asset = "bootable-$version-${{ matrix.target }}.zip" - $expectedHash = (Get-Content "$asset.sha256" -Raw).Split(' ')[0] - $actualHash = (Get-FileHash $asset -Algorithm SHA256).Hash.ToLower() - if ($actualHash -ne $expectedHash) { throw 'Packaged ZIP checksum does not match its sidecar.' } - $verify = Join-Path $env:RUNNER_TEMP 'bootable-release-verify' - Expand-Archive -LiteralPath $asset -DestinationPath $verify - $required = @( - 'bootable.exe', - 'bootable-desktop.exe', - 'bootable-helper.exe', - 'install.ps1', - 'bootable.svg', - 'README.md', - 'LICENSE' - ) - foreach ($name in $required) { - if (-not (Test-Path -LiteralPath (Join-Path $verify $name) -PathType Leaf)) { - throw "Release ZIP is missing $name." - } - } - $reportedVersion = & (Join-Path $verify 'bootable.exe') --version - if ($LASTEXITCODE -ne 0 -or $reportedVersion.Trim() -ne "bootable $version") { - throw "Release binary reported unexpected version: $reportedVersion" - } - & (Join-Path $verify 'bootable.exe') --help | Out-Null - if ($LASTEXITCODE -ne 0) { throw 'Packaged TUI failed its help smoke test.' } + run: scripts/verify-windows-packages.ps1 -Version $env:BOOTABLE_VERSION - uses: actions/attest-build-provenance@v2 + if: startsWith(github.ref, 'refs/tags/v') with: - subject-path: bootable-* + subject-path: dist/windows/* - uses: actions/upload-artifact@v4 with: - name: release-${{ matrix.target }} - path: | - bootable-*.tar.gz - bootable-*.zip - bootable-*.sha256 + name: release-windows-x86_64 + path: dist/windows/* if-no-files-found: error publish: name: Publish release - needs: build + needs: [linux, macos, windows] + if: startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-24.04 steps: - uses: actions/download-artifact@v4 @@ -163,16 +173,17 @@ jobs: body: | ## Bootable ${{ github.ref_name }} - Executables are unsigned; the macOS build is not notarized. Use expendable USB or SD - media. Check the physical target before approving erasure. + Bootable ships native installers and portable builds for its matching GUI and TUI. + Packages are unsigned and the macOS app is ad-hoc signed, not notarized. Use expendable + USB or SD media and check the physical target before approving erasure. - - Packages: Linux x86-64, Windows 10+ x86-64, macOS Apple Silicon - - Interfaces: native desktop, mouse-enabled TUI, CLI - - Raw media: ISO, IMG, RAW, XZ, gzip, Zstandard, bzip2 - - Windows media: GPT or MBR, FAT32, split WIM, boot-tree audit - - Integrity: publisher checksum when available; raw byte read-back after writing + - Linux x86-64: AppImage, DEB, RPM, and tar.gz + - Windows 10+ x86-64: MSI, setup EXE, portable GUI/TUI EXEs, and ZIP + - macOS Apple Silicon: DMG and tar.gz + - Integrity: SHA-256 sidecars and GitHub build provenance for every asset - Privilege: interactive apps remain unelevated; a fixed helper performs approved writes - Each archive has a SHA-256 sidecar and GitHub build provenance. Legacy BIOS helpers, - Linux persistence, Windows To Go, DOS media, and multiboot are not implemented. + The DEB/RPM and Windows installers place the protected helper automatically. The macOS + DMG includes an explicit helper installer. Legacy BIOS helpers, Linux persistence, + Windows To Go, DOS media, and multiboot are not implemented. files: dist/* diff --git a/CHANGELOG.md b/CHANGELOG.md index b6df0e3..c5cb6fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to Bootable are documented here. +## 0.1.1 — 2026-08-27 + +- Added native Linux AppImage, DEB, and RPM packages, each containing the desktop app, TUI, and + protected write helper. +- Added a macOS DMG with an application bundle and explicit privileged-helper installer. +- Added Windows MSI and setup EXE installers plus direct portable GUI and TUI executables. +- Added package-content, embedded-version, checksum, and installer extraction checks to the release + workflow, with SHA-256 sidecars and provenance for every published artifact. + ## 0.1.0 — 2026-08-27 - Reworked the desktop and terminal interfaces around the same workspace-first flow, shared diff --git a/Cargo.lock b/Cargo.lock index 540fe66..f60fe3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -792,7 +792,7 @@ dependencies = [ [[package]] name = "bootable-core" -version = "0.1.0" +version = "0.1.1" dependencies = [ "bzip2", "flate2", @@ -817,7 +817,7 @@ dependencies = [ [[package]] name = "bootable-desktop" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "bootable-core", @@ -831,7 +831,7 @@ dependencies = [ [[package]] name = "bootable-helper" -version = "0.1.0" +version = "0.1.1" dependencies = [ "bootable-core", "serde_json", @@ -839,7 +839,7 @@ dependencies = [ [[package]] name = "bootable-tui" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "bootable-core", diff --git a/Cargo.toml b/Cargo.toml index c7f82bf..2cbb94f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ default-members = [ resolver = "2" [workspace.package] -version = "0.1.0" +version = "0.1.1" edition = "2024" license = "Apache-2.0" rust-version = "1.88" diff --git a/README.md b/README.md index 7b81e71..433faa0 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@

Create and verify bootable USB and SD drives.

- Linux · - Windows · - macOS · + Linux AppImage · + Windows installer · + macOS DMG · All downloads and checksums

@@ -65,7 +65,8 @@ curl -fsSL https://bootable.palash.dev/install.sh | sh -s -- --tui curl -fsSL https://bootable.palash.dev/install.sh | sh -s -- --all ``` -Windows: download and extract the ZIP, then run: +Native packages are also available as DEB/RPM on Linux, MSI on Windows, and DMG on macOS. For the +portable Windows ZIP, extract it and run: ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1 -Variant All diff --git a/assets/bootable-mark.png b/assets/bootable-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..f6de6422feee44bc1551cb74de2bef62c74d795d GIT binary patch literal 54062 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 z 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 HJ_`LmKr5-Y literal 0 HcmV?d00001 diff --git a/assets/bootable.ico b/assets/bootable.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e354c0930c51dd394b1e1cc0ac46c34fd1af2c4 GIT binary patch literal 370070 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 + exit 1 + } +done +command -v dpkg-deb >/dev/null +command -v rpmbuild >/dev/null +test -x "$linuxdeploy" +test -x "$appimagetool" + +output="$root/$output" +mkdir -p "$output" +work="$(mktemp -d "${TMPDIR:-/tmp}/bootable-linux-package.XXXXXX")" +trap 'rm -rf "$work"' EXIT + +install_payload() { + local destination="$1" + install -D -m 0755 "$binary_dir/bootable" "$destination/usr/bin/bootable" + install -D -m 0755 "$binary_dir/bootable-desktop" "$destination/usr/bin/bootable-desktop" + install -D -m 0755 "$binary_dir/bootable-helper" "$destination/usr/libexec/bootable-helper" + install -D -m 0644 "$root/assets/bootable-mark.svg" \ + "$destination/usr/share/icons/hicolor/scalable/apps/bootable.svg" + install -D -m 0644 "$root/assets/bootable-mark.png" \ + "$destination/usr/share/icons/hicolor/1024x1024/apps/bootable.png" + install -D -m 0644 "$root/packaging/app.bootable.write-media.policy" \ + "$destination/usr/share/polkit-1/actions/app.bootable.write-media.policy" + install -D -m 0644 "$root/README.md" "$destination/usr/share/doc/bootable/README.md" + install -D -m 0644 "$root/LICENSE" "$destination/usr/share/doc/bootable/LICENSE" + sed 's|@EXEC@|/usr/bin/bootable-desktop|g' \ + "$root/packaging/app.bootable.Bootable.desktop" \ + > "$destination/usr/share/applications/app.bootable.Bootable.desktop" + chmod 0644 "$destination/usr/share/applications/app.bootable.Bootable.desktop" +} + +deb_root="$work/deb" +install_payload "$deb_root" +mkdir -p "$deb_root/DEBIAN" +installed_size="$(du -sk "$deb_root/usr" | awk '{print $1}')" +cat > "$deb_root/DEBIAN/control" < +Homepage: https://github.com/debpalash/bootable +Depends: libc6, libfontconfig1, libxkbcommon-x11-0, polkitd | policykit-1 +Description: Safety-first boot media writer + Bootable provides matching desktop and terminal interfaces for inspecting, + writing, and verifying bootable images on removable media. +EOF +deb_asset="$output/bootable_${version}_amd64.deb" +dpkg-deb --build --root-owner-group "$deb_root" "$deb_asset" + +rpm_top="$work/rpmbuild" +mkdir -p "$rpm_top"/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} +install -m 0755 "$binary_dir/bootable" "$rpm_top/SOURCES/bootable" +install -m 0755 "$binary_dir/bootable-desktop" "$rpm_top/SOURCES/bootable-desktop" +install -m 0755 "$binary_dir/bootable-helper" "$rpm_top/SOURCES/bootable-helper" +install -m 0644 "$root/assets/bootable-mark.svg" "$rpm_top/SOURCES/bootable.svg" +install -m 0644 "$root/assets/bootable-mark.png" "$rpm_top/SOURCES/bootable.png" +install -m 0644 "$root/packaging/app.bootable.write-media.policy" "$rpm_top/SOURCES/app.bootable.write-media.policy" +sed 's|@EXEC@|/usr/bin/bootable-desktop|g' \ + "$root/packaging/app.bootable.Bootable.desktop" \ + > "$rpm_top/SOURCES/app.bootable.Bootable.desktop" +install -m 0644 "$root/README.md" "$rpm_top/SOURCES/README.md" +install -m 0644 "$root/LICENSE" "$rpm_top/SOURCES/LICENSE" +cat > "$rpm_top/SPECS/bootable.spec" < - $version-1 +- Native installer release. +EOF +rpmbuild --define "_topdir $rpm_top" -bb "$rpm_top/SPECS/bootable.spec" +rpm_asset="$(find "$rpm_top/RPMS" -type f -name '*.rpm' -print -quit)" +test -n "$rpm_asset" +cp "$rpm_asset" "$output/bootable-${version}-1.x86_64.rpm" + +appdir="$work/Bootable.AppDir" +install_payload "$appdir" +sed 's|@EXEC@|bootable-desktop|g' \ + "$root/packaging/app.bootable.Bootable.desktop" \ + > "$appdir/usr/share/applications/app.bootable.Bootable.desktop" +# The adjacent helper lets the runtime retain its fixed-name fallback inside the AppImage. +install -m 0755 "$binary_dir/bootable-helper" "$appdir/usr/bin/bootable-helper" +"$linuxdeploy" \ + --appdir "$appdir" \ + --executable "$appdir/usr/bin/bootable-desktop" \ + --executable "$appdir/usr/bin/bootable" \ + --executable "$appdir/usr/bin/bootable-helper" \ + --desktop-file "$appdir/usr/share/applications/app.bootable.Bootable.desktop" \ + --icon-file "$appdir/usr/share/icons/hicolor/1024x1024/apps/bootable.png" +cat > "$appdir/AppRun" <<'EOF' +#!/bin/sh +set -eu +appdir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" +if [ "${1:-}" = "--tui" ]; then + shift + exec "$appdir/usr/bin/bootable" "$@" +fi +exec "$appdir/usr/bin/bootable-desktop" "$@" +EOF +chmod 0755 "$appdir/AppRun" +ARCH=x86_64 "$appimagetool" "$appdir" "$output/bootable-${version}-x86_64.AppImage" + +archive_stage="$work/archive" +mkdir -p "$archive_stage" +install -m 0755 "$binary_dir/bootable" "$archive_stage/bootable" +install -m 0755 "$binary_dir/bootable-desktop" "$archive_stage/bootable-desktop" +install -m 0755 "$binary_dir/bootable-helper" "$archive_stage/bootable-helper" +install -m 0755 "$root/scripts/install.sh" "$archive_stage/install.sh" +install -m 0644 "$root/assets/bootable-mark.svg" "$archive_stage/bootable.svg" +install -m 0644 "$root/packaging/app.bootable.Bootable.desktop" "$archive_stage/app.bootable.Bootable.desktop" +install -m 0644 "$root/packaging/app.bootable.write-media.policy" "$archive_stage/app.bootable.write-media.policy" +install -m 0644 "$root/README.md" "$root/LICENSE" "$archive_stage/" +tar -C "$archive_stage" -czf "$output/bootable-${version}-${target}.tar.gz" . + +for asset in "$output"/*; do + case "$asset" in *.sha256) continue ;; esac + (cd "$output" && sha256sum "$(basename "$asset")" > "$(basename "$asset").sha256") +done diff --git a/scripts/package-macos.sh b/scripts/package-macos.sh new file mode 100755 index 0000000..0171f79 --- /dev/null +++ b/scripts/package-macos.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +set -euo pipefail + +version="${1:?usage: package-macos.sh VERSION [TARGET] [OUTPUT_DIR]}" +target="${2:-aarch64-apple-darwin}" +output="${3:-dist/macos}" +root="$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)" +binary_dir="$root/target/$target/release" +output="$root/$output" + +for executable in bootable bootable-desktop bootable-helper; do + test -x "$binary_dir/$executable" || { + echo "missing executable: $binary_dir/$executable" >&2 + exit 1 + } +done +mkdir -p "$output" +work="$(mktemp -d "${TMPDIR:-/tmp}/bootable-macos-package.XXXXXX")" +trap 'rm -rf "$work"' EXIT + +app="$work/dmg/Bootable.app" +contents="$app/Contents" +mkdir -p "$contents/MacOS" "$contents/Resources" +install -m 0755 "$binary_dir/bootable-desktop" "$contents/MacOS/bootable-desktop" +install -m 0755 "$binary_dir/bootable" "$contents/MacOS/bootable" +install -m 0755 "$binary_dir/bootable-helper" "$contents/MacOS/bootable-helper" + +iconset="$work/bootable.iconset" +mkdir -p "$iconset" +for size in 16 32 128 256 512; do + sips -z "$size" "$size" "$root/assets/bootable-mark.png" \ + --out "$iconset/icon_${size}x${size}.png" >/dev/null + double="$((size * 2))" + sips -z "$double" "$double" "$root/assets/bootable-mark.png" \ + --out "$iconset/icon_${size}x${size}@2x.png" >/dev/null +done +iconutil -c icns "$iconset" -o "$contents/Resources/bootable.icns" + +cat > "$contents/Info.plist" < + + + + CFBundleDevelopmentRegionen + CFBundleDisplayNameBootable + CFBundleExecutablebootable-desktop + CFBundleIconFilebootable + CFBundleIdentifierapp.bootable.Bootable + CFBundleInfoDictionaryVersion6.0 + CFBundleNameBootable + CFBundlePackageTypeAPPL + CFBundleShortVersionString$version + CFBundleVersion$version + LSApplicationCategoryTypepublic.app-category.utilities + LSMinimumSystemVersion12.0 + NSHighResolutionCapable + + +EOF +plutil -lint "$contents/Info.plist" +codesign --force --deep --sign - "$app" + +cat > "$work/dmg/Install Bootable Helper.command" <<'EOF' +#!/bin/sh +set -eu +bundle="$(CDPATH= cd -- "$(dirname -- "$0")/Bootable.app/Contents/MacOS" && pwd)" +echo "Bootable installs only its narrow media-write helper with administrator ownership." +sudo install -d -m 0755 /Library/PrivilegedHelperTools +sudo install -m 0755 "$bundle/bootable-helper" /Library/PrivilegedHelperTools/app.bootable.helper +sudo chown root:wheel /Library/PrivilegedHelperTools/app.bootable.helper +echo "Bootable helper installed. You can now launch Bootable.app." +EOF +chmod 0755 "$work/dmg/Install Bootable Helper.command" +ln -s /Applications "$work/dmg/Applications" + +dmg="$output/bootable-${version}-aarch64.dmg" +hdiutil create -volname "Bootable $version" -srcfolder "$work/dmg" -ov -format UDZO "$dmg" + +archive_stage="$work/archive" +mkdir -p "$archive_stage" +install -m 0755 "$binary_dir/bootable" "$archive_stage/bootable" +install -m 0755 "$binary_dir/bootable-desktop" "$archive_stage/bootable-desktop" +install -m 0755 "$binary_dir/bootable-helper" "$archive_stage/bootable-helper" +install -m 0755 "$root/scripts/install.sh" "$archive_stage/install.sh" +install -m 0644 "$root/assets/bootable-mark.svg" "$archive_stage/bootable.svg" +install -m 0644 "$root/README.md" "$root/LICENSE" "$archive_stage/" +tar -C "$archive_stage" -czf "$output/bootable-${version}-${target}.tar.gz" . + +for asset in "$output"/*; do + case "$asset" in *.sha256) continue ;; esac + (cd "$output" && shasum -a 256 "$(basename "$asset")" > "$(basename "$asset").sha256") +done diff --git a/scripts/package-windows.ps1 b/scripts/package-windows.ps1 new file mode 100644 index 0000000..213d3c7 --- /dev/null +++ b/scripts/package-windows.ps1 @@ -0,0 +1,54 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [string]$Version, + [string]$Target = 'x86_64-pc-windows-msvc', + [string]$OutputDirectory = 'dist/windows' +) + +$ErrorActionPreference = 'Stop' +$root = Split-Path -Parent $PSScriptRoot +$binaryDirectory = Join-Path $root "target/$Target/release" +$output = Join-Path $root $OutputDirectory +$config = Join-Path $root 'packaging/Packager.toml' + +foreach ($name in @('bootable.exe', 'bootable-desktop.exe', 'bootable-helper.exe')) { + if (-not (Test-Path -LiteralPath (Join-Path $binaryDirectory $name) -PathType Leaf)) { + throw "Missing executable: $name" + } +} +$configuredVersion = Select-String -LiteralPath $config -Pattern '^version = "([^\"]+)"$' +if (-not $configuredVersion -or $configuredVersion.Matches[0].Groups[1].Value -ne $Version) { + throw "Packager.toml does not declare release version $Version." +} + +New-Item -ItemType Directory -Path $output -Force | Out-Null +cargo packager --config $config --formats wix,nsis +if ($LASTEXITCODE -ne 0) { throw 'cargo-packager failed.' } + +$msi = Get-ChildItem -LiteralPath $output -Filter '*.msi' | Select-Object -First 1 +$installer = Get-ChildItem -LiteralPath $output -Filter '*setup.exe' | Select-Object -First 1 +if (-not $msi) { throw 'cargo-packager did not produce an MSI.' } +if (-not $installer) { throw 'cargo-packager did not produce an NSIS installer.' } +Move-Item -LiteralPath $msi.FullName -Destination (Join-Path $output "bootable-$Version-x86_64.msi") -Force +Move-Item -LiteralPath $installer.FullName -Destination (Join-Path $output "bootable-$Version-x86_64-setup.exe") -Force +Copy-Item -LiteralPath (Join-Path $binaryDirectory 'bootable-desktop.exe') ` + -Destination (Join-Path $output "bootable-desktop-$Version-x86_64.exe") +Copy-Item -LiteralPath (Join-Path $binaryDirectory 'bootable.exe') ` + -Destination (Join-Path $output "bootable-tui-$Version-x86_64.exe") + +$stage = Join-Path $env:RUNNER_TEMP 'bootable-windows-archive' +New-Item -ItemType Directory -Path $stage -Force | Out-Null +Copy-Item -LiteralPath (Join-Path $binaryDirectory 'bootable.exe') -Destination $stage +Copy-Item -LiteralPath (Join-Path $binaryDirectory 'bootable-desktop.exe') -Destination $stage +Copy-Item -LiteralPath (Join-Path $binaryDirectory 'bootable-helper.exe') -Destination $stage +Copy-Item -LiteralPath (Join-Path $root 'scripts/install.ps1') -Destination $stage +Copy-Item -LiteralPath (Join-Path $root 'assets/bootable-mark.svg') -Destination (Join-Path $stage 'bootable.svg') +Copy-Item -LiteralPath (Join-Path $root 'README.md'),(Join-Path $root 'LICENSE') -Destination $stage +Compress-Archive -Path (Join-Path $stage '*') ` + -DestinationPath (Join-Path $output "bootable-$Version-$Target.zip") -Force + +Get-ChildItem -LiteralPath $output -File | Where-Object Extension -ne '.sha256' | ForEach-Object { + $hash = (Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256).Hash.ToLower() + "$hash $($_.Name)" | Set-Content -NoNewline "$($_.FullName).sha256" +} diff --git a/scripts/verify-linux-packages.sh b/scripts/verify-linux-packages.sh new file mode 100755 index 0000000..581aedf --- /dev/null +++ b/scripts/verify-linux-packages.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +set -euo pipefail + +version="${1:?usage: verify-linux-packages.sh VERSION [OUTPUT_DIR]}" +output="${2:-dist/linux}" +root="$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)" +output="$root/$output" + +deb="$output/bootable_${version}_amd64.deb" +rpm="$output/bootable-${version}-1.x86_64.rpm" +appimage="$output/bootable-${version}-x86_64.AppImage" +archive="$output/bootable-${version}-x86_64-unknown-linux-gnu.tar.gz" + +(cd "$output" && sha256sum -c -- *.sha256) +test "$(dpkg-deb -f "$deb" Version)" = "$version" +for path in ./usr/bin/bootable ./usr/bin/bootable-desktop ./usr/libexec/bootable-helper \ + ./usr/share/applications/app.bootable.Bootable.desktop \ + ./usr/share/polkit-1/actions/app.bootable.write-media.policy; do + dpkg-deb -c "$deb" | grep -Fq "$path" +done +test "$(rpm -qp --queryformat '%{VERSION}' "$rpm")" = "$version" +for path in /usr/bin/bootable /usr/bin/bootable-desktop /usr/libexec/bootable-helper \ + /usr/share/applications/app.bootable.Bootable.desktop \ + /usr/share/polkit-1/actions/app.bootable.write-media.policy; do + rpm -qlp "$rpm" | grep -Fxq "$path" +done + +extract="$(mktemp -d "${TMPDIR:-/tmp}/bootable-linux-verify.XXXXXX")" +trap 'rm -rf "$extract"' EXIT +(cd "$extract" && "$appimage" --appimage-extract >/dev/null) +for path in AppRun usr/bin/bootable usr/bin/bootable-desktop usr/bin/bootable-helper; do + test -x "$extract/squashfs-root/$path" +done +test "$("$extract/squashfs-root/usr/bin/bootable" --version)" = "bootable $version" + +mkdir "$extract/archive" +tar -xzf "$archive" -C "$extract/archive" +for executable in bootable bootable-desktop bootable-helper install.sh; do + test -x "$extract/archive/$executable" +done +test "$("$extract/archive/bootable" --version)" = "bootable $version" +"$extract/archive/bootable" --help >/dev/null diff --git a/scripts/verify-macos-packages.sh b/scripts/verify-macos-packages.sh new file mode 100755 index 0000000..408c8df --- /dev/null +++ b/scripts/verify-macos-packages.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +set -euo pipefail + +version="${1:?usage: verify-macos-packages.sh VERSION [OUTPUT_DIR]}" +output="${2:-dist/macos}" +root="$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)" +output="$root/$output" +dmg="$output/bootable-${version}-aarch64.dmg" +archive="$output/bootable-${version}-aarch64-apple-darwin.tar.gz" + +(cd "$output" && shasum -a 256 -c ./*.sha256) +hdiutil verify "$dmg" +mount="$(mktemp -d "${TMPDIR:-/tmp}/bootable-dmg-verify.XXXXXX")" +extract="$(mktemp -d "${TMPDIR:-/tmp}/bootable-macos-verify.XXXXXX")" +cleanup() { + hdiutil detach "$mount" -quiet >/dev/null 2>&1 || true + rm -rf "$mount" "$extract" +} +trap cleanup EXIT +hdiutil attach "$dmg" -readonly -nobrowse -mountpoint "$mount" -quiet +test -d "$mount/Bootable.app" +test -x "$mount/Bootable.app/Contents/MacOS/bootable-desktop" +test -x "$mount/Bootable.app/Contents/MacOS/bootable" +test -x "$mount/Bootable.app/Contents/MacOS/bootable-helper" +test -x "$mount/Install Bootable Helper.command" +test "$(defaults read "$mount/Bootable.app/Contents/Info" CFBundleShortVersionString)" = "$version" +codesign --verify --deep --strict "$mount/Bootable.app" +test "$("$mount/Bootable.app/Contents/MacOS/bootable" --version)" = "bootable $version" +hdiutil detach "$mount" -quiet + +tar -xzf "$archive" -C "$extract" +for executable in bootable bootable-desktop bootable-helper install.sh; do + test -x "$extract/$executable" +done +test "$("$extract/bootable" --version)" = "bootable $version" diff --git a/scripts/verify-windows-packages.ps1 b/scripts/verify-windows-packages.ps1 new file mode 100644 index 0000000..5b4a447 --- /dev/null +++ b/scripts/verify-windows-packages.ps1 @@ -0,0 +1,62 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [string]$Version, + [string]$OutputDirectory = 'dist/windows' +) + +$ErrorActionPreference = 'Stop' +$root = Split-Path -Parent $PSScriptRoot +$output = Join-Path $root $OutputDirectory +$expected = @( + "bootable-$Version-x86_64.msi", + "bootable-$Version-x86_64-setup.exe", + "bootable-desktop-$Version-x86_64.exe", + "bootable-tui-$Version-x86_64.exe", + "bootable-$Version-x86_64-pc-windows-msvc.zip" +) + +foreach ($name in $expected) { + $path = Join-Path $output $name + if (-not (Test-Path -LiteralPath $path -PathType Leaf)) { throw "Missing package: $name" } + $sidecar = "$path.sha256" + $expectedHash = (Get-Content -LiteralPath $sidecar -Raw).Split(' ')[0] + $actualHash = (Get-FileHash -LiteralPath $path -Algorithm SHA256).Hash.ToLower() + if ($expectedHash -ne $actualHash) { throw "Checksum mismatch: $name" } +} + +$reportedVersion = & (Join-Path $output "bootable-tui-$Version-x86_64.exe") --version +if ($LASTEXITCODE -ne 0 -or $reportedVersion.Trim() -ne "bootable $Version") { + throw "Portable TUI reported an unexpected version: $reportedVersion" +} +& (Join-Path $output "bootable-tui-$Version-x86_64.exe") --help | Out-Null +if ($LASTEXITCODE -ne 0) { throw 'Portable TUI failed its help smoke test.' } + +$msiExtract = Join-Path $env:RUNNER_TEMP 'bootable-msi-verify' +$process = Start-Process -FilePath 'msiexec.exe' -ArgumentList @( + '/a', + "`"$(Join-Path $output "bootable-$Version-x86_64.msi")`"", + '/qn', + "TARGETDIR=`"$msiExtract`"" +) -Wait -PassThru +if ($process.ExitCode -ne 0) { throw "MSI administrative extraction failed: $($process.ExitCode)" } +foreach ($name in @('bootable.exe', 'bootable-desktop.exe', 'bootable-helper.exe')) { + if (-not (Get-ChildItem -LiteralPath $msiExtract -Recurse -Filter $name -File)) { + throw "MSI is missing $name." + } +} + +$listing = & 7z l (Join-Path $output "bootable-$Version-x86_64-setup.exe") +if ($LASTEXITCODE -ne 0) { throw 'Could not inspect the NSIS installer.' } +foreach ($name in @('bootable.exe', 'bootable-desktop.exe', 'bootable-helper.exe')) { + if (-not ($listing -match [regex]::Escape($name))) { throw "NSIS installer is missing $name." } +} + +$zipExtract = Join-Path $env:RUNNER_TEMP 'bootable-zip-verify' +Expand-Archive -LiteralPath (Join-Path $output "bootable-$Version-x86_64-pc-windows-msvc.zip") ` + -DestinationPath $zipExtract -Force +foreach ($name in @('bootable.exe', 'bootable-desktop.exe', 'bootable-helper.exe', 'install.ps1')) { + if (-not (Test-Path -LiteralPath (Join-Path $zipExtract $name) -PathType Leaf)) { + throw "ZIP is missing $name." + } +} diff --git a/site/src/components/Header.astro b/site/src/components/Header.astro index 36a39a9..5ed5d39 100644 --- a/site/src/components/Header.astro +++ b/site/src/components/Header.astro @@ -12,7 +12,7 @@ const homeHref = home ? '#top' : '/'; bootable - v0.1.0 + v0.1.1