Skip to content

ci: refactor release workflow to use workflow_run and improve artifac… #6

ci: refactor release workflow to use workflow_run and improve artifac…

ci: refactor release workflow to use workflow_run and improve artifac… #6

Workflow file for this run

name: Create/Update Release
on:
workflow_run:
workflows: ["Build ISO"]
types:
- completed
branches:
- main
push:
branches:
- main
- dev
workflow_dispatch:
env:
MAX_RETRIES: 3
RETRY_DELAY: 30
permissions:
contents: write
issues: write
jobs:
update-release:
# Alleen uitvoeren als de build succesvol was
if: ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
permissions:
contents: write
issues: 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
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}
repository: ${{ github.repository }}
- name: Verify ISO Files
run: |
if [ ! -d "./iso-files" ] || [ -z "$(ls -A ./iso-files)" ]; then
echo "::error::ISO files not found in artifacts"
exit 1
fi
echo "Found ISO files:"
ls -la ./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.`
});