mirror of
https://github.com/buckit-io/buckit.git
synced 2026-09-16 15:45:06 +00:00
414f5656f2
Add an Install panel to the generated release landing page listing the curl/irm one-liners for the Linux, macOS, and Windows installer scripts.
548 lines
27 KiB
YAML
548 lines
27 KiB
YAML
name: Release
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'RELEASE.*'
|
|
|
|
permissions:
|
|
contents: write
|
|
packages: write
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- goos: linux
|
|
goarch: amd64
|
|
- goos: linux
|
|
goarch: arm64
|
|
- goos: windows
|
|
goarch: amd64
|
|
ext: .exe
|
|
- goos: darwin
|
|
goarch: arm64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version: 1.25.x
|
|
|
|
- name: Build binary
|
|
env:
|
|
CGO_ENABLED: 0
|
|
BUCKIT_RELEASE: RELEASE
|
|
run: |
|
|
# Extract timestamp from tag (e.g., RELEASE.2026-05-10T21-48-00Z.rc1 -> 2026-05-10T21-48-00Z)
|
|
VERSION=$(echo "${{ github.ref_name }}" | sed 's/^RELEASE\.//' | sed 's/\.rc[0-9]*$//')
|
|
# Pass RC suffix via BUCKIT_HOTFIX so it's embedded in the binary's ReleaseTag
|
|
if [[ "${{ github.ref_name }}" =~ \.(rc[0-9]+)$ ]]; then
|
|
export BUCKIT_HOTFIX="${BASH_REMATCH[1]}"
|
|
fi
|
|
LDFLAGS=$(go run buildscripts/gen-ldflags.go "${VERSION}")
|
|
GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -tags kqueue -trimpath --ldflags "${LDFLAGS}" -o buckit-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}.${{ github.ref_name }}
|
|
|
|
- name: Generate checksum
|
|
run: |
|
|
sha256sum buckit-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}.${{ github.ref_name }} > buckit-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}.${{ github.ref_name }}.sha256sum
|
|
|
|
- name: Sign with minisign
|
|
env:
|
|
MINISIGN_PRIVATE_KEY: ${{ secrets.MINISIGN_PRIVATE_KEY }}
|
|
MINISIGN_PASSWORD: ${{ secrets.MINISIGN_PASSWORD }}
|
|
run: |
|
|
go install aead.dev/minisign/cmd/minisign@v0.2.1
|
|
echo "$MINISIGN_PRIVATE_KEY" | base64 -d > /tmp/minisign.key
|
|
echo "$MINISIGN_PASSWORD" | minisign -Sm buckit-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}.${{ github.ref_name }} -s /tmp/minisign.key
|
|
shred -u /tmp/minisign.key
|
|
|
|
- name: Build packages
|
|
if: matrix.goos == 'linux'
|
|
env:
|
|
NFPM_VERSION: 2.46.3
|
|
PKG_ARCH: ${{ matrix.goarch }}
|
|
run: |
|
|
wget -q "https://github.com/goreleaser/nfpm/releases/download/v${NFPM_VERSION}/nfpm_${NFPM_VERSION}_amd64.deb"
|
|
sudo apt install -y "./nfpm_${NFPM_VERSION}_amd64.deb"
|
|
mkdir -p dist
|
|
cp "buckit-linux-${PKG_ARCH}.${{ github.ref_name }}" dist/buckit
|
|
# Convert RELEASE.2026-05-11T17-20-40Z[.rcN] -> 20260511172040.0.0
|
|
PKG_VERSION=$(echo "${{ github.ref_name }}" | sed 's/^RELEASE\.//' | sed 's/\.rc[0-9]*$//' | tr -d '\-:TZ').0.0
|
|
export PKG_VERSION
|
|
for pkg in rpm deb apk; do
|
|
nfpm package -f packaging/nfpm.yaml -p "$pkg" -t dist/
|
|
done
|
|
|
|
- name: Generate package checksums
|
|
if: matrix.goos == 'linux'
|
|
run: |
|
|
for pkg in dist/*.deb dist/*.rpm dist/*.apk; do
|
|
sha256sum "$pkg" > "${pkg}.sha256sum"
|
|
done
|
|
|
|
- name: Upload artifacts
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: build-${{ matrix.goos }}-${{ matrix.goarch }}
|
|
path: |
|
|
buckit-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}.${{ github.ref_name }}
|
|
buckit-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}.${{ github.ref_name }}.sha256sum
|
|
buckit-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}.${{ github.ref_name }}.minisig
|
|
dist/*.deb
|
|
dist/*.rpm
|
|
dist/*.apk
|
|
dist/*.deb.sha256sum
|
|
dist/*.rpm.sha256sum
|
|
dist/*.apk.sha256sum
|
|
|
|
docker:
|
|
needs: build
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
path: artifacts
|
|
merge-multiple: true
|
|
|
|
- name: Prepare binaries for Docker
|
|
run: |
|
|
cp artifacts/buckit-linux-amd64.${{ github.ref_name }} buckit-amd64.${{ github.ref_name }}
|
|
cp artifacts/buckit-linux-arm64.${{ github.ref_name }} buckit-arm64.${{ github.ref_name }}
|
|
cp artifacts/buckit-linux-amd64.${{ github.ref_name }}.minisig buckit-amd64.${{ github.ref_name }}.minisig
|
|
cp artifacts/buckit-linux-arm64.${{ github.ref_name }}.minisig buckit-arm64.${{ github.ref_name }}.minisig
|
|
chmod +x buckit-*.${{ github.ref_name }}
|
|
|
|
- uses: docker/setup-qemu-action@v3
|
|
|
|
- uses: docker/setup-buildx-action@v3
|
|
|
|
- uses: docker/login-action@v3
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
|
|
- name: Determine tags
|
|
id: tags
|
|
run: |
|
|
TAGS="ghcr.io/buckit-io/buckit:${{ github.ref_name }}"
|
|
TAGS="${TAGS},docker.io/buckitio/buckit:${{ github.ref_name }}"
|
|
if [[ "${{ github.ref_name }}" != *".rc"* ]]; then
|
|
TAGS="${TAGS},ghcr.io/buckit-io/buckit:latest"
|
|
TAGS="${TAGS},docker.io/buckitio/buckit:latest"
|
|
fi
|
|
echo "tags=${TAGS}" >> $GITHUB_OUTPUT
|
|
|
|
- uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
file: Dockerfile
|
|
platforms: linux/amd64,linux/arm64
|
|
push: true
|
|
tags: ${{ steps.tags.outputs.tags }}
|
|
build-args: |
|
|
RELEASE=${{ github.ref_name }}
|
|
|
|
publish:
|
|
needs: [build, docker]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
path: artifacts
|
|
merge-multiple: true
|
|
|
|
- name: Prepare release assets
|
|
run: |
|
|
mkdir -p release-assets
|
|
find artifacts -type f \
|
|
! -name 'buckit.rpm' \
|
|
! -name 'buckit.deb' \
|
|
! -name 'buckit.apk' \
|
|
! -name 'buckit.rpm.sha256sum' \
|
|
! -name 'buckit.deb.sha256sum' \
|
|
! -name 'buckit.apk.sha256sum' \
|
|
-exec cp {} release-assets/ \;
|
|
|
|
- name: Create GitHub Release
|
|
uses: softprops/action-gh-release@v2
|
|
with:
|
|
generate_release_notes: true
|
|
prerelease: ${{ contains(github.ref_name, '.rc') }}
|
|
files: release-assets/*
|
|
|
|
update-gh-pages:
|
|
if: "!contains(github.ref_name, '.rc')"
|
|
needs: [build, publish]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
ref: gh-pages
|
|
path: pages
|
|
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
path: src
|
|
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
path: artifacts
|
|
merge-multiple: true
|
|
|
|
- name: Publish install scripts
|
|
run: |
|
|
cp src/packaging/install-linux.sh pages/install-linux.sh
|
|
cp src/packaging/install-mac.sh pages/install-mac.sh
|
|
cp src/packaging/install-windows.ps1 pages/install-windows.ps1
|
|
chmod +x pages/install-linux.sh pages/install-mac.sh
|
|
|
|
- name: Write self-update checksum files
|
|
run: |
|
|
tag="${{ github.ref_name }}"
|
|
|
|
# Rebuild the release tree from scratch to remove any stale assets.
|
|
rm -rf pages/server/buckit/release pages/server/buckit/archives
|
|
mkdir -p \
|
|
pages/server/buckit/release/linux-amd64 \
|
|
pages/server/buckit/release/linux-arm64 \
|
|
pages/server/buckit/release/windows-amd64 \
|
|
pages/server/buckit/release/darwin-arm64 \
|
|
pages/server/buckit/archives
|
|
|
|
sha=$(awk '{print $1}' "artifacts/buckit-linux-amd64.${tag}.sha256sum")
|
|
echo "${sha} buckit.${tag}" > "pages/server/buckit/release/linux-amd64/buckit.sha256sum"
|
|
sha=$(awk '{print $1}' "artifacts/buckit-linux-arm64.${tag}.sha256sum")
|
|
echo "${sha} buckit.${tag}" > "pages/server/buckit/release/linux-arm64/buckit.sha256sum"
|
|
sha=$(awk '{print $1}' "artifacts/buckit-windows-amd64.exe.${tag}.sha256sum")
|
|
echo "${sha} buckit.exe.${tag}" > "pages/server/buckit/release/windows-amd64/buckit.sha256sum"
|
|
sha=$(awk '{print $1}' "artifacts/buckit-darwin-arm64.${tag}.sha256sum")
|
|
echo "${sha} buckit.${tag}" > "pages/server/buckit/release/darwin-arm64/buckit.sha256sum"
|
|
|
|
- name: Generate release index page
|
|
run: |
|
|
tag="${{ github.ref_name }}"
|
|
base="https://github.com/buckit-io/buckit/releases/download/${tag}"
|
|
PKG_VERSION=$(echo "${tag}" | sed 's/^RELEASE\.//' | sed 's/\.rc[0-9]*$//' | tr -d '\-:TZ').0.0
|
|
cat > pages/server/buckit/release/index.html <<HTML
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Buckit ${tag}</title>
|
|
<style>
|
|
:root { color-scheme: light; --bg: #f3f5f9; --surface: #ffffff; --surface-alt: #f8fafc; --border: #d8dee9; --text: #0f172a; --muted: #475569; --link: #0f766e; --link-hover: #115e59; --accent: #dcfce7; --accent-text: #166534; --shadow: 0 18px 40px rgba(15, 23, 42, 0.08); }
|
|
* { box-sizing: border-box; }
|
|
body { margin: 0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--bg); color: var(--text); }
|
|
.page { max-width: 1080px; margin: 0 auto; padding: 40px 20px 64px; }
|
|
.hero, .panel { background: var(--surface); border: 1px solid var(--border); border-radius: 14px; box-shadow: var(--shadow); }
|
|
.hero { padding: 28px; margin-bottom: 24px; }
|
|
.eyebrow { display: inline-block; padding: 6px 10px; border-radius: 999px; background: var(--accent); color: var(--accent-text); font-size: 12px; font-weight: 700; letter-spacing: 0; text-transform: uppercase; }
|
|
h1 { margin: 14px 0 10px; font-size: 34px; line-height: 1.1; }
|
|
.subhead { margin: 0 0 20px; max-width: 760px; color: var(--muted); font-size: 16px; line-height: 1.6; }
|
|
.hero-actions, .meta { display: flex; flex-wrap: wrap; gap: 12px; }
|
|
.meta { margin-top: 18px; }
|
|
.meta-item { padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface-alt); min-width: 160px; }
|
|
.meta-label { display: block; font-size: 12px; color: var(--muted); margin-bottom: 4px; }
|
|
.meta-value { font-size: 14px; font-weight: 600; }
|
|
.button, .text-link { color: var(--link); text-decoration: none; font-weight: 600; }
|
|
.button { display: inline-flex; align-items: center; justify-content: center; min-height: 42px; padding: 0 16px; border-radius: 10px; border: 1px solid #99f6e4; background: #f0fdfa; }
|
|
.button:hover, .text-link:hover { color: var(--link-hover); }
|
|
.panel { padding: 24px; margin-bottom: 24px; }
|
|
.panel:last-child { margin-bottom: 0; }
|
|
.section-title { margin: 0 0 8px; font-size: 24px; }
|
|
.section-copy { margin: 0 0 20px; color: var(--muted); line-height: 1.6; }
|
|
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; }
|
|
.card { border: 1px solid var(--border); border-radius: 12px; background: var(--surface-alt); padding: 18px; }
|
|
.card h3 { margin: 0 0 8px; font-size: 18px; }
|
|
.card p { margin: 0 0 16px; color: var(--muted); font-size: 14px; line-height: 1.5; }
|
|
.card-links { display: grid; gap: 10px; }
|
|
.download { display: inline-flex; align-items: center; justify-content: center; min-height: 40px; padding: 0 14px; border-radius: 10px; background: #0f172a; color: #ffffff; text-decoration: none; font-weight: 600; }
|
|
.download:hover { background: #1e293b; }
|
|
.aux-links { display: flex; flex-wrap: wrap; gap: 12px; }
|
|
.table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: 12px; background: var(--surface-alt); }
|
|
table { width: 100%; border-collapse: collapse; }
|
|
th, td { text-align: left; padding: 14px 16px; border-bottom: 1px solid var(--border); vertical-align: top; }
|
|
th { font-size: 12px; text-transform: uppercase; color: var(--muted); background: #eef2f7; letter-spacing: 0.04em; }
|
|
tbody tr:last-child td { border-bottom: 0; }
|
|
td strong { display: block; margin-bottom: 4px; }
|
|
.footer-note { margin-top: 18px; color: var(--muted); font-size: 14px; line-height: 1.6; }
|
|
a { color: var(--link); text-decoration: none; }
|
|
a:hover { text-decoration: underline; }
|
|
@media (max-width: 720px) {
|
|
.page { padding: 24px 16px 48px; }
|
|
.hero, .panel { padding: 20px; }
|
|
h1 { font-size: 28px; }
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="page">
|
|
<section class="hero">
|
|
<span class="eyebrow">Latest Stable Release</span>
|
|
<h1>Buckit</h1>
|
|
<p class="subhead">Signed release binaries for the Buckit S3-compatible object storage server.</p>
|
|
<div class="hero-actions">
|
|
<a class="button" href="../archives/">Browse release archive</a>
|
|
</div>
|
|
<div class="meta">
|
|
<div class="meta-item">
|
|
<span class="meta-label">Release tag</span>
|
|
<span class="meta-value">${tag}</span>
|
|
</div>
|
|
<div class="meta-item">
|
|
<span class="meta-label">Repository</span>
|
|
<span class="meta-value">buckit-io/buckit</span>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2 class="section-title">Install</h2>
|
|
<p class="section-copy">One-line installers that download the right artifact for your platform, verify its SHA-256 checksum, and print the command to finish. They do not install for you — the privileged step is yours to review and run.</p>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Platform</th><th>Command</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><strong>Linux</strong>rpm / deb / apk</td>
|
|
<td><code style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px">curl -fsSL https://buckit-io.github.io/buckit/install-linux.sh | sh</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>macOS</strong>Apple Silicon</td>
|
|
<td><code style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px">curl -fsSL https://buckit-io.github.io/buckit/install-mac.sh | sh</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>Windows</strong>x86_64</td>
|
|
<td><code style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px">irm https://buckit-io.github.io/buckit/install-windows.ps1 | iex</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2 class="section-title">Downloads</h2>
|
|
<p class="section-copy">Choose the binary for your OS and architecture. Each platform card includes the signed artifact, checksum, and minisign signature.</p>
|
|
<div class="cards">
|
|
<article class="card">
|
|
<h3>Linux x86_64</h3>
|
|
<p>Standard Linux build for x86_64 hosts.</p>
|
|
<div class="card-links">
|
|
<a class="download" href="${base}/buckit-linux-amd64.${tag}">Download binary</a>
|
|
<div class="aux-links">
|
|
<a href="${base}/buckit-linux-amd64.${tag}.sha256sum">Checksum</a>
|
|
<a href="${base}/buckit-linux-amd64.${tag}.minisig">Signature</a>
|
|
</div>
|
|
</div>
|
|
</article>
|
|
<article class="card">
|
|
<h3>Linux arm64</h3>
|
|
<p>Linux build for ARM64 systems and cloud hosts.</p>
|
|
<div class="card-links">
|
|
<a class="download" href="${base}/buckit-linux-arm64.${tag}">Download binary</a>
|
|
<div class="aux-links">
|
|
<a href="${base}/buckit-linux-arm64.${tag}.sha256sum">Checksum</a>
|
|
<a href="${base}/buckit-linux-arm64.${tag}.minisig">Signature</a>
|
|
</div>
|
|
</div>
|
|
</article>
|
|
<article class="card">
|
|
<h3>macOS arm64</h3>
|
|
<p>Native Apple Silicon build for modern Macs.</p>
|
|
<div class="card-links">
|
|
<a class="download" href="${base}/buckit-darwin-arm64.${tag}">Download binary</a>
|
|
<div class="aux-links">
|
|
<a href="${base}/buckit-darwin-arm64.${tag}.sha256sum">Checksum</a>
|
|
<a href="${base}/buckit-darwin-arm64.${tag}.minisig">Signature</a>
|
|
</div>
|
|
</div>
|
|
</article>
|
|
<article class="card">
|
|
<h3>Windows x86_64</h3>
|
|
<p>Windows build for 64-bit desktop and server environments.</p>
|
|
<div class="card-links">
|
|
<a class="download" href="${base}/buckit-windows-amd64.exe.${tag}">Download binary</a>
|
|
<div class="aux-links">
|
|
<a href="${base}/buckit-windows-amd64.exe.${tag}.sha256sum">Checksum</a>
|
|
<a href="${base}/buckit-windows-amd64.exe.${tag}.minisig">Signature</a>
|
|
</div>
|
|
</div>
|
|
</article>
|
|
</div>
|
|
<p class="footer-note">Need the raw artifact names for automation or mirrors? The manifest below keeps the exact filenames and verification links in one place.</p>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Platform</th><th>Binary</th><th>Checksum</th><th>Signature</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><strong>Linux x86_64</strong>Standard Linux</td>
|
|
<td><a href="${base}/buckit-linux-amd64.${tag}">buckit-linux-amd64.${tag}</a></td>
|
|
<td><a href="${base}/buckit-linux-amd64.${tag}.sha256sum">.sha256sum</a></td>
|
|
<td><a href="${base}/buckit-linux-amd64.${tag}.minisig">.minisig</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>Linux arm64</strong>ARM64 Linux</td>
|
|
<td><a href="${base}/buckit-linux-arm64.${tag}">buckit-linux-arm64.${tag}</a></td>
|
|
<td><a href="${base}/buckit-linux-arm64.${tag}.sha256sum">.sha256sum</a></td>
|
|
<td><a href="${base}/buckit-linux-arm64.${tag}.minisig">.minisig</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>macOS arm64</strong>Apple Silicon</td>
|
|
<td><a href="${base}/buckit-darwin-arm64.${tag}">buckit-darwin-arm64.${tag}</a></td>
|
|
<td><a href="${base}/buckit-darwin-arm64.${tag}.sha256sum">.sha256sum</a></td>
|
|
<td><a href="${base}/buckit-darwin-arm64.${tag}.minisig">.minisig</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>Windows x86_64</strong>64-bit Windows</td>
|
|
<td><a href="${base}/buckit-windows-amd64.exe.${tag}">buckit-windows-amd64.exe.${tag}</a></td>
|
|
<td><a href="${base}/buckit-windows-amd64.exe.${tag}.sha256sum">.sha256sum</a></td>
|
|
<td><a href="${base}/buckit-windows-amd64.exe.${tag}.minisig">.minisig</a></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2 class="section-title">Linux packages</h2>
|
|
<p class="section-copy">Native packages for Debian/Ubuntu, RPM, and Alpine distributions.</p>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Format</th><th>amd64</th><th>arm64</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><strong>Debian/Ubuntu</strong>.deb</td>
|
|
<td><a href="${base}/buckit_${PKG_VERSION}_amd64.deb">buckit_${PKG_VERSION}_amd64.deb</a></td>
|
|
<td><a href="${base}/buckit_${PKG_VERSION}_arm64.deb">buckit_${PKG_VERSION}_arm64.deb</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>RPM</strong>.rpm</td>
|
|
<td><a href="${base}/buckit-${PKG_VERSION}.x86_64.rpm">buckit-${PKG_VERSION}.x86_64.rpm</a></td>
|
|
<td><a href="${base}/buckit-${PKG_VERSION}.aarch64.rpm">buckit-${PKG_VERSION}.aarch64.rpm</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>Alpine</strong>.apk</td>
|
|
<td><a href="${base}/buckit_${PKG_VERSION}_x86_64.apk">buckit_${PKG_VERSION}_x86_64.apk</a></td>
|
|
<td><a href="${base}/buckit_${PKG_VERSION}_aarch64.apk">buckit_${PKG_VERSION}_aarch64.apk</a></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
HTML
|
|
|
|
- name: Generate archives index page
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
gh api repos/buckit-io/buckit/releases --paginate \
|
|
--jq '.[] | select(.prerelease == false) | {tag: .tag_name, date: .published_at[:10], url: .html_url}' \
|
|
> /tmp/releases.jsonl
|
|
|
|
python3 - /tmp/releases.jsonl pages/server/buckit/archives/index.html <<'PYEOF'
|
|
import json, html, sys
|
|
|
|
releases = [json.loads(line) for line in open(sys.argv[1]) if line.strip()]
|
|
|
|
rows = '\n'.join(
|
|
f'<tr>'
|
|
f'<td>{html.escape(r["date"])}</td>'
|
|
f'<td><a href="{html.escape(r["url"])}">{html.escape(r["tag"])}</a></td>'
|
|
f'<td><a href="{html.escape(r["url"])}">Assets →</a></td>'
|
|
f'</tr>'
|
|
for r in releases
|
|
)
|
|
|
|
page = f'''<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Buckit Releases</title>
|
|
<style>
|
|
:root {{ color-scheme: light; --bg: #f3f5f9; --surface: #ffffff; --surface-alt: #f8fafc; --border: #d8dee9; --text: #0f172a; --muted: #475569; --link: #0f766e; --shadow: 0 18px 40px rgba(15, 23, 42, 0.08); }}
|
|
* {{ box-sizing: border-box; }}
|
|
body {{ margin: 0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--bg); color: var(--text); }}
|
|
.page {{ max-width: 1080px; margin: 0 auto; padding: 40px 20px 64px; }}
|
|
.hero, .panel {{ background: var(--surface); border: 1px solid var(--border); border-radius: 14px; box-shadow: var(--shadow); }}
|
|
.hero {{ padding: 28px; margin-bottom: 24px; }}
|
|
.eyebrow {{ display: inline-block; padding: 6px 10px; border-radius: 999px; background: #dcfce7; color: #166534; font-size: 12px; font-weight: 700; text-transform: uppercase; }}
|
|
h1 {{ margin: 14px 0 10px; font-size: 34px; line-height: 1.1; }}
|
|
.subhead {{ margin: 0; max-width: 720px; color: var(--muted); line-height: 1.6; }}
|
|
.actions {{ margin-top: 18px; }}
|
|
.button {{ display: inline-flex; align-items: center; justify-content: center; min-height: 42px; padding: 0 16px; border-radius: 10px; border: 1px solid #99f6e4; background: #f0fdfa; color: var(--link); text-decoration: none; font-weight: 600; }}
|
|
.panel {{ padding: 24px; }}
|
|
.table-wrap {{ overflow-x: auto; border: 1px solid var(--border); border-radius: 12px; background: var(--surface-alt); }}
|
|
table {{ border-collapse: collapse; width: 100%; }}
|
|
th, td {{ text-align: left; padding: 14px 16px; border-bottom: 1px solid var(--border); }}
|
|
th {{ background: #eef2f7; font-weight: 600; font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; }}
|
|
tbody tr:last-child td {{ border-bottom: 0; }}
|
|
a {{ color: var(--link); text-decoration: none; }}
|
|
a:hover {{ text-decoration: underline; }}
|
|
@media (max-width: 720px) {{
|
|
.page {{ padding: 24px 16px 48px; }}
|
|
.hero, .panel {{ padding: 20px; }}
|
|
h1 {{ font-size: 28px; }}
|
|
}}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="page">
|
|
<section class="hero">
|
|
<span class="eyebrow">Release Archive</span>
|
|
<h1>Buckit Releases</h1>
|
|
<p class="subhead">Stable Buckit releases published to GitHub. Open any release to inspect artifacts, checksums, and signed binaries, or jump back to the current release landing page.</p>
|
|
<div class="actions">
|
|
<a class="button" href="../release/">Open latest release</a>
|
|
</div>
|
|
</section>
|
|
<section class="panel">
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Date</th><th>Release</th><th>Downloads</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
{rows}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</body>
|
|
</html>'''
|
|
|
|
with open(sys.argv[2], 'w') as f:
|
|
f.write(page)
|
|
PYEOF
|
|
|
|
- name: Deploy to gh-pages
|
|
uses: peaceiris/actions-gh-pages@v4
|
|
with:
|
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
publish_dir: ./pages
|
|
force_orphan: true
|