From 33f0aa5714670da4f2b7e208bfff5b2f1d37aeb6 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Fri, 20 Feb 2026 13:58:32 +0000 Subject: [PATCH] ci: run dev prerelease nightly Replace dev push builds with nightly schedule that only runs when dev head advances; still runs on manual dispatch. Plumb a ref input through reusable workflows so scheduled runs build the dev commit. --- .github/workflows/build-and-upload.yml | 23 +++++++++ .github/workflows/dev-release.yml | 61 +++++++++++++++++++----- .github/workflows/manual-npm-publish.yml | 6 +++ .github/workflows/release-ui.yml | 10 +++- .github/workflows/reusable-release.yml | 11 +++++ 5 files changed, 99 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-and-upload.yml b/.github/workflows/build-and-upload.yml index 47870b3b..8ddc9daa 100644 --- a/.github/workflows/build-and-upload.yml +++ b/.github/workflows/build-and-upload.yml @@ -3,6 +3,11 @@ name: Build and Upload Binaries on: workflow_call: inputs: + ref: + description: "Git ref (branch, tag, or SHA) to build from" + required: false + default: "" + type: string version: description: "Version to apply to workspace packages (release builds)" required: false @@ -45,6 +50,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 @@ -85,6 +92,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 @@ -124,6 +133,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 @@ -164,6 +175,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 @@ -237,6 +250,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 @@ -310,6 +325,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 @@ -388,6 +405,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 @@ -490,6 +509,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup QEMU uses: docker/setup-qemu-action@v3 @@ -587,6 +608,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 diff --git a/.github/workflows/dev-release.yml b/.github/workflows/dev-release.yml index 4fdc3c0f..22479267 100644 --- a/.github/workflows/dev-release.yml +++ b/.github/workflows/dev-release.yml @@ -1,12 +1,13 @@ name: Develop Pre-Release on: - push: - branches: - - dev + schedule: + # Nightly build of dev (only if dev has new commits) + - cron: "0 1 * * *" workflow_dispatch: permissions: + actions: read id-token: write contents: write @@ -15,25 +16,63 @@ concurrency: cancel-in-progress: true jobs: - prepare: + gate: runs-on: ubuntu-latest outputs: - version_suffix: ${{ steps.vars.outputs.version_suffix }} + run: ${{ steps.gate.outputs.run }} + dev_sha: ${{ steps.gate.outputs.dev_sha }} + version_suffix: ${{ steps.gate.outputs.version_suffix }} steps: - - name: Compute version suffix - id: vars + - name: Decide whether to run + id: gate shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -euo pipefail - SHA8="${GITHUB_SHA::8}" + + api() { + curl -sS \ + -H "Authorization: Bearer ${GH_TOKEN}" \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "$1" + } + + DEV_SHA=$(api "https://api.github.com/repos/${GITHUB_REPOSITORY}/git/ref/heads/dev" | jq -r '.object.sha') + if [ -z "$DEV_SHA" ] || [ "$DEV_SHA" = "null" ]; then + echo "Failed to resolve dev head SHA" >&2 + exit 1 + fi + DATE=$(date -u +%Y%m%d) - echo "version_suffix=-dev-${DATE}-${SHA8}" >> "$GITHUB_OUTPUT" + SHA8="${DEV_SHA::8}" + VERSION_SUFFIX="-dev-${DATE}-${SHA8}" + + SHOULD_RUN="false" + if [ "${GITHUB_EVENT_NAME}" = "workflow_dispatch" ]; then + SHOULD_RUN="true" + else + # Nightly: only run if dev has advanced since last successful dev-release build. + LAST_SHA=$(api "https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/workflows/dev-release.yml/runs?branch=dev&status=success&per_page=1" | jq -r '.workflow_runs[0].head_sha // empty') + if [ -z "${LAST_SHA}" ]; then + SHOULD_RUN="true" + elif [ "${LAST_SHA}" != "${DEV_SHA}" ]; then + SHOULD_RUN="true" + fi + fi + + echo "run=${SHOULD_RUN}" >> "$GITHUB_OUTPUT" + echo "dev_sha=${DEV_SHA}" >> "$GITHUB_OUTPUT" + echo "version_suffix=${VERSION_SUFFIX}" >> "$GITHUB_OUTPUT" prerelease: - needs: prepare + needs: gate + if: ${{ needs.gate.outputs.run == 'true' }} uses: ./.github/workflows/reusable-release.yml with: - version_suffix: ${{ needs.prepare.outputs.version_suffix }} + ref: ${{ needs.gate.outputs.dev_sha }} + version_suffix: ${{ needs.gate.outputs.version_suffix }} npm_package_name: "@neuralnomads/codenomad-dev" dist_tag: latest prerelease: true diff --git a/.github/workflows/manual-npm-publish.yml b/.github/workflows/manual-npm-publish.yml index 81d93fd1..51f5a328 100644 --- a/.github/workflows/manual-npm-publish.yml +++ b/.github/workflows/manual-npm-publish.yml @@ -19,6 +19,10 @@ on: type: string workflow_call: inputs: + ref: + required: false + default: "" + type: string version: required: true type: string @@ -46,6 +50,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 diff --git a/.github/workflows/release-ui.yml b/.github/workflows/release-ui.yml index 57195dca..2a021832 100644 --- a/.github/workflows/release-ui.yml +++ b/.github/workflows/release-ui.yml @@ -1,7 +1,13 @@ name: Release UI on: - workflow_call: {} + workflow_call: + inputs: + ref: + description: "Git ref (branch, tag, or SHA) to build from" + required: false + default: "" + type: string workflow_dispatch: {} permissions: @@ -18,6 +24,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml index c34959ba..e839e76b 100644 --- a/.github/workflows/reusable-release.yml +++ b/.github/workflows/reusable-release.yml @@ -3,6 +3,11 @@ name: Reusable Release on: workflow_call: inputs: + ref: + description: "Git ref (branch, tag, or SHA) to build from" + required: false + default: "" + type: string version_suffix: description: "Suffix appended to package.json version" required: false @@ -46,6 +51,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} - name: Setup Node uses: actions/setup-node@v4 @@ -84,6 +91,7 @@ jobs: needs: prepare-release uses: ./.github/workflows/build-and-upload.yml with: + ref: ${{ inputs.ref || github.ref }} version: ${{ needs.prepare-release.outputs.version }} tag: ${{ needs.prepare-release.outputs.tag }} release_name: ${{ needs.prepare-release.outputs.release_name }} @@ -95,6 +103,8 @@ jobs: permissions: contents: read uses: ./.github/workflows/release-ui.yml + with: + ref: ${{ inputs.ref || github.ref }} secrets: inherit publish-server: @@ -103,6 +113,7 @@ jobs: - build-and-upload uses: ./.github/workflows/manual-npm-publish.yml with: + ref: ${{ inputs.ref || github.ref }} version: ${{ needs.prepare-release.outputs.version }} dist_tag: ${{ inputs.dist_tag }} package_name: ${{ inputs.npm_package_name }}