Skip to content

chore(release): v0.104.0 #142

chore(release): v0.104.0

chore(release): v0.104.0 #142

Workflow file for this run

# STABLE binary release. On a `vX.Y.Z` tag (cut by the nightly-release orchestrator's stable job
# — nightly-release.yml — either from the midnight cron detecting a version bump or from a manual
# `workflow_dispatch`), this workflow builds the `dig-node` service binary + its `dign` alias for
# every OS/arch (via the reusable build workflow) and publishes them to a STABLE GitHub Release:
# `prerelease: false`, marked `latest`. Every per-OS/arch binary is published under the canonical
# `dig-node-*` name (+ the `dign-*` alias) — SPEC §11.2; the duplicate legacy `dig-companion-*`
# copy was dropped in #585. The changelog is already
# inside the tag (the orchestrator committed it before tagging), so the notes carry the changelog.
#
# This is intentionally tag-ONLY: merges to main no longer build or release here (dig_ecosystem
# #590 batches releases to the nightly cron + manual dispatch). Pre-merge coverage comes from
# ci.yml (fmt/clippy/test/coverage on every PR); daily main-HEAD build coverage comes from the
# nightly channel. A `workflow_dispatch` is kept as a manual "does main still build?" canary — it
# builds but does not publish (publish is gated on a tag ref).
name: Release (stable)
on:
push:
tags:
- "v*"
workflow_dispatch:
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
permissions:
contents: write
jobs:
# Resolve the version string the artifacts are stamped with: `X.Y.Z` from a `vX.Y.Z` tag, or a
# `g<shortsha>` build id for the manual canary (which never publishes).
meta:
name: Resolve version
runs-on: ubuntu-latest
outputs:
version: ${{ steps.v.outputs.version }}
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- id: v
shell: bash
run: |
if [ "$GITHUB_REF_TYPE" = "tag" ]; then
echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
else
echo "version=g$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT"
fi
# Build every OS/arch through the shared reusable workflow — the same build the nightly channel
# uses, so the two release paths can never diverge on how a binary is produced.
build:
name: Build
needs: meta
uses: ./.github/workflows/build-binaries.yml
with:
version: ${{ needs.meta.outputs.version }}
# Empty ref => build the tag/commit this run is on.
ref: ""
# Publish ONLY for a real tag — the manual-dispatch canary builds but stops here.
publish:
name: Publish GitHub Release
needs: build
if: github.ref_type == 'tag'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download all build artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Flatten
run: |
mkdir -p release
find artifacts -type f -exec cp {} release/ \;
ls -la release
- name: Create / update the STABLE release and attach binaries
uses: softprops/action-gh-release@v2
with:
# `prerelease: false` + `make_latest: true`: a stable release is the one that moves
# `latest`. Nightlies (nightly-release.yml) are always prerelease + never latest, so a
# nightly can never masquerade as this stable download.
prerelease: false
make_latest: "true"
files: release/*
generate_release_notes: true
fail_on_unmatched_files: true