From be6088825867534d65ab9468e02348b9a761282f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:52:20 +0000 Subject: [PATCH] Improve vendor CI/CD workflow with better messaging and auto-merge Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com> --- .github/workflows/vendor.yml | 110 +++++++++++++++++++++++++++++++---- scripts/update.ps1 | 43 ++++++++++++-- 2 files changed, 137 insertions(+), 16 deletions(-) diff --git a/.github/workflows/vendor.yml b/.github/workflows/vendor.yml index 717e543..6e16ea3 100644 --- a/.github/workflows/vendor.yml +++ b/.github/workflows/vendor.yml @@ -31,9 +31,9 @@ jobs: - name: Summary - Workflow started shell: pwsh run: | - echo "## đŸ“Ļ Update Vendor - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY + echo "## đŸ“Ļ Vendor Update - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY - echo "Checking for vendor dependency updates..." >> $env:GITHUB_STEP_SUMMARY + echo "🔍 Checking for vendor dependency updates..." >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY - id: make-changes @@ -46,13 +46,36 @@ jobs: Set-GHVariable -Name COUNT_UPDATED -Value $count $newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json) $listUpdated = "" - $updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n" + $updateMessage = "| Name | Old Version | New Version | Change Type |`n| :--- | :---: | :---: | :---: |`n" foreach ($s in $newVersion) { $oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version if ($s.version -ne $oldVersion) { $repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases" + + # Determine change type and emoji + $changeType = "unknown" + $emoji = "🔄" + try { + $oldVer = [System.Version]::Parse($oldVersion.Split('-')[0]) + $newVer = [System.Version]::Parse($s.version.Split('-')[0]) + + if ($newVer.Major -gt $oldVer.Major) { + $changeType = "major" + $emoji = "âš ī¸" + } elseif ($newVer.Minor -gt $oldVer.Minor) { + $changeType = "minor" + $emoji = "✨" + } else { + $changeType = "patch" + $emoji = "🐛" + } + } catch { + $changeType = "unknown" + $emoji = "🔄" + } + $listUpdated += "$($s.name) v$($s.version), " - $updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n" + $updateMessage += "| $emoji **[$($s.name)]($repoUrl)** | \`$oldVersion\` | \`$($s.version)\` | $changeType |`n" } } if ($count -eq 0) { return } @@ -66,32 +89,89 @@ jobs: if ($count -eq 0) { echo "### ✅ No Updates Available" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY - echo "All vendor dependencies are up to date." >> $env:GITHUB_STEP_SUMMARY + echo "All vendor dependencies are up to date! 🎉" >> $env:GITHUB_STEP_SUMMARY } else { $word = if ($count -eq 1) { 'dependency' } else { 'dependencies' } + $emoji = if ($count -eq 1) { 'đŸ“Ļ' } else { 'đŸ“ĻđŸ“Ļ' } echo "### 🔄 Updates Found" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY - echo "**$count** vendor $word updated:" >> $env:GITHUB_STEP_SUMMARY + echo "$emoji **$count** vendor $word updated:" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY echo "$env:UPDATE_MESSAGE" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY + + # Check if we can auto-merge (only minor/patch changes) + $hasBreaking = $env:HAS_BREAKING_CHANGES -eq 'True' + if ($hasBreaking) { + echo "> âš ī¸ **Note:** This update contains major version changes that may include breaking changes." >> $env:GITHUB_STEP_SUMMARY + } else { + echo "> â„šī¸ **Note:** This update only contains minor or patch changes." >> $env:GITHUB_STEP_SUMMARY + } + } + + - name: Auto-merge minor updates + if: env.COUNT_UPDATED > 0 && env.HAS_BREAKING_CHANGES != 'True' + shell: pwsh + run: | + try { + echo "### 🚀 Auto-merging Updates" >> $env:GITHUB_STEP_SUMMARY + echo "" >> $env:GITHUB_STEP_SUMMARY + echo "Attempting to automatically merge non-breaking changes to master..." >> $env:GITHUB_STEP_SUMMARY + + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + + # Commit the changes + git add vendor/sources.json + git commit -m "âŦ†ī¸ Update dependencies ($env:LIST_UPDATED)" + + # Push directly to master + git push origin HEAD:master + + echo "" >> $env:GITHUB_STEP_SUMMARY + echo "✅ **Success!** Updates have been automatically merged to master." >> $env:GITHUB_STEP_SUMMARY + echo "" >> $env:GITHUB_STEP_SUMMARY + echo "**Updated dependencies:** $env:LIST_UPDATED" >> $env:GITHUB_STEP_SUMMARY + + # Set a flag to skip PR creation + echo "AUTO_MERGED=true" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 + } catch { + echo "" >> $env:GITHUB_STEP_SUMMARY + echo "âš ī¸ **Warning:** Unable to automatically merge updates." >> $env:GITHUB_STEP_SUMMARY + echo "" >> $env:GITHUB_STEP_SUMMARY + echo "**Error:** $($_.Exception.Message)" >> $env:GITHUB_STEP_SUMMARY + echo "" >> $env:GITHUB_STEP_SUMMARY + echo "Falling back to creating a pull request..." >> $env:GITHUB_STEP_SUMMARY + + Write-Warning "Failed to auto-merge: $($_.Exception.Message)" + + # Reset changes so PR creation can work + git reset --hard HEAD~1 + + # Set flag to create PR instead + echo "AUTO_MERGED=false" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 } - uses: peter-evans/create-pull-request@v7 - if: env.COUNT_UPDATED > 0 + if: env.COUNT_UPDATED > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false') with: - title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies' + title: ${{ env.COUNT_UPDATED == '1' && format('âŦ†ī¸ Update {0}', env.LIST_UPDATED) || format('âŦ†ī¸ Update {0} vendored dependencies', env.COUNT_UPDATED) }} body: | - ### Automatically updated `${{ env.COUNT_UPDATED }}` dependencies: + ### ${{ env.COUNT_UPDATED == '1' && 'đŸ“Ļ Automatically updated 1 dependency' || format('đŸ“Ļ Automatically updated {0} dependencies', env.COUNT_UPDATED) }} + ${{ env.UPDATE_MESSAGE }} + --- - Please verify and then **Merge** the pull request to update. + + ${{ env.HAS_BREAKING_CHANGES == 'True' && 'âš ī¸ **This update contains major version changes that may include breaking changes.**' || 'â„šī¸ This update only contains minor or patch changes.' }} + + Please verify and then **Merge** the pull request to apply the updates. commit-message: 'âŦ†ī¸ Update dependencies (${{ env.LIST_UPDATED }})' branch: update-vendor base: master - name: Summary - Pull request created - if: env.COUNT_UPDATED > 0 + if: env.COUNT_UPDATED > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false') shell: pwsh run: | echo "### 🎉 Pull Request Created" >> $env:GITHUB_STEP_SUMMARY @@ -102,4 +182,10 @@ jobs: echo "" >> $env:GITHUB_STEP_SUMMARY echo "**Updated dependencies:** $env:LIST_UPDATED" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY - echo "> Please review and merge the pull request to apply the updates." >> $env:GITHUB_STEP_SUMMARY + if ($env:HAS_BREAKING_CHANGES -eq 'True') { + echo "> âš ī¸ **Manual review required:** This update contains major version changes." >> $env:GITHUB_STEP_SUMMARY + } else { + echo "> â„šī¸ **Note:** Auto-merge failed, manual review required." >> $env:GITHUB_STEP_SUMMARY + } + echo "" >> $env:GITHUB_STEP_SUMMARY + echo "Please review and merge the pull request to apply the updates." >> $env:GITHUB_STEP_SUMMARY diff --git a/scripts/update.ps1 b/scripts/update.ps1 index c6b982d..fa108a9 100644 --- a/scripts/update.ps1 +++ b/scripts/update.ps1 @@ -259,6 +259,8 @@ function Fetch-DownloadUrl { } $count = 0 +$hasBreakingChanges = $false +$updateDetails = @() # Read the current sources content $sources = Get-Content $sourcesPath | Out-String | ConvertFrom-Json @@ -301,6 +303,35 @@ foreach ($s in $sources) { # } $count++ + + # Analyze version change type + $changeType = "unknown" + try { + # Try parsing as semantic version + $oldVer = [System.Version]::Parse($s.version.Split('-')[0]) + $newVer = [System.Version]::Parse($version.Split('-')[0]) + + if ($newVer.Major -gt $oldVer.Major) { + $changeType = "major" + $hasBreakingChanges = $true + } elseif ($newVer.Minor -gt $oldVer.Minor) { + $changeType = "minor" + } else { + $changeType = "patch" + } + } catch { + # If semantic versioning fails, treat as unknown (potentially breaking) + $changeType = "unknown" + $hasBreakingChanges = $true + Write-Verbose "Could not parse version as semantic version, treating as potentially breaking" + } + + $updateDetails += @{ + name = $s.name + oldVersion = $s.version + newVersion = $version + changeType = $changeType + } } $s.url = $downloadUrl @@ -314,12 +345,16 @@ if ($count -eq 0) { return } +# Export update details for GitHub Actions +if ($Env:GITHUB_ACTIONS -eq 'true') { + $updateDetailsJson = $updateDetails | ConvertTo-Json -Compress + Write-Output "UPDATE_DETAILS=$updateDetailsJson" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 + Write-Output "HAS_BREAKING_CHANGES=$hasBreakingChanges" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 + Write-Output "::notice title=Task Complete::Successfully updated $count dependencies." +} + if ($Env:APPVEYOR -eq 'True') { Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information } -if ($Env:GITHUB_ACTIONS -eq 'true') { - Write-Output "::notice title=Task Complete::Successfully updated $count dependencies." -} - Write-Host -ForegroundColor green "Successfully updated $count dependencies."