🙌

Azure PipelinesでデバイスドライバをビルドするとApiValidatorがエラーを出す問題の解決方法

に公開

概要

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のドキュメントはこちらです。

https://learn.microsoft.com/azure/devops/pipelines/tasks/build/visual-studio-build?wt.mc_id=MVP_452751

説明

さっそく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環境のメリット(メンテ不要)を活かしていきましょう!

Discussion