概要
WDK 10.0.26100.1はNuGet経由でも取得できるようになり、WDK未インストールなビルドマシンでもCI/CDでドライバをビルドできます。いわゆるHosted Agentでもビルドできそうです。これは便利!
ところが、Azure PipelinesのVSBuildタスクでビルドすると、ApiValidatorがエラーを出すという罠に遭遇しました。それを解決した話です。
最初に結論まとめ
- 原因: VSBuildタスク既定のx86版MSBuildが、存在しない
x86\ApiValidator.exe
を探してコケる - 対策: VSBuildタスクに
msbuildArchitecture: 'x64'
を明示して、x64版MSBuildを使う
これで解決します。結果からいうと、WDKのNuGet版は、x86版のMSBuildでは動作しないようです。(少なくとも2025/9/18時点では)
YAMLのポイント部分
- task: VSBuild@1
inputs:
msbuildArchitecture: 'x64'
VSBuildのドキュメントはこちらです。
説明
さっそくNuGet版のWDKを入れて、ローカル(オンプレPC)でmsbuildでのビルドに成功しました。しかし、Azure PipelinesのVSBuildタスクで同じソリューションをビルドすると、ビルド自体は成功しているようですがその後のチェックでエラーが出ています。
ログはこんな感じでした。
[error] packages\Microsoft.Windows.WDK.x64.10.0.26100.4204\c\build\10.0.26100.0\WindowsDriver.common.targets(1996,5):
Error MSB3721: The command
"D:\a\1\s\packages\Microsoft.Windows.WDK.x64.10.0.26100.4204\c\bin\10.0.26100.0\x86\ApiValidator.exe"
-DriverPackagePath:D:\a\1\s\x64\Debug\MyDriver.sys
-SupportedApiXmlFiles:D:\a\1\s\packages\Microsoft.Windows.WDK.x64.10.0.26100.4204\c\build\10.0.26100.0\universalDDIs\x64\UniversalDDIs.xml
-ModuleWhiteListXmlFiles:D:\a\1\s\packages\Microsoft.Windows.WDK.x64.10.0.26100.4204\c\build\10.0.26100.0\universalDDIs\x64\ModuleWhiteList.xml
-ApiExtractorExePath:D:\a\1\s\packages\Microsoft.Windows.WDK.x64.10.0.26100.4204\c\bin\10.0.26100.0\x86
" exited with code 1.
これだけだとアプリケーション終了コード1を返してエラーで終わったことしか分かりませんが、成功しているローカル環境と比べるなどして切り分けていったところ、原因が見えてきました。
切り分け結果
- WDK 10.0.26100.1のNuGetパッケージ構成を見ると、
x64\ApiValidator.exe
はあるがx86\ApiValidator.exe
は無い - ローカル成功ケース:
-
x64\ApiValidator.exe
が使用される → 成功
-
- Pipelines失敗ケース:
-
x86\ApiValidator.exe
を使用される → 見つからず失敗(リターンコード1)
-
解決方法
VSBuildタスクのドキュメントをよく確認したところ、デフォルトでx86版を使うと書かれています。msbuildがx86版なのでツールもx86版を使っているというのはありそうです。
試しにx64版を使うようにしたところ、これだけでx64\ApiValidator.exe
が選ばれ、エラーは解消しました。
こちらは成功したYAMLの一例です。
pool:
vmImage: 'windows-2022'
steps:
- task: VSBuild@1
displayName: 'Build solution'
inputs:
solution: '$(Build.SourcesDirectory)\Target.sln'
vsVersion: '17.0'
platform: 'x64'
configuration: 'Debug'
maximumCpuCount: true
msbuildArchitecture: 'x64' # ここがポイント:x64版MSBuildを使う
msbuildArgs: '/restore /p:RestorePackagesConfig=true'
デフォルトがx86版なのはたぶん過去との互換のためで、x64版が使える環境であえてx86版のツールを使うメリットは薄いと思います。x86依存があるプロジェクトでなければ、x64版を使う方向で良いと思います。
まとめ
最新のWDKのNuGet版を使えば、WDKのないマネージドホストでもCI/CDビルドができます。しかしAzure Pipelinesには注意点があり、引っかかりましたが解決できました。
定義済みタスクは自分で一から組まなくていいので便利ですが、それだけに暗黙の動作に注意です。落とし穴に気をつけつつ、マネージドなCI/CD環境のメリット(メンテ不要)を活かしていきましょう!