From c84fd09e18f7b8007404b5bd42cba252943ea97f Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sun, 5 Jul 2026 14:34:01 -0500 Subject: [PATCH] feat(workflows): move dev-cascade into dedicated cascade-dev.yml Moves the "recreate dev from main" function out of auto-release.yml Step 11 into its own workflow, and makes it actually work on protected branches. - cascade-dev.yml: on release-workflow completion (+ manual dispatch), force-push main -> dev. The bot is force-push allowlisted on dev via branch-protection.yml, so this works where delete+recreate could not (Gitea refuses to delete a protected branch). Force-push (not merge) => no version-file conflicts; running after the release => dev gets the fully version-bumped + changelog-promoted main. Skips Template-* repos; concurrency-guarded. - auto-release.yml Step 11: drop the dev delete/recreate; keep rc cleanup. Refs Template-Generic#53; enabled by the bot allowlist (#334/#54/#49). Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i --- .mokogitea/workflows/auto-release.yml | 16 ++----- .mokogitea/workflows/cascade-dev.yml | 69 ++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/.mokogitea/workflows/auto-release.yml b/.mokogitea/workflows/auto-release.yml index 8337c71..32852a2 100644 --- a/.mokogitea/workflows/auto-release.yml +++ b/.mokogitea/workflows/auto-release.yml @@ -398,7 +398,7 @@ jobs: && echo "main branch pushed to GitHub mirror" \ || echo "WARNING: GitHub mirror push failed" - - name: "Step 11: Delete rc branch and recreate dev from main" + - name: "Step 11: Delete rc branch (dev reset moved to cascade-dev.yml)" if: steps.version.outputs.skip != 'true' continue-on-error: true run: | @@ -410,17 +410,9 @@ jobs: "${API_BASE}/branches/rc" 2>/dev/null \ && echo "Deleted rc branch" || echo "rc branch not found" - # Delete dev branch - curl -sf -X DELETE -H "Authorization: token ${TOKEN}" \ - "${API_BASE}/branches/dev" 2>/dev/null && echo "Deleted dev branch" - - # Recreate dev from main (now includes version bump + changelog promotion) - curl -sf -X POST -H "Authorization: token ${TOKEN}" \ - -H "Content-Type: application/json" \ - "${API_BASE}/branches" \ - -d '{"new_branch_name":"dev","old_branch_name":"main"}' 2>/dev/null && echo "Recreated dev from main" - - echo "Pre-release branches cleaned, dev reset from main" >> $GITHUB_STEP_SUMMARY + # dev is reset from main by the dedicated "Cascade Main -> Dev" workflow + # (cascade-dev.yml), which runs after this release completes. + echo "rc cleaned; dev reset handled by cascade-dev.yml" >> $GITHUB_STEP_SUMMARY - name: "Step 12: Create version branch from main" if: steps.version.outputs.skip != 'true' diff --git a/.mokogitea/workflows/cascade-dev.yml b/.mokogitea/workflows/cascade-dev.yml index 5f7c1d7..affdf14 100644 --- a/.mokogitea/workflows/cascade-dev.yml +++ b/.mokogitea/workflows/cascade-dev.yml @@ -1,10 +1,65 @@ -# DISABLED — auto-release Step 11 recreates dev from main after every release. -# Cascade-dev is redundant and causes version conflicts when both main and dev -# have different version numbers in templateDetails.xml / manifest.xml. -name: "Cascade Main → Dev (DISABLED)" -on: workflow_dispatch +# Copyright (C) 2026 Moko Consulting +# SPDX-License-Identifier: GPL-3.0-or-later +# FILE INFORMATION +# DEFGROUP: Gitea.Workflow +# INGROUP: moko-platform.Release +# BRIEF: Reset dev to main after each release (cascade). Moved out of auto-release Step 11. +# +# +========================================================================+ +# | CASCADE MAIN -> DEV | +# +========================================================================+ +# | dev mirrors main and is reset on every release. | +# | delete+recreate cannot run against a protected branch, so this | +# | force-pushes main -> dev. The automation identity is force-push | +# | allowlisted on dev via branch-protection.yml. | +# | Runs AFTER the release workflow completes, so dev picks up the | +# | fully version-bumped + changelog-promoted main (not the pre-bump | +# | state). Force-push (not merge) => no version-file conflicts. | +# +========================================================================+ + +name: "Cascade Main -> Dev" + +on: + workflow_run: + workflows: ["Universal: Build & Release"] + types: [completed] + workflow_dispatch: + +concurrency: + group: cascade-dev-${{ github.repository }} + cancel-in-progress: true + +permissions: + contents: write + jobs: - noop: + cascade: + name: Reset dev to main + if: >- + !startsWith(github.event.repository.name, 'Template-') && + (github.event_name == 'workflow_dispatch' || + github.event.workflow_run.conclusion == 'success') runs-on: ubuntu-latest steps: - - run: echo "Cascade disabled — auto-release handles dev recreation" + - name: Force dev to main + env: + TOKEN: ${{ secrets.MOKOGITEA_TOKEN }} + SERVER: ${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }} + REPO: ${{ github.repository }} + run: | + set -euo pipefail + git init -q sync && cd sync + git config user.email "gitea-actions[bot]@mokoconsulting.tech" + git config user.name "gitea-actions[bot]" + git remote add origin "https://x-access-token:${TOKEN}@${SERVER#https://}/${REPO}.git" + git fetch -q --depth=1 origin main + + if git ls-remote --exit-code --heads origin dev >/dev/null 2>&1; then + # dev exists -> force it to match main (dev is a mirror of main) + git push --force origin FETCH_HEAD:refs/heads/dev + echo "dev reset to main" >> "$GITHUB_STEP_SUMMARY" + else + # dev missing (e.g. renamed to rc mid-cycle) -> recreate from main + git push origin FETCH_HEAD:refs/heads/dev + echo "dev created from main" >> "$GITHUB_STEP_SUMMARY" + fi -- 2.52.0