前回の投稿では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 Toolset | windows-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でのビルドに失敗する理由は、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を起動して、「個別のコンポーネント」から「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 Enterprise | vs_enterprise.exe |
Visual Studio 2022 Professional | vs_professional.exe |
Visual Studio 2022 Community | vs_community.exe |
Visual Studio 2022 Build Tools | vs_buildtools.exe |
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
を使ってビルドを実行したときは、前回も示したように以下のようなエラーとなりました。
このエラーメッセージには、「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
を使ってビルドするとビルドは成功しました。
最後の数行を抜粋すると、以下の通り表示されています。
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件の返信