summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdonais Romero González <[email protected]>2022-08-26 14:48:11 -0700
committerGitHub <[email protected]>2022-08-26 14:48:11 -0700
commitd504c54cf595e9185617a3e611e417617be8c0b8 (patch)
treef0d7d3e09abe2cf55ad646380488c8cde685f727
parent73c55fdc2e3d407ee39521ff4a1b2ea6791f134e (diff)
Add CI workflows for building and validating driver samples (#775)
* Add scripts to build a set of samples, as well as individual solution folders. * Add GitHub workflows to use these scripts and build all samples on push and changed samples on pull request. For now samples will be built under Windows 2019 but eventually workflow will be moved to run under Windows 2022.
-rw-r--r--.github/scripts/Build-ChangedProjects.ps134
-rw-r--r--.github/workflows/ci-pr.yml40
-rw-r--r--.github/workflows/ci.yml35
-rw-r--r--.gitignore6
-rw-r--r--Build-AllProjects.ps115
-rw-r--r--Build-Project.ps164
-rw-r--r--Build-ProjectSet.ps138
-rw-r--r--exclusions.csv15
8 files changed, 246 insertions, 1 deletions
diff --git a/.github/scripts/Build-ChangedProjects.ps1 b/.github/scripts/Build-ChangedProjects.ps1
new file mode 100644
index 00000000..e163e5f9
--- /dev/null
+++ b/.github/scripts/Build-ChangedProjects.ps1
@@ -0,0 +1,34 @@
+param (
+ [array]$ChangedFiles
+)
+
+$root = (Get-Location).Path
+
+# To include in CI gate
+$projectSet = @{}
+foreach ($file in $ChangedFiles)
+{
+ if (-not (Test-Path $file)) {
+ Write-Output "❔ Changed file $file cannot be found"
+ continue
+ }
+ $dir = (Get-Item $file).DirectoryName
+ while ((-not ($slnItems = (Get-ChildItem $dir '*.sln'))) -and ($dir -ne $root))
+ {
+ $dir = (Get-Item $dir).Parent.FullName
+ }
+ if ($dir -eq $root)
+ {
+ Write-Output "❔ Changed file $file does not match a project."
+ continue
+ }
+ $projectName = $dir.Replace($root, '').Trim('\').Replace('\', '.').ToLower()
+ Write-Output "🔎 Found project [$projectName] at $dir from changed file $file"
+ if (-not ($projectSet.ContainsKey($projectName)))
+ {
+ $projectSet[$projectName] = $dir
+ }
+}
+
+.\Build-ProjectSet -ProjectSet $projectSet
+
diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml
new file mode 100644
index 00000000..12062b34
--- /dev/null
+++ b/.github/workflows/ci-pr.yml
@@ -0,0 +1,40 @@
+name: Build changes to driver samples
+on:
+ pull_request:
+ branches:
+ - main
+ - develop
+ paths-ignore:
+ - '**.md'
+ - 'LICENSE'
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ configuration: [Debug, Release]
+ platform: [x64, arm64]
+ runs-on: windows-2019
+ env:
+ Solution_Path: general\echo\kmdf\kmdfecho.sln
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v3
+ with:
+ submodules: 'recursive'
+
+ - name: Add MSBuild to PATH
+ uses: microsoft/[email protected]
+
+ - name: Get changed files
+ id: get-changed-files
+ uses: tj-actions/changed-files@v27
+
+ - name: Retrieve and build solutions from changed files
+ id: build-changed-projects
+ run: |
+ $changedFiles = "${{ steps.get-changed-files.outputs.all_changed_files }}".Split(' ')
+ .\.github\scripts\Build-ChangedProjects.ps1 -ChangedFiles $changedFiles
+ env:
+ Configuration: ${{ matrix.configuration }}
+ Platform: ${{ matrix.platform }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..68b46552
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,35 @@
+name: Build all driver samples
+on:
+ push:
+ branches:
+ - main
+ - develop
+ paths-ignore:
+ - '**.md'
+ - 'LICENSE'
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ configuration: [Debug, Release]
+ platform: [x64, arm64]
+ runs-on: windows-2019
+ env:
+ Solution_Path: general\echo\kmdf\kmdfecho.sln
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v3
+ with:
+ submodules: 'recursive'
+
+ - name: Add MSBuild to PATH
+ uses: microsoft/[email protected]
+
+ - name: Retrieve and build all available solutions
+ id: build-all-projects
+ run: |
+ .\Build-AllProjects.ps1
+ env:
+ Configuration: ${{ matrix.configuration }}
+ Platform: ${{ matrix.platform }}
diff --git a/.gitignore b/.gitignore
index f227925f..995bfc8e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,9 +20,12 @@ bld/
[Bb]in/
[Oo]bj/
-# Visual Studo 2015 cache/options directory
+# Visual Studio 2015 cache/options directory
.vs/
+# Visual Studio Code directory
+.vscode/
+
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
@@ -54,6 +57,7 @@ dlldata.c
*.tmp
*.tmp_proj
*.log
+*.tlog
*.vspscc
*.vssscc
.builds
diff --git a/Build-AllProjects.ps1 b/Build-AllProjects.ps1
new file mode 100644
index 00000000..4738907c
--- /dev/null
+++ b/Build-AllProjects.ps1
@@ -0,0 +1,15 @@
+$root = Get-Location
+$solutionFiles = Get-ChildItem -Path $root -Recurse -Filter *.sln | Select-Object -ExpandProperty FullName
+
+# To include in CI gate
+$projectSet = @{}
+foreach ($file in $solutionFiles)
+{
+ $dir = (Get-Item $file).DirectoryName
+ $dir_norm = $dir.Replace($root, '').Trim('\').Replace('\', '.').ToLower()
+ echo "🔎 Found project [$dir_norm] at $dir"
+ $projectSet[$dir_norm] = $dir
+}
+
+.\Build-ProjectSet -ProjectSet $projectSet
+
diff --git a/Build-Project.ps1 b/Build-Project.ps1
new file mode 100644
index 00000000..1f79b679
--- /dev/null
+++ b/Build-Project.ps1
@@ -0,0 +1,64 @@
+param(
+ $Directory,
+ [string]$ProjectName,
+ $LogFilesDirectory = "_logfiles",
+ [string]$Configuration = "Debug",
+ [string]$Platform = "x64"
+)
+
+# TODO Validate $Directory and $LogFilesDirectory
+New-Item -ItemType Directory -Force -Path $LogFilesDirectory | Out-Null
+
+if ([string]::IsNullOrWhitespace($ProjectName))
+{
+ $ProjectName = (Resolve-Path $Directory).Path.Replace((Get-Location), '').Replace('\', '.').Trim('.').ToLower()
+}
+
+$solutionFile = Get-ChildItem -Path $Directory -Filter *.sln | Select-Object -ExpandProperty FullName -First 1
+
+$configurationIsSupported = $false
+$inSolutionConfigurationPlatformsSection = $false
+foreach ($line in Get-Content -Path $solutionFile)
+{
+ if (-not $inSolutionConfigurationPlatformsSection -and $line -match "\s*GlobalSection\(SolutionConfigurationPlatforms\).*")
+ {
+ $inSolutionConfigurationPlatformsSection = $true;
+ continue;
+ }
+ elseif ($line -match "\s*EndGlobalSection.*")
+ {
+ $inSolutionConfigurationPlatformsSection = $false;
+ continue;
+ }
+
+ if ($inSolutionConfigurationPlatformsSection)
+ {
+ [regex]$regex = ".*=\s*(?<ConfigString>(?<Configuration>.*)\|(?<Platform>.*))\s*"
+ $match = $regex.Match($line)
+ if ([string]::IsNullOrWhiteSpace($match.Groups["ConfigString"].Value) -or [string]::IsNullOrWhiteSpace($match.Groups["Platform"].Value))
+ {
+ Write-Warning "Could not parse configuration entry $line from file $solutionFile."
+ continue;
+ }
+ if ($match.Groups["Configuration"].Value.Trim() -eq $Configuration -and $match.Groups["Platform"].Value.Trim() -eq $Platform)
+ {
+ $configurationIsSupported = $true;
+ }
+ }
+}
+
+if (-not $configurationIsSupported)
+{
+ Write-Output "[$ProjectName] ⏩ Skipped. Configuration $Configuration|$Platform not supported."
+ exit 0
+}
+
+$errorLogFilePath = "$LogFilesDirectory\$ProjectName.err"
+$warnLogFilePath = "$LogFilesDirectory\$ProjectName.wrn"
+Write-Output "[$ProjectName] ⚒️ Building project..."
+msbuild $solutionFile -clp:Verbosity=m -t:clean,build -property:Configuration=$Configuration -property:Platform=$Platform -p:TargetVersion=Windows10 -p:InfVerif_AdditionalOptions="/msft /sw1205 /sw1324 /sw1420 /sw1421" -p:SignToolWS=/fdws -p:DriverCFlagAddOn=/wd4996 -flp1:errorsonly`;logfile=$errorLogFilePath -flp2:WarningsOnly`;logfile=$warnLogFilePath -noLogo
+if ($LASTEXITCODE -ne 0)
+{
+ Write-Warning "❌ Build failed. Log available at $errorLogFilePath"
+ exit 1
+}
diff --git a/Build-ProjectSet.ps1 b/Build-ProjectSet.ps1
new file mode 100644
index 00000000..57c4ac32
--- /dev/null
+++ b/Build-ProjectSet.ps1
@@ -0,0 +1,38 @@
+param(
+ [hashtable]$ProjectSet,
+ [string]$Configuration = $env:Configuration,
+ [string]$Platform = $env:Platform
+)
+
+#TODO validate params
+
+$exclusionsSet = @{}
+$failSet = @()
+Import-Csv 'exclusions.csv' | ForEach-Object {
+ $exclusionsSet[$_.Path.Replace($root, '').Trim('\').Replace('\', '.').ToLower()] = $_.Reason
+}
+
+$ProjectSet.GetEnumerator() | ForEach-Object {
+ $projectName = $_.Key
+ if ($exclusionsSet.ContainsKey($projectName))
+ {
+ Write-Output "[$projectName] ⏩ Excluded and skipped. Reason: $($exclusionsSet[$projectName])"
+ return;
+ }
+ $directory = $_.Value
+ .\Build-Project -Directory $directory -ProjectName $ProjectName -Configuration $Configuration -Platform $Platform
+ if ($LASTEXITCODE -ne 0)
+ {
+ $failSet += $ProjectName
+ }
+}
+
+if ($failSet.Count -gt 0)
+{
+ Write-Output "Some projects were built with errors:"
+ foreach ($failedProject in $failSet)
+ {
+ Write-Output "$failedProject"
+ }
+ Write-Error "Some projects were built with errors."
+} \ No newline at end of file
diff --git a/exclusions.csv b/exclusions.csv
new file mode 100644
index 00000000..71b0edf3
--- /dev/null
+++ b/exclusions.csv
@@ -0,0 +1,15 @@
+Path,Reason
+general\dchu\osrfx2_dchu_base,Wrong Toolset - needs migration
+general\dchu\osrfx2_dchu_extension_loose,Needs fix for project not found
+general\dchu\osrfx2_dchu_extension_tight,Wrong Toolset - needs migration
+general\filehistory,Deprecated APIs
+general\simplemediasource,ARM64 LNK1181: cannot open input file 'SimpleMediaSource.lib'
+general\winhec 2017 lab\toaster driver,Needs input from end user
+general\winhec 2017 lab\toaster support app,Needs input from end user
+network\trans\stmedit,Invalid Win32 architecture
+network\trans\wfpsampler,Missing INF section; missing libs
+network\wlan\wdi,Invalid architecture
+print\oem printer customization plug-in samples\c++,Invalid architecture
+print\v4printdriversamples\printerextensionsample,Invalid architecture
+tree,Missing headers
+video\indirectdisplay,ARM64 Warning C4530: C++ exception handler used, but unwind semantics are not enabled \ No newline at end of file