Author SHA1 Message Date
james.maesandCodex 9a221b376e ci: retire migrated legacy RC coordinator (#6)
All 33 active default-branch RC callers now use the pinned orb-owned worker. Remove the duplicate release implementation after passing caller migrations and verified Alerts RC.17 recovery.

Co-authored-by: Codex <noreply@openai.com>
2026-10-21 02:39:17 -05:00
james.maesandCodex 3f1dc3a48f ci: align canonical shared orb workers (#5)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 01:27:12 -05:00
james.maesandCodex 395f51b93a ci: centralize organization workflow lint (#4)
* ci: delegate organization workflow lint to shared orb worker

Co-Authored-By: Codex <noreply@openai.com>

* ci: retire duplicate organization Circle lint job

Co-Authored-By: Codex <noreply@openai.com>

---------

Co-authored-by: Codex <noreply@openai.com>
2026-10-20 20:26:36 -05:00
james.maes 8f7cf886f2 Merge pull request #3 from QRun-IO/fix/release-rc-artifact-id
fix(release-rc): read the project's own artifactId, not the parent's
2026-10-16 11:34:45 -05:00
james.maesandClaude Opus 5.5 56e76e4bf3 fix(release-rc): read the project's own artifactId, not the parent's
tag-and-release took the first qbit-* artifactId in the pom, which is the
<parent> qbit-build-parent, so it waited for qbit-build-parent X on Maven
Central and failed (qbit-crm 0.2.0-RC.6). Skip the <parent> block.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 11:27:21 -05:00
james.maes b28dbbe3f0 Merge pull request #2 from QRun-IO/feature/rc-tag-and-release
feat(release-rc): tag and release each RC after Maven Central confirms it
2026-10-16 08:02:26 -05:00
james.maesandClaude Opus 5.5 d494052a33 feat(release-rc): tag and release each RC after Central confirms it
A new tag-and-release job waits for the orb's bump commit and for the
version on Maven Central, checks that the Central artifact was published
after this merge, then creates the signed annotated tag (SSH key from the
QRUN_TAG_SIGNING_KEY secret) on the bump commit and a GitHub prerelease
listing the merged PRs. It never creates an unsigned tag and skips a tag
that already exists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 16:17:37 -05:00
james.maes a308e88c55 Merge pull request #1 from QRun-IO/feature/qbit-release-rc
feat: reusable qbit release-candidate workflow
2026-10-13 14:27:10 -05:00
3 changed files with 14 additions and 91 deletions

No files matched your search

-18
View File
@@ -1,18 +0,0 @@
# The org's CircleCI GitHub App builds every repository; without a config this repository
# reported "No configuration was found" as an error on every commit. Lint the workflows instead.
version: 2.1
jobs:
actionlint:
docker:
- image: cimg/go:1.24
steps:
- checkout
- run:
name: Lint GitHub Actions workflows
command: go run github.com/rhysd/actionlint/cmd/actionlint@v1.7.7 -color .github/workflows/*.yml
workflows:
lint:
jobs:
- actionlint
-73
View File
@@ -1,73 +0,0 @@
# Cut the next release candidate of a qbit (QRun-IO/qqq docs/QRUN-QBIT-REPO-STANDARD.md, C6).
#
# Called from each qbit's .github/workflows/release-rc.yml on a manual dispatch or when a
# develop PR labelled `release:rc` is merged. It merges develop into the release line through
# the GitHub API (GitHub signs the merge commit), and the push of release/* runs the existing
# CircleCI publish_release_candidate workflow (qqq-orb: RC bump, Maven Central, tag). Nothing
# here publishes, tags or touches hotfix/* branches.
#
# Release line: develop's <revision>X.Y.Z-SNAPSHOT</revision> picks release/X.Y.Z if that branch
# exists, else release/X.Y (created from develop when missing).
name: qbit release candidate
on:
workflow_call:
inputs:
dry_run:
description: Print the plan without merging or creating branches
type: boolean
default: false
permissions:
contents: write
jobs:
cut-rc:
runs-on: ubuntu-24.04
timeout-minutes: 10
concurrency:
group: qbit-release-rc-${{ github.repository }}
cancel-in-progress: false
steps:
- name: Merge develop into the release line
env:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
DRY_RUN: ${{ inputs.dry_run }}
run: |
set -euo pipefail
develop_sha=$(gh api "repos/$REPO/branches/develop" -q .commit.sha)
revision=$(gh api "repos/$REPO/contents/pom.xml?ref=$develop_sha" -q .content | base64 -d \
| sed -n 's:.*<revision>\(.*\)</revision>.*:\1:p' | head -n 1)
if [[ ! "$revision" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)-SNAPSHOT$ ]]; then
echo "::error::develop pom.xml <revision> must be X.Y.Z-SNAPSHOT, found '$revision'"
exit 1
fi
full="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
line="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}"
branch_exists() { gh api "repos/$REPO/branches/$1" --silent 2>/dev/null; }
if branch_exists "release/$full"; then branch="release/$full"
elif branch_exists "release/$line"; then branch="release/$line"
else branch=""; fi
if [[ -z "$branch" ]]; then
branch="release/$line"
echo "Plan: create $branch from develop $develop_sha (first RC of $full)"
[[ "$DRY_RUN" == true ]] && exit 0
gh api "repos/$REPO/git/refs" -f ref="refs/heads/$branch" -f sha="$develop_sha" --silent
else
echo "Plan: merge develop $develop_sha into $branch"
[[ "$DRY_RUN" == true ]] && exit 0
# 201 merged, 204 already up to date (nothing new to release), 409 conflict.
response=$(gh api --include "repos/$REPO/merges" -f base="$branch" -f head="$develop_sha" \
-f commit_message="Merge develop into $branch for the next $full RC" 2>&1) || true
status=$(printf '%s\n' "$response" | sed -n 's:^HTTP/[0-9.]* \([0-9][0-9]*\).*:\1:p' | head -n 1)
case "$status" in
201) ;;
204) echo "::warning::$branch already contains develop; no new RC"; exit 0 ;;
409) echo "::error::Merge conflict between develop and $branch; resolve it in a PR into $branch"; exit 1 ;;
*) echo "::error::Merge of develop into $branch failed (HTTP ${status:-unknown})"; exit 1 ;;
esac
fi
echo "Pushed $branch; CircleCI publish_release_candidate cuts the RC." >> "$GITHUB_STEP_SUMMARY"
echo "Release line: $branch" >> "$GITHUB_STEP_SUMMARY"
+14
View File
@@ -0,0 +1,14 @@
name: Workflow lint
'on':
push:
branches:
- '**'
pull_request: null
workflow_dispatch: null
permissions:
contents: read
jobs:
actionlint:
uses: QRun-IO/qqq-orb/.github/workflows/workflow-lint.yml@0f33ddadf88b9a1b940b8883782fe2000ee1d2bd
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name
!= github.repository