|
|
|
@@ -1,270 +1,270 @@
|
|
|
|
|
# Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
|
|
|
#
|
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
#
|
|
|
|
|
# FILE INFORMATION
|
|
|
|
|
# DEFGROUP: Gitea.Workflow
|
|
|
|
|
# INGROUP: moko-platform.Release
|
|
|
|
|
# REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform
|
|
|
|
|
# PATH: /templates/workflows/universal/auto-release.yml.template
|
|
|
|
|
# VERSION: 05.00.00
|
|
|
|
|
# BRIEF: Universal build & release � detects platform from manifest.xml
|
|
|
|
|
#
|
|
|
|
|
# +========================================================================+
|
|
|
|
|
# | UNIVERSAL BUILD & RELEASE PIPELINE |
|
|
|
|
|
# +========================================================================+
|
|
|
|
|
# | |
|
|
|
|
|
# | Reads manifest.xml (joomla|dolibarr|generic) to branch logic. |
|
|
|
|
|
# | |
|
|
|
|
|
# | Platform-specific: |
|
|
|
|
|
# | joomla: XML manifest, updates.xml, type-prefixed packages |
|
|
|
|
|
# | dolibarr: mod*.class.php, update.txt, dev version reset |
|
|
|
|
|
# | generic: README-only, no update stream |
|
|
|
|
|
# | |
|
|
|
|
|
# +========================================================================+
|
|
|
|
|
|
|
|
|
|
name: "Universal: Build & Release"
|
|
|
|
|
|
|
|
|
|
on:
|
|
|
|
|
pull_request:
|
|
|
|
|
types: [opened, closed]
|
|
|
|
|
branches:
|
|
|
|
|
- main
|
|
|
|
|
workflow_dispatch:
|
|
|
|
|
inputs:
|
|
|
|
|
action:
|
|
|
|
|
description: 'Action to perform'
|
|
|
|
|
required: false
|
|
|
|
|
type: choice
|
|
|
|
|
default: release
|
|
|
|
|
options:
|
|
|
|
|
- release
|
|
|
|
|
- promote-rc
|
|
|
|
|
|
|
|
|
|
env:
|
|
|
|
|
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
|
|
|
GITEA_URL: ${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}
|
|
|
|
|
GITEA_ORG: ${{ vars.GITEA_ORG || github.repository_owner }}
|
|
|
|
|
GITEA_REPO: ${{ vars.GITEA_REPO || github.event.repository.name }}
|
|
|
|
|
|
|
|
|
|
permissions:
|
|
|
|
|
contents: write
|
|
|
|
|
|
|
|
|
|
jobs:
|
|
|
|
|
# ── PR Opened → Rename branch to RC and build RC release ─────────────────────
|
|
|
|
|
promote-rc:
|
|
|
|
|
name: Promote to RC
|
|
|
|
|
runs-on: release
|
|
|
|
|
if: >-
|
|
|
|
|
(github.event.action == 'opened' && github.event.pull_request.merged != true) ||
|
|
|
|
|
(github.event_name == 'workflow_dispatch' && inputs.action == 'promote-rc')
|
|
|
|
|
|
|
|
|
|
steps:
|
|
|
|
|
- name: Checkout repository
|
|
|
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
|
|
|
with:
|
|
|
|
|
token: ${{ secrets.MOKOGITEA_TOKEN }}
|
|
|
|
|
fetch-depth: 1
|
|
|
|
|
|
|
|
|
|
- name: Setup moko-platform tools
|
|
|
|
|
env:
|
|
|
|
|
MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
|
|
|
|
|
MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting
|
|
|
|
|
run: |
|
|
|
|
|
if ! command -v composer &> /dev/null; then
|
|
|
|
|
sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer >/dev/null 2>&1
|
|
|
|
|
fi
|
|
|
|
|
# Always fetch latest CLI tools — never use stale cache from previous runs
|
|
|
|
|
rm -rf /tmp/moko-platform-api
|
|
|
|
|
git clone --depth 1 --branch main --quiet \
|
|
|
|
|
"https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git" \
|
|
|
|
|
/tmp/moko-platform-api
|
|
|
|
|
cd /tmp/moko-platform-api
|
|
|
|
|
composer install --no-dev --no-interaction --quiet
|
|
|
|
|
|
|
|
|
|
- name: Rename branch to rc
|
|
|
|
|
run: |
|
|
|
|
|
php /tmp/moko-platform-api/cli/branch_rename.php \
|
|
|
|
|
--from "${{ github.event.pull_request.head.ref || 'dev' }}" --to rc \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}" \
|
|
|
|
|
--api-base "${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" \
|
|
|
|
|
--pr "${{ github.event.pull_request.number }}"
|
|
|
|
|
|
|
|
|
|
- name: Checkout rc and configure git
|
|
|
|
|
run: |
|
|
|
|
|
git fetch origin rc
|
|
|
|
|
git checkout rc
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
|
|
|
|
|
|
|
|
|
|
- name: Publish RC release
|
|
|
|
|
run: |
|
|
|
|
|
php /tmp/moko-platform-api/cli/release_publish.php \
|
|
|
|
|
--path . --stability rc --bump minor --branch rc \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}"
|
|
|
|
|
|
|
|
|
|
- name: Summary
|
|
|
|
|
if: always()
|
|
|
|
|
run: |
|
|
|
|
|
echo "## Promoted to Release Candidate" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "Branch renamed to rc, minor bump, RC + lesser stream releases built, updates.xml synced" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
|
|
|
|
|
# ── Merged PR → Build & Release (or promote RC to stable) ────────────────────
|
|
|
|
|
release:
|
|
|
|
|
name: Build & Release Pipeline
|
|
|
|
|
runs-on: release
|
|
|
|
|
if: >-
|
|
|
|
|
github.event.pull_request.merged == true ||
|
|
|
|
|
(github.event_name == 'workflow_dispatch' && inputs.action != 'promote-rc')
|
|
|
|
|
|
|
|
|
|
steps:
|
|
|
|
|
- name: Checkout repository
|
|
|
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
|
|
|
with:
|
|
|
|
|
token: ${{ secrets.MOKOGITEA_TOKEN }}
|
|
|
|
|
fetch-depth: 0
|
|
|
|
|
|
|
|
|
|
- name: Configure git for bot pushes
|
|
|
|
|
run: |
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
|
|
|
|
|
|
|
|
|
|
- name: Setup moko-platform tools
|
|
|
|
|
env:
|
|
|
|
|
MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
|
|
|
|
|
MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting
|
|
|
|
|
COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_MIRROR_TOKEN }}"}}'
|
|
|
|
|
run: |
|
|
|
|
|
# Ensure PHP + Composer are available
|
|
|
|
|
if ! command -v composer &> /dev/null; then
|
|
|
|
|
sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer >/dev/null 2>&1
|
|
|
|
|
fi
|
|
|
|
|
# Always fetch latest CLI tools — never use stale cache from previous runs
|
|
|
|
|
rm -rf /tmp/moko-platform-api
|
|
|
|
|
git clone --depth 1 --branch main --quiet \
|
|
|
|
|
"https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git" \
|
|
|
|
|
/tmp/moko-platform-api
|
|
|
|
|
cd /tmp/moko-platform-api
|
|
|
|
|
composer install --no-dev --no-interaction --quiet
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- name: "Publish stable release"
|
|
|
|
|
run: |
|
|
|
|
|
php /tmp/moko-platform-api/cli/release_publish.php \
|
|
|
|
|
--path . --stability stable --bump minor --branch main \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}"
|
|
|
|
|
|
|
|
|
|
# -- STEP 9: Mirror to GitHub (stable only) --------------------------------
|
|
|
|
|
- name: "Step 9: Mirror release to GitHub"
|
|
|
|
|
if: >-
|
|
|
|
|
steps.version.outputs.skip != 'true' &&
|
|
|
|
|
secrets.GH_MIRROR_TOKEN != ''
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
|
|
|
|
|
RELEASE_TAG="${{ steps.version.outputs.release_tag }}"
|
|
|
|
|
GH_REPO="${{ vars.GH_MIRROR_REPO || github.repository }}"
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
php /tmp/moko-platform-api/cli/release_mirror.php \
|
|
|
|
|
--version "$VERSION" --tag "$RELEASE_TAG" \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "$API_BASE" \
|
|
|
|
|
--gh-token "${{ secrets.GH_MIRROR_TOKEN }}" --gh-repo "$GH_REPO" \
|
|
|
|
|
--branch main 2>&1 || true
|
|
|
|
|
echo "GitHub mirror updated" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
|
|
|
|
|
# -- STEP 10: Sync main branch to GitHub mirror ----------------------------
|
|
|
|
|
- name: "Step 10: Push main to GitHub mirror"
|
|
|
|
|
if: >-
|
|
|
|
|
steps.version.outputs.skip != 'true' &&
|
|
|
|
|
secrets.GH_MIRROR_TOKEN != ''
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
GH_REPO="${{ vars.GH_MIRROR_REPO || github.repository }}"
|
|
|
|
|
GH_ORG=$(echo "$GH_REPO" | cut -d/ -f1)
|
|
|
|
|
GH_NAME=$(echo "$GH_REPO" | cut -d/ -f2)
|
|
|
|
|
git remote add github "https://x-access-token:${{ secrets.GH_MIRROR_TOKEN }}@github.com/${GH_ORG}/${GH_NAME}.git" 2>/dev/null || \
|
|
|
|
|
git remote set-url github "https://x-access-token:${{ secrets.GH_MIRROR_TOKEN }}@github.com/${GH_ORG}/${GH_NAME}.git"
|
|
|
|
|
git fetch origin main --depth=1
|
|
|
|
|
git push github origin/main:refs/heads/main --force 2>/dev/null \
|
|
|
|
|
&& echo "main branch pushed to GitHub mirror" \
|
|
|
|
|
|| echo "WARNING: GitHub mirror push failed"
|
|
|
|
|
|
|
|
|
|
- name: "Step 11: Delete rc branch and recreate dev from main"
|
|
|
|
|
if: steps.version.outputs.skip != 'true'
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
TOKEN="${{ secrets.MOKOGITEA_TOKEN }}"
|
|
|
|
|
|
|
|
|
|
# Delete rc branch (ephemeral — created by promote-rc)
|
|
|
|
|
curl -sf -X DELETE -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${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
|
|
|
|
|
|
|
|
|
|
- name: "Step 12: Create version branch from main"
|
|
|
|
|
if: steps.version.outputs.skip != 'true'
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
TOKEN="${{ secrets.MOKOGITEA_TOKEN }}"
|
|
|
|
|
VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
|
|
|
|
|
BRANCH_NAME="version/${VERSION}"
|
|
|
|
|
MAIN_SHA=$(git rev-parse HEAD)
|
|
|
|
|
|
|
|
|
|
# Delete old version branch if it exists (same version re-release)
|
|
|
|
|
curl -sf -X DELETE -H "Authorization: token ${TOKEN}" "${API_BASE}/branches/${BRANCH_NAME}" 2>/dev/null && echo "Deleted old ${BRANCH_NAME}"
|
|
|
|
|
|
|
|
|
|
# Create version/XX.YY.ZZ from main
|
|
|
|
|
curl -sf -X POST -H "Authorization: token ${TOKEN}" -H "Content-Type: application/json" "${API_BASE}/branches" -d "{\"new_branch_name\":\"${BRANCH_NAME}\",\"old_branch_name\":\"main\"}" 2>/dev/null && echo "Created ${BRANCH_NAME} from main (${MAIN_SHA})" || echo "WARNING: ${BRANCH_NAME} creation failed"
|
|
|
|
|
|
|
|
|
|
echo "Version branch created: ${BRANCH_NAME} (${MAIN_SHA})" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# -- Dolibarr post-release: Reset dev version -----------------------------
|
|
|
|
|
- name: "Post-release: Reset dev version"
|
|
|
|
|
if: steps.version.outputs.skip != 'true'
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
php /tmp/moko-platform-api/cli/version_reset_dev.php \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "${API_BASE}" \
|
|
|
|
|
--branch dev --path . 2>&1 || true
|
|
|
|
|
|
|
|
|
|
# -- Summary --------------------------------------------------------------
|
|
|
|
|
- name: Pipeline Summary
|
|
|
|
|
if: always()
|
|
|
|
|
run: |
|
|
|
|
|
VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
|
|
|
|
|
PLATFORM="${{ steps.platform.outputs.platform }}"
|
|
|
|
|
if [ "${{ steps.version.outputs.skip }}" = "true" ]; then
|
|
|
|
|
echo "## Release Skipped" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "No VERSION in README.md" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
elif [ "${{ steps.check.outputs.already_released }}" = "true" ]; then
|
|
|
|
|
echo "## Already Released — ${VERSION}" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
else
|
|
|
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "## Build & Release Complete (${PLATFORM})" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Step | Result |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "|------|--------|" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Platform | \`${PLATFORM}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Version | \`${VERSION}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Branch | \`${{ steps.version.outputs.branch }}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Tag | \`${{ steps.version.outputs.tag }}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Release | [View](${GITEA_URL}/${GITEA_ORG}/${GITEA_REPO}/releases/tag/${{ steps.version.outputs.tag }}) |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
fi
|
|
|
|
|
# Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
|
|
|
#
|
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
#
|
|
|
|
|
# FILE INFORMATION
|
|
|
|
|
# DEFGROUP: Gitea.Workflow
|
|
|
|
|
# INGROUP: moko-platform.Release
|
|
|
|
|
# REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform
|
|
|
|
|
# PATH: /templates/workflows/universal/auto-release.yml.template
|
|
|
|
|
# VERSION: 05.00.00
|
|
|
|
|
# BRIEF: Universal build & release � detects platform from manifest.xml
|
|
|
|
|
#
|
|
|
|
|
# +========================================================================+
|
|
|
|
|
# | UNIVERSAL BUILD & RELEASE PIPELINE |
|
|
|
|
|
# +========================================================================+
|
|
|
|
|
# | |
|
|
|
|
|
# | Reads manifest.xml (joomla|dolibarr|generic) to branch logic. |
|
|
|
|
|
# | |
|
|
|
|
|
# | Platform-specific: |
|
|
|
|
|
# | joomla: XML manifest, updates.xml, type-prefixed packages |
|
|
|
|
|
# | dolibarr: mod*.class.php, update.txt, dev version reset |
|
|
|
|
|
# | generic: README-only, no update stream |
|
|
|
|
|
# | |
|
|
|
|
|
# +========================================================================+
|
|
|
|
|
|
|
|
|
|
name: "Universal: Build & Release"
|
|
|
|
|
|
|
|
|
|
on:
|
|
|
|
|
pull_request:
|
|
|
|
|
types: [opened, closed]
|
|
|
|
|
branches:
|
|
|
|
|
- main
|
|
|
|
|
workflow_dispatch:
|
|
|
|
|
inputs:
|
|
|
|
|
action:
|
|
|
|
|
description: 'Action to perform'
|
|
|
|
|
required: false
|
|
|
|
|
type: choice
|
|
|
|
|
default: release
|
|
|
|
|
options:
|
|
|
|
|
- release
|
|
|
|
|
- promote-rc
|
|
|
|
|
|
|
|
|
|
env:
|
|
|
|
|
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
|
|
|
GITEA_URL: ${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}
|
|
|
|
|
GITEA_ORG: ${{ vars.GITEA_ORG || github.repository_owner }}
|
|
|
|
|
GITEA_REPO: ${{ vars.GITEA_REPO || github.event.repository.name }}
|
|
|
|
|
|
|
|
|
|
permissions:
|
|
|
|
|
contents: write
|
|
|
|
|
|
|
|
|
|
jobs:
|
|
|
|
|
# ── PR Opened → Rename branch to RC and build RC release ─────────────────────
|
|
|
|
|
promote-rc:
|
|
|
|
|
name: Promote to RC
|
|
|
|
|
runs-on: release
|
|
|
|
|
if: >-
|
|
|
|
|
(github.event.action == 'opened' && github.event.pull_request.merged != true) ||
|
|
|
|
|
(github.event_name == 'workflow_dispatch' && inputs.action == 'promote-rc')
|
|
|
|
|
|
|
|
|
|
steps:
|
|
|
|
|
- name: Checkout repository
|
|
|
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
|
|
|
with:
|
|
|
|
|
token: ${{ secrets.MOKOGITEA_TOKEN }}
|
|
|
|
|
fetch-depth: 1
|
|
|
|
|
|
|
|
|
|
- name: Setup moko-platform tools
|
|
|
|
|
env:
|
|
|
|
|
MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
|
|
|
|
|
MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting
|
|
|
|
|
run: |
|
|
|
|
|
if ! command -v composer &> /dev/null; then
|
|
|
|
|
sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer >/dev/null 2>&1
|
|
|
|
|
fi
|
|
|
|
|
# Always fetch latest CLI tools — never use stale cache from previous runs
|
|
|
|
|
rm -rf /tmp/moko-platform-api
|
|
|
|
|
git clone --depth 1 --branch main --quiet \
|
|
|
|
|
"https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git" \
|
|
|
|
|
/tmp/moko-platform-api
|
|
|
|
|
cd /tmp/moko-platform-api
|
|
|
|
|
composer install --no-dev --no-interaction --quiet
|
|
|
|
|
|
|
|
|
|
- name: Rename branch to rc
|
|
|
|
|
run: |
|
|
|
|
|
php /tmp/moko-platform-api/cli/branch_rename.php \
|
|
|
|
|
--from "${{ github.event.pull_request.head.ref || 'dev' }}" --to rc \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}" \
|
|
|
|
|
--api-base "${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}" \
|
|
|
|
|
--pr "${{ github.event.pull_request.number }}"
|
|
|
|
|
|
|
|
|
|
- name: Checkout rc and configure git
|
|
|
|
|
run: |
|
|
|
|
|
git fetch origin rc
|
|
|
|
|
git checkout rc
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
|
|
|
|
|
|
|
|
|
|
- name: Publish RC release
|
|
|
|
|
run: |
|
|
|
|
|
php /tmp/moko-platform-api/cli/release_publish.php \
|
|
|
|
|
--path . --stability rc --bump minor --branch rc \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}"
|
|
|
|
|
|
|
|
|
|
- name: Summary
|
|
|
|
|
if: always()
|
|
|
|
|
run: |
|
|
|
|
|
echo "## Promoted to Release Candidate" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "Branch renamed to rc, minor bump, RC + lesser stream releases built, updates.xml synced" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
|
|
|
|
|
# ── Merged PR → Build & Release (or promote RC to stable) ────────────────────
|
|
|
|
|
release:
|
|
|
|
|
name: Build & Release Pipeline
|
|
|
|
|
runs-on: release
|
|
|
|
|
if: >-
|
|
|
|
|
github.event.pull_request.merged == true ||
|
|
|
|
|
(github.event_name == 'workflow_dispatch' && inputs.action != 'promote-rc')
|
|
|
|
|
|
|
|
|
|
steps:
|
|
|
|
|
- name: Checkout repository
|
|
|
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
|
|
|
with:
|
|
|
|
|
token: ${{ secrets.MOKOGITEA_TOKEN }}
|
|
|
|
|
fetch-depth: 0
|
|
|
|
|
|
|
|
|
|
- name: Configure git for bot pushes
|
|
|
|
|
run: |
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
|
|
|
|
|
|
|
|
|
|
- name: Setup moko-platform tools
|
|
|
|
|
env:
|
|
|
|
|
MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
|
|
|
|
|
MOKO_CLONE_HOST: git.mokoconsulting.tech/MokoConsulting
|
|
|
|
|
COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_MIRROR_TOKEN }}"}}'
|
|
|
|
|
run: |
|
|
|
|
|
# Ensure PHP + Composer are available
|
|
|
|
|
if ! command -v composer &> /dev/null; then
|
|
|
|
|
sudo apt-get update -qq && sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl composer >/dev/null 2>&1
|
|
|
|
|
fi
|
|
|
|
|
# Always fetch latest CLI tools — never use stale cache from previous runs
|
|
|
|
|
rm -rf /tmp/moko-platform-api
|
|
|
|
|
git clone --depth 1 --branch main --quiet \
|
|
|
|
|
"https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git" \
|
|
|
|
|
/tmp/moko-platform-api
|
|
|
|
|
cd /tmp/moko-platform-api
|
|
|
|
|
composer install --no-dev --no-interaction --quiet
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- name: "Publish stable release"
|
|
|
|
|
run: |
|
|
|
|
|
php /tmp/moko-platform-api/cli/release_publish.php \
|
|
|
|
|
--path . --stability stable --bump minor --branch main \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}"
|
|
|
|
|
|
|
|
|
|
# -- STEP 9: Mirror to GitHub (stable only) --------------------------------
|
|
|
|
|
- name: "Step 9: Mirror release to GitHub"
|
|
|
|
|
if: >-
|
|
|
|
|
steps.version.outputs.skip != 'true' &&
|
|
|
|
|
secrets.GH_MIRROR_TOKEN != ''
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
|
|
|
|
|
RELEASE_TAG="${{ steps.version.outputs.release_tag }}"
|
|
|
|
|
GH_REPO="${{ vars.GH_MIRROR_REPO || github.repository }}"
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
php /tmp/moko-platform-api/cli/release_mirror.php \
|
|
|
|
|
--version "$VERSION" --tag "$RELEASE_TAG" \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "$API_BASE" \
|
|
|
|
|
--gh-token "${{ secrets.GH_MIRROR_TOKEN }}" --gh-repo "$GH_REPO" \
|
|
|
|
|
--branch main 2>&1 || true
|
|
|
|
|
echo "GitHub mirror updated" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
|
|
|
|
|
# -- STEP 10: Sync main branch to GitHub mirror ----------------------------
|
|
|
|
|
- name: "Step 10: Push main to GitHub mirror"
|
|
|
|
|
if: >-
|
|
|
|
|
steps.version.outputs.skip != 'true' &&
|
|
|
|
|
secrets.GH_MIRROR_TOKEN != ''
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
GH_REPO="${{ vars.GH_MIRROR_REPO || github.repository }}"
|
|
|
|
|
GH_ORG=$(echo "$GH_REPO" | cut -d/ -f1)
|
|
|
|
|
GH_NAME=$(echo "$GH_REPO" | cut -d/ -f2)
|
|
|
|
|
git remote add github "https://x-access-token:${{ secrets.GH_MIRROR_TOKEN }}@github.com/${GH_ORG}/${GH_NAME}.git" 2>/dev/null || \
|
|
|
|
|
git remote set-url github "https://x-access-token:${{ secrets.GH_MIRROR_TOKEN }}@github.com/${GH_ORG}/${GH_NAME}.git"
|
|
|
|
|
git fetch origin main --depth=1
|
|
|
|
|
git push github origin/main:refs/heads/main --force 2>/dev/null \
|
|
|
|
|
&& echo "main branch pushed to GitHub mirror" \
|
|
|
|
|
|| echo "WARNING: GitHub mirror push failed"
|
|
|
|
|
|
|
|
|
|
- name: "Step 11: Delete rc branch and recreate dev from main"
|
|
|
|
|
if: steps.version.outputs.skip != 'true'
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
TOKEN="${{ secrets.MOKOGITEA_TOKEN }}"
|
|
|
|
|
|
|
|
|
|
# Delete rc branch (ephemeral — created by promote-rc)
|
|
|
|
|
curl -sf -X DELETE -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${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
|
|
|
|
|
|
|
|
|
|
- name: "Step 12: Create version branch from main"
|
|
|
|
|
if: steps.version.outputs.skip != 'true'
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
TOKEN="${{ secrets.MOKOGITEA_TOKEN }}"
|
|
|
|
|
VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
|
|
|
|
|
BRANCH_NAME="version/${VERSION}"
|
|
|
|
|
MAIN_SHA=$(git rev-parse HEAD)
|
|
|
|
|
|
|
|
|
|
# Delete old version branch if it exists (same version re-release)
|
|
|
|
|
curl -sf -X DELETE -H "Authorization: token ${TOKEN}" "${API_BASE}/branches/${BRANCH_NAME}" 2>/dev/null && echo "Deleted old ${BRANCH_NAME}"
|
|
|
|
|
|
|
|
|
|
# Create version/XX.YY.ZZ from main
|
|
|
|
|
curl -sf -X POST -H "Authorization: token ${TOKEN}" -H "Content-Type: application/json" "${API_BASE}/branches" -d "{\"new_branch_name\":\"${BRANCH_NAME}\",\"old_branch_name\":\"main\"}" 2>/dev/null && echo "Created ${BRANCH_NAME} from main (${MAIN_SHA})" || echo "WARNING: ${BRANCH_NAME} creation failed"
|
|
|
|
|
|
|
|
|
|
echo "Version branch created: ${BRANCH_NAME} (${MAIN_SHA})" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# -- Dolibarr post-release: Reset dev version -----------------------------
|
|
|
|
|
- name: "Post-release: Reset dev version"
|
|
|
|
|
if: steps.version.outputs.skip != 'true'
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
php /tmp/moko-platform-api/cli/version_reset_dev.php \
|
|
|
|
|
--token "${{ secrets.MOKOGITEA_TOKEN }}" --api-base "${API_BASE}" \
|
|
|
|
|
--branch dev --path . 2>&1 || true
|
|
|
|
|
|
|
|
|
|
# -- Summary --------------------------------------------------------------
|
|
|
|
|
- name: Pipeline Summary
|
|
|
|
|
if: always()
|
|
|
|
|
run: |
|
|
|
|
|
VERSION="${{ steps.bump.outputs.version || steps.version.outputs.version }}"
|
|
|
|
|
PLATFORM="${{ steps.platform.outputs.platform }}"
|
|
|
|
|
if [ "${{ steps.version.outputs.skip }}" = "true" ]; then
|
|
|
|
|
echo "## Release Skipped" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "No VERSION in README.md" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
elif [ "${{ steps.check.outputs.already_released }}" = "true" ]; then
|
|
|
|
|
echo "## Already Released — ${VERSION}" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
else
|
|
|
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "## Build & Release Complete (${PLATFORM})" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Step | Result |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "|------|--------|" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Platform | \`${PLATFORM}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Version | \`${VERSION}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Branch | \`${{ steps.version.outputs.branch }}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Tag | \`${{ steps.version.outputs.tag }}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Release | [View](${GITEA_URL}/${GITEA_ORG}/${GITEA_REPO}/releases/tag/${{ steps.version.outputs.tag }}) |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
fi
|
|
|
|
|