feat: Enhance CI workflow with diagnostics and artifact management
- Added workflow_dispatch inputs for customizable build types and artifact uploads. - Implemented detailed diagnostics for vcpkg setup, build processes, and post-build checks on Windows. - Enhanced error handling and reporting for vcpkg-related issues during builds. - Improved artifact upload conditions and added summary information for better visibility in CI results.
This commit is contained in:
198
.github/workflows/ci.yml
vendored
198
.github/workflows/ci.yml
vendored
@@ -17,9 +17,30 @@ on:
|
|||||||
- 'cmake/**'
|
- 'cmake/**'
|
||||||
- 'CMakeLists.txt'
|
- 'CMakeLists.txt'
|
||||||
- '.github/workflows/**'
|
- '.github/workflows/**'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
build_type:
|
||||||
|
description: 'Build Type (Debug, Release, RelWithDebInfo)'
|
||||||
|
required: false
|
||||||
|
default: 'RelWithDebInfo'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- Debug
|
||||||
|
- Release
|
||||||
|
- RelWithDebInfo
|
||||||
|
run_sanitizers:
|
||||||
|
description: 'Run memory sanitizers'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
upload_artifacts:
|
||||||
|
description: 'Upload build artifacts'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
env:
|
env:
|
||||||
BUILD_TYPE: RelWithDebInfo
|
BUILD_TYPE: ${{ github.event.inputs.build_type || 'RelWithDebInfo' }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-test:
|
build-and-test:
|
||||||
@@ -48,7 +69,20 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Set up vcpkg (Windows only)
|
- name: Setup vcpkg Cache (Windows)
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/vcpkg
|
||||||
|
!${{ github.workspace }}/vcpkg/buildtrees
|
||||||
|
!${{ github.workspace }}/vcpkg/packages
|
||||||
|
!${{ github.workspace }}/vcpkg/downloads
|
||||||
|
key: vcpkg-${{ runner.os }}-${{ hashFiles('vcpkg.json') }}
|
||||||
|
restore-keys: |
|
||||||
|
vcpkg-${{ runner.os }}-
|
||||||
|
|
||||||
|
- name: Set up vcpkg (Windows)
|
||||||
if: runner.os == 'Windows'
|
if: runner.os == 'Windows'
|
||||||
uses: lukka/run-vcpkg@v11
|
uses: lukka/run-vcpkg@v11
|
||||||
id: vcpkg
|
id: vcpkg
|
||||||
@@ -61,7 +95,7 @@ jobs:
|
|||||||
vcpkgGitCommitId: 'a42af01b72c28a8e1d7b48107b33e4f286a55ef6' # 2024.07.12 release
|
vcpkgGitCommitId: 'a42af01b72c28a8e1d7b48107b33e4f286a55ef6' # 2024.07.12 release
|
||||||
runVcpkgInstall: false # Let CMake handle installation via manifest mode
|
runVcpkgInstall: false # Let CMake handle installation via manifest mode
|
||||||
|
|
||||||
- name: Retry vcpkg setup (Windows only)
|
- name: Retry vcpkg setup (Windows)
|
||||||
if: runner.os == 'Windows' && steps.vcpkg.outcome == 'failure'
|
if: runner.os == 'Windows' && steps.vcpkg.outcome == 'failure'
|
||||||
uses: lukka/run-vcpkg@v11
|
uses: lukka/run-vcpkg@v11
|
||||||
env:
|
env:
|
||||||
@@ -72,6 +106,24 @@ jobs:
|
|||||||
vcpkgGitCommitId: 'a42af01b72c28a8e1d7b48107b33e4f286a55ef6'
|
vcpkgGitCommitId: 'a42af01b72c28a8e1d7b48107b33e4f286a55ef6'
|
||||||
runVcpkgInstall: false
|
runVcpkgInstall: false
|
||||||
doNotUpdateVcpkg: true # Use existing clone on retry
|
doNotUpdateVcpkg: true # Use existing clone on retry
|
||||||
|
|
||||||
|
- name: Diagnose vcpkg (Windows)
|
||||||
|
if: runner.os == 'Windows' && (steps.vcpkg.outcome == 'failure' || steps.vcpkg.outcome == 'success')
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
Write-Host "=== vcpkg Diagnostics ===" -ForegroundColor Cyan
|
||||||
|
Write-Host "vcpkg directory: ${{ github.workspace }}/vcpkg"
|
||||||
|
|
||||||
|
if (Test-Path "${{ github.workspace }}/vcpkg/vcpkg.exe") {
|
||||||
|
Write-Host "✅ vcpkg.exe found" -ForegroundColor Green
|
||||||
|
& "${{ github.workspace }}/vcpkg/vcpkg.exe" version
|
||||||
|
} else {
|
||||||
|
Write-Host "❌ vcpkg.exe not found" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "`nEnvironment:" -ForegroundColor Cyan
|
||||||
|
Write-Host "VCPKG_DEFAULT_TRIPLET: $env:VCPKG_DEFAULT_TRIPLET"
|
||||||
|
Write-Host "Workspace: ${{ github.workspace }}"
|
||||||
|
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
id: deps
|
id: deps
|
||||||
@@ -116,6 +168,44 @@ jobs:
|
|||||||
brew install ninja pkg-config
|
brew install ninja pkg-config
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: Pre-configure Diagnostics (Windows)
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
Write-Host "=== Pre-configure Diagnostics ===" -ForegroundColor Cyan
|
||||||
|
Write-Host "Build Type: ${{ env.BUILD_TYPE }}"
|
||||||
|
Write-Host "Workspace: ${{ github.workspace }}"
|
||||||
|
|
||||||
|
# Check Visual Studio installation
|
||||||
|
$vsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
||||||
|
if (Test-Path $vsWhere) {
|
||||||
|
Write-Host "`nVisual Studio Installation:" -ForegroundColor Cyan
|
||||||
|
& $vsWhere -latest -property displayName
|
||||||
|
& $vsWhere -latest -property installationVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check CMake
|
||||||
|
Write-Host "`nCMake Version:" -ForegroundColor Cyan
|
||||||
|
cmake --version
|
||||||
|
|
||||||
|
# Verify vcpkg toolchain
|
||||||
|
$toolchain = "${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake"
|
||||||
|
if (Test-Path $toolchain) {
|
||||||
|
Write-Host "✅ vcpkg toolchain found at: $toolchain" -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host "⚠️ vcpkg toolchain not found at: $toolchain" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show vcpkg manifest
|
||||||
|
if (Test-Path "vcpkg.json") {
|
||||||
|
Write-Host "`nvcpkg.json contents:" -ForegroundColor Cyan
|
||||||
|
Get-Content "vcpkg.json" | Write-Host
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show available disk space
|
||||||
|
Write-Host "`nDisk Space:" -ForegroundColor Cyan
|
||||||
|
Get-PSDrive C | Select-Object Used,Free | Format-Table -AutoSize
|
||||||
|
|
||||||
- name: Configure
|
- name: Configure
|
||||||
id: configure
|
id: configure
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -125,11 +215,13 @@ jobs:
|
|||||||
set -e
|
set -e
|
||||||
echo "::group::CMake Configuration"
|
echo "::group::CMake Configuration"
|
||||||
if [[ "${{ runner.os }}" == "Windows" ]]; then
|
if [[ "${{ runner.os }}" == "Windows" ]]; then
|
||||||
|
# Windows-specific configuration with enhanced error handling
|
||||||
cmake -B build -G "Visual Studio 17 2022" -A x64 \
|
cmake -B build -G "Visual Studio 17 2022" -A x64 \
|
||||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||||
-DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
-DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
||||||
-DVCPKG_TARGET_TRIPLET=x64-windows-static \
|
-DVCPKG_TARGET_TRIPLET=x64-windows-static \
|
||||||
-DVCPKG_MANIFEST_MODE=ON \
|
-DVCPKG_MANIFEST_MODE=ON \
|
||||||
|
-DVCPKG_INSTALL_OPTIONS="--debug" \
|
||||||
-DYAZE_MINIMAL_BUILD=ON \
|
-DYAZE_MINIMAL_BUILD=ON \
|
||||||
-DYAZE_ENABLE_ROM_TESTS=OFF 2>&1 | tee cmake_config.log
|
-DYAZE_ENABLE_ROM_TESTS=OFF 2>&1 | tee cmake_config.log
|
||||||
else
|
else
|
||||||
@@ -177,6 +269,77 @@ jobs:
|
|||||||
grep -i "error" build.log | head -20 || true
|
grep -i "error" build.log | head -20 || true
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: Windows Build Diagnostics
|
||||||
|
if: failure() && runner.os == 'Windows' && steps.build.outcome == 'failure'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
Write-Host "=== Windows Build Diagnostics ===" -ForegroundColor Red
|
||||||
|
|
||||||
|
# Check for vcpkg-related errors
|
||||||
|
if (Select-String -Path "build.log" -Pattern "vcpkg" -Quiet) {
|
||||||
|
Write-Host "`nvcpkg-related errors found:" -ForegroundColor Yellow
|
||||||
|
Select-String -Path "build.log" -Pattern "vcpkg.*error" -CaseSensitive:$false | Select-Object -First 10
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check for linker errors
|
||||||
|
if (Select-String -Path "build.log" -Pattern "LNK[0-9]{4}" -Quiet) {
|
||||||
|
Write-Host "`nLinker errors found:" -ForegroundColor Yellow
|
||||||
|
Select-String -Path "build.log" -Pattern "LNK[0-9]{4}" | Select-Object -First 10
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check for missing dependencies
|
||||||
|
if (Select-String -Path "build.log" -Pattern "fatal error.*No such file" -Quiet) {
|
||||||
|
Write-Host "`nMissing file errors found:" -ForegroundColor Yellow
|
||||||
|
Select-String -Path "build.log" -Pattern "fatal error.*No such file" | Select-Object -First 10
|
||||||
|
}
|
||||||
|
|
||||||
|
# List vcpkg installed packages if available
|
||||||
|
$vcpkgExe = "${{ github.workspace }}/vcpkg/vcpkg.exe"
|
||||||
|
if (Test-Path $vcpkgExe) {
|
||||||
|
Write-Host "`nInstalled vcpkg packages:" -ForegroundColor Cyan
|
||||||
|
& $vcpkgExe list
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Post-Build Diagnostics (Windows)
|
||||||
|
if: runner.os == 'Windows' && steps.build.outcome == 'success'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
Write-Host "=== Post-Build Diagnostics ===" -ForegroundColor Green
|
||||||
|
|
||||||
|
$binPath = "build/bin/${{ env.BUILD_TYPE }}"
|
||||||
|
if (Test-Path $binPath) {
|
||||||
|
Write-Host "`nBuilt executables and libraries:" -ForegroundColor Cyan
|
||||||
|
Get-ChildItem -Path $binPath -Include *.exe,*.dll -Recurse | ForEach-Object {
|
||||||
|
$size = [math]::Round($_.Length / 1MB, 2)
|
||||||
|
Write-Host " $($_.Name) - ${size} MB"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check for specific yaze executable
|
||||||
|
if (Test-Path "$binPath/yaze.exe") {
|
||||||
|
Write-Host "`n✅ yaze.exe successfully built" -ForegroundColor Green
|
||||||
|
$yazeSize = [math]::Round((Get-Item "$binPath/yaze.exe").Length / 1MB, 2)
|
||||||
|
Write-Host " Size: ${yazeSize} MB"
|
||||||
|
} else {
|
||||||
|
Write-Host "`n⚠️ yaze.exe not found" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "⚠️ Build output directory not found: $binPath" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Upload Build Artifacts (Windows)
|
||||||
|
if: |
|
||||||
|
runner.os == 'Windows' &&
|
||||||
|
steps.build.outcome == 'success' &&
|
||||||
|
(github.event.inputs.upload_artifacts == 'true' || github.event_name == 'push')
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: yaze-windows-ci-${{ github.run_number }}
|
||||||
|
path: |
|
||||||
|
build/bin/${{ env.BUILD_TYPE }}/*.exe
|
||||||
|
build/bin/${{ env.BUILD_TYPE }}/*.dll
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: 3
|
||||||
|
|
||||||
- name: Test (Core)
|
- name: Test (Core)
|
||||||
id: test_core
|
id: test_core
|
||||||
@@ -226,12 +389,28 @@ jobs:
|
|||||||
echo "## Build Summary - ${{ matrix.name }}" >> $GITHUB_STEP_SUMMARY
|
echo "## Build Summary - ${{ matrix.name }}" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
# Workflow trigger info
|
||||||
|
echo "### Workflow Information" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- **Trigger**: ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
||||||
|
echo "- **Manual Build Type**: ${{ github.event.inputs.build_type }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- **Upload Artifacts**: ${{ github.event.inputs.upload_artifacts }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- **Run Sanitizers**: ${{ github.event.inputs.run_sanitizers }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
# Configuration info
|
# Configuration info
|
||||||
echo "### Configuration" >> $GITHUB_STEP_SUMMARY
|
echo "### Configuration" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "- **Platform**: ${{ matrix.os }}" >> $GITHUB_STEP_SUMMARY
|
echo "- **Platform**: ${{ matrix.os }}" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "- **Compiler**: ${{ matrix.cc }}/${{ matrix.cxx }}" >> $GITHUB_STEP_SUMMARY
|
echo "- **Compiler**: ${{ matrix.cc }}/${{ matrix.cxx }}" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "- **Build Type**: ${{ env.BUILD_TYPE }}" >> $GITHUB_STEP_SUMMARY
|
echo "- **Build Type**: ${{ env.BUILD_TYPE }}" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "- **Minimal Build**: ON" >> $GITHUB_STEP_SUMMARY
|
echo "- **Minimal Build**: ON" >> $GITHUB_STEP_SUMMARY
|
||||||
|
if [[ "${{ runner.os }}" == "Windows" ]]; then
|
||||||
|
echo "- **vcpkg Triplet**: x64-windows-static" >> $GITHUB_STEP_SUMMARY
|
||||||
|
if [[ "${{ steps.vcpkg.outcome }}" != "" ]]; then
|
||||||
|
echo "- **vcpkg Setup**: ${{ steps.vcpkg.outcome }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
fi
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
# Build status
|
# Build status
|
||||||
@@ -263,6 +442,15 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
# Artifacts info
|
||||||
|
if [[ "${{ runner.os }}" == "Windows" && "${{ steps.build.outcome }}" == "success" ]]; then
|
||||||
|
if [[ "${{ github.event.inputs.upload_artifacts }}" == "true" || "${{ github.event_name }}" == "push" ]]; then
|
||||||
|
echo "### Artifacts" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- 📦 Windows build artifacts uploaded: yaze-windows-ci-${{ github.run_number }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Test results
|
# Test results
|
||||||
if [ -f build/core_test_results.xml ]; then
|
if [ -f build/core_test_results.xml ]; then
|
||||||
echo "### Test Results" >> $GITHUB_STEP_SUMMARY
|
echo "### Test Results" >> $GITHUB_STEP_SUMMARY
|
||||||
@@ -300,7 +488,9 @@ jobs:
|
|||||||
memory-sanitizer:
|
memory-sanitizer:
|
||||||
name: "🔬 Memory Sanitizer"
|
name: "🔬 Memory Sanitizer"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
if: github.event_name == 'pull_request'
|
if: |
|
||||||
|
github.event_name == 'pull_request' ||
|
||||||
|
(github.event_name == 'workflow_dispatch' && github.event.inputs.run_sanitizers == 'true')
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|||||||
Reference in New Issue
Block a user