diff --git a/.github/workflows/check_wdk.yml b/.github/workflows/check_wdk.yml new file mode 100644 index 0000000000..82a3467e1e --- /dev/null +++ b/.github/workflows/check_wdk.yml @@ -0,0 +1,83 @@ +# Copyright (c) eBPF for Windows contributors +# SPDX-License-Identifier: MIT + +# This workflow checks for Windows Driver Kit updates and files issues when updates are needed. + +name: Check for updates to the Windows Driver Kit + +on: + # Run script every Sunday at midnight + schedule: + - cron: '0 0 * * 0' + # Allow manual triggering of the script + workflow_dispatch: + +jobs: + check: + runs-on: Windows-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + + - name: Check for updates to the Windows Driver Kit + id: check_wdk + run: | + # Get the latest version of the Windows Driver Kit + $packageVersion = .\scripts\Get-LatestNugetPackageVersion.ps1 -PackageName "Microsoft.Windows.WDK.x64" + "wdk_version=$packageVersion" >> $env:GITHUB_OUTPUT + + - name: Check the version of the WDK in the repo + id: check_repo_wdk + run: | + $wdkVersion = (Get-Content -Path .\wdk.props | Select-String -Pattern "" | ForEach-Object { $_ -replace "", "" -replace "", "" }).trim() + "wdk_version=$wdkVersion" >> $env:GITHUB_OUTPUT + + - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea + if: steps.check_wdk.outputs.wdk_version != steps.check_repo_wdk.outputs.wdk_version + env: + TITLE: 'Update the Windows Driver Kit' + BODY: | + The Windows Driver Kit version in the repository does not match the latest version available on NuGet. Please update the WDK version in the repository to match the latest version available on NuGet. + The latest version is ${{steps.check_wdk.outputs.wdk_version}} and the version in the repository is ${{steps.check_repo_wdk.outputs.wdk_version}}. + To update the WDK run the following command: + ```powershell + .\scripts\Update-WdkVersion.ps1 + ``` + LABELS: bug,ci/cd + with: + script: | + const owner = process.env.GITHUB_REPOSITORY.split('/')[0] + const repo = process.env.GITHUB_REPOSITORY.split('/')[1] + const body = process.env.BODY; + const title = process.env.TITLE; + const labels = process.env.LABELS; + const label_array = labels ? labels.split(',') : []; + console.log(label_array); + // Get all issues that have these labels. + const opts = github.rest.issues.listForRepo.endpoint.merge({ + ...context.issue, + state: 'open', + labels: label_array, + }); + const issues = await github.paginate(opts); + // Look for an existing issue with the same title. + for (const issue of issues) { + if (issue.title === title) { + console.log(`Updating issue ${title}`); + await github.rest.issues.createComment({ + issue_number: issue.number, + owner, + repo, + body, + }); + return; + } + } + // Existing issue not found, create a new one. + console.log(`Creating issue ${title}`); + await github.rest.issues.create({ + owner: owner, + repo: repo, + title: title, + body: body, + labels: label_array, + }); diff --git a/scripts/Get-LatestNugetPackageVersion.ps1 b/scripts/Get-LatestNugetPackageVersion.ps1 new file mode 100644 index 0000000000..eab93f3d2a --- /dev/null +++ b/scripts/Get-LatestNugetPackageVersion.ps1 @@ -0,0 +1,49 @@ +# Copyright (c) eBPF for Windows contributors +# SPDX-License-Identifier: MIT + +param( + [string]$packageName +) + +<# +.SYNOPSIS +Get the latest version of a NuGet package. + +.DESCRIPTION +Queries the NuGet package manager for the latest version of a package. + +.PARAMETER packageName +The name of the package to query. + +.NOTES +This function requires the 'nuget' command to be available in the PATH. +#> + +function Get-LatestNugetPackageVersion( + [string]$packageName +) { + if ([string]::IsNullOrWhiteSpace($packageName)) { + throw "Package name cannot be empty" + } + + try { + $package = nuget list $packageName + if ($LASTEXITCODE -ne 0) { + throw "Failed to retrieve package information" + } + $packageLine = $package | Where-Object { $_ -match $packageName } + if (-not $packageLine) { + throw "Package '$packageName' not found" + } + if ($packageLine -is [array]) { + $packageLine = $packageLine[0] + } + $version = $packageLine -replace "$packageName\s+", "" + return $version + } catch { + throw "Failed to retrieve version of package '$packageName': $_" + } +} + +# Get the latest version of the Microsoft.Windows.WDK.x64 package +Get-LatestNugetPackageVersion $packageName \ No newline at end of file