fix: generate release changelog from full local repo
Local Build and Deploy / deploy (push) Successful in 1m23s

Shallow clone (depth 1) only has one commit, so git log was empty.
Now generates changelog from the bare repo before cloning, and uses
Python to build the JSON payload for proper multiline escaping.
This commit is contained in:
openhands committed 2026-07-20 15:11:59 +02:00
1 parent aea9d83865
commit 15ed8ffbf0
1 file changed
+56 -36
+56 -36
View File
@@ -15,28 +15,27 @@ jobs:
run: |
set -e
# ── Checkout ────────────────────────────────────────────────
SRC="/tmp/epicnext-release"
rm -rf "$SRC"
git clone --branch "${VERSION}" --depth 1 \
/docker/gitea/gitea/git/repositories/remco/epicnext-cms.git \
"$SRC"
cd "$SRC"
REPO="/docker/gitea/gitea/git/repositories/remco/epicnext-cms.git"
# ── Generate Release Notes ───────────────────────────────────
PREV_TAG="$(git tag --sort=-creatordate | head -2 | tail -1 || echo '')"
# ── Generate changelog ────────────────────────────────────────
PREV_TAG="$(git -C "$REPO" tag --sort=-creatordate | head -2 | tail -1 || echo '')"
if [ -n "$PREV_TAG" ]; then
RANGE="${PREV_TAG}..${VERSION}"
NOTES="$(git log --oneline --no-decorate "${RANGE}" 2>/dev/null || git log --oneline --no-decorate -20)"
git -C "$REPO" log --oneline --no-decorate "${RANGE}" > /tmp/changelog.txt 2>/dev/null || \
git -C "$REPO" log --oneline --no-decorate -30 > /tmp/changelog.txt
else
NOTES="$(git log --oneline --no-decorate -30)"
git -C "$REPO" log --oneline --no-decorate -30 > /tmp/changelog.txt
fi
echo "=== Release Notes ==="
echo "$NOTES"
echo "=== Changelog ==="
cat /tmp/changelog.txt
# ── Build ─────────────────────────────────────────────────────
SRC="/tmp/epicnext-release"
rm -rf "$SRC"
git clone --branch "${VERSION}" --depth 1 "$REPO" "$SRC"
cd "$SRC"
# ── Build ────────────────────────────────────────────────────
# Copy env for Prisma client generation and build
if [ -f /var/www/atom-nexst/.env ]; then
cp /var/www/atom-nexst/.env "$SRC/.env"
fi
@@ -45,28 +44,49 @@ jobs:
export SKIP_ENV_VALIDATION=1
pnpm build
# ── Create Gitea Release ─────────────────────────────────────
BODY="## EpicNext-CMS ${VERSION}
# ── Create release (Python handles JSON properly) ─────────────
python3 << 'PYEOF'
import json, os, urllib.request
### Changes
${NOTES}
version = os.environ['VERSION']
api = os.environ['GITEA_API']
repo = os.environ['GITEA_REPO']
token = "${{ secrets.GITEA_TOKEN }}"
---
_Automated release from Gitea Actions_
"
with open('/tmp/changelog.txt') as f:
notes = f.read()
curl -s -X POST "${GITEA_API}/repos/${GITEA_REPO}/releases" \
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
-H "Content-Type: application/json" \
-d "$(cat <<-ENDJSON
{
"tag_name": "${VERSION}",
"name": "${VERSION}",
"body": $(echo "$BODY" | jq -Rs '.'),
"draft": false,
"prerelease": false
}
ENDJSON
)"
body = f"""## EpicNext-CMS {version}
echo "Release ${VERSION} created successfully!"
### Changes
{notes}
---
*Automated release from Gitea Actions*
"""
payload = json.dumps({
'tag_name': version,
'name': version,
'body': body,
'draft': False,
'prerelease': False,
}).encode('utf-8')
req = urllib.request.Request(
f'{api}/repos/{repo}/releases',
data=payload,
headers={
'Authorization': f'token {token}',
'Content-Type': 'application/json',
},
method='POST',
)
try:
resp = urllib.request.urlopen(req)
result = json.loads(resp.read().decode('utf-8'))
print(f"Release created: {result.get('html_url', result.get('id', '?'))}")
except urllib.error.HTTPError as e:
print(f"API error {e.code}: {e.read().decode('utf-8')}")
raise
PYEOF