-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Auto-merge non-breaking vendor updates with improved messaging #3059
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
d61a4f7
be60888
4d21982
f2e8ae5
e64c0b1
bf90303
e6fea0b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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,52 +46,197 @@ 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 |`n| :--- | :---: | :---: |`n" | ||
| $majorUpdates = @() | ||
| $singleDepName = "" | ||
| $singleDepOldVersion = "" | ||
| $singleDepNewVersion = "" | ||
| 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" | ||
|
|
||
| # Store single dependency info for messages | ||
| if ($count -eq 1) { | ||
| $singleDepName = $s.name | ||
| $singleDepOldVersion = $oldVersion | ||
| $singleDepNewVersion = $s.version | ||
| } | ||
|
|
||
| # Determine change type and emoji | ||
| $changeType = "unknown" | ||
| $emoji = "🔄" | ||
| $isMajor = $false | ||
| try { | ||
| # Handle versions with more than 4 parts | ||
| $oldVerStr = $oldVersion.Split('-')[0] | ||
| $newVerStr = $s.version.Split('-')[0] | ||
|
|
||
| # Split by dots and take only numeric parts, first 4 max | ||
| $oldParts = $oldVerStr.Split('.') | Where-Object { $_ -match '^\d+$' } | Select-Object -First 4 | ||
| $newParts = $newVerStr.Split('.') | Where-Object { $_ -match '^\d+$' } | Select-Object -First 4 | ||
|
|
||
| # Ensure we have at least 2 parts (major.minor) | ||
| if ($oldParts.Count -ge 2 -and $newParts.Count -ge 2) { | ||
| $oldVerParseable = $oldParts -join '.' | ||
| $newVerParseable = $newParts -join '.' | ||
|
|
||
| $oldVer = [System.Version]::Parse($oldVerParseable) | ||
| $newVer = [System.Version]::Parse($newVerParseable) | ||
|
|
||
| if ($newVer.Major -gt $oldVer.Major) { | ||
| $changeType = "major" | ||
| $emoji = "⚠️" | ||
| $isMajor = $true | ||
| } elseif ($newVer.Minor -gt $oldVer.Minor) { | ||
| $changeType = "minor" | ||
| $emoji = "✨" | ||
| } else { | ||
| $changeType = "patch" | ||
| $emoji = "🐛" | ||
| } | ||
| } | ||
| } catch { | ||
| $changeType = "unknown" | ||
| $emoji = "🔄" | ||
| } | ||
|
|
||
| # Track major updates for changelog section | ||
| if ($isMajor) { | ||
| $compareUrl = "$repoUrl/compare/v$oldVersion...v$($s.version)" | ||
| $majorUpdates += @{ | ||
| name = $s.name | ||
| oldVersion = $oldVersion | ||
| newVersion = $s.version | ||
| compareUrl = $compareUrl | ||
| repoUrl = $repoUrl | ||
| } | ||
| } | ||
|
|
||
| $listUpdated += "$($s.name) v$($s.version), " | ||
| $updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n" | ||
| $updateMessage += "| $emoji **[$($s.name)]($repoUrl)** | \`$oldVersion\` | \`$($s.version)\` |`n" | ||
| } | ||
| } | ||
| if ($count -eq 0) { return } | ||
| Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ') | ||
| Set-GHVariable -Name SINGLE_DEP_NAME -Value $singleDepName | ||
| Set-GHVariable -Name SINGLE_DEP_OLD_VERSION -Value $singleDepOldVersion | ||
| Set-GHVariable -Name SINGLE_DEP_NEW_VERSION -Value $singleDepNewVersion | ||
| echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 | ||
|
|
||
| # Generate major updates changelog section | ||
| if ($majorUpdates.Count -gt 0) { | ||
| $changelogSection = "`n<details>`n<summary>⚠️ Major version updates - View changelog</summary>`n`n" | ||
| foreach ($update in $majorUpdates) { | ||
| $changelogSection += "### [$($update.name)]($($update.repoUrl))`n" | ||
| $changelogSection += "**$($update.oldVersion)** → **$($update.newVersion)**`n`n" | ||
| $changelogSection += "- [View full changelog]($($update.compareUrl))`n" | ||
| $changelogSection += "- [Release notes]($($update.repoUrl)/tag/v$($update.newVersion))`n`n" | ||
| } | ||
| $changelogSection += "</details>`n" | ||
| echo "CHANGELOG_SECTION<<<EOF`n$changelogSection`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 | ||
| } else { | ||
| echo "CHANGELOG_SECTION=" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 | ||
| } | ||
|
|
||
| - name: Summary - Update check results | ||
| shell: pwsh | ||
| run: | | ||
| $count = $env:COUNT_UPDATED | ||
| 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' } | ||
| echo "### 🔄 Updates Found" >> $env:GITHUB_STEP_SUMMARY | ||
| echo "" >> $env:GITHUB_STEP_SUMMARY | ||
| echo "**$count** vendor $word updated:" >> $env:GITHUB_STEP_SUMMARY | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @copilot Don't use multiple emoji icons, always use one. Instead, if there is only an update to one dependency, use that name and version information, instead of 1 vendor updated message
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done in commit e6fea0b. Removed double emoji logic and updated single dependency messages to show the dependency name and version. Example output for single update: The workflow now displays "📦 Updated git-for-windows from |
||
| if ($count -eq 1) { | ||
| echo "📦 **$env:SINGLE_DEP_NAME** updated from \`$env:SINGLE_DEP_OLD_VERSION\` to \`$env:SINGLE_DEP_NEW_VERSION\`" >> $env:GITHUB_STEP_SUMMARY | ||
| } else { | ||
| echo "📦 **$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 | ||
| $commitResult = 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 only if a commit was made (check if HEAD moved) | ||
| $headBeforeReset = git rev-parse HEAD | ||
| if ($commitResult) { | ||
| 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: | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @copilot Likewise, instead of "Automatically updated 1 dependency" message, just state the name and version of the package instead.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done in commit e6fea0b. The PR body now shows the package name and version for single updates. Example output: For single updates, the heading displays "📦 Updated {name} from |
||
| ### ${{ env.COUNT_UPDATED == '1' && format('📦 Updated {0} from `{1}` to `{2}`', env.SINGLE_DEP_NAME, env.SINGLE_DEP_OLD_VERSION, env.SINGLE_DEP_NEW_VERSION) || format('📦 Automatically updated {0} dependencies', env.COUNT_UPDATED) }} | ||
|
|
||
| ${{ env.UPDATE_MESSAGE }} | ||
|
|
||
| ${{ env.CHANGELOG_SECTION }} | ||
|
|
||
| --- | ||
| 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 +247,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 | ||

There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@copilot Please remove
Change Typecolumn as it is excessive, instead if the update is major, add a<details>with<summary>of changes below the table that contains the changelog between the old and new versionThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done in commit bf90303. Removed the "Change Type" column and added a collapsible
<details>section below the table for major version updates with changelog and release notes links.Example output with major update:
Collapsed view:

Expanded view:

The table now shows only Name, Old Version, and New Version columns with emoji indicators (⚠️ for major, ✨ for minor, 🐛 for patch). Major updates include a details section with links to the full changelog comparison and release notes.