Fix GitHub Actions step summary generation issues

This commit is contained in:
David Refoua
2026-04-12 04:13:02 +03:30
committed by GitHub
7 changed files with 473 additions and 162 deletions

View File

@@ -1,7 +1,12 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2 version: 2
updates: updates:
# Enable version updates for GitHub Actions # Enable version updates for GitHub Actions
- package-ecosystem: "github-actions" - package-ecosystem: "github-actions" # See documentation for possible values
directory: "/" # Location of package manifests directory: "/" # Location of package manifests
schedule: schedule:
interval: "weekly" interval: "weekly"

View File

@@ -12,6 +12,7 @@ on:
- "v*" - "v*"
pull_request: pull_request:
branches: [ "master", "development" ] branches: [ "master", "development" ]
workflow_dispatch:
#---------------------------------# #---------------------------------#
# environment configuration # # environment configuration #
@@ -42,17 +43,94 @@ jobs:
- name: Summary - Repository checkout - name: Summary - Repository checkout
shell: pwsh shell: pwsh
run: | run: |
echo "## 📦 Build Cmder - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY # Get Cmder version
echo "" >> $env:GITHUB_STEP_SUMMARY . scripts/utils.ps1
echo "### Repository Information" >> $env:GITHUB_STEP_SUMMARY $cmderVersion = Get-VersionStr
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY $buildTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY # Determine branch and PR information
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY $refName = "${{ github.ref_name }}"
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY $headRef = "${{ github.head_ref }}"
echo "| Actor | @${{ github.actor }} |" >> $env:GITHUB_STEP_SUMMARY $eventName = "${{ github.event_name }}"
echo "| Workflow | \`${{ github.workflow }}\` |" >> $env:GITHUB_STEP_SUMMARY $prNumber = $null
echo "" >> $env:GITHUB_STEP_SUMMARY $actualBranchName = $refName
$branchLink = ""
$prLink = ""
# Check if this is a PR merge ref (e.g., "3061/merge")
if ($refName -match '^(\d+)/(merge|head)$') {
$prNumber = $Matches[1]
# Use head_ref for the actual branch name if available
if ($headRef) {
$actualBranchName = $headRef
}
$branchLink = "https://github.com/${{ github.repository }}/tree/$actualBranchName"
$prLink = "https://github.com/${{ github.repository }}/pull/$prNumber"
} elseif ($eventName -eq "pull_request") {
# This is a pull request event
$prNumber = "${{ github.event.pull_request.number }}"
if ($headRef) {
$actualBranchName = $headRef
}
$branchLink = "https://github.com/${{ github.repository }}/tree/$actualBranchName"
$prLink = "https://github.com/${{ github.repository }}/pull/$prNumber"
} else {
# Regular branch, link to the branch tree
$branchLink = "https://github.com/${{ github.repository }}/tree/$refName"
}
$summary = @"
## 📦 Build Cmder - Workflow Summary
<small>Build started: ``$buildTime``</small>
### Repository Information
| Property | Value |
| --- | --- |
| Repository | [``${{ github.repository }}``](https://github.com/${{ github.repository }}) |
| Branch | [``$actualBranchName``]($branchLink) |
$(if ($prNumber) { "| Pull Request | [#$prNumber]($prLink) |" })
| Commit | [``${{ github.sha }}``](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) |
| Actor | [@${{ github.actor }}](https://github.com/${{ github.actor }}) |
| Workflow | ``${{ github.workflow }}`` |
| Cmder Version | **$cmderVersion** |
---
### 🗃️ Vendor Packages ([sources.json](vendor/sources.json))
| Package | Version |
| --- | --- |
"@
# Read vendor sources.json and add to summary
$vendorSources = Get-Content -Raw "vendor/sources.json" | ConvertFrom-Json
if ($vendorSources.Count -eq 0) {
$summary += "`n| _No vendor packages found_ | |"
} else {
foreach ($vendor in $vendorSources) {
# Create release link based on vendor package
$versionLink = "$($vendor.version)"
if ($vendor.url) {
# Extract owner/repo/tag from the URL and create release link
# Handle both /releases/download/ and /archive/ URLs
if ($vendor.url -match 'github\.com/([^/]+)/([^/]+)/(releases/download|archive)/([^/]+)') {
$owner = $Matches[1]
$repo = $Matches[2]
$pathType = $Matches[3]
$tag = $Matches[4]
if ($pathType -eq 'archive') {
$tag = $tag -replace '\.(?:tar\.gz|tgz|zip)$', ''
}
$versionLink = "[$($vendor.version)](https://github.com/$owner/$repo/releases/tag/$tag)"
}
}
$summary += "`n| ``$($vendor.name)`` | $versionLink |"
}
}
$summary += "`n"
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Add MSBuild to PATH - name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v3 uses: microsoft/setup-msbuild@v3
@@ -66,36 +144,21 @@ jobs:
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "### ✅ Build Status" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "Cmder launcher successfully compiled." >> $env:GITHUB_STEP_SUMMARY ---
echo "" >> $env:GITHUB_STEP_SUMMARY
✅ Cmder built successfully.
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Pack the built files - name: Pack the built files
shell: pwsh shell: pwsh
working-directory: scripts working-directory: scripts
run: .\pack.ps1 -verbose run: .\pack.ps1 -verbose
- name: Summary - Package artifacts
if: success()
shell: pwsh
run: |
echo "### 📦 Artifacts Created" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "| Artifact | Size | Hash (SHA256) |" >> $env:GITHUB_STEP_SUMMARY
echo "| --- | --- | --- |" >> $env:GITHUB_STEP_SUMMARY
$artifacts = @("cmder.zip", "cmder.7z", "cmder_mini.zip")
foreach ($artifact in $artifacts) {
$path = "build/$artifact"
if (Test-Path $path) {
$size = (Get-Item $path).Length / 1MB
# Truncate hash to first 16 chars for summary readability (full hash in hashes.txt)
$hash = (Get-FileHash $path -Algorithm SHA256).Hash.Substring(0, 16)
echo "| \`$artifact\` | $([math]::Round($size, 2)) MB | \`$hash...\` |" >> $env:GITHUB_STEP_SUMMARY
}
}
echo "" >> $env:GITHUB_STEP_SUMMARY
- name: Upload artifact (cmder.zip) - name: Upload artifact (cmder.zip)
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v7
with: with:
@@ -128,15 +191,55 @@ jobs:
- name: Summary - Artifacts uploaded - name: Summary - Artifacts uploaded
if: success() if: success()
shell: pwsh shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
run: | run: |
echo "### ☁️ Upload Status" >> $env:GITHUB_STEP_SUMMARY # Source utility functions
echo "" >> $env:GITHUB_STEP_SUMMARY . scripts/utils.ps1
echo "All artifacts successfully uploaded to GitHub Actions:" >> $env:GITHUB_STEP_SUMMARY
echo '- ✅ `cmder.zip`' >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo '- ✅ `cmder.7z`' >> $env:GITHUB_STEP_SUMMARY
echo '- ✅ `cmder_mini.zip`' >> $env:GITHUB_STEP_SUMMARY ### 🗃️ Artifacts
echo '- ✅ `hashes.txt`' >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY | Artifact | Size | Hash (SHA256) |
| --- | --- | --- |
"@
# Get all files from the build directory (excluding directories and hidden files)
if (Test-Path "build") {
$buildFiles = Get-ChildItem -Path "build" -File | Where-Object { -not $_.Name.StartsWith('.') } | Sort-Object Name
foreach ($file in $buildFiles) {
$artifact = $file.Name
$path = $file.FullName
$sizeFormatted = Format-FileSize -Bytes $file.Length
$hash = (Get-FileHash $path -Algorithm SHA256).Hash
# Try to get the actual artifact download URL
$downloadUrl = Get-ArtifactDownloadUrl -ArtifactName $artifact -Repository "${{ github.repository }}" -RunId "${{ github.run_id }}"
$warning = ""
if (-not $downloadUrl) {
# Fallback to workflow run page if artifact URL fetch fails
$downloadUrl = "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
$warning = " ⚠️"
}
# Determine emoji based on file type
if ($artifact -match '\.txt$') {
$emoji = "📄"
} elseif ($artifact -match '\.(zip|rar|7z)$') {
$emoji = "🗄️"
} else {
$emoji = "📦"
}
$summary += "`n| $emoji [``$artifact``$warning]($downloadUrl) | $sizeFormatted | ``$hash`` |"
}
}
$summary += "`n"
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Create Release - name: Create Release
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
@@ -154,14 +257,20 @@ jobs:
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
shell: pwsh shell: pwsh
run: | run: |
echo "### 🚀 Release Information" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "Draft release created for tag: **\`${{ github.ref_name }}\`**" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "Release includes:" >> $env:GITHUB_STEP_SUMMARY
echo "- Full version (\`cmder.zip\`, \`cmder.7z\`)" >> $env:GITHUB_STEP_SUMMARY
echo "- Mini version (\`cmder_mini.zip\`)" >> $env:GITHUB_STEP_SUMMARY
echo "- File hashes (\`hashes.txt\`)" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "> ⚠️ Release is in **draft** mode. Please review and publish manually." >> $env:GITHUB_STEP_SUMMARY
---
### Release Information
🚀 Draft release created for tag: **``${{ github.ref_name }}``**
Release includes:
- Full version (``cmder.zip``, ``cmder.7z``)
- Mini version (``cmder_mini.zip``)
- File hashes (``hashes.txt``)
> ⚠️ Release is in **draft** mode. Please review and publish manually.
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

View File

@@ -50,20 +50,21 @@ jobs:
- name: Summary - CodeQL analysis started - name: Summary - CodeQL analysis started
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'## 🔒 CodeQL Security Analysis - Workflow Summary' ## 🔒 CodeQL Security Analysis - Workflow Summary
''
'### Analysis Configuration' ### Analysis Configuration
''
'| Property | Value |' | Property | Value |
'| --- | --- |' | --- | --- |
'| Repository | `${{ github.repository }}` |' | Repository | ``${{ github.repository }}`` |
'| Branch | `${{ github.ref_name }}` |' | Branch | ``${{ github.ref_name }}`` |
'| Language | `${{ matrix.language }}` |' | Language | ``${{ matrix.language }}`` |
'| Commit | `${{ github.sha }}` |' | Commit | ``${{ github.sha }}`` |
''
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
@@ -89,13 +90,14 @@ jobs:
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'### ✅ Build Completed' ### ✅ Build Completed
''
'Cmder launcher built successfully for CodeQL analysis.' Cmder launcher built successfully for CodeQL analysis.
''
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4 uses: github/codeql-action/analyze@v4
@@ -106,13 +108,14 @@ jobs:
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'### 🔍 CodeQL Analysis Results' ### 🔍 CodeQL Analysis Results
''
'✅ CodeQL security analysis completed successfully.' ✅ CodeQL security analysis completed successfully.
''
'**Language analyzed:** `${{ matrix.language }}`' **Language analyzed:** ``${{ matrix.language }}``
''
'> Check the Security tab for detailed findings and recommendations.' > Check the Security tab for detailed findings and recommendations.
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

View File

@@ -39,20 +39,33 @@ jobs:
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Summary - Test execution started - name: Summary - Test execution started
shell: pwsh shell: pwsh
run: | run: |
echo "## 🧪 Run Tests - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY # Get Cmder version
echo "" >> $env:GITHUB_STEP_SUMMARY . scripts/utils.ps1
echo "### Test Environment" >> $env:GITHUB_STEP_SUMMARY $cmderVersion = Get-VersionStr
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY ## ✅ Run Tests - Workflow Summary
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY ### Test Environment
echo "| Runner OS | \`${{ runner.os }}\` |" >> $env:GITHUB_STEP_SUMMARY | Property | Value |
echo "" >> $env:GITHUB_STEP_SUMMARY | --- | --- |
| Repository | ``${{ github.repository }}`` |
| Branch | ``${{ github.ref_name }}`` |
| Commit | ``${{ github.sha }}`` |
| Runner OS | ``${{ runner.os }}`` |
| Cmder Version | **$cmderVersion** |
| PowerShell Version | **$($PSVersionTable.PSVersion)** |
| Event | ``${{ github.event_name }}`` |
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Initialize vendors - name: Initialize vendors
shell: pwsh shell: pwsh
@@ -63,53 +76,127 @@ jobs:
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "### ⚙️ Vendor Initialization" >> $env:GITHUB_STEP_SUMMARY # Get vendor versions from sources.json
echo "" >> $env:GITHUB_STEP_SUMMARY $vendorInfo = @()
echo "✅ Vendor dependencies initialized successfully." >> $env:GITHUB_STEP_SUMMARY $sources = Get-Content "vendor\sources.json" -Raw | ConvertFrom-Json
echo "" >> $env:GITHUB_STEP_SUMMARY foreach ($source in $sources) {
$dir = $source.name
if (-not $dir) {
continue
}
$versionFile = "vendor/$dir/.cmderver"
if (Test-Path $versionFile) {
$version = Get-Content $versionFile -Raw
$vendorInfo += "- **$dir**: $($version.Trim())"
}
}
$summary = @"
### ⚙️ Vendor Initialization
✅ Vendor dependencies initialized successfully.
**Vendor Versions:**
"@
$(
if ($vendorInfo.Count -eq 0) {
$summary += "_No vendor version information available._"
} else {
$summary += $vendorInfo -join "`n"
}
)
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Summary - Test results table header - name: Summary - Test results table header
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "### 📋 Test Results" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "" >> $env:GITHUB_STEP_SUMMARY ### 📋 Test Results
echo "| Test | Status |" >> $env:GITHUB_STEP_SUMMARY
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY | Test | Status | Duration |
| --- | --- | --- |
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Testing Clink Shell - name: Testing Clink Shell
id: test-clink
shell: pwsh
run: | run: |
$startTime = Get-Date
cmd /c vendor\init.bat /v /d /t cmd /c vendor\init.bat /v /d /t
$duration = [math]::Round(((Get-Date) - $startTime).TotalSeconds, 2)
echo "duration=$duration" >> $env:GITHUB_OUTPUT
- name: Summary - Clink Shell test - name: Summary - Clink Shell test
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "| Clink Shell | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY $duration = "${{ steps.test-clink.outputs.duration }}"
if ($duration) {
$duration = "$duration s"
} else {
$duration = "N/A"
}
"| Clink Shell | ✅ Passed | $duration |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Testing PowerShell - name: Testing PowerShell
id: test-powershell
shell: pwsh
run: | run: |
$startTime = Get-Date
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'" PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'"
$duration = [math]::Round(((Get-Date) - $startTime).TotalSeconds, 2)
echo "duration=$duration" >> $env:GITHUB_OUTPUT
- name: Summary - PowerShell test - name: Summary - PowerShell test
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "| PowerShell | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY $duration = "${{ steps.test-powershell.outputs.duration }}"
if ($duration) {
$duration = "$duration s"
} else {
$duration = "N/A"
}
"| PowerShell | ✅ Passed | $duration |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Testing Bash - name: Testing Bash
id: test-bash
shell: pwsh
run: | run: |
$startTime = Get-Date
bash vendor/cmder.sh bash vendor/cmder.sh
$duration = [math]::Round(((Get-Date) - $startTime).TotalSeconds, 2)
echo "duration=$duration" >> $env:GITHUB_OUTPUT
- name: Summary - Bash test - name: Summary - Bash test
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "| Bash | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY $duration = "${{ steps.test-bash.outputs.duration }}"
if ($duration) {
$duration = "$duration s"
} else {
$duration = "N/A"
}
"| Bash | ✅ Passed | $duration |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Summary - All tests completed - name: Summary - All tests completed
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "### ✅ All Tests Completed" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY ### ✅ All Tests Completed
echo "All shell environments tested successfully!" >> $env:GITHUB_STEP_SUMMARY
All shell environments tested successfully!
**Test Coverage:**
- ✅ Clink shell environment (Windows cmd.exe with Clink)
- ✅ PowerShell environment (with Cmder profile)
- ✅ Bash environment (Git Bash integration)
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

View File

@@ -31,62 +31,64 @@ jobs:
- name: Summary - Workflow started - name: Summary - Workflow started
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'## 📦 Update Vendor - Workflow Summary' ## 📦 Update Vendor - Workflow Summary
''
'Checking for vendor dependency updates...' Checking for vendor dependency updates...
''
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- id: make-changes - id: make-changes
name: Checking for updates name: Checking for updates
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |
$currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json) $currentVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose . .\scripts\update.ps1 -verbose
Set-GHVariable -Name COUNT_UPDATED -Value $count Set-GHVariable -Name COUNT_UPDATED -Value $count
$newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json) $newVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
$listUpdated = "" $listUpdated = ""
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n" $updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
foreach ($s in $newVersion) { foreach ($s in $newVersion) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version $oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) { if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases" $repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
$listUpdated += "$($s.name) v$($s.version), " $listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n" $updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
}
} }
if ($count -eq 0) { return } }
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ') if ($count -eq 0) { return }
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
echo "UPDATE_MESSAGE<<EOF`n$updateMessage`nEOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- name: Summary - Update check results - name: Summary - Update check results
shell: pwsh shell: pwsh
run: | run: |
$count = [int]$env:COUNT_UPDATED $count = [int]$env:COUNT_UPDATED
if ($count -eq 0) { if ($count -eq 0) {
$summary = @( $summary = @"
'### ✅ No Updates Available' ### ✅ No Updates Available
''
'All vendor dependencies are up to date.' All vendor dependencies are up to date.
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
} else { } else {
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' } $word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
$summary = @( $summary = @"
'### 🔄 Updates Found' ### 🔄 Updates Found
''
"**$count** vendor $word updated:" **$count** vendor $word updated:
''
$env:UPDATE_MESSAGE $env:UPDATE_MESSAGE
''
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
} }
- uses: peter-evans/create-pull-request@v8 $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- uses: peter-evans/create-pull-request@v7
if: env.COUNT_UPDATED > 0 if: env.COUNT_UPDATED > 0
with: with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies' title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
@@ -103,15 +105,16 @@ jobs:
if: env.COUNT_UPDATED > 0 if: env.COUNT_UPDATED > 0
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'### 🎉 Pull Request Created' ### 🎉 Pull Request Created
''
'A pull request has been created to update the vendor dependencies.' A pull request has been created to update the vendor dependencies.
''
'**Branch:** `update-vendor`' **Branch:** ``update-vendor``
''
$env:LIST_UPDATED -and "**Updated dependencies:** $env:LIST_UPDATED" -or "**Updated dependencies:** " **Updated dependencies:** $env:LIST_UPDATED
''
'> Please review and merge the pull request to apply the updates.' > Please review and merge the pull request to apply the updates.
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

View File

@@ -70,7 +70,7 @@ if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) {
foreach ($t in $targets.GetEnumerator()) { foreach ($t in $targets.GetEnumerator()) {
Create-Archive "$cmderRoot" "$saveTo\$($t.Name)" $t.Value Create-Archive "$cmderRoot" "$saveTo\$($t.Name)" $t.Value
$hash = (Digest-Hash "$saveTo\$($t.Name)") $hash = (Digest-Hash "$saveTo\$($t.Name)")
Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + ' ' + $hash) Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + "`t" + $hash)
} }
Pop-Location Pop-Location

