Skip to content

ci: improve release workflow with error handling and shell configuration #5

ci: improve release workflow with error handling and shell configuration

ci: improve release workflow with error handling and shell configuration #5

Workflow file for this run

name: Create/Update Release
on:
repository_dispatch:
types: [trigger-release]
push:
branches:
- main
- dev
workflow_dispatch:
env:
MAX_RETRIES: 3
RETRY_DELAY: 30
permissions:
contents: write
issues: write
jobs:
update-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up environment variables
id: env
run: |
echo "VERSION=$(date +'%Y.%m.%d')" >> $GITHUB_ENV
echo "BUILD_ID=$(date +'%Y%m%d_%H%M%S')" >> $GITHUB_ENV
- name: Generate Release Notes
run: |
# Create release notes header
echo "# πŸš€ Release ${{ env.VERSION }}" > release_notes.md
echo "" >> release_notes.md
# Add recent changes
echo "## πŸ“ Recent Changes" >> release_notes.md
echo "" >> release_notes.md
git log --pretty=format:"- %s" -n 10 >> release_notes.md
echo "" >> release_notes.md
echo "" >> release_notes.md
# Add package information if available
if [ -f "updates.txt" ]; then
echo "## πŸ“¦ Updated Packages" >> release_notes.md
echo "\`\`\`" >> release_notes.md
cat updates.txt >> release_notes.md
echo "\`\`\`" >> release_notes.md
echo "" >> release_notes.md
fi
# Add changelog if available
if [ -f "changelog.txt" ]; then
echo "## πŸ“‹ Package Changelog" >> release_notes.md
cat changelog.txt >> release_notes.md
fi
# Add build information
echo "" >> release_notes.md
echo "## πŸ”§ Build Information" >> release_notes.md
echo "- Build ID: \`${{ env.BUILD_ID }}\`" >> release_notes.md
echo "- Commit: \`$(git rev-parse HEAD)\`" >> release_notes.md
echo "- Branch: \`${GITHUB_REF#refs/heads/}\`" >> release_notes.md
echo "- Build Date: \`$(date -u '+%Y-%m-%d %H:%M:%S UTC')\`" >> release_notes.md
- name: Update Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: |
set -euo pipefail
# Check if release exists
if gh release view "${{ env.VERSION }}" &>/dev/null; then
echo "Updating existing release ${{ env.VERSION }}"
gh release edit "${{ env.VERSION }}" \
--title "Release ${{ env.VERSION }}" \
--notes-file release_notes.md
else
echo "Creating new release ${{ env.VERSION }}"
gh release create "${{ env.VERSION }}" \
--title "Release ${{ env.VERSION }}" \
--notes-file release_notes.md \
--target "${GITHUB_REF#refs/heads/}"
fi
- name: Download ISO Artifacts
uses: actions/download-artifact@v4
with:
name: iso-files
path: ./iso-files
- name: Update Release with ISO
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
retries=0
max_retries=${{ env.MAX_RETRIES }}
while [ $retries -lt $max_retries ]; do
if gh release view "${{ env.VERSION }}" &>/dev/null; then
gh release edit "${{ env.VERSION }}" \
--title "Release ${{ env.VERSION }}" \
--notes-file release_notes.md && \
gh release upload "${{ env.VERSION }}" ./iso-files/* && break
else
gh release create "${{ env.VERSION }}" \
--title "Release ${{ env.VERSION }}" \
--notes-file release_notes.md \
--target ${GITHUB_REF#refs/heads/} \
./iso-files/* && break
fi
retries=$((retries + 1))
[ $retries -lt $max_retries ] && sleep ${{ env.RETRY_DELAY }}
done
if [ $retries -eq $max_retries ]; then
echo "::error::Failed to create/update release after $max_retries attempts"
exit 1
fi
- name: Upload Build Logs
if: always()
uses: actions/upload-artifact@v3
with:
name: release-logs-${{ env.BUILD_ID }}
path: release_notes.md
retention-days: 7
- name: Notify on Failure
if: failure()
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: '❌ Release Update Failed',
body: `The release update workflow failed on ${new Date().toISOString()}\n\nBuild ID: ${process.env.BUILD_ID}\n\nPlease check the workflow logs for details.`
});