Azure DevOps PipelinesでVS2015 / VS2022の同時ビルド #1

Azure DevOps Pipelinesで利用できる最新のイメージ(windows-2022)には、Visual StudioとしてはVisual Studio 2022しかインストールされていません。そのため、標準のままではVS2015のVC++プロジェクトをビルドできません。

Azure DevOps Pipelines

自動ビルドのシステムとしてAzure DevOpsのAzure Pipelinesを利用しています。Azure Pipelinesは、少量のビルドであれば無料で利用できます。

Azure DevOpsのAzure Pipelinesでは、ビルドするためのマシンとして、クラウドのVMやオンプレミスで自分で用意することができます。しかし、Microsoftが用意したAzure pipelines agentのホストも利用できます。

2022年10月時点ではAzure pipelines agentの無料枠は以下の通りとなっています。

Azure pipelines agentはビルド対象がパブリックレポジトリの場合は、最大10個のジョブを並行実行で、時間に制限なく利用できます。

ビルド対象がプライベートレポジトリの場合、同時に一つのジョブしか実行できません。しかし、一か月あたり1800分間(30時間)を無料で利用できます。同時に複数のジョブを実行したい場合(Agentの追加)や1800分間を超えた場合は有償となります。

Azure pipelines agentの実行イメージ

このAzure pipelines agentの実行イメージは、現時点(2022年10月)では、以下のものが用意されています。

  • macOS-10.15
  • macOS-11
  • macOS-12
  • macos-latest
  • ubuntu-18.04
  • ubuntu-20.04
  • ubuntu-22.04
  • ubuntu-latest
  • windows-2019
  • windows-2022
  • windows-latest

各イメージのOSのバージョンや含まれている開発ツールなどの詳細は、github の GitHub Actions Runner Imagesで公開されています。

Azure pipelines agentのWindowsイメージ

Windowsのイメージは3つありますが、実質は二つです。Windows Sever 2022 (windows-2022)とWindows Sever 2019 (windows-2019)です。windows-latestのイメージは、その時点での安定板の最新イメージの別名です。現時点(2022年10月)では、windows-2022の別名となります。

各Windowsイメージで、インストールされている開発環境は異なります。様々の開発プロジェクトのビルドをできるように、Visual Studioだけでなく、Go、Kotlin、Node,Perl、Python、Java、Androidなど、多くのものがインストールされています。

windowsのイメージのVisual Studioの情報を書き出すと以下の表になります。

imageOSVisual StudioVisual Studioのコンポーネント
Microsoft.VisualStudio.Component.VC.140
windows-2019Microsoft Windows Server 2019 DatacenterVisual Studio Enterprise 2019インストール済み
(Toolset vs2015 (vc140)はビルドできる)
windows-2022Microsoft Windows Server 2022 DatacenterVisual Studio Enterprise 2022未インストール
(Toolset vs2015 (vc140)はビルドできない)
windows-latestwindows-2022と同じwindows-2022と同じwindows-2022と同じ

マイクロソフトがホストするagentのイメージは、インストールされているVisual Studioとそのコンポーネントが上記のように固定されています。

この結果、VC++のプロジェクトの場合、プロジェクトに設定されているPlatform toolsetの値によってビルドできるか・できないかが変わります。

各WindowsイメージでのVC++ Platform Toolsetによるビルドの可否は以下のようになります。

VC++ Platform Toolsetwindows-2019
(Visual Studio 2019)
windows-2022
(Visual Studio 2022)
Visual Studio 2015 (v140)サポート非サポート
Visual Studio 2017 (v141)サポートサポート
Visual Studio 2019 (v142)サポートサポート
Visual Studio 2022 (v143)非サポートサポート
Azure pipelines agentのOSイメージとVC++のビルドの可否

この結果を見るとわかりますが、Platform Toolsetが「Visual Studio 2015 (v140)」と「Visual Studio 2022 (v143)」は、両立しないことがわかります。これは、一つのVisual Studioソリューションにそれらのプロジェクトが同時に存在する場合に、Azure pipelines agentを使って、ビルドできないことになります。

VS2015からVS2022までサポートするライブラリーのソリューション

VC++のNativeライブラリーをVS2022で開発しているとします。このライブラリーがVS2015からVS2022までをサポートする場合、テスト用のコードもVS2015からVS2022まで用意します。