View File

@@ -249,3 +249,107 @@ function Download-File {
$wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; $wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials;
$wc.DownloadFile($Url, $File) $wc.DownloadFile($Url, $File)
} }
function Format-FileSize {
<#
.SYNOPSIS
Formats a file size in bytes to a human-readable string using binary units.
.DESCRIPTION
Converts file sizes to appropriate binary units (B, KiB, MiB, GiB) for better readability.
.PARAMETER Bytes
The file size in bytes to format.
.EXAMPLE
Format-FileSize -Bytes 1024
Returns "1.00 KiB"
.EXAMPLE
Format-FileSize -Bytes 15728640
Returns "15.00 MiB"
#>
param(
[Parameter(Mandatory = $true)]
[double]$Bytes
)
if ($Bytes -ge 1GB) {
return "{0:N2} GiB" -f ($Bytes / 1GB)
} elseif ($Bytes -ge 1MB) {
return "{0:N2} MiB" -f ($Bytes / 1MB)
} elseif ($Bytes -ge 1KB) {
return "{0:N2} KiB" -f ($Bytes / 1KB)
} else {
return "{0:N0} B" -f $Bytes
}
}
function Get-ArtifactDownloadUrl {
<#
.SYNOPSIS
Retrieves the download URL for a GitHub Actions artifact with retry logic.
.DESCRIPTION
Uses the GitHub CLI to fetch artifact information from the GitHub API with automatic retries.
Falls back to returning $null if all attempts fail.
.PARAMETER ArtifactName
The name of the artifact to retrieve the download URL for.
.PARAMETER Repository
The GitHub repository in the format "owner/repo".
.PARAMETER RunId
The GitHub Actions workflow run ID.
.PARAMETER MaxRetries
Maximum number of retry attempts. Default is 3.
.PARAMETER DelaySeconds
Delay in seconds between retry attempts. Default is 2.
.EXAMPLE
Get-ArtifactDownloadUrl -ArtifactName "cmder.zip" -Repository "cmderdev/cmder" -RunId "123456789"
.EXAMPLE
Get-ArtifactDownloadUrl -ArtifactName "build-output" -Repository "owner/repo" -RunId "987654321" -MaxRetries 5 -DelaySeconds 3
#>
param(
[Parameter(Mandatory = $true)]
[string]$ArtifactName,
[Parameter(Mandatory = $true)]
[string]$Repository,
[Parameter(Mandatory = $true)]
[string]$RunId,
[int]$MaxRetries = 3,
[int]$DelaySeconds = 2
)
for ($i = 0; $i -lt $MaxRetries; $i++) {
try {
# Use GitHub CLI to get artifact information
$artifactsJson = gh api "repos/$Repository/actions/runs/$RunId/artifacts" --jq ".artifacts[] | select(.name == `"$ArtifactName`")"
if ($artifactsJson) {
$artifact = $artifactsJson | ConvertFrom-Json
if ($artifact.id) {
# Construct browser-accessible GitHub Actions artifact download URL
# Format: https://github.com/owner/repo/actions/runs/{run_id}/artifacts/{artifact_id}
return "https://github.com/$Repository/actions/runs/$RunId/artifacts/$($artifact.id)"
}
}
} catch {
Write-Host "Attempt $($i + 1) failed to get artifact URL for $ArtifactName : $_"
}
if ($i -lt ($MaxRetries - 1)) {
Start-Sleep -Seconds $DelaySeconds
}
}
return $null
}