|
|
|
@@ -1,386 +1,375 @@
|
|
|
|
|
# Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
|
|
|
#
|
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
#
|
|
|
|
|
# FILE INFORMATION
|
|
|
|
|
# DEFGROUP: Gitea.Workflow
|
|
|
|
|
# INGROUP: MokoStandards.Release
|
|
|
|
|
# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards
|
|
|
|
|
# PATH: /templates/workflows/universal/pre-release.yml.template
|
|
|
|
|
# VERSION: 05.00.00
|
|
|
|
|
# BRIEF: Manual pre-release — builds dev/alpha/beta/rc packages from any branch
|
|
|
|
|
|
|
|
|
|
name: "Universal: Pre-Release"
|
|
|
|
|
|
|
|
|
|
on:
|
|
|
|
|
workflow_dispatch:
|
|
|
|
|
inputs:
|
|
|
|
|
stability:
|
|
|
|
|
description: 'Pre-release channel'
|
|
|
|
|
required: true
|
|
|
|
|
type: choice
|
|
|
|
|
options:
|
|
|
|
|
- development
|
|
|
|
|
- alpha
|
|
|
|
|
- beta
|
|
|
|
|
- release-candidate
|
|
|
|
|
|
|
|
|
|
permissions:
|
|
|
|
|
contents: write
|
|
|
|
|
|
|
|
|
|
env:
|
|
|
|
|
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 }}
|
|
|
|
|
|
|
|
|
|
jobs:
|
|
|
|
|
build:
|
|
|
|
|
name: "Build Pre-Release (${{ inputs.stability }})"
|
|
|
|
|
runs-on: release
|
|
|
|
|
|
|
|
|
|
steps:
|
|
|
|
|
- name: Checkout
|
|
|
|
|
uses: actions/checkout@v4
|
|
|
|
|
with:
|
|
|
|
|
fetch-depth: 0
|
|
|
|
|
token: ${{ secrets.GA_TOKEN }}
|
|
|
|
|
|
|
|
|
|
- name: Setup PHP
|
|
|
|
|
run: |
|
|
|
|
|
if ! command -v php &> /dev/null; then
|
|
|
|
|
sudo apt-get update -qq
|
|
|
|
|
sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip >/dev/null 2>&1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
- name: Detect platform
|
|
|
|
|
id: platform
|
|
|
|
|
run: |
|
|
|
|
|
# Parse .manifest.xml via manifest_read.php — outputs all fields to GITHUB_OUTPUT
|
|
|
|
|
php /tmp/mokostandards-api/cli/manifest_read.php --path . --github-output 2>/dev/null || true
|
|
|
|
|
PLATFORM=$(php /tmp/mokostandards-api/cli/manifest_read.php --path . --field platform 2>/dev/null)
|
|
|
|
|
[ -z "$PLATFORM" ] && PLATFORM="generic"
|
|
|
|
|
echo "platform=$PLATFORM" >> "$GITHUB_OUTPUT"
|
|
|
|
|
# entry-point from manifest, find as fallback
|
|
|
|
|
MOD_FILE=$(php /tmp/mokostandards-api/cli/manifest_read.php --path . --field entry-point 2>/dev/null)
|
|
|
|
|
[ -z "$MOD_FILE" ] && MOD_FILE=$(find . -maxdepth 4 -name "mod*.class.php" ! -path "./.git/*" -exec grep -l 'extends DolibarrModules' {} \; 2>/dev/null | head -1)
|
|
|
|
|
MANIFEST=$(find . -maxdepth 3 -name "*.xml" ! -path "./.git/*" -exec grep -l '<extension' {} \; 2>/dev/null | head -1)
|
|
|
|
|
echo "manifest=${MANIFEST}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "mod_file=${MOD_FILE}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
|
|
|
|
|
- name: Resolve metadata
|
|
|
|
|
id: meta
|
|
|
|
|
run: |
|
|
|
|
|
STABILITY="${{ inputs.stability }}"
|
|
|
|
|
|
|
|
|
|
case "$STABILITY" in
|
|
|
|
|
development) SUFFIX="-dev"; TAG="development" ;;
|
|
|
|
|
alpha) SUFFIX="-alpha"; TAG="alpha" ;;
|
|
|
|
|
beta) SUFFIX="-beta"; TAG="beta" ;;
|
|
|
|
|
release-candidate) SUFFIX="-rc"; TAG="release-candidate" ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
# Read and bump patch version (with rollover)
|
|
|
|
|
CURRENT=$(sed -n 's/.*VERSION:[[:space:]]*\([0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\).*/\1/p' README.md 2>/dev/null | head -1)
|
|
|
|
|
[ -z "$CURRENT" ] && CURRENT="00.00.00"
|
|
|
|
|
|
|
|
|
|
MAJOR=$(echo "$CURRENT" | cut -d. -f1)
|
|
|
|
|
MINOR=$(echo "$CURRENT" | cut -d. -f2)
|
|
|
|
|
PATCH=$(echo "$CURRENT" | cut -d. -f3)
|
|
|
|
|
|
|
|
|
|
# Patch bump with rollover: ZZ=99 → bump minor, YY=99 → bump major
|
|
|
|
|
NEW_PATCH=$((10#$PATCH + 1))
|
|
|
|
|
NEW_MINOR=$((10#$MINOR))
|
|
|
|
|
NEW_MAJOR=$((10#$MAJOR))
|
|
|
|
|
|
|
|
|
|
if [ $NEW_PATCH -gt 99 ]; then
|
|
|
|
|
NEW_PATCH=0
|
|
|
|
|
NEW_MINOR=$((NEW_MINOR + 1))
|
|
|
|
|
fi
|
|
|
|
|
if [ $NEW_MINOR -gt 99 ]; then
|
|
|
|
|
NEW_MINOR=0
|
|
|
|
|
NEW_MAJOR=$((NEW_MAJOR + 1))
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
VERSION=$(printf "%02d.%02d.%02d" $NEW_MAJOR $NEW_MINOR $NEW_PATCH)
|
|
|
|
|
TODAY=$(date +%Y-%m-%d)
|
|
|
|
|
|
|
|
|
|
echo "Bumping: ${CURRENT} → ${VERSION} (patch)"
|
|
|
|
|
|
|
|
|
|
# Update README.md
|
|
|
|
|
sed -i "s/VERSION:[[:space:]]*${CURRENT}/VERSION: ${VERSION}/" README.md
|
|
|
|
|
|
|
|
|
|
# Update platform-specific manifest
|
|
|
|
|
PLATFORM="${{ steps.platform.outputs.platform }}"
|
|
|
|
|
MANIFEST="${{ steps.platform.outputs.manifest }}"
|
|
|
|
|
MOD_FILE="${{ steps.platform.outputs.mod_file }}"
|
|
|
|
|
case "$PLATFORM" in
|
|
|
|
|
joomla)
|
|
|
|
|
if [ -n "$MANIFEST" ]; then
|
|
|
|
|
MANIFEST_VER=$(sed -n 's/.*<version>\([^<]*\)<\/version>.*/\1/p' "$MANIFEST" | head -1)
|
|
|
|
|
sed -i "s|<version>${MANIFEST_VER}</version>|<version>${VERSION}</version>|" "$MANIFEST"
|
|
|
|
|
sed -i "s|<creationDate>[^<]*</creationDate>|<creationDate>${TODAY}</creationDate>|" "$MANIFEST"
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
dolibarr)
|
|
|
|
|
if [ -n "$MOD_FILE" ]; then
|
|
|
|
|
sed -i "s/\$this->version = '[^']*'/\$this->version = '${VERSION}'/" "$MOD_FILE"
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
*) ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
# Commit version bump
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
git remote set-url origin "https://jmiller:${{ secrets.GA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
|
|
|
|
|
git add -A
|
|
|
|
|
git diff --cached --quiet || {
|
|
|
|
|
git commit -m "chore(version): bump ${CURRENT} → ${VERSION} [skip ci]"
|
|
|
|
|
git push origin HEAD 2>&1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Auto-detect element (platform-aware)
|
|
|
|
|
case "$PLATFORM" in
|
|
|
|
|
joomla)
|
|
|
|
|
MANIFEST="${{ steps.platform.outputs.manifest }}"
|
|
|
|
|
EXT_ELEMENT=""
|
|
|
|
|
if [ -n "$MANIFEST" ]; then
|
|
|
|
|
EXT_ELEMENT=$(sed -n 's/.*<element>\([^<]*\)<\/element>.*/\1/p' "$MANIFEST" 2>/dev/null | head -1)
|
|
|
|
|
if [ -z "$EXT_ELEMENT" ]; then
|
|
|
|
|
EXT_ELEMENT=$(basename "$MANIFEST" .xml | tr '[:upper:]' '[:lower:]')
|
|
|
|
|
case "$EXT_ELEMENT" in
|
|
|
|
|
templatedetails|manifest) EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -') ;;
|
|
|
|
|
esac
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -')
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
dolibarr)
|
|
|
|
|
MOD_FILE="${{ steps.platform.outputs.mod_file }}"
|
|
|
|
|
if [ -n "$MOD_FILE" ]; then
|
|
|
|
|
MOD_BASENAME=$(basename "$MOD_FILE" .class.php)
|
|
|
|
|
EXT_ELEMENT=$(echo "$MOD_BASENAME" | sed 's/^mod//' | tr '[:upper:]' '[:lower:]')
|
|
|
|
|
else
|
|
|
|
|
EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -')
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -')
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
ZIP_NAME="${EXT_ELEMENT}-${VERSION}${SUFFIX}.zip"
|
|
|
|
|
|
|
|
|
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "stability=${STABILITY}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "suffix=${SUFFIX}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "zip_name=${ZIP_NAME}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "ext_element=${EXT_ELEMENT}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "manifest=${MANIFEST}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
|
|
|
|
|
echo "=== Pre-Release: ${EXT_ELEMENT} ${VERSION}${SUFFIX} ==="
|
|
|
|
|
|
|
|
|
|
- name: Build package
|
|
|
|
|
run: |
|
|
|
|
|
SOURCE_DIR="src"
|
|
|
|
|
[ ! -d "$SOURCE_DIR" ] && SOURCE_DIR="htdocs"
|
|
|
|
|
if [ ! -d "$SOURCE_DIR" ]; then
|
|
|
|
|
echo "::error::No src/ or htdocs/ directory"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
mkdir -p build/package
|
|
|
|
|
rsync -a \
|
|
|
|
|
--exclude='sftp-config*' \
|
|
|
|
|
--exclude='.ftpignore' \
|
|
|
|
|
--exclude='*.ppk' \
|
|
|
|
|
--exclude='*.pem' \
|
|
|
|
|
--exclude='*.key' \
|
|
|
|
|
--exclude='.env*' \
|
|
|
|
|
--exclude='*.local' \
|
|
|
|
|
--exclude='.build-trigger' \
|
|
|
|
|
"${SOURCE_DIR}/" build/package/
|
|
|
|
|
|
|
|
|
|
- name: Create ZIP
|
|
|
|
|
id: zip
|
|
|
|
|
run: |
|
|
|
|
|
ZIP_NAME="${{ steps.meta.outputs.zip_name }}"
|
|
|
|
|
cd build/package
|
|
|
|
|
zip -r "../${ZIP_NAME}" .
|
|
|
|
|
cd ..
|
|
|
|
|
|
|
|
|
|
SHA256=$(sha256sum "${ZIP_NAME}" | cut -d' ' -f1)
|
|
|
|
|
echo "sha256=${SHA256}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "ZIP: ${ZIP_NAME} (SHA: ${SHA256:0:16}...)"
|
|
|
|
|
|
|
|
|
|
- name: Create or replace Gitea release
|
|
|
|
|
id: release
|
|
|
|
|
run: |
|
|
|
|
|
TAG="${{ steps.meta.outputs.tag }}"
|
|
|
|
|
VERSION="${{ steps.meta.outputs.version }}"
|
|
|
|
|
STABILITY="${{ steps.meta.outputs.stability }}"
|
|
|
|
|
SHA256="${{ steps.zip.outputs.sha256 }}"
|
|
|
|
|
ZIP_NAME="${{ steps.meta.outputs.zip_name }}"
|
|
|
|
|
EXT_ELEMENT="${{ steps.meta.outputs.ext_element }}"
|
|
|
|
|
TOKEN="${{ secrets.GA_TOKEN }}"
|
|
|
|
|
API="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
BRANCH=$(git branch --show-current)
|
|
|
|
|
|
|
|
|
|
BODY="## ${VERSION} ($(date +%Y-%m-%d))
|
|
|
|
|
**Channel:** ${STABILITY}
|
|
|
|
|
**SHA-256:** \`${SHA256}\`"
|
|
|
|
|
|
|
|
|
|
# Delete existing release
|
|
|
|
|
EXISTING_ID=$(curl -sS -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API}/releases/tags/${TAG}" | jq -r '.id // empty' 2>/dev/null)
|
|
|
|
|
if [ -n "$EXISTING_ID" ]; then
|
|
|
|
|
curl -sS -X DELETE -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API}/releases/${EXISTING_ID}" 2>/dev/null || true
|
|
|
|
|
curl -sS -X DELETE -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API}/tags/${TAG}" 2>/dev/null || true
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Create release
|
|
|
|
|
RELEASE_ID=$(curl -sS -X POST -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
-H "Content-Type: application/json" \
|
|
|
|
|
"${API}/releases" \
|
|
|
|
|
-d "$(jq -n \
|
|
|
|
|
--arg tag "$TAG" \
|
|
|
|
|
--arg target "$BRANCH" \
|
|
|
|
|
--arg name "${EXT_ELEMENT} ${VERSION} (${STABILITY})" \
|
|
|
|
|
--arg body "$BODY" \
|
|
|
|
|
'{tag_name: $tag, target_commitish: $target, name: $name, body: $body, prerelease: true}'
|
|
|
|
|
)" | jq -r '.id')
|
|
|
|
|
|
|
|
|
|
echo "release_id=${RELEASE_ID}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
|
|
|
|
|
# Upload ZIP
|
|
|
|
|
curl -sS -X POST -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
-H "Content-Type: application/octet-stream" \
|
|
|
|
|
"${API}/releases/${RELEASE_ID}/assets?name=${ZIP_NAME}" \
|
|
|
|
|
--data-binary "@build/${ZIP_NAME}"
|
|
|
|
|
|
|
|
|
|
echo "Released: ${EXT_ELEMENT} ${VERSION} (${STABILITY})"
|
|
|
|
|
|
|
|
|
|
- name: Update updates.xml
|
|
|
|
|
if: steps.platform.outputs.platform == 'joomla'
|
|
|
|
|
run: |
|
|
|
|
|
STABILITY="${{ steps.meta.outputs.stability }}"
|
|
|
|
|
VERSION="${{ steps.meta.outputs.version }}"
|
|
|
|
|
SHA256="${{ steps.zip.outputs.sha256 }}"
|
|
|
|
|
ZIP_NAME="${{ steps.meta.outputs.zip_name }}"
|
|
|
|
|
TAG="${{ steps.meta.outputs.tag }}"
|
|
|
|
|
DATE=$(date +%Y-%m-%d)
|
|
|
|
|
|
|
|
|
|
if [ ! -f "updates.xml" ]; then
|
|
|
|
|
echo "No updates.xml — skipping"
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
export PY_STABILITY="$STABILITY" PY_VERSION="$VERSION" PY_SHA256="$SHA256" \
|
|
|
|
|
PY_ZIP_NAME="$ZIP_NAME" PY_TAG="$TAG" PY_DATE="$DATE" \
|
|
|
|
|
PY_GITEA_ORG="$GITEA_ORG" PY_GITEA_REPO="$GITEA_REPO"
|
|
|
|
|
python3 << 'PYEOF'
|
|
|
|
|
import re, os
|
|
|
|
|
|
|
|
|
|
stability = os.environ["PY_STABILITY"]
|
|
|
|
|
version = os.environ["PY_VERSION"]
|
|
|
|
|
sha256 = os.environ["PY_SHA256"]
|
|
|
|
|
zip_name = os.environ["PY_ZIP_NAME"]
|
|
|
|
|
tag = os.environ["PY_TAG"]
|
|
|
|
|
date = os.environ["PY_DATE"]
|
|
|
|
|
gitea_org = os.environ["PY_GITEA_ORG"]
|
|
|
|
|
gitea_repo = os.environ["PY_GITEA_REPO"]
|
|
|
|
|
download_url = f"https://git.mokoconsulting.tech/{gitea_org}/{gitea_repo}/releases/download/{tag}/{zip_name}"
|
|
|
|
|
|
|
|
|
|
with open("updates.xml", "r") as f:
|
|
|
|
|
content = f.read()
|
|
|
|
|
|
|
|
|
|
# Map stability to XML tag name
|
|
|
|
|
tag_map = {"development": "development", "alpha": "alpha", "beta": "beta", "release-candidate": "rc"}
|
|
|
|
|
xml_tag = tag_map.get(stability, stability)
|
|
|
|
|
|
|
|
|
|
pattern = r"(<update>(?:(?!</update>).)*?<tag>" + re.escape(xml_tag) + r"</tag>.*?</update>)"
|
|
|
|
|
match = re.search(pattern, content, re.DOTALL)
|
|
|
|
|
if match:
|
|
|
|
|
block = match.group(1)
|
|
|
|
|
updated = re.sub(r"<version>[^<]*</version>", f"<version>{version}</version>", block)
|
|
|
|
|
updated = re.sub(r"<creationDate>[^<]*</creationDate>", f"<creationDate>{date}</creationDate>", updated)
|
|
|
|
|
if "<sha256>" in updated:
|
|
|
|
|
updated = re.sub(r"<sha256>[^<]*</sha256>", f"<sha256>{sha256}</sha256>", updated)
|
|
|
|
|
else:
|
|
|
|
|
updated = updated.replace("</downloads>", f"</downloads>\n <sha256>{sha256}</sha256>")
|
|
|
|
|
updated = re.sub(r"(<downloadurl[^>]*>)[^<]*(</downloadurl>)", rf"\g<1>{download_url}\g<2>", updated)
|
|
|
|
|
content = content.replace(block, updated)
|
|
|
|
|
print(f"Updated {xml_tag} channel: version={version}")
|
|
|
|
|
else:
|
|
|
|
|
print(f"WARNING: No <tag>{xml_tag}</tag> block in updates.xml")
|
|
|
|
|
|
|
|
|
|
with open("updates.xml", "w") as f:
|
|
|
|
|
f.write(content)
|
|
|
|
|
PYEOF
|
|
|
|
|
|
|
|
|
|
# Commit and push to current branch
|
|
|
|
|
if ! git diff --quiet updates.xml 2>/dev/null; then
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
git add updates.xml
|
|
|
|
|
git commit -m "chore: update ${STABILITY} channel ${VERSION} [skip ci]"
|
|
|
|
|
git push origin HEAD 2>&1 || echo "WARNING: push failed"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
- name: "Sync updates.xml to all branches"
|
|
|
|
|
if: steps.platform.outputs.platform == 'joomla'
|
|
|
|
|
run: |
|
|
|
|
|
CURRENT_BRANCH="${{ github.ref_name }}"
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
|
|
|
|
|
# Sync updates.xml to main and dev (whichever isn't current)
|
|
|
|
|
for BRANCH in main dev; do
|
|
|
|
|
[ "$BRANCH" = "$CURRENT_BRANCH" ] && continue
|
|
|
|
|
|
|
|
|
|
echo "Syncing updates.xml → ${BRANCH}"
|
|
|
|
|
git fetch origin "${BRANCH}" 2>/dev/null || continue
|
|
|
|
|
git checkout "origin/${BRANCH}" -- . 2>/dev/null || continue
|
|
|
|
|
git checkout "${CURRENT_BRANCH}" -- updates.xml
|
|
|
|
|
if ! git diff --quiet updates.xml 2>/dev/null; then
|
|
|
|
|
git add updates.xml
|
|
|
|
|
git commit -m "chore: sync updates.xml from ${CURRENT_BRANCH} [skip ci]"
|
|
|
|
|
git push origin HEAD:refs/heads/${BRANCH} 2>&1 || echo "WARNING: push to ${BRANCH} failed"
|
|
|
|
|
fi
|
|
|
|
|
git checkout "${CURRENT_BRANCH}" 2>/dev/null
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
- name: "Delete lesser pre-release channels (cascade)"
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
TOKEN="${{ secrets.GA_TOKEN }}"
|
|
|
|
|
STABILITY="${{ steps.meta.outputs.stability }}"
|
|
|
|
|
|
|
|
|
|
# Cascade: rc → beta,alpha,dev | beta → alpha,dev | alpha → dev | dev → nothing
|
|
|
|
|
case "$STABILITY" in
|
|
|
|
|
release-candidate) TAGS_TO_DELETE="beta alpha development" ;;
|
|
|
|
|
beta) TAGS_TO_DELETE="alpha development" ;;
|
|
|
|
|
alpha) TAGS_TO_DELETE="development" ;;
|
|
|
|
|
*) TAGS_TO_DELETE="" ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
[ -z "$TAGS_TO_DELETE" ] && exit 0
|
|
|
|
|
|
|
|
|
|
for TAG in $TAGS_TO_DELETE; do
|
|
|
|
|
RELEASE_ID=$(curl -sS -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API_BASE}/releases/tags/${TAG}" 2>/dev/null | \
|
|
|
|
|
python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true)
|
|
|
|
|
|
|
|
|
|
if [ -n "$RELEASE_ID" ] && [ "$RELEASE_ID" != "None" ]; then
|
|
|
|
|
curl -sS -X DELETE -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API_BASE}/releases/${RELEASE_ID}" 2>/dev/null || true
|
|
|
|
|
curl -sS -X DELETE -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API_BASE}/tags/${TAG}" 2>/dev/null || true
|
|
|
|
|
echo "Deleted: ${TAG} (id: ${RELEASE_ID})"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
# 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/moko-platform
|
|
|
|
|
# PATH: /templates/workflows/universal/pre-release.yml.template
|
|
|
|
|
# VERSION: 05.01.00
|
|
|
|
|
# BRIEF: Manual pre-release -- builds dev/alpha/beta/rc packages from any branch
|
|
|
|
|
|
|
|
|
|
name: "Universal: Pre-Release"
|
|
|
|
|
|
|
|
|
|
on:
|
|
|
|
|
workflow_dispatch:
|
|
|
|
|
inputs:
|
|
|
|
|
stability:
|
|
|
|
|
description: 'Pre-release channel'
|
|
|
|
|
required: true
|
|
|
|
|
type: choice
|
|
|
|
|
options:
|
|
|
|
|
- development
|
|
|
|
|
- alpha
|
|
|
|
|
- beta
|
|
|
|
|
- release-candidate
|
|
|
|
|
|
|
|
|
|
permissions:
|
|
|
|
|
contents: write
|
|
|
|
|
|
|
|
|
|
env:
|
|
|
|
|
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 }}
|
|
|
|
|
|
|
|
|
|
jobs:
|
|
|
|
|
build:
|
|
|
|
|
name: "Build Pre-Release (${{ inputs.stability }})"
|
|
|
|
|
runs-on: release
|
|
|
|
|
|
|
|
|
|
steps:
|
|
|
|
|
- name: Checkout
|
|
|
|
|
uses: actions/checkout@v4
|
|
|
|
|
with:
|
|
|
|
|
fetch-depth: 0
|
|
|
|
|
token: ${{ secrets.GA_TOKEN }}
|
|
|
|
|
|
|
|
|
|
- name: Setup tools
|
|
|
|
|
run: |
|
|
|
|
|
# Update moko-platform CLI tools if available; install PHP if missing
|
|
|
|
|
if command -v moko-platform-update &> /dev/null; then
|
|
|
|
|
moko-platform-update
|
|
|
|
|
elif [ -d "/opt/moko-platform" ]; then
|
|
|
|
|
cd /opt/moko-platform && git pull origin main --quiet 2>/dev/null || true
|
|
|
|
|
else
|
|
|
|
|
if ! command -v php &> /dev/null; then
|
|
|
|
|
sudo apt-get update -qq
|
|
|
|
|
sudo apt-get install -y -qq php-cli php-mbstring php-xml php-zip php-curl >/dev/null 2>&1
|
|
|
|
|
fi
|
|
|
|
|
git clone --depth 1 --branch main --quiet \
|
|
|
|
|
"https://x-access-token:${{ secrets.GA_TOKEN }}@git.mokoconsulting.tech/MokoConsulting/moko-platform.git" \
|
|
|
|
|
/tmp/moko-platform-api
|
|
|
|
|
fi
|
|
|
|
|
# Set MOKO_CLI to whichever path exists
|
|
|
|
|
if [ -d "/opt/moko-platform/cli" ]; then
|
|
|
|
|
echo "MOKO_CLI=/opt/moko-platform/cli" >> "$GITHUB_ENV"
|
|
|
|
|
else
|
|
|
|
|
echo "MOKO_CLI=/tmp/moko-platform-api/cli" >> "$GITHUB_ENV"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
- name: Detect platform
|
|
|
|
|
id: platform
|
|
|
|
|
run: |
|
|
|
|
|
PLATFORM=$(sed -n 's/.*<platform>\([^<]*\)<\/platform>.*/\1/p' .mokogitea/manifest.xml 2>/dev/null | head -1 | tr -d '[:space:]')
|
|
|
|
|
[ -z "$PLATFORM" ] && PLATFORM="generic"
|
|
|
|
|
echo "platform=$PLATFORM" >> "$GITHUB_OUTPUT"
|
|
|
|
|
MANIFEST=$(find ./src -maxdepth 1 -name "pkg_*.xml" -exec grep -l '<extension' {} \; 2>/dev/null | head -1)
|
|
|
|
|
[ -z "$MANIFEST" ] && MANIFEST=$(find . -maxdepth 3 -name "*.xml" ! -path "./.git/*" ! -path "*/packages/*" -exec grep -l '<extension' {} \; 2>/dev/null | head -1)
|
|
|
|
|
[ -z "$MANIFEST" ] && MANIFEST=$(find . -maxdepth 3 -name "*.xml" ! -path "./.git/*" -exec grep -l '<extension' {} \; 2>/dev/null | head -1)
|
|
|
|
|
MOD_FILE=$(find . -maxdepth 4 -name "mod*.class.php" ! -path "./.git/*" -exec grep -l 'extends DolibarrModules' {} \; 2>/dev/null | head -1)
|
|
|
|
|
echo "manifest=${MANIFEST}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "mod_file=${MOD_FILE}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
|
|
|
|
|
- name: Resolve metadata and bump version
|
|
|
|
|
id: meta
|
|
|
|
|
run: |
|
|
|
|
|
STABILITY="${{ inputs.stability }}"
|
|
|
|
|
|
|
|
|
|
case "$STABILITY" in
|
|
|
|
|
development) SUFFIX="-dev"; TAG="development" ;;
|
|
|
|
|
alpha) SUFFIX="-alpha"; TAG="alpha" ;;
|
|
|
|
|
beta) SUFFIX="-beta"; TAG="beta" ;;
|
|
|
|
|
release-candidate) SUFFIX="-rc"; TAG="release-candidate" ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
# Patch bump via CLI tool
|
|
|
|
|
php ${MOKO_CLI}/version_bump.php --path .
|
|
|
|
|
VERSION=$(php ${MOKO_CLI}/version_read.php --path . 2>/dev/null)
|
|
|
|
|
[ -z "$VERSION" ] && VERSION="00.00.01"
|
|
|
|
|
TODAY=$(date +%Y-%m-%d)
|
|
|
|
|
|
|
|
|
|
# Update platform-specific manifest
|
|
|
|
|
PLATFORM="${{ steps.platform.outputs.platform }}"
|
|
|
|
|
MANIFEST="${{ steps.platform.outputs.manifest }}"
|
|
|
|
|
MOD_FILE="${{ steps.platform.outputs.mod_file }}"
|
|
|
|
|
|
|
|
|
|
php ${MOKO_CLI}/version_set_platform.php \
|
|
|
|
|
--path . --version "$VERSION" --branch "${{ github.ref_name }}" 2>/dev/null || true
|
|
|
|
|
|
|
|
|
|
# Commit version bump
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
git remote set-url origin "https://jmiller:${{ secrets.GA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
|
|
|
|
|
git add -A
|
|
|
|
|
git diff --cached --quiet || {
|
|
|
|
|
git commit -m "chore(version): pre-release bump to ${VERSION} [skip ci]"
|
|
|
|
|
git push origin HEAD 2>&1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Auto-detect element (platform-aware)
|
|
|
|
|
EXT_ELEMENT=""
|
|
|
|
|
case "$PLATFORM" in
|
|
|
|
|
joomla)
|
|
|
|
|
if [ -n "$MANIFEST" ]; then
|
|
|
|
|
EXT_ELEMENT=$(sed -n 's/.*<element>\([^<]*\)<\/element>.*/\1/p' "$MANIFEST" 2>/dev/null | head -1)
|
|
|
|
|
if [ -z "$EXT_ELEMENT" ]; then
|
|
|
|
|
EXT_ELEMENT=$(basename "$MANIFEST" .xml | tr '[:upper:]' '[:lower:]')
|
|
|
|
|
case "$EXT_ELEMENT" in
|
|
|
|
|
templatedetails|manifest) EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -') ;;
|
|
|
|
|
esac
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -')
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
dolibarr)
|
|
|
|
|
if [ -n "$MOD_FILE" ]; then
|
|
|
|
|
MOD_BASENAME=$(basename "$MOD_FILE" .class.php)
|
|
|
|
|
EXT_ELEMENT=$(echo "$MOD_BASENAME" | sed 's/^mod//' | tr '[:upper:]' '[:lower:]')
|
|
|
|
|
else
|
|
|
|
|
EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -')
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
EXT_ELEMENT=$(echo "${GITEA_REPO}" | tr '[:upper:]' '[:lower:]' | tr -d ' -')
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
ZIP_NAME="${EXT_ELEMENT}-${VERSION}${SUFFIX}.zip"
|
|
|
|
|
|
|
|
|
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "stability=${STABILITY}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "suffix=${SUFFIX}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "zip_name=${ZIP_NAME}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "ext_element=${EXT_ELEMENT}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "manifest=${MANIFEST}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
|
|
|
|
|
echo "=== Pre-Release: ${EXT_ELEMENT} ${VERSION}${SUFFIX} ==="
|
|
|
|
|
|
|
|
|
|
- name: Build package
|
|
|
|
|
run: |
|
|
|
|
|
SOURCE_DIR="src"
|
|
|
|
|
[ ! -d "$SOURCE_DIR" ] && SOURCE_DIR="htdocs"
|
|
|
|
|
if [ ! -d "$SOURCE_DIR" ]; then
|
|
|
|
|
echo "::error::No src/ or htdocs/ directory"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
MANIFEST="${{ steps.meta.outputs.manifest }}"
|
|
|
|
|
EXT_TYPE=""
|
|
|
|
|
if [ -n "$MANIFEST" ]; then
|
|
|
|
|
EXT_TYPE=$(sed -n 's/.*<extension[^>]*type="\([^"]*\)".*/\1/p' "$MANIFEST" | head -1)
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
EXCLUDES="sftp-config* .ftpignore *.ppk *.pem *.key .env* *.local .build-trigger"
|
|
|
|
|
|
|
|
|
|
mkdir -p build/package
|
|
|
|
|
|
|
|
|
|
if [ "$EXT_TYPE" = "package" ] && [ -d "${SOURCE_DIR}/packages" ]; then
|
|
|
|
|
echo "=== Building Joomla PACKAGE (multi-extension) ==="
|
|
|
|
|
for ext_dir in "${SOURCE_DIR}"/packages/*/; do
|
|
|
|
|
[ ! -d "$ext_dir" ] && continue
|
|
|
|
|
EXT_NAME=$(basename "$ext_dir")
|
|
|
|
|
echo " Packaging sub-extension: ${EXT_NAME}"
|
|
|
|
|
cd "$ext_dir"
|
|
|
|
|
zip -r "../../build/package/${EXT_NAME}.zip" . -x $EXCLUDES
|
|
|
|
|
cd "$OLDPWD"
|
|
|
|
|
done
|
|
|
|
|
for f in "${SOURCE_DIR}"/*.xml "${SOURCE_DIR}"/*.php; do
|
|
|
|
|
[ -f "$f" ] && cp "$f" build/package/
|
|
|
|
|
done
|
|
|
|
|
else
|
|
|
|
|
echo "=== Building standard extension ==="
|
|
|
|
|
rsync -a \
|
|
|
|
|
--exclude='sftp-config*' \
|
|
|
|
|
--exclude='.ftpignore' \
|
|
|
|
|
--exclude='*.ppk' \
|
|
|
|
|
--exclude='*.pem' \
|
|
|
|
|
--exclude='*.key' \
|
|
|
|
|
--exclude='.env*' \
|
|
|
|
|
--exclude='*.local' \
|
|
|
|
|
--exclude='.build-trigger' \
|
|
|
|
|
"${SOURCE_DIR}/" build/package/
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
- name: Create ZIP
|
|
|
|
|
id: zip
|
|
|
|
|
run: |
|
|
|
|
|
ZIP_NAME="${{ steps.meta.outputs.zip_name }}"
|
|
|
|
|
cd build/package
|
|
|
|
|
zip -r "../${ZIP_NAME}" .
|
|
|
|
|
cd ..
|
|
|
|
|
|
|
|
|
|
SHA256=$(sha256sum "${ZIP_NAME}" | cut -d' ' -f1)
|
|
|
|
|
echo "sha256=${SHA256}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
echo "ZIP: ${ZIP_NAME} (SHA: ${SHA256:0:16}...)"
|
|
|
|
|
|
|
|
|
|
- name: Create or replace Gitea release
|
|
|
|
|
id: release
|
|
|
|
|
run: |
|
|
|
|
|
TAG="${{ steps.meta.outputs.tag }}"
|
|
|
|
|
VERSION="${{ steps.meta.outputs.version }}"
|
|
|
|
|
STABILITY="${{ steps.meta.outputs.stability }}"
|
|
|
|
|
SHA256="${{ steps.zip.outputs.sha256 }}"
|
|
|
|
|
ZIP_NAME="${{ steps.meta.outputs.zip_name }}"
|
|
|
|
|
EXT_ELEMENT="${{ steps.meta.outputs.ext_element }}"
|
|
|
|
|
TOKEN="${{ secrets.GA_TOKEN }}"
|
|
|
|
|
API="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
BRANCH=$(git branch --show-current)
|
|
|
|
|
|
|
|
|
|
BODY="## ${VERSION} ($(date +%Y-%m-%d))
|
|
|
|
|
**Channel:** ${STABILITY}
|
|
|
|
|
**SHA-256:** \`${SHA256}\`"
|
|
|
|
|
|
|
|
|
|
# Delete existing release
|
|
|
|
|
EXISTING_ID=$(curl -sS -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API}/releases/tags/${TAG}" | jq -r '.id // empty' 2>/dev/null)
|
|
|
|
|
if [ -n "$EXISTING_ID" ]; then
|
|
|
|
|
curl -sS -X DELETE -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API}/releases/${EXISTING_ID}" 2>/dev/null || true
|
|
|
|
|
curl -sS -X DELETE -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
"${API}/tags/${TAG}" 2>/dev/null || true
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Create release
|
|
|
|
|
RELEASE_ID=$(curl -sS -X POST -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
-H "Content-Type: application/json" \
|
|
|
|
|
"${API}/releases" \
|
|
|
|
|
-d "$(jq -n \
|
|
|
|
|
--arg tag "$TAG" \
|
|
|
|
|
--arg target "$BRANCH" \
|
|
|
|
|
--arg name "${EXT_ELEMENT} ${VERSION} (${STABILITY})" \
|
|
|
|
|
--arg body "$BODY" \
|
|
|
|
|
'{tag_name: $tag, target_commitish: $target, name: $name, body: $body, prerelease: true}'
|
|
|
|
|
)" | jq -r '.id')
|
|
|
|
|
|
|
|
|
|
echo "release_id=${RELEASE_ID}" >> "$GITHUB_OUTPUT"
|
|
|
|
|
|
|
|
|
|
# Upload ZIP
|
|
|
|
|
curl -sS -X POST -H "Authorization: token ${TOKEN}" \
|
|
|
|
|
-H "Content-Type: application/octet-stream" \
|
|
|
|
|
"${API}/releases/${RELEASE_ID}/assets?name=${ZIP_NAME}" \
|
|
|
|
|
--data-binary "@build/${ZIP_NAME}"
|
|
|
|
|
|
|
|
|
|
echo "Released: ${EXT_ELEMENT} ${VERSION} (${STABILITY})"
|
|
|
|
|
|
|
|
|
|
- name: Update updates.xml
|
|
|
|
|
if: steps.platform.outputs.platform == 'joomla'
|
|
|
|
|
run: |
|
|
|
|
|
STABILITY="${{ steps.meta.outputs.stability }}"
|
|
|
|
|
VERSION="${{ steps.meta.outputs.version }}"
|
|
|
|
|
SHA256="${{ steps.zip.outputs.sha256 }}"
|
|
|
|
|
ZIP_NAME="${{ steps.meta.outputs.zip_name }}"
|
|
|
|
|
TAG="${{ steps.meta.outputs.tag }}"
|
|
|
|
|
|
|
|
|
|
if [ ! -f "updates.xml" ]; then
|
|
|
|
|
echo "No updates.xml -- skipping"
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Map stability to XML tag name
|
|
|
|
|
case "$STABILITY" in
|
|
|
|
|
development) XML_TAG="development" ;;
|
|
|
|
|
alpha) XML_TAG="alpha" ;;
|
|
|
|
|
beta) XML_TAG="beta" ;;
|
|
|
|
|
release-candidate) XML_TAG="rc" ;;
|
|
|
|
|
*) XML_TAG="$STABILITY" ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
DOWNLOAD_URL="${GITEA_URL}/${GITEA_ORG}/${GITEA_REPO}/releases/download/${TAG}/${ZIP_NAME}"
|
|
|
|
|
|
|
|
|
|
# Use PHP to update the channel in updates.xml
|
|
|
|
|
php -r '
|
|
|
|
|
$xml_tag = $argv[1];
|
|
|
|
|
$version = $argv[2];
|
|
|
|
|
$sha256 = $argv[3];
|
|
|
|
|
$url = $argv[4];
|
|
|
|
|
$date = date("Y-m-d");
|
|
|
|
|
|
|
|
|
|
$content = file_get_contents("updates.xml");
|
|
|
|
|
$pattern = "/(<update>(?:(?!<\/update>).)*?<tag>" . preg_quote($xml_tag) . "<\/tag>.*?<\/update>)/s";
|
|
|
|
|
|
|
|
|
|
$content = preg_replace_callback($pattern, function($m) use ($version, $sha256, $url, $date) {
|
|
|
|
|
$block = $m[0];
|
|
|
|
|
$block = preg_replace("/<version>[^<]*<\/version>/", "<version>{$version}</version>", $block);
|
|
|
|
|
if (strpos($block, "<sha256>") !== false) {
|
|
|
|
|
$block = preg_replace("/<sha256>[^<]*<\/sha256>/", "<sha256>{$sha256}</sha256>", $block);
|
|
|
|
|
} else {
|
|
|
|
|
$block = str_replace("</downloads>", "</downloads>\n <sha256>{$sha256}</sha256>", $block);
|
|
|
|
|
}
|
|
|
|
|
$block = preg_replace("/(<downloadurl[^>]*>)[^<]*(<\/downloadurl>)/", "\${1}{$url}\${2}", $block);
|
|
|
|
|
return $block;
|
|
|
|
|
}, $content);
|
|
|
|
|
|
|
|
|
|
file_put_contents("updates.xml", $content);
|
|
|
|
|
echo "Updated {$xml_tag} channel: version={$version}\n";
|
|
|
|
|
' "$XML_TAG" "$VERSION" "$SHA256" "$DOWNLOAD_URL"
|
|
|
|
|
|
|
|
|
|
# Commit and push
|
|
|
|
|
if ! git diff --quiet updates.xml 2>/dev/null; then
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
git add updates.xml
|
|
|
|
|
git commit -m "chore: update ${STABILITY} channel ${VERSION} [skip ci]"
|
|
|
|
|
git push origin HEAD 2>&1 || echo "WARNING: push failed"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
- name: "Sync updates.xml to all branches"
|
|
|
|
|
if: steps.platform.outputs.platform == 'joomla'
|
|
|
|
|
run: |
|
|
|
|
|
CURRENT_BRANCH="${{ github.ref_name }}"
|
|
|
|
|
git config --local user.email "gitea-actions[bot]@mokoconsulting.tech"
|
|
|
|
|
git config --local user.name "gitea-actions[bot]"
|
|
|
|
|
|
|
|
|
|
for BRANCH in main dev; do
|
|
|
|
|
[ "$BRANCH" = "$CURRENT_BRANCH" ] && continue
|
|
|
|
|
echo "Syncing updates.xml -> ${BRANCH}"
|
|
|
|
|
git fetch origin "${BRANCH}" 2>/dev/null || continue
|
|
|
|
|
git checkout "origin/${BRANCH}" -- . 2>/dev/null || continue
|
|
|
|
|
git checkout "${CURRENT_BRANCH}" -- updates.xml
|
|
|
|
|
if ! git diff --quiet updates.xml 2>/dev/null; then
|
|
|
|
|
git add updates.xml
|
|
|
|
|
git commit -m "chore: sync updates.xml from ${CURRENT_BRANCH} [skip ci]"
|
|
|
|
|
git push origin HEAD:refs/heads/${BRANCH} 2>&1 || echo "WARNING: push to ${BRANCH} failed"
|
|
|
|
|
fi
|
|
|
|
|
git checkout "${CURRENT_BRANCH}" 2>/dev/null
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
- name: "Delete lesser pre-release channels (cascade)"
|
|
|
|
|
continue-on-error: true
|
|
|
|
|
run: |
|
|
|
|
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
|
|
|
|
TOKEN="${{ secrets.GA_TOKEN }}"
|
|
|
|
|
|
|
|
|
|
php ${MOKO_CLI}/release_cascade.php \
|
|
|
|
|
--stability "${{ steps.meta.outputs.stability }}" \
|
|
|
|
|
--token "${TOKEN}" \
|
|
|
|
|
--api-base "${API_BASE}"
|
|
|
|
|
|
|
|
|
|
- name: Summary
|
|
|
|
|
if: always()
|
|
|
|
|
run: |
|
|
|
|
|
VERSION="${{ steps.meta.outputs.version }}"
|
|
|
|
|
STABILITY="${{ steps.meta.outputs.stability }}"
|
|
|
|
|
ZIP_NAME="${{ steps.meta.outputs.zip_name }}"
|
|
|
|
|
SHA256="${{ steps.zip.outputs.sha256 }}"
|
|
|
|
|
echo "## Pre-Release Complete" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "|-------|-------|" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Version | \`${VERSION}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Channel | ${STABILITY} |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| Package | \`${ZIP_NAME}\` |" >> $GITHUB_STEP_SUMMARY
|
|
|
|
|
echo "| SHA-256 | \`${SHA256:-n/a}\` |" >> $GITHUB_STEP_SUMMARY
|