すると、このライブラリーのソリューションのプロジェクトは以下のようになります。

ソリューションに含むVC++プロジェクトPlatform Toolset
ライブラリー本体プロジェクトVisual Studio 2022 (v143)
VS2022用のサンプル プロジェクトVisual Studio 2022 (v143)
VS2019用のサンプル プロジェクトVisual Studio 2019 (v142)
VS2017用のサンプル プロジェクトVisual Studio 2017 (v141)
VS2015用のサンプル プロジェクトVisual Studio 2015 (v140)
VC++ライブラリーのソリューション構成

このソリューションでは、使用しているPlatform ToolsetとしてVS2015 (v140)からVS2022 (v143)まですべて含むことになります。

ライブラリーがLibraryAだとした場合、LibraryAのソリューションを実際に作成すると以下のようになります。

VC++ライブラリー プロジェクト(一つ)とそのテスト プログラム プロジェクト(四つ)のソリューション

このソリューションをVC140のToolsetをインストール済みのローカルのVisual Studio 2022でビルドすれば、もちろんすべてのプロジェクトを問題なくビルドできます。

しかし、マイクロソフトがホストしているAzure pipelines agentを使うとビルドは成功しません。

このソリューションをAzure pipelines agentのwindows-2019のイメージを使ってビルドすると、Platform toolsetがVisual Studio 2022(v143)のプロジェクトはビルドに失敗します。

Azure pipelines agentのwindows-2022のイメージを使ってビルドすると、Platform ToolsetがVisual Studio 2015(v140)のプロジェクトはビルドに失敗します。

このように、Azure pipelines agentを使った、ビルドではVS2015とVS2022の両方のToolsetを使うプロジェクトを含むソリューションを標準のままではビルドすることはできません。

もちろん、CustomのagentをクラウドのVMやオンプレミスで作成し、そのイメージに必要なモジュールをすべてインストールしておけば、問題なくビルドできます。その場合は、クラウドのVMに費用がかかったり、オンプレミスであれば、それ用のPCを用意する必要があります。そもそも、環境を作るのが手間であったりします。

実際に、上記のソリューションをAzure pipelinesで実行してみます。

Azure Pipelineの作成

まずは、Azure pipelinesにPipelineを作成します。なお、使用している画像は2022年10月時点のAzure DevOpsの画面となります。

Azure DevOpsで左側のPipelinesを選択すると、Azure Pipelinesの設定ができます。パイプラインを一つも作成していない場合は、以下のような画面になります。

Azure pipelinesの新規作成

新規作成するときは「Create Pipeline」を選択します。

すると、以下の画面に遷移して、ビルドするソースコードがどこにあるかを指定する画面になります。

使用するレポジトリの選択

ソースコードの場所は、Azure DevOpsがホストするgit (Azure Repos Git)やTFVC(Team Foundation Version Control)は使えるのはもちろんですが、GitHub、Bitbucket、Git、Subversionなども利用できます。ただし、ビルドするホストにAzure Pipelines agentを使う場合は、ソースコードはAzure DevOpsのAzure Pipelines agentからアクセスできる必要があるので、インターネットからアクセスできるレポジトリである必要がります。

テスト用のソリューションをAzure DevOpsのTFVCに登録したので、ここではAzure DevOpsでホストされているTFVCを選択します。

次は、選択したレポジトリーに固有の設定をします。Azure DevOpsでホストしていないレポジトリーを選択した場合は、認証情報などの設定も必要となります。

レポジトリ(TFVC)の設定

TFVCの場合は、既定の設定でも問題ないので、そのままの状態で、「Continue」を選択して次に進みます。

次は、パイプラインの元になるテンプレートを選択します。

テンプレートを使わず、設定が空の状態からパイプラインを作成することもできます。しかし、ほとんどの場合、適切なテンプレートを選択すると、パイプライン作成時の設定が最小限で済みます。

パイプラインのテンプレートの選択(.NET Desktop)

今回は、VC++プロジェクトのVisual Studioのソリューションです。この場合、「.NET Desktop」のテンプレートが適しています。テンプレートの名称に .NET の文字が入っています。しかし、テンプレートの説明を見ると「Build and test a .NET or Windows classic desktop solution. 」(日本語訳: .NETまたはWindowsクラシック・デスクトップ・ソリューションのビルドとテスト)と記載されており、VC++プロジェクトの場合もこれが適切であることがわかります。

「.NET Desktop」のテンプレートを選択(「Apply」ボタンをクリック)すると、パイプラインの設定画面に遷移します。

テンプレートに.NET Desktopを選んだ時の初期タスク

テンプレートを使ったことにより、パイプラインのタスクがいくつか自動的に設定されています。

今回は、VC++プロジェクトをビルドするのであって、.NETプロジェクトはビルドしません。また、ビルドの確認だけなので、ビルド結果で単体テストを実行したり、どこかに保存したり、公開したりする必要もありません。

そのため、いくつかのタスクは実行する必要はないので、不要なタスクは無効化します(下の画面の左側の赤色の枠)。

パイプラインのタスク(Tasks)の設定

また、この画面では、Agentに使うイメージも選択することができます(上の画面の右側の赤色の枠)。ここでは、windows-2019のイメージを選択します。

次に、「Variables」を選択します。すると、変数の設定画面になります。

パイプラインの変数(Variables)の設定

BuildPlatformの値を変更します。初期値は.NETアプリのビルドに適した「any cpu」になっています。VC++プロジェクトのビルドに適切な値は、「WIN32」や「x64」などの値です。ここでは、「x64」を設定します。

.NET Desktopのテンプレートを使用したので、これだけの設定変更で、VC++プロジェクトをビルドするためのパイプラインは完成です。

あとは、パイプラインを保存して、実行(実行キューに投入)すればビルドの動作確認ができます。そのためには、「Save & queue」(下の画面の赤色の枠)を選択します。

作成したパイプラインの保存と実行

「Save & queue」を選択すると、「Run pipeline」の確認画面が表示されます。

パイプラインの保存と実行の確認画面

保存して実行するだけであれば、設定を変更せず「Save and run」ボタンを選択すれば、保存して、パイプラインが実行されます。

Azure pipelineの実行結果

windows-2019のイメージを使用した結果

OSイメージとしてwindows-2019を使ってビルドするとビルドエラーになります。

windows-2019イメージを使ったビルド結果

エラーの行を抜き出すと以下の通りです。

##[error]C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(439,5): Error MSB8020: The build tools for v143 (Platform Toolset = 'v143') cannot be found. To build using the v143 build tools, please install v143 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".

このエラーメッセージには、「The build tools for v143 (Platform Toolset = ‘v143’) cannot be found.」(日本語訳: v143 (Platform Toolset = ‘v143’) 用のビルドツールが見つかりません)とあります。これからわかるようにVS2022に相当するv143のPlatform Toolsetが見つからず、エラーになっています。

windows-2019のイメージには、Visual Studio 2019のみインストールされており、より新しい Visual Studio 2022 の Platform Toolset をサポートしていません。そのため、VS2022のPlatform Toolsetを使うプロジェクトでビルドエラーになります。

windows-2022のイメージを使用した結果

OSイメージとしてwindows-2022を使ってビルドするとビルドエラーになります。

windows-2022イメージを使ったビルド結果

エラーの行を抜き出すと以下の通りです。

##[error]C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(460,5): Error MSB8020: The build tools for Visual Studio 2015 (Platform Toolset = 'v140') cannot be found. To build using the v140 build tools, please install Visual Studio 2015 build tools.  Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".

このエラーメッセージには、「The build tools for Visual Studio 2015 (Platform Toolset = ‘v140’) cannot be found.」(日本語訳: Visual Studio 2015 (Platform Toolset = ‘v140’) 用のビルドツールが見つかりません)とあります。これからわかるように、VS2015に相当するv140のPlatform Toolsetが見つからず、エラーになっています。

windows-2022のイメージには、Visual Studio 2022のみインストールされていいます。しかし、オプションのVC140のツールセットがインストールされていません。そのためVS2015のPlatform Toolsetを使うプロジェクトでエラーになります。


このように、VS2015とVS2022のVC++プロジェクトを含むソリューションは、Azure pipelines agentを使ったビルドに失敗します。ただし、これは、イメージを変更を加えずに使用した場合です。イメージを修正すれば、ビルドに成功するようになります。

次回の投稿では、イメージの修正方法を説明します。

“Azure DevOps PipelinesでVS2015 / VS2022の同時ビルド #1” への1件の返信

コメントを残す