Skip to content

release

release #5

Workflow file for this run

name: release
on:
push:
tags: ["v*"]
workflow_dispatch:
permissions:
contents: write
env:
CARGO_TERM_COLOR: always
CARGO_INCREMENTAL: "0"
jobs:
build:
name: ${{ matrix.target }} (build ${{ matrix.attempt }})
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
attempt: [1, 2]
target:
- x86_64-unknown-linux-gnu
- aarch64-unknown-linux-gnu
- x86_64-pc-windows-gnu
- aarch64-pc-windows-gnullvm
- aarch64-apple-darwin
- x86_64-apple-darwin
include:
- target: x86_64-unknown-linux-gnu
runner: ubuntu-22.04
bin: abgen
- target: aarch64-unknown-linux-gnu
runner: ubuntu-22.04-arm
bin: abgen
- target: x86_64-pc-windows-gnu
runner: ubuntu-22.04
bin: abgen.exe
# rquickjs-sys has no pregenerated bindings for this triple: bindgen
# runs against the llvm-mingw sysroot (BINDGEN_EXTRA_CLANG_ARGS below)
- target: aarch64-pc-windows-gnullvm
runner: ubuntu-22.04
bin: abgen.exe
cargo_flags: --features rquickjs/bindgen
- target: aarch64-apple-darwin
runner: macos-14
bin: abgen
- target: x86_64-apple-darwin
runner: macos-15-intel
bin: abgen
exclude:
# mingw ld link-order non-determinism: no bit-identical gate, built once
- target: x86_64-pc-windows-gnu
attempt: 2
steps:
- name: setup (checkout + toolchains)
run: |
git init -q .
git remote add origin "https://github.com/$GITHUB_REPOSITORY"
git fetch -q --depth 1 origin "$GITHUB_SHA"
git checkout -q FETCH_HEAD
(
if ! command -v rustup >/dev/null 2>&1; then
curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs \
| sh -s -- -y --default-toolchain none --profile minimal --no-modify-path
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
export PATH="$HOME/.cargo/bin:$PATH"
fi
rustup toolchain install 1.97.0 --profile minimal --no-self-update
rustup default 1.97.0
rustup target add ${{ matrix.target }}
) > /tmp/rustup.log 2>&1 &
rustup_pid=$!
if [ "${{ matrix.target }}" = "x86_64-pc-windows-gnu" ]; then
sudo apt-get update
sudo apt-get install -y --no-install-recommends g++-mingw-w64-x86-64-posix cmake
cat > /tmp/mingw-toolchain.cmake <<'EOF'
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc-posix)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++-posix)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
EOF
{
echo "CMAKE_TOOLCHAIN_FILE=/tmp/mingw-toolchain.cmake"
echo "CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc-posix"
echo "CC_x86_64_pc_windows_gnu=x86_64-w64-mingw32-gcc-posix"
echo "CXX_x86_64_pc_windows_gnu=x86_64-w64-mingw32-g++-posix"
echo "AR_x86_64_pc_windows_gnu=x86_64-w64-mingw32-ar"
} >> "$GITHUB_ENV"
fi
if [ "${{ matrix.target }}" = "aarch64-pc-windows-gnullvm" ]; then
curl -fsSL -o llvm-mingw.tar.xz https://github.com/mstorsjo/llvm-mingw/releases/download/20260616/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64.tar.xz
echo "534b92e067b22a6b4441f48ae9240a3341b17825d04d577eab0cf85c44b4deda llvm-mingw.tar.xz" | sha256sum -c
sudo tar -xJf llvm-mingw.tar.xz -C /opt && rm llvm-mingw.tar.xz
cat > /tmp/aarch64-mingw-toolchain.cmake <<'EOF'
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-w64-mingw32-clang)
set(CMAKE_CXX_COMPILER aarch64-w64-mingw32-clang++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
EOF
# without the import libs, lld resolves libc++/libunwind statically
sudo rm /opt/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32/lib/libc++.dll.a \
/opt/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32/lib/libunwind.dll.a
echo "/opt/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64/bin" >> "$GITHUB_PATH"
{
echo "CMAKE_TOOLCHAIN_FILE=/tmp/aarch64-mingw-toolchain.cmake"
echo "CARGO_TARGET_AARCH64_PC_WINDOWS_GNULLVM_LINKER=aarch64-w64-mingw32-clang"
echo "CC_aarch64_pc_windows_gnullvm=aarch64-w64-mingw32-clang"
echo "CXX_aarch64_pc_windows_gnullvm=aarch64-w64-mingw32-clang++"
echo "AR_aarch64_pc_windows_gnullvm=aarch64-w64-mingw32-ar"
echo "BINDGEN_EXTRA_CLANG_ARGS=--target=aarch64-w64-mingw32 --sysroot=/opt/llvm-mingw-20260616-ucrt-ubuntu-22.04-x86_64/aarch64-w64-mingw32"
} >> "$GITHUB_ENV"
fi
wait "$rustup_pid" || { cat /tmp/rustup.log; exit 1; }
cat /tmp/rustup.log
rustflags="--remap-path-prefix $PWD=/build --remap-path-prefix $HOME=/home"
if [ "${{ matrix.target }}" = "x86_64-pc-windows-gnu" ]; then
rustflags="$rustflags -C link-arg=-Wl,--no-insert-timestamp"
fi
if [ "${{ matrix.target }}" = "aarch64-pc-windows-gnullvm" ]; then
rustflags="$rustflags -C target-feature=+crt-static -C link-arg=-Wl,--no-insert-timestamp"
fi
{
echo "SOURCE_DATE_EPOCH=$(git log -1 --format=%ct)"
echo "RUSTFLAGS=$rustflags"
echo "CFLAGS=-ffile-prefix-map=$PWD=/build"
echo "CXXFLAGS=-ffile-prefix-map=$PWD=/build"
} >> "$GITHUB_ENV"
- name: build
run: cargo build --release --locked --target ${{ matrix.target }} ${{ matrix.cargo_flags }} --bin abgen
- name: package, smoke test, publish
env:
GH_TOKEN: ${{ github.token }}
run: |
dist="abgen-${GITHUB_REF_NAME:-dev}-${{ matrix.target }}"
mkdir -p "$dist/shader"
cp "target/${{ matrix.target }}/release/${{ matrix.bin }}" "$dist/"
cp -R template "$dist/template"
cp crate/shader/scene_ignore_windows "$dist/shader/"
cp LICENSE README.md "$dist/"
if [ "${{ matrix.target }}" = "x86_64-pc-windows-gnu" ]; then
for dll in libstdc++-6.dll libgcc_s_seh-1.dll libwinpthread-1.dll; do
cp "$(x86_64-w64-mingw32-g++-posix -print-file-name=$dll)" "$dist/"
done
fi
TAR=tar; command -v gtar >/dev/null && TAR=gtar
"$TAR" --sort=name --owner=0 --group=0 --numeric-owner \
--mtime="@${SOURCE_DATE_EPOCH}" -czf "$dist.tar.gz" "$dist"
shasum -a 256 "$dist.tar.gz" > "$dist.tar.gz.sha256"
if [ "${{ matrix.attempt }}" = "1" ] && ! echo "${{ matrix.target }}" | grep -q windows; then
rm -rf /tmp/smoke && mkdir /tmp/smoke
tar -xzf "$dist.tar.gz" -C /tmp/smoke
(
cd "/tmp/smoke/$dist"
./abgen --version
HTTP_SERVER_PORT=5199 ./abgen &
server=$!
for _ in $(seq 1 40); do
curl -sf http://127.0.0.1:5199/readyz && ok=1 && break
sleep 0.5
done
kill "$server" || true
test "${ok:-0}" = 1
)
fi
case "$GITHUB_REF" in refs/tags/v*) ;; *) exit 0 ;; esac
gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 \
|| gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" \
--title "abgen $GITHUB_REF_NAME" --notes-file .github/release-notes.md \
|| gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null
if [ "${{ matrix.attempt }}" = "1" ]; then
gh release upload "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --clobber \
"$dist.tar.gz" "$dist.tar.gz.sha256"
else
cp "$dist.tar.gz.sha256" "$dist.tar.gz.sha256-2"
gh release upload "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --clobber \
"$dist.tar.gz.sha256-2"
fi
publish:
needs: build
runs-on: ubuntu-22.04
if: startsWith(github.ref, 'refs/tags/v')
permissions:
contents: write
id-token: write
steps:
- name: verify, checksums, npm
env:
GH_TOKEN: ${{ github.token }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
git init -q .
git remote add origin "https://github.com/$GITHUB_REPOSITORY"
git fetch -q --depth 1 origin "$GITHUB_SHA"
git checkout -q FETCH_HEAD
gh release download "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" \
--pattern 'abgen-*.tar.gz' --pattern 'abgen-*.tar.gz.sha256*' -D dist
cd dist
test "$(ls ./*.tar.gz | wc -l)" -eq 6
test "$(ls ./*.sha256-2 | wc -l)" -eq 5
for f2 in ./*.sha256-2; do
diff "$f2" "${f2%-2}" || { echo "reproducibility mismatch: $f2"; exit 1; }
done
sha256sum -c ./*.sha256
cat ./*.sha256 > SHA256SUMS.txt
cat SHA256SUMS.txt
gh release upload "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --clobber SHA256SUMS.txt
for f in ./*.sha256 ./*.sha256-2; do
gh release delete-asset "$GITHUB_REF_NAME" "$(basename "$f")" --repo "$GITHUB_REPOSITORY" --yes
done
cd ..
if [ -z "$NODE_AUTH_TOKEN" ]; then
echo "NPM_TOKEN secret not configured - skipping npm publish"
exit 0
fi
printf '//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}\n' > "$HOME/.npmrc"
bash npm/publish.sh "${GITHUB_REF_NAME#v}" dist