backlog-md/.github/workflows/release.yml

313 lines
10 KiB
YAML

name: Release multi-platform executables
on:
push:
tags: ['v*.*.*']
permissions:
contents: write
id-token: write
jobs:
build:
name: build-${{ matrix.target }}
strategy:
matrix:
include:
- os: ubuntu-latest
target: bun-linux-x64-baseline
- os: ubuntu-latest
target: bun-linux-arm64
- os: macos-latest
target: bun-darwin-x64
- os: macos-latest
target: bun-darwin-arm64
- os: windows-latest
target: bun-windows-x64-baseline
runs-on: ${{ matrix.os }}
env:
BIN: backlog-bin${{ contains(matrix.target,'windows') && '.exe' || '' }}
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v1
with:
bun-version: 1.3.3
- uses: actions/cache@v4
id: cache
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-${{ matrix.target }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-${{ matrix.target }}-bun-
- run: bun install --frozen-lockfile
- name: Sync version to tag
shell: bash
run: |
TAG="${GITHUB_REF##refs/tags/v}"
jq ".version = \"$TAG\"" package.json > tmp.json && mv tmp.json package.json
- name: Prime Bun cache for baseline target (Windows workaround)
if: ${{ contains(matrix.target, 'baseline') && contains(matrix.target, 'windows') }}
shell: bash
run: |
# Workaround for https://github.com/oven-sh/bun/issues/13513
# Build a dummy project from C:\ to prime the baseline binary cache
cd /c
mkdir -p bun-cache-primer
cd bun-cache-primer
echo 'console.log("cache primer")' > index.js
bun build --compile --target=${{ matrix.target }} ./index.js --outfile primer.exe || true
cd $GITHUB_WORKSPACE
- name: Compile standalone binary
shell: bash
run: |
mkdir -p dist
bun build src/cli.ts --compile --minify --target=${{ matrix.target }} --define __EMBEDDED_VERSION__="\"${GITHUB_REF##refs/tags/v}\"" --outfile=dist/${{ env.BIN }}
- name: Make binary executable (non-Windows)
if: ${{ !contains(matrix.target,'windows') }}
run: chmod +x "dist/${{ env.BIN }}"
- name: Check build output and move binary
shell: bash
run: |
echo "Contents of dist/:"
ls -la dist/
echo "Moving dist/${{ env.BIN }} to ${{ env.BIN }}"
mv dist/${{ env.BIN }} ${{ env.BIN }}
echo "Final binary size:"
ls -lh ${{ env.BIN }}
- uses: actions/upload-artifact@v4
with:
name: backlog-${{ matrix.target }}
path: ${{ env.BIN }}
npm-publish:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Prepare npm package
shell: bash
run: |
mkdir -p dist
cp scripts/cli.cjs dist/cli.js
cp scripts/resolveBinary.cjs dist/resolveBinary.cjs
cp scripts/postuninstall.cjs dist/postuninstall.cjs
chmod +x dist/cli.js
- name: Create npm-ready package.json
shell: bash
run: |
TAG="${GITHUB_REF##refs/tags/v}"
jq 'del(.devDependencies,.scripts.prepare,.scripts.preinstall,.type) |
.version = "'$TAG'" |
.bin = {backlog:"cli.js"} |
.files = ["cli.js","resolveBinary.cjs","postuninstall.cjs","package.json","README.md","LICENSE"] |
.scripts = {"postuninstall": "node postuninstall.cjs"} |
.repository = {"type":"git","url":"https://github.com/MrLesk/Backlog.md"} |
.optionalDependencies = {
"backlog.md-linux-x64" : "'$TAG'",
"backlog.md-linux-arm64": "'$TAG'",
"backlog.md-darwin-x64" : "'$TAG'",
"backlog.md-darwin-arm64": "'$TAG'",
"backlog.md-windows-x64": "'$TAG'"
}' package.json > dist/package.json
cp LICENSE README.md dist/ 2>/dev/null || true
- uses: actions/setup-node@v5
with:
node-version: 20
- name: Configure npm for trusted publishing
shell: bash
run: |
set -euo pipefail
npm install -g npm@11.6.0
npm --version
- name: Dry run trusted publish
run: |
cd dist
npm publish --access public --dry-run
- name: Publish to npm
run: |
cd dist
npm publish --access public
publish-binaries:
needs: [build, npm-publish]
strategy:
matrix:
include:
- target: bun-linux-x64-baseline
package: backlog.md-linux-x64
os: linux
cpu: x64
- target: bun-linux-arm64
package: backlog.md-linux-arm64
os: linux
cpu: arm64
- target: bun-darwin-x64
package: backlog.md-darwin-x64
os: darwin
cpu: x64
- target: bun-darwin-arm64
package: backlog.md-darwin-arm64
os: darwin
cpu: arm64
- target: bun-windows-x64-baseline
package: backlog.md-windows-x64
os: win32
cpu: x64
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: backlog-${{ matrix.target }}
timeout-minutes: 15
- name: Prepare package
shell: bash
run: |
TAG="${GITHUB_REF##refs/tags/v}"
mkdir -p pkg
# Rename the binary to the expected name
if [[ -f backlog-bin.exe ]]; then
mv backlog-bin.exe pkg/backlog.exe
elif [[ -f backlog-bin ]]; then
mv backlog-bin pkg/backlog
else
echo "Error: No binary found"
ls -la
exit 1
fi
cp LICENSE README.md pkg/ 2>/dev/null || true
cat <<EOF > pkg/package.json
{
"name": "${{ matrix.package }}",
"version": "${TAG}",
"os": ["${{ matrix.os }}"],
"cpu": ["${{ matrix.cpu }}"],
"files": ["backlog${{ contains(matrix.target,'windows') && '.exe' || '' }}","package.json","LICENSE"],
"repository": {
"type": "git",
"url": "https://github.com/MrLesk/Backlog.md"
}
}
EOF
- name: Ensure executable permission (non-Windows)
if: ${{ !contains(matrix.target,'windows') }}
shell: bash
run: |
chmod +x pkg/backlog
- uses: actions/setup-node@v5
with:
node-version: 20
- name: Configure npm for trusted publishing
shell: bash
run: |
set -euo pipefail
npm install -g npm@11.6.0
npm --version
- name: Dry run platform publish
run: |
cd pkg
npm publish --access public --dry-run
- name: Publish platform package
run: |
cd pkg
npm publish --access public
install-sanity:
name: install-sanity-${{ matrix.os }}
needs: [publish-binaries, npm-publish]
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-node@v5
with:
node-version: 20
registry-url: https://registry.npmjs.org
- name: Install and run backlog -v (Unix)
if: ${{ matrix.os != 'windows-latest' }}
shell: bash
run: |
set -euxo pipefail
VERSION="${GITHUB_REF##refs/tags/v}"
mkdir sanity && cd sanity
npm init -y >/dev/null 2>&1
npm i "backlog.md@${VERSION}"
npx backlog -v
- name: Install and run backlog -v (Windows)
if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$Version = $env:GITHUB_REF_NAME.TrimStart('v')
mkdir sanity | Out-Null
Set-Location sanity
npm init -y | Out-Null
npm i "backlog.md@$Version"
npx backlog -v
github-release:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
path: release-assets
timeout-minutes: 15
- name: Rename binaries for release
run: |
echo "=== Debug: Downloaded artifacts ==="
find release-assets -type f -exec ls -lh {} \;
echo "=== Processing artifacts ==="
mkdir -p binaries
for dir in release-assets/*/; do
if [ -d "$dir" ]; then
target=$(basename "$dir" | sed 's/backlog-//')
echo "Processing target: $target"
echo "Directory contents:"
ls -la "$dir"
binary=$(find "$dir" -name "backlog-bin*" -type f)
if [ -n "$binary" ]; then
echo "Found binary: $binary ($(ls -lh "$binary" | awk '{print $5}'))"
if [[ "$target" == *"windows"* ]] && [[ "$binary" == *".exe" ]]; then
cp "$binary" "binaries/backlog-${target}.exe"
echo "Copied to binaries/backlog-${target}.exe ($(ls -lh "binaries/backlog-${target}.exe" | awk '{print $5}'))"
else
cp "$binary" "binaries/backlog-${target}"
echo "Copied to binaries/backlog-${target} ($(ls -lh "binaries/backlog-${target}" | awk '{print $5}'))"
fi
fi
fi
done
echo "=== Final binaries ==="
ls -lh binaries/
- uses: softprops/action-gh-release@v1
with:
files: binaries/*
update-readme:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v1
with:
bun-version: 1.3.3
- run: bun install --frozen-lockfile
- name: Sync version to tag
shell: bash
run: |
TAG="${GITHUB_REF##refs/tags/v}"
jq ".version = \"$TAG\"" package.json > tmp.json && mv tmp.json package.json
- name: Export board to README with version
shell: bash
run: |
TAG="${GITHUB_REF##refs/tags/v}"
bun run cli board export --readme --export-version "v$TAG"
- name: Commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "docs: update README with latest board status and version [skip ci]"
branch: main
file_pattern: README.md package.json