diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2b71a75cd..40ca5baf8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,17 +42,60 @@ jobs: - name: Summary - Repository checkout shell: pwsh run: | - echo "## ๐Ÿ“ฆ Build Cmder - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "### Repository Information" >> $env:GITHUB_STEP_SUMMARY - echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY - echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY - echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Actor | @${{ github.actor }} |" >> $env:GITHUB_STEP_SUMMARY - echo "| Workflow | \`${{ github.workflow }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + # Get Cmder version + . scripts/utils.ps1 + $cmderVersion = Get-VersionStr + $buildTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") + + # Determine branch link (handle PR merge refs) + $branchName = "${{ github.ref_name }}" + $branchLink = "" + if ($branchName -match '^(\d+)/(merge|head)$') { + # This is a PR merge/head ref, link to the PR + $prNumber = $Matches[1] + $branchLink = "https://github.com/${{ github.repository }}/pull/$prNumber" + } elseif ("${{ github.event_name }}" -eq "pull_request") { + # This is a pull request event, link to the PR + $branchLink = "https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}" + } else { + # Regular branch, link to the branch tree + $branchLink = "https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}" + } + + $summary = @" + ## ๐Ÿ“ฆ Build Cmder - Workflow Summary + + Build started: $buildTime + + ### Repository Information + | Property | Value | + | --- | --- | + | Repository | [``${{ github.repository }}``](https://github.com/${{ github.repository }}) | + | Branch | [``$branchName``]($branchLink) | + | 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 + | Package | Version | + | --- | --- | + "@ + + # Read vendor sources.json and add to summary + $vendorSources = Get-Content "vendor/sources.json" | ConvertFrom-Json + if ($vendorSources.Count -eq 0) { + $summary += "`n| _No vendor packages found_ | |" + } else { + foreach ($vendor in $vendorSources) { + $summary += "`n| ``$($vendor.name)`` | $($vendor.version) |" + } + } + $summary += "`n" + + $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Add MSBuild to PATH uses: microsoft/setup-msbuild@v2 @@ -66,36 +109,21 @@ jobs: if: success() shell: pwsh run: | - echo "### โœ… Build Status" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "Cmder launcher successfully compiled." >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + @" + + --- + + ### Build Status + + โœ… Cmder built successfully. + + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Pack the built files shell: pwsh working-directory: scripts 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) uses: actions/upload-artifact@v5 with: @@ -124,15 +152,82 @@ jobs: - name: Summary - Artifacts uploaded if: success() shell: pwsh + env: + GH_TOKEN: ${{ github.token }} run: | - echo "### โ˜๏ธ Upload Status" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "All artifacts successfully uploaded to GitHub Actions:" >> $env:GITHUB_STEP_SUMMARY - echo "- โœ… \`cmder.zip\`" >> $env:GITHUB_STEP_SUMMARY - echo "- โœ… \`cmder.7z\`" >> $env:GITHUB_STEP_SUMMARY - echo "- โœ… \`cmder_mini.zip\`" >> $env:GITHUB_STEP_SUMMARY - echo "- โœ… \`hashes.txt\`" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + $summary = @" + + --- + + ### ๐Ÿ—ƒ๏ธ Artifacts + + | Artifact | Size | Download | Hash (SHA256) | + | --- | --- | --- | --- | + "@ + + # Function to get artifact download URL with retry logic + function Get-ArtifactDownloadUrl { + param( + [string]$ArtifactName, + [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/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts" --jq ".artifacts[] | select(.name == `"$ArtifactName`")" + + if ($artifactsJson) { + $artifact = $artifactsJson | ConvertFrom-Json + if ($artifact.archive_download_url) { + return $artifact.archive_download_url + } + } + } catch { + Write-Host "Attempt $($i + 1) failed to get artifact URL for $ArtifactName : $_" + } + + if ($i -lt ($MaxRetries - 1)) { + Start-Sleep -Seconds $DelaySeconds + } + } + + return $null + } + + $artifacts = @("cmder.zip", "cmder.7z", "cmder_mini.zip", "hashes.txt") + foreach ($artifact in $artifacts) { + $path = "build/$artifact" + if (Test-Path $path) { + $size = (Get-Item $path).Length / 1MB + $hash = (Get-FileHash $path -Algorithm SHA256).Hash + + # Try to get the actual artifact download URL + $downloadUrl = Get-ArtifactDownloadUrl -ArtifactName $artifact + $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|7z)$') { + $emoji = "๐Ÿ—„๏ธ" + } else { + $emoji = "๐Ÿ“ฆ" + } + + $summary += "`n| $emoji ``$artifact`` | $([math]::Round($size, 2)) MB | [๐Ÿ“ฅ Download$warning]($downloadUrl) | ``$hash`` |" + } + } + $summary += "`n" + + $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Create Release uses: softprops/action-gh-release@v2 @@ -150,13 +245,18 @@ jobs: if: startsWith(github.ref, 'refs/tags/') shell: pwsh run: | - echo "### ๐Ÿš€ Release Information" >> $env:GITHUB_STEP_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. + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 16ebd4072..30052d7eb 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -50,17 +50,19 @@ jobs: - name: Summary - CodeQL analysis started shell: pwsh run: | - echo "## ๐Ÿ”’ CodeQL Security Analysis - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "### Analysis Configuration" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY - echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY - echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Language | \`${{ matrix.language }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + @" + ## ๐Ÿ”’ CodeQL Security Analysis - Workflow Summary + + ### Analysis Configuration + + | Property | Value | + | --- | --- | + | Repository | ``${{ github.repository }}`` | + | Branch | ``${{ github.ref_name }}`` | + | Language | ``${{ matrix.language }}`` | + | Commit | ``${{ github.sha }}`` | + + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL @@ -86,10 +88,12 @@ jobs: if: success() shell: pwsh run: | - echo "### โœ… Build Completed" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "Cmder launcher built successfully for CodeQL analysis." >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + @" + ### โœ… Build Completed + + Cmder launcher built successfully for CodeQL analysis. + + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 @@ -100,10 +104,12 @@ jobs: if: success() shell: pwsh run: | - echo "### ๐Ÿ” CodeQL Analysis Results" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "โœ… CodeQL security analysis completed successfully." >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "**Language analyzed:** \`${{ matrix.language }}\`" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "> Check the Security tab for detailed findings and recommendations." >> $env:GITHUB_STEP_SUMMARY + @" + ### ๐Ÿ” CodeQL Analysis Results + + โœ… CodeQL security analysis completed successfully. + + **Language analyzed:** ``${{ matrix.language }}`` + + > Check the Security tab for detailed findings and recommendations. + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5110ab18d..043b15860 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -43,16 +43,25 @@ jobs: - name: Summary - Test execution started shell: pwsh run: | - echo "## ๐Ÿงช Run Tests - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "### Test Environment" >> $env:GITHUB_STEP_SUMMARY - echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY - echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY - echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "| Runner OS | \`${{ runner.os }}\` |" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + # Get Cmder version + . scripts/utils.ps1 + $cmderVersion = Get-VersionStr + + @" + ## โœ… Run Tests - Workflow Summary + + ### Test Environment + | Property | Value | + | --- | --- | + | 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 }}`` | + + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Initialize vendors shell: pwsh @@ -63,21 +72,49 @@ jobs: if: success() shell: pwsh run: | - echo "### โš™๏ธ Vendor Initialization" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "โœ… Vendor dependencies initialized successfully." >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + # Get vendor versions from sources.json + $vendorInfo = @() + $sources = Get-Content "sources.json" -Raw | ConvertFrom-Json + $vendorDirs = $sources.PSObject.Properties | ForEach-Object { $_.Name } + foreach ($dir in $vendorDirs) { + $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) { + "_No vendor version information available._" + } else { + $vendorInfo -join "`n" + } + ) + + "@ + + $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Summary - Test results table header if: success() shell: pwsh run: | - echo "### ๐Ÿ“‹ Test Results" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "| Test | Status |" >> $env:GITHUB_STEP_SUMMARY - echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY + @" + ### ๐Ÿ“‹ Test Results + + | Test | Status | Duration | + | --- | --- | --- | + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Testing Clink Shell + id: test-clink run: | cmd /c vendor\init.bat /v /d /t @@ -85,8 +122,9 @@ jobs: if: success() shell: pwsh run: | - echo "| Clink Shell | โœ… Passed |" >> $env:GITHUB_STEP_SUMMARY + "| Clink Shell | โœ… Passed | Cmd shell initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Testing PowerShell + id: test-powershell run: | PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'" @@ -94,8 +132,9 @@ jobs: if: success() shell: pwsh run: | - echo "| PowerShell | โœ… Passed |" >> $env:GITHUB_STEP_SUMMARY + "| PowerShell | โœ… Passed | Profile script execution |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Testing Bash + id: test-bash run: | bash vendor/cmder.sh @@ -103,13 +142,20 @@ jobs: if: success() shell: pwsh run: | - echo "| Bash | โœ… Passed |" >> $env:GITHUB_STEP_SUMMARY + "| Bash | โœ… Passed | Bash environment initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Summary - All tests completed if: success() shell: pwsh run: | - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "### โœ… All Tests Completed" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "All shell environments tested successfully!" >> $env:GITHUB_STEP_SUMMARY + @" + + ### โœ… All Tests Completed + + 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) + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 diff --git a/.github/workflows/vendor.yml b/.github/workflows/vendor.yml index 717e543db..6bdf80496 100644 --- a/.github/workflows/vendor.yml +++ b/.github/workflows/vendor.yml @@ -31,10 +31,12 @@ jobs: - name: Summary - Workflow started shell: pwsh run: | - echo "## ๐Ÿ“ฆ Update Vendor - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "Checking for vendor dependency updates..." >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + @" + ## ๐Ÿ“ฆ Update Vendor - Workflow Summary + + Checking for vendor dependency updates... + + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - id: make-changes name: Checking for updates @@ -64,17 +66,21 @@ jobs: 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 + @" + ### โœ… No Updates Available + + All vendor dependencies are up to date. + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 } 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 - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "$env:UPDATE_MESSAGE" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY + @" + ### ๐Ÿ”„ Updates Found + + **$count** vendor $word updated: + + $env:UPDATE_MESSAGE + + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 } - uses: peter-evans/create-pull-request@v7 @@ -94,12 +100,14 @@ jobs: if: env.COUNT_UPDATED > 0 shell: pwsh run: | - echo "### ๐ŸŽ‰ Pull Request Created" >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "A pull request has been created to update the vendor dependencies." >> $env:GITHUB_STEP_SUMMARY - echo "" >> $env:GITHUB_STEP_SUMMARY - echo "**Branch:** \`update-vendor\`" >> $env:GITHUB_STEP_SUMMARY - 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 + @" + ### ๐ŸŽ‰ Pull Request Created + + A pull request has been created to update the vendor dependencies. + + **Branch:** ``update-vendor`` + + **Updated dependencies:** $env:LIST_UPDATED + + > Please review and merge the pull request to apply the updates. + "@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8