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

前回の投稿ではAzure Pipelines agentを使ってVS2015とVS2022のVC++プロジェクトの両方を含むソリューションをビルドできないことを説明しました。今回は、それをビルドでるようにするための方法を説明します。

Azure Pipelines agentでビルドに失敗した理由

VS2015とVS2022のVC++プロジェクトの両方を含むソリューションをAzure Pipelines agentを使ってビルドすると失敗します。

Azure Pipelines agentに利用できるWindowsイメージ(2022年10月時点)は、windows-2019とwindows-2022の二つがあります。

これらのイメージでサポートしているVC++のPlatform Toolsetは以下の通りです

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

この表を見てわかるようにAzure Pipelines agentでのビルドに失敗する理由は、VS2015(vc140)とVS2022(vc143)を同時にサポートしているWindowsイメージがないからです。

ビルドが失敗しないためには?

ビルドが失敗しないためには、二つの方しかありません。

  • windows-2019のイメージにVisual Studio 2022 (v143)のツールセットをインストールする
  • windows-2022のイメージにVisual Studio 2015 (v140)のツールセットをインストールする

前者は、windows-2019のイメージにインストールされているVisual Studio がVisual Studio 2019です。Visual Studio 2019は、Visual Studio 2019 (v142)がより新しいツールセットをサポートしておらず、どうやってもビルドすることは不可能です。方法としては、windows-2019のイメージにVisual Studio 2022をインストールして、ビルドにVisual Studio 2022を使うしかありません。この場合、Visual Studio 2022のフルセットをインストールするとになり現実的ではありません。

後者は、windows-2022のイメージにインストールされているVisual Studio がVisual Studio 2022です。Visual Studio 2022は、Visual Studio 2022 (v143)より古いツールセットは、ツールセットのコンポーネントがインストールされていれば、利用してビルドすることが可能です。そのため、Visual Studio 2015 (v140)のツールセットがインストールされていれば、ビルドは可能です。

この結果、windows-2022のイメージであれば、Visual Studio 2015 (v140)のツールセットのコンポーネントを追加インストールすれば、ビルドが可能になることがわかります。

Visual Studio 2015 (v140)のツールセットを含むイメージの作成

では、windows-2022のイメージをカスタマイズする方法はあるのでしょうか?

MicrosoftがホストするAzure pipelines agent用のOSイメージはマイクロソフトが用意しているものであり、イメージそのものをカスタマイズする方法はありません。

しかし、パイプラインが実行を開始してからパイプラインのタスクとしてモジュールを追加イストールすることは可能です。しかし、パイプラインのタスクとして実行するためには、GUIを使うことはできず、すべてがコマンドラインで完結する必要があります。

Visual Studio Installerによるツールセットのインストール

さて、ツールセットのインストールはどのようにできるのでしょうか?

ローカルのPCでは、Visual Studio Installerを使うとGUIでツールセットをインストールすることはできます。

Visual Studio Installer アイコン

Visual Studio Installerを起動して、「個別のコンポーネント」から「MSVC v140 – VS 2015 C++ ビルドツール (v14.00)」を選択してインストールすることが可能です。

MSVC v140 – VS 2015 C++ ビルドツール (v14.00)

しかし、Azure Pipelines agentで実行するときは、人間によるGUI操作はできません。インストールするなら、コマンドライン操作のみでツールセットをインストールできる必要があります。

コマンドラインでツールセットをインストールするには?

コマンドラインでツールセットをインストールすることは、Visual Studio 2022のインストーラーを用意することにより可能です。使用するインストーラーはVisual Studioのエディションごとに異なります。windows-2022のイメージにインストールされているVisual Studio は、Visual Studio Enterprise 2022なので、インストーラーはvs_enterprise.exeとなります。

これを使うことにより、追加のコンポーネントをコマンドラインでインストールすることが可能です。

vs_enterprise.exeの使い方は、マイクロソフトのサイトに記載があります。詳細は、マイクロソフトのサイトで確認してください。

Visual Studio Enterprise 2022で、Visual Studio 2015 (v140)のツールセットを追加インストールするには、以下のコマンドで可能です。

vs_enterprise.exe --add Microsoft.VisualStudio.Component.VC.140

しかし、上記のコマンドでは、まだ、GUIが必要となります。完全にGUIを必要とせずインストールするには、-qオプションを追加します。

vs_enterprise.exe -q --add Microsoft.VisualStudio.Component.VC.140

このコマンドを利用することにより、Visual Studio 2015 (v140)のツールセットのコンポーネントをGUI無しでインストールできます。

Azure Pipelinesのタスクとしてインストールする

上記のコマンドラインを使えば、ツールセットを追加でインストールすることができます。

インストーラー(vs_enterprise.exe)の入手

しかし、windows-2022のイメージのどこにvs_enterprise.exeがあるかがわかりません。どのように存在場所を確認すればよいのでしょうか?

先ほどのマイクロソフトのサイトにvs_enterprise.exeをダウンロードできる場所が記載されています。引用すると以下の表です。

エディションブートストラップ
Visual Studio 2022 Enterprisevs_enterprise.exe
Visual Studio 2022 Professionalvs_professional.exe
Visual Studio 2022 Communityvs_community.exe
Visual Studio 2022 Build Toolsvs_buildtools.exe
Visual Studio 2022 の最新のブートストラップ

vs_enterprise.exeなら、「https://aka.ms/vs/17/release/vs_enterprise.exe」からダウンロードできることがわかります。

windows-2022のイメージのどこにvs_enterprise.exeがあるかわからないのであれば、上記の場所からダウンロードしてくればよいのです。

追加のツールセットをインストールするための方法

結果として、Azure Pipelinesのタスクとして

  • curl.exeを使って、vs_enterprise.exeをダウンロードする
  • ダウンロードしたvs_enterprise.exeを使って、ツールセットをインストールする

を作成して、パイプラインの最初のタスクとして実行すれば、VS2015のプロジェクトもビルドできる環境を準備することができます。

具体的には、パイプラインの最初のタスクとして、以下のコマンドラインスクリプトを実行します。

cd %TEMP%
ECHO begin curl %DATE% %TIME%
ECHO curl -o vs_enterprise.exe -L https://aka.ms/vs/17/release/vs_enterprise.exe
curl -o vs_enterprise.exe -L https://aka.ms/vs/17/release/vs_enterprise.exe
IF ERRORLEVEL 1 exit %ERRORLEVEL%
ECHO end curl %DATE% %TIME%

ECHO begin install %DATE% %TIME%
ECHO vs_enterprise.exe -q --wait --add Microsoft.VisualStudio.Component.VC.140
vs_enterprise.exe -q --wait --add Microsoft.VisualStudio.Component.VC.140
SET RESULT=%ERRORLEVEL%
ECHO ERRORLEVEL=%RESULT%
ECHO end install %DATE% %TIME%

exit %RESULT%

パイプラインのタスクとして vs_enterprise.exe を実行するときは、インストールが完了するまでコマンドが終わらないようにするために --waitオプションも追加しています。

vs_enterprise.exe -q --wait --add Microsoft.VisualStudio.Component.VC.140

--waitオプションがない場合は、インストーラー(vs_enterprise.exe)は、実行したらすぐに終了し、バックグラウンドでインストールを続行します。この場合、インストールが完了する前に、VC++のビルドが開始してしまうため、ビルドに失敗してしまいます。

Azure Pipelineの修正

パイプラインを修正します。上記のタスクをパイプラインの先頭に追加して、Visual Studio 2015 (v140)のツールセットを利用できるようにします。

コマンドラインタスクの追加

パイプラインの編集画面を開き、「Agent job 1」の右側にある「+」ボタン(タスク追加ボタン。左側の赤色の枠)をクリックします。

コマンドラインタスクの追加

すると、画面右側が「Add tasks」(タスクの追加)画面に遷移します。

次に、上部のタブの「Utility」(右側上部の赤色の枠)をクリックします。すると、Utilityタスクの一覧が表示されます。この中から、「Command line」を選択し、その中の「Add」(追加)ボタン(青色のボタン)をクリックします。

コマンドラインタスクを先頭に移動

すると、下記のように「Agent job 1」の一番下に「Command Line Script」タスクが追加されます。

コマンドラインタスクを先頭へ移動

Visual Studio 2015 (v140)のツールセットのインストールはビルドタスク(Build solution **\*/sln)より前に実行する必要があるため、追加された「Command Line Script」を、ドラッグして、一番上に移動します。

コマンドラインタスクを先頭へ移動完了

コマンドラインタスクの詳細を設定

一番上に移動したら、「Command Line Script」タスクの詳細を設定します。

コマンドラインタスクの詳細を設定

「Display name」(表示名・上の画面の上側の赤色の枠)は、タスクの名前を付けます。今回の場合は、「Install Visual Studio 2105 (v140) toolset」とつけることにします。

「Script」(スクリプト。上の画面の下側の赤色の枠)は、前の節で提示したスクリプトをそのまま貼り付けます。

コマンドラインタスクを追加したパイプラインの保存と実行

コマンドラインタスクの追加が完了したら、修正したパイプラインの保存と実行します。

コマンドラインタスクを追加したパイプラインの保存と実行

そのためには、画面上部の「Save & queue」をクリックします。

Azure pipelineの実行結果

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

Visual Studio 2015 (v150) ツールセットをインストールするタスクを追加せずに、OSイメージとしてwindows-2022を使ってビルドを実行したときは、前回も示したように以下のようなエラーとなりました。

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

このエラーメッセージには、「The build tools for Visual Studio 2015 (Platform Toolset = ‘v140’) cannot be found.」(日本語訳: Visual Studio 2015 (Platform Toolset = ‘v140’) 用のビルドツールが見つかりません)と表示されていました。

次に、Visual Studio 2015 (v150) ツールセットをインストールするタスクを追加したパイプラインを使い、OSイメージとしてwindows-2022を使ってビルドするとビルドは成功しました。

windows-2022イメージを使用し、ツールセットを追加インストールしたビルド結果

最後の数行を抜粋すると、以下の通り表示されています。

Done Building Project "D:\a\9\s\LibraryA\LibraryA.sln" (default targets).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:11.74
Finishing: Build solution **\*.sln

エラーは0件であり、VS2015 / VS2017 / VS2019 / VS2022のすべてのプロジェクトのビルドが成功していることがわかります。

パイプラインのタスクとしてVisual Studioのコンポーネントをインストールする方法のメリットとデメリット

メリット

メリットは、Microsoftが用意したAzure pipelines agentをそのまま利用できることです。

ビルドシステムをホストするカスタムのAgentを必要とせず、Microsoftが用意したAzure pipelines agentを利用できます。無料枠の範囲のビルドであれば、コストがかかりません。また、カスタムのAgentを用意する必要がないので、ビルドシステムをセットアップする必要もありません。

デメリット

デメリットは、ジョブの実行時間が増えることです。

この方法では、パイプラインの最初のタスクとして、Visual Studioのコンポーネントを追加します。そのため、ジョブの実行時間がコンポーネントのインストール時間だけ増えることになります。今回のコンポーネント(Visual Studio 2015 (v140)ツールセット)の場合は、6分間から10分間ぐらいのインストール時間がかかります。

この結果、無料枠の消費も速くなってしまいます。


今回の投稿では、Azure Pipelinesのwindows-2022イメージを使って、VS2015 / VS2017 / VS2019 / VS2022のすべての種類のプロジェクト含むソリューションのビルドができるようにする方法の説明でした。

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

コメントを残す