mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-23 02:24:39 +01:00
723 lines
No EOL
31 KiB
YAML
723 lines
No EOL
31 KiB
YAML
name: Nightly Release v3-alpha
|
||
|
||
on:
|
||
schedule:
|
||
- cron: '0 2 * * *' # 2 AM UTC daily
|
||
workflow_dispatch:
|
||
inputs:
|
||
force_release:
|
||
description: 'Force release even if no changes detected'
|
||
required: false
|
||
default: false
|
||
type: boolean
|
||
dry_run:
|
||
description: 'Run in dry-run mode (no actual release)'
|
||
required: false
|
||
default: true
|
||
type: boolean
|
||
|
||
jobs:
|
||
nightly-release:
|
||
runs-on: ubuntu-latest
|
||
|
||
permissions:
|
||
contents: write
|
||
pull-requests: read
|
||
actions: write
|
||
|
||
steps:
|
||
- name: Checkout code
|
||
uses: actions/checkout@v4
|
||
with:
|
||
ref: v3-alpha
|
||
fetch-depth: 0
|
||
token: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||
|
||
- name: Setup Go
|
||
uses: actions/setup-go@v4
|
||
with:
|
||
go-version: '1.24'
|
||
cache: true
|
||
cache-dependency-path: 'v3/go.sum'
|
||
|
||
- name: Install Task
|
||
uses: arduino/setup-task@v2
|
||
with:
|
||
version: 3.x
|
||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||
|
||
- name: Setup Git
|
||
run: |
|
||
git config --global user.name "github-actions[bot]"
|
||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||
|
||
# Configure git to use the token for authentication
|
||
git config --global url."https://x-access-token:${{ secrets.WAILS_REPO_TOKEN || github.token }}@github.com/".insteadOf "https://github.com/"
|
||
|
||
- name: Check for existing release tag
|
||
id: check_tag
|
||
run: |
|
||
if git describe --tags --exact-match HEAD 2>/dev/null; then
|
||
echo "has_tag=true" >> $GITHUB_OUTPUT
|
||
echo "tag=$(git describe --tags --exact-match HEAD)" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "has_tag=false" >> $GITHUB_OUTPUT
|
||
echo "tag=" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Check for unreleased changelog content
|
||
id: changelog_check
|
||
run: |
|
||
echo "🔍 Checking UNRELEASED_CHANGELOG.md for content..."
|
||
|
||
# Run the release script in check mode to see if there's content
|
||
cd v3/tasks/release
|
||
|
||
# Use the release script itself to check for content
|
||
if go run release.go --check-only 2>/dev/null; then
|
||
echo "has_unreleased_content=true" >> $GITHUB_OUTPUT
|
||
echo "✅ Found unreleased changelog content"
|
||
else
|
||
echo "has_unreleased_content=false" >> $GITHUB_OUTPUT
|
||
echo "ℹ️ No unreleased changelog content found"
|
||
fi
|
||
|
||
- name: Quick change detection and early exit
|
||
id: quick_check
|
||
run: |
|
||
echo "🔍 Quick check for changes to determine if we should continue..."
|
||
|
||
# First check if we have unreleased changelog content
|
||
if [ "${{ steps.changelog_check.outputs.has_unreleased_content }}" == "true" ]; then
|
||
echo "✅ Found unreleased changelog content, proceeding with release"
|
||
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||
echo "should_continue=true" >> $GITHUB_OUTPUT
|
||
echo "reason=Found unreleased changelog content" >> $GITHUB_OUTPUT
|
||
exit 0
|
||
fi
|
||
|
||
# If no unreleased changelog content, check for git changes as fallback
|
||
echo "No unreleased changelog content found, checking for git changes..."
|
||
|
||
# Check if current commit has a release tag
|
||
if git describe --tags --exact-match HEAD 2>/dev/null; then
|
||
CURRENT_TAG=$(git describe --tags --exact-match HEAD)
|
||
echo "Current commit has release tag: $CURRENT_TAG"
|
||
|
||
# For tagged commits, check if there are changes since the tag
|
||
COMMIT_COUNT=$(git rev-list ${CURRENT_TAG}..HEAD --count)
|
||
if [ "$COMMIT_COUNT" -eq 0 ]; then
|
||
echo "has_changes=false" >> $GITHUB_OUTPUT
|
||
echo "should_continue=false" >> $GITHUB_OUTPUT
|
||
echo "reason=No changes since existing tag $CURRENT_TAG and no unreleased changelog content" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||
echo "should_continue=true" >> $GITHUB_OUTPUT
|
||
fi
|
||
else
|
||
# No current tag, check against latest release
|
||
LATEST_TAG=$(git tag --list "v3.0.0-alpha.*" | sort -V | tail -1)
|
||
if [ -z "$LATEST_TAG" ]; then
|
||
echo "No previous release found, proceeding with release"
|
||
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||
echo "should_continue=true" >> $GITHUB_OUTPUT
|
||
else
|
||
COMMIT_COUNT=$(git rev-list ${LATEST_TAG}..HEAD --count)
|
||
if [ "$COMMIT_COUNT" -gt 0 ]; then
|
||
echo "Found $COMMIT_COUNT commits since $LATEST_TAG"
|
||
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||
echo "should_continue=true" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "has_changes=false" >> $GITHUB_OUTPUT
|
||
echo "should_continue=false" >> $GITHUB_OUTPUT
|
||
echo "reason=No changes since latest release $LATEST_TAG and no unreleased changelog content" >> $GITHUB_OUTPUT
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
- name: Early exit - No changes detected
|
||
if: |
|
||
steps.quick_check.outputs.should_continue == 'false' &&
|
||
github.event.inputs.force_release != 'true'
|
||
run: |
|
||
echo "🛑 EARLY EXIT: ${{ steps.quick_check.outputs.reason }}"
|
||
echo ""
|
||
echo "ℹ️ No changes detected since last release and force_release is not enabled."
|
||
echo " Workflow will exit early to save resources."
|
||
echo ""
|
||
echo " To force a release anyway, run this workflow with 'force_release=true'"
|
||
echo ""
|
||
echo "## 🛑 Early Exit Summary" >> $GITHUB_STEP_SUMMARY
|
||
echo "**Reason:** ${{ steps.quick_check.outputs.reason }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "**Action:** Workflow exited early to save resources" >> $GITHUB_STEP_SUMMARY
|
||
echo "**Force Release:** Set 'force_release=true' to override this behavior" >> $GITHUB_STEP_SUMMARY
|
||
exit 0
|
||
|
||
- name: Continue with release process
|
||
if: |
|
||
steps.quick_check.outputs.should_continue == 'true' ||
|
||
github.event.inputs.force_release == 'true'
|
||
run: |
|
||
echo "✅ Proceeding with release process..."
|
||
if [ "${{ github.event.inputs.force_release }}" == "true" ]; then
|
||
echo "🔨 FORCE RELEASE: Overriding change detection"
|
||
fi
|
||
|
||
- name: Run release script
|
||
id: release
|
||
if: |
|
||
steps.quick_check.outputs.should_continue == 'true' ||
|
||
github.event.inputs.force_release == 'true'
|
||
run: |
|
||
cd v3
|
||
|
||
echo "🚀 Running release task..."
|
||
echo "======================================================="
|
||
|
||
# Initialize error tracking
|
||
RELEASE_ERRORS=""
|
||
RELEASE_SUCCESS=true
|
||
|
||
# Store the original version for comparison
|
||
ORIGINAL_VERSION=$(cat internal/version/version.txt 2>/dev/null || echo "unknown")
|
||
echo "📌 Current version: $ORIGINAL_VERSION"
|
||
|
||
# Run the release task and capture output with error handling
|
||
if [ "${{ github.event.inputs.dry_run }}" == "true" ]; then
|
||
echo "🧪 DRY RUN MODE: Simulating release task execution"
|
||
# In dry run, we'll simulate the task without making actual changes
|
||
OUTPUT=$(task release 2>&1 || true)
|
||
RELEASE_EXIT_CODE=0 # Always succeed in dry run
|
||
echo "$OUTPUT"
|
||
else
|
||
echo "🚀 LIVE MODE: Executing release task"
|
||
OUTPUT=$(task release 2>&1)
|
||
RELEASE_EXIT_CODE=$?
|
||
echo "$OUTPUT"
|
||
|
||
if [ $RELEASE_EXIT_CODE -ne 0 ]; then
|
||
echo "❌ Release task failed with exit code $RELEASE_EXIT_CODE"
|
||
RELEASE_ERRORS="$RELEASE_ERRORS\n- Release task execution failed: $OUTPUT"
|
||
RELEASE_SUCCESS=false
|
||
else
|
||
echo "✅ Release task completed successfully"
|
||
fi
|
||
fi
|
||
|
||
# Verify version file exists and is readable
|
||
if [ ! -f "internal/version/version.txt" ]; then
|
||
echo "❌ Version file not found: internal/version/version.txt"
|
||
RELEASE_ERRORS="$RELEASE_ERRORS\n- Version file not found after release task execution"
|
||
RELEASE_SUCCESS=false
|
||
RELEASE_VERSION="unknown"
|
||
else
|
||
RELEASE_VERSION=$(cat internal/version/version.txt 2>/dev/null || echo "unknown")
|
||
if [ "$RELEASE_VERSION" == "unknown" ]; then
|
||
echo "❌ Failed to read version from file"
|
||
RELEASE_ERRORS="$RELEASE_ERRORS\n- Failed to read version from version.txt"
|
||
RELEASE_SUCCESS=false
|
||
else
|
||
echo "✅ Successfully read version: $RELEASE_VERSION"
|
||
fi
|
||
fi
|
||
|
||
# Check if version changed
|
||
VERSION_CHANGED="false"
|
||
if [ "$ORIGINAL_VERSION" != "$RELEASE_VERSION" ] && [ "$RELEASE_VERSION" != "unknown" ]; then
|
||
echo "✅ Version changed from $ORIGINAL_VERSION to $RELEASE_VERSION"
|
||
VERSION_CHANGED="true"
|
||
else
|
||
echo "ℹ️ Version unchanged: $RELEASE_VERSION"
|
||
fi
|
||
|
||
RELEASE_TAG="${RELEASE_VERSION}"
|
||
RELEASE_TITLE="Wails ${RELEASE_VERSION}"
|
||
|
||
# Set outputs for next steps
|
||
echo "version=$RELEASE_VERSION" >> $GITHUB_OUTPUT
|
||
echo "tag=$RELEASE_TAG" >> $GITHUB_OUTPUT
|
||
echo "title=$RELEASE_TITLE" >> $GITHUB_OUTPUT
|
||
echo "is_prerelease=true" >> $GITHUB_OUTPUT
|
||
echo "is_latest=false" >> $GITHUB_OUTPUT
|
||
echo "has_changes=${{ steps.changelog_check.outputs.has_unreleased_content }}" >> $GITHUB_OUTPUT
|
||
echo "success=$RELEASE_SUCCESS" >> $GITHUB_OUTPUT
|
||
echo "version_changed=$VERSION_CHANGED" >> $GITHUB_OUTPUT
|
||
|
||
# Generate release notes from UNRELEASED_CHANGELOG.md if it has content
|
||
if [ "${{ steps.changelog_check.outputs.has_unreleased_content }}" == "true" ] && [ "$RELEASE_SUCCESS" == "true" ]; then
|
||
echo "📝 Generating release notes from UNRELEASED_CHANGELOG.md..."
|
||
|
||
# Use the release script to extract changelog content
|
||
cd tasks/release
|
||
if CHANGELOG_CONTENT=$(go run release.go --extract-changelog 2>&1); then
|
||
if [ -n "$CHANGELOG_CONTENT" ] && [ "$CHANGELOG_CONTENT" != "No changelog content found." ]; then
|
||
echo "### Changes in this release:" > ../../release-notes.txt
|
||
echo "" >> ../../release-notes.txt
|
||
echo "$CHANGELOG_CONTENT" >> ../../release-notes.txt
|
||
echo "✅ Successfully extracted changelog content"
|
||
echo "release_notes_file=release-notes.txt" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "ℹ️ No changelog content to extract"
|
||
echo "No detailed changelog available for this release." > ../../release-notes.txt
|
||
echo "release_notes_file=release-notes.txt" >> $GITHUB_OUTPUT
|
||
fi
|
||
else
|
||
echo "⚠️ Failed to extract changelog content: $CHANGELOG_CONTENT"
|
||
echo "No detailed changelog available for this release." > ../../release-notes.txt
|
||
RELEASE_ERRORS="$RELEASE_ERRORS\n- Failed to extract changelog content for release notes"
|
||
echo "release_notes_file=release-notes.txt" >> $GITHUB_OUTPUT
|
||
fi
|
||
cd ../..
|
||
else
|
||
echo "release_notes_file=" >> $GITHUB_OUTPUT
|
||
if [ "$RELEASE_SUCCESS" != "true" ]; then
|
||
echo "⚠️ Skipping release notes generation due to release task failure"
|
||
fi
|
||
fi
|
||
|
||
# Set error output for later steps
|
||
if [ -n "$RELEASE_ERRORS" ]; then
|
||
echo "release_errors<<EOF" >> $GITHUB_OUTPUT
|
||
echo -e "$RELEASE_ERRORS" >> $GITHUB_OUTPUT
|
||
echo "EOF" >> $GITHUB_OUTPUT
|
||
echo "has_release_errors=true" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "has_release_errors=false" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Create and push git tag
|
||
id: git_tag
|
||
if: |
|
||
(steps.quick_check.outputs.should_continue == 'true' || github.event.inputs.force_release == 'true') &&
|
||
steps.check_tag.outputs.has_tag == 'false' &&
|
||
github.event.inputs.dry_run != 'true' &&
|
||
steps.release.outputs.success == 'true' &&
|
||
steps.release.outputs.version_changed == 'true'
|
||
env:
|
||
GITHUB_TOKEN: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||
run: |
|
||
echo "🏷️ Creating and pushing git tag: ${{ steps.release.outputs.tag }}"
|
||
|
||
# Initialize error tracking
|
||
GIT_ERRORS=""
|
||
GIT_SUCCESS=true
|
||
|
||
# Create git tag with error handling
|
||
if git tag -a "${{ steps.release.outputs.tag }}" -m "Release ${{ steps.release.outputs.version }}" 2>&1; then
|
||
echo "✅ Successfully created git tag: ${{ steps.release.outputs.tag }}"
|
||
else
|
||
echo "❌ Failed to create git tag"
|
||
GIT_ERRORS="$GIT_ERRORS\n- Failed to create git tag: ${{ steps.release.outputs.tag }}"
|
||
GIT_SUCCESS=false
|
||
fi
|
||
|
||
# Push tag with retry logic and error handling
|
||
if [ "$GIT_SUCCESS" == "true" ]; then
|
||
RETRY_COUNT=0
|
||
MAX_RETRIES=3
|
||
PUSH_SUCCESS=false
|
||
|
||
while [ $RETRY_COUNT -lt $MAX_RETRIES ] && [ "$PUSH_SUCCESS" == "false" ]; do
|
||
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||
echo "🔄 Attempting to push tag (attempt $RETRY_COUNT/$MAX_RETRIES)..."
|
||
|
||
if git push "https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}.git" "${{ steps.release.outputs.tag }}" 2>&1; then
|
||
echo "✅ Successfully pushed git tag to origin"
|
||
PUSH_SUCCESS=true
|
||
else
|
||
echo "❌ Failed to push git tag (attempt $RETRY_COUNT/$MAX_RETRIES)"
|
||
if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
|
||
echo "⏳ Waiting 5 seconds before retry..."
|
||
sleep 5
|
||
fi
|
||
fi
|
||
done
|
||
|
||
if [ "$PUSH_SUCCESS" == "false" ]; then
|
||
echo "❌ Failed to push git tag after $MAX_RETRIES attempts"
|
||
GIT_ERRORS="$GIT_ERRORS\n- Failed to push git tag after $MAX_RETRIES attempts"
|
||
GIT_SUCCESS=false
|
||
fi
|
||
fi
|
||
|
||
# Set outputs for later steps
|
||
echo "success=$GIT_SUCCESS" >> $GITHUB_OUTPUT
|
||
|
||
if [ -n "$GIT_ERRORS" ]; then
|
||
echo "git_tag_errors<<EOF" >> $GITHUB_OUTPUT
|
||
echo -e "$GIT_ERRORS" >> $GITHUB_OUTPUT
|
||
echo "EOF" >> $GITHUB_OUTPUT
|
||
echo "has_git_errors=true" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "has_git_errors=false" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Commit and push changes
|
||
id: git_commit
|
||
if: |
|
||
(steps.quick_check.outputs.should_continue == 'true' || github.event.inputs.force_release == 'true') &&
|
||
github.event.inputs.dry_run != 'true' &&
|
||
steps.release.outputs.success == 'true' &&
|
||
steps.release.outputs.version_changed == 'true'
|
||
env:
|
||
GITHUB_TOKEN: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||
run: |
|
||
echo "📝 Committing and pushing changes..."
|
||
|
||
# Initialize error tracking
|
||
COMMIT_ERRORS=""
|
||
COMMIT_SUCCESS=true
|
||
|
||
# Add any changes made by the release script with error handling
|
||
if git add . 2>&1; then
|
||
echo "✅ Successfully staged changes"
|
||
else
|
||
echo "❌ Failed to stage changes"
|
||
COMMIT_ERRORS="$COMMIT_ERRORS\n- Failed to stage changes with git add"
|
||
COMMIT_SUCCESS=false
|
||
fi
|
||
|
||
# Check if there are changes to commit
|
||
if [ "$COMMIT_SUCCESS" == "true" ]; then
|
||
if ! git diff --cached --quiet; then
|
||
echo "📝 Changes detected, creating commit..."
|
||
|
||
# Create commit with error handling
|
||
if git commit -m "${{ steps.release.outputs.version }}" 2>&1; then
|
||
echo "✅ Successfully created commit"
|
||
|
||
# Push changes with retry logic
|
||
RETRY_COUNT=0
|
||
MAX_RETRIES=3
|
||
PUSH_SUCCESS=false
|
||
|
||
while [ $RETRY_COUNT -lt $MAX_RETRIES ] && [ "$PUSH_SUCCESS" == "false" ]; do
|
||
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||
echo "🔄 Attempting to push changes (attempt $RETRY_COUNT/$MAX_RETRIES)..."
|
||
|
||
if git push "https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}.git" v3-alpha 2>&1; then
|
||
echo "✅ Successfully pushed changes to v3-alpha branch"
|
||
PUSH_SUCCESS=true
|
||
else
|
||
echo "❌ Failed to push changes (attempt $RETRY_COUNT/$MAX_RETRIES)"
|
||
if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
|
||
echo "⏳ Waiting 5 seconds before retry..."
|
||
sleep 5
|
||
fi
|
||
fi
|
||
done
|
||
|
||
if [ "$PUSH_SUCCESS" == "false" ]; then
|
||
echo "❌ Failed to push changes after $MAX_RETRIES attempts"
|
||
COMMIT_ERRORS="$COMMIT_ERRORS\n- Failed to push changes after $MAX_RETRIES attempts"
|
||
COMMIT_SUCCESS=false
|
||
fi
|
||
else
|
||
echo "❌ Failed to create commit"
|
||
COMMIT_ERRORS="$COMMIT_ERRORS\n- Failed to create git commit"
|
||
COMMIT_SUCCESS=false
|
||
fi
|
||
else
|
||
echo "ℹ️ No changes to commit"
|
||
fi
|
||
fi
|
||
|
||
# Set outputs for later steps
|
||
echo "success=$COMMIT_SUCCESS" >> $GITHUB_OUTPUT
|
||
|
||
if [ -n "$COMMIT_ERRORS" ]; then
|
||
echo "commit_errors<<EOF" >> $GITHUB_OUTPUT
|
||
echo -e "$COMMIT_ERRORS" >> $GITHUB_OUTPUT
|
||
echo "EOF" >> $GITHUB_OUTPUT
|
||
echo "has_commit_errors=true" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "has_commit_errors=false" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Read release notes
|
||
id: read_notes
|
||
if: |
|
||
(steps.quick_check.outputs.should_continue == 'true' || github.event.inputs.force_release == 'true') &&
|
||
steps.release.outputs.release_notes_file != '' &&
|
||
steps.release.outputs.version_changed == 'true'
|
||
run: |
|
||
cd v3
|
||
if [ -f "release-notes.txt" ]; then
|
||
# Read the release notes and handle multiline content
|
||
RELEASE_NOTES=$(cat release-notes.txt)
|
||
echo "release_notes<<EOF" >> $GITHUB_OUTPUT
|
||
echo "$RELEASE_NOTES" >> $GITHUB_OUTPUT
|
||
echo "EOF" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "release_notes=No release notes available" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Test GitHub Release Creation (DRY RUN)
|
||
if: |
|
||
(steps.quick_check.outputs.should_continue == 'true' || github.event.inputs.force_release == 'true') &&
|
||
github.event.inputs.dry_run == 'true' &&
|
||
steps.release.outputs.version_changed == 'true'
|
||
run: |
|
||
echo "🧪 DRY RUN: Would create GitHub release with the following parameters:"
|
||
echo "======================================================================="
|
||
echo "Tag Name: ${{ steps.release.outputs.tag }}"
|
||
echo "Release Name: ${{ steps.release.outputs.title }}"
|
||
echo "Is Prerelease: ${{ steps.release.outputs.is_prerelease }}"
|
||
echo "Is Latest: ${{ steps.release.outputs.is_latest }}"
|
||
echo "Has Changes: ${{ steps.release.outputs.has_changes }}"
|
||
echo ""
|
||
echo "Release Body Preview:"
|
||
echo "## Wails v3 Alpha Release - ${{ steps.release.outputs.version }}"
|
||
echo ""
|
||
cat << 'RELEASE_NOTES_EOF'
|
||
${{ steps.read_notes.outputs.release_notes }}
|
||
RELEASE_NOTES_EOF
|
||
echo ""
|
||
echo ""
|
||
echo ""
|
||
echo "---"
|
||
echo ""
|
||
echo "🤖 This is an automated nightly release generated from the latest changes in the v3-alpha branch."
|
||
echo ""
|
||
echo "**Installation:**"
|
||
echo "\`\`\`bash"
|
||
echo "go install github.com/wailsapp/wails/v3/cmd/wails@${{ steps.release.outputs.tag }}"
|
||
echo "\`\`\`"
|
||
echo ""
|
||
echo "**⚠️ Alpha Warning:** This is pre-release software and may contain bugs or incomplete features."
|
||
echo ""
|
||
echo "✅ DRY RUN: GitHub release creation test completed successfully!"
|
||
|
||
- name: Create GitHub Release (LIVE)
|
||
id: github_release
|
||
if: |
|
||
(steps.quick_check.outputs.should_continue == 'true' || github.event.inputs.force_release == 'true') &&
|
||
github.event.inputs.dry_run != 'true' &&
|
||
steps.release.outputs.success == 'true' &&
|
||
steps.release.outputs.version_changed == 'true'
|
||
continue-on-error: true
|
||
run: |
|
||
echo "🚀 Creating GitHub release using gh CLI..."
|
||
|
||
# Create release notes in a temporary file
|
||
cat > release_notes.md << 'EOF'
|
||
## Wails v3 Alpha Release - ${{ steps.release.outputs.version }}
|
||
|
||
${{ steps.read_notes.outputs.release_notes }}
|
||
|
||
|
||
|
||
---
|
||
|
||
🤖 This is an automated nightly release generated from the latest changes in the v3-alpha branch.
|
||
|
||
**Installation:**
|
||
```bash
|
||
go install github.com/wailsapp/wails/v3/cmd/wails@${{ steps.release.outputs.tag }}
|
||
```
|
||
|
||
**⚠️ Alpha Warning:** This is pre-release software and may contain bugs or incomplete features.
|
||
EOF
|
||
|
||
# Create the release
|
||
if gh release create "${{ steps.release.outputs.tag }}" \
|
||
--title "${{ steps.release.outputs.title }}" \
|
||
--notes-file release_notes.md \
|
||
--target v3-alpha \
|
||
--prerelease; then
|
||
echo "✅ Successfully created GitHub release"
|
||
echo "outcome=success" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "❌ Failed to create GitHub release"
|
||
echo "outcome=failure" >> $GITHUB_OUTPUT
|
||
fi
|
||
env:
|
||
GITHUB_TOKEN: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||
|
||
- name: Handle GitHub Release Creation Result
|
||
id: release_result
|
||
if: |
|
||
(steps.quick_check.outputs.should_continue == 'true' || github.event.inputs.force_release == 'true') &&
|
||
github.event.inputs.dry_run != 'true' &&
|
||
steps.release.outputs.success == 'true' &&
|
||
steps.release.outputs.version_changed == 'true'
|
||
run: |
|
||
echo "📋 Checking GitHub release creation result..."
|
||
|
||
# Initialize error tracking
|
||
GITHUB_ERRORS=""
|
||
GITHUB_SUCCESS=true
|
||
|
||
# Check if GitHub release creation succeeded
|
||
if [ "${{ steps.github_release.outcome }}" == "success" ]; then
|
||
echo "✅ GitHub release created successfully"
|
||
echo "🔗 Release URL: https://github.com/${{ github.repository }}/releases/tag/${{ steps.release.outputs.tag }}"
|
||
else
|
||
echo "❌ GitHub release creation failed"
|
||
GITHUB_ERRORS="$GITHUB_ERRORS\n- GitHub release creation failed with outcome: ${{ steps.github_release.outcome }}"
|
||
GITHUB_SUCCESS=false
|
||
fi
|
||
|
||
# Set outputs for summary
|
||
echo "success=$GITHUB_SUCCESS" >> $GITHUB_OUTPUT
|
||
|
||
if [ -n "$GITHUB_ERRORS" ]; then
|
||
echo "github_errors<<EOF" >> $GITHUB_OUTPUT
|
||
echo -e "$GITHUB_ERRORS" >> $GITHUB_OUTPUT
|
||
echo "EOF" >> $GITHUB_OUTPUT
|
||
echo "has_github_errors=true" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "has_github_errors=false" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Error Summary and Reporting
|
||
id: error_summary
|
||
if: always()
|
||
run: |
|
||
echo "📊 Generating comprehensive error summary..."
|
||
|
||
# Initialize error tracking
|
||
TOTAL_ERRORS=0
|
||
ERROR_SUMMARY=""
|
||
OVERALL_SUCCESS=true
|
||
|
||
# Check for changelog errors
|
||
if [ "${{ steps.changelog_check.outputs.has_errors }}" == "true" ]; then
|
||
echo "❌ Changelog processing errors detected"
|
||
ERROR_SUMMARY="$ERROR_SUMMARY\n### 📄 Changelog Processing Errors\n${{ steps.changelog_check.outputs.changelog_errors }}\n"
|
||
TOTAL_ERRORS=$((TOTAL_ERRORS + 1))
|
||
OVERALL_SUCCESS=false
|
||
fi
|
||
|
||
# Check for release script errors
|
||
if [ "${{ steps.release.outputs.has_release_errors }}" == "true" ]; then
|
||
echo "❌ Release script errors detected"
|
||
ERROR_SUMMARY="$ERROR_SUMMARY\n### 🚀 Release Script Errors\n${{ steps.release.outputs.release_errors }}\n"
|
||
TOTAL_ERRORS=$((TOTAL_ERRORS + 1))
|
||
OVERALL_SUCCESS=false
|
||
fi
|
||
|
||
# Check for git tag errors
|
||
if [ "${{ steps.git_tag.outputs.has_git_errors }}" == "true" ]; then
|
||
echo "❌ Git tag errors detected"
|
||
ERROR_SUMMARY="$ERROR_SUMMARY\n### 🏷️ Git Tag Errors\n${{ steps.git_tag.outputs.git_tag_errors }}\n"
|
||
TOTAL_ERRORS=$((TOTAL_ERRORS + 1))
|
||
OVERALL_SUCCESS=false
|
||
fi
|
||
|
||
# Check for git commit errors
|
||
if [ "${{ steps.git_commit.outputs.has_commit_errors }}" == "true" ]; then
|
||
echo "❌ Git commit errors detected"
|
||
ERROR_SUMMARY="$ERROR_SUMMARY\n### 📝 Git Commit Errors\n${{ steps.git_commit.outputs.commit_errors }}\n"
|
||
TOTAL_ERRORS=$((TOTAL_ERRORS + 1))
|
||
OVERALL_SUCCESS=false
|
||
fi
|
||
|
||
# Check for GitHub release errors
|
||
if [ "${{ steps.release_result.outputs.has_github_errors }}" == "true" ]; then
|
||
echo "❌ GitHub release errors detected"
|
||
ERROR_SUMMARY="$ERROR_SUMMARY\n### 🐙 GitHub Release Errors\n${{ steps.release_result.outputs.github_errors }}\n"
|
||
TOTAL_ERRORS=$((TOTAL_ERRORS + 1))
|
||
OVERALL_SUCCESS=false
|
||
fi
|
||
|
||
# Set outputs for final summary
|
||
echo "total_errors=$TOTAL_ERRORS" >> $GITHUB_OUTPUT
|
||
echo "overall_success=$OVERALL_SUCCESS" >> $GITHUB_OUTPUT
|
||
|
||
if [ -n "$ERROR_SUMMARY" ]; then
|
||
echo "error_summary<<EOF" >> $GITHUB_OUTPUT
|
||
echo -e "$ERROR_SUMMARY" >> $GITHUB_OUTPUT
|
||
echo "EOF" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
# Log summary
|
||
if [ "$OVERALL_SUCCESS" == "true" ]; then
|
||
echo "✅ Workflow completed successfully with no errors"
|
||
else
|
||
echo "⚠️ Workflow completed with $TOTAL_ERRORS error categories"
|
||
fi
|
||
|
||
- name: Summary
|
||
if: always()
|
||
run: |
|
||
if [ "${{ github.event.inputs.dry_run }}" == "true" ]; then
|
||
echo "## 🧪 DRY RUN Release Test Summary" >> $GITHUB_STEP_SUMMARY
|
||
else
|
||
echo "## 🚀 Nightly Release Summary" >> $GITHUB_STEP_SUMMARY
|
||
fi
|
||
echo "================================" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Version:** ${{ steps.release.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Tag:** ${{ steps.release.outputs.tag }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Version Changed:** ${{ steps.release.outputs.version_changed }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Has existing tag:** ${{ steps.check_tag.outputs.has_tag }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Has unreleased changelog content:** ${{ steps.changelog_check.outputs.has_unreleased_content }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Has changes:** ${{ steps.release.outputs.has_changes }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Is prerelease:** ${{ steps.release.outputs.is_prerelease }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Is latest:** ${{ steps.release.outputs.is_latest }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
|
||
# Overall status
|
||
if [ "${{ steps.error_summary.outputs.overall_success }}" == "true" ]; then
|
||
if [ "${{ github.event.inputs.dry_run }}" == "true" ]; then
|
||
echo "- **Mode:** 🧪 DRY RUN (no actual release created)" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Status:** ✅ Test completed successfully" >> $GITHUB_STEP_SUMMARY
|
||
else
|
||
echo "- **Mode:** 🚀 Live release" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Status:** ✅ Release created successfully" >> $GITHUB_STEP_SUMMARY
|
||
fi
|
||
else
|
||
echo "- **Mode:** ${{ github.event.inputs.dry_run == 'true' && '🧪 DRY RUN' || '🚀 Live release' }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "- **Status:** ⚠️ Completed with ${{ steps.error_summary.outputs.total_errors }} error(s)" >> $GITHUB_STEP_SUMMARY
|
||
fi
|
||
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "### Release Processing" >> $GITHUB_STEP_SUMMARY
|
||
if [ "${{ steps.release.outputs.version_changed }}" == "true" ]; then
|
||
echo "✅ **Version was incremented** and release created" >> $GITHUB_STEP_SUMMARY
|
||
else
|
||
echo "ℹ️ **Version was not changed** - no release created" >> $GITHUB_STEP_SUMMARY
|
||
fi
|
||
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "### Changelog Processing" >> $GITHUB_STEP_SUMMARY
|
||
if [ "${{ steps.changelog_check.outputs.has_unreleased_content }}" == "true" ]; then
|
||
echo "✅ **UNRELEASED_CHANGELOG.md** had content and was processed" >> $GITHUB_STEP_SUMMARY
|
||
echo "- Content moved to main changelog" >> $GITHUB_STEP_SUMMARY
|
||
echo "- UNRELEASED_CHANGELOG.md reset with template" >> $GITHUB_STEP_SUMMARY
|
||
else
|
||
echo "ℹ️ **UNRELEASED_CHANGELOG.md** had no content to process" >> $GITHUB_STEP_SUMMARY
|
||
fi
|
||
|
||
# Error reporting section
|
||
if [ "${{ steps.error_summary.outputs.total_errors }}" -gt 0 ]; then
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "## ⚠️ Error Report" >> $GITHUB_STEP_SUMMARY
|
||
echo "**Total Error Categories:** ${{ steps.error_summary.outputs.total_errors }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "${{ steps.error_summary.outputs.error_summary }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "### 🔧 Troubleshooting Tips" >> $GITHUB_STEP_SUMMARY
|
||
echo "- Check the individual step logs above for detailed error messages" >> $GITHUB_STEP_SUMMARY
|
||
echo "- Verify GitHub token permissions (contents: write, pull-requests: read)" >> $GITHUB_STEP_SUMMARY
|
||
echo "- Ensure UNRELEASED_CHANGELOG.md follows the expected format" >> $GITHUB_STEP_SUMMARY
|
||
echo "- Check for network connectivity issues if git/GitHub operations failed" >> $GITHUB_STEP_SUMMARY
|
||
echo "- Re-run the workflow with 'force_release=true' if needed" >> $GITHUB_STEP_SUMMARY
|
||
fi
|
||
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "### Release Notes Preview" >> $GITHUB_STEP_SUMMARY
|
||
if [ -n "${{ steps.read_notes.outputs.release_notes }}" ]; then
|
||
echo "${{ steps.read_notes.outputs.release_notes }}" >> $GITHUB_STEP_SUMMARY
|
||
else
|
||
echo "No specific release notes generated" >> $GITHUB_STEP_SUMMARY
|
||
fi
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "---" >> $GITHUB_STEP_SUMMARY
|
||
echo "*Generated by automated nightly release workflow with enhanced error handling and changelog integration*" >> $GITHUB_STEP_SUMMARY
|
||
|
||
# Set final workflow status
|
||
if [ "${{ steps.error_summary.outputs.overall_success }}" != "true" ]; then
|
||
echo "⚠️ Workflow completed with errors. Check the summary above for details."
|
||
exit 1
|
||
fi |