Edited at

Azure Pipelines でネイティブミドルウェアの CI しました

この記事はMicrosoft Azure Advent Calendar 2018 12/25 の記事です。

https://qiita.com/advent-calendar/2018/azure


はじめに

C++ と C# で構築されたミドルウェアを Azure Pipelines でビルドし、成果物をダウンロードするまでの流れを試してみます。


環境

個人開発しているゲームエンジンをビルドします。

カテゴリ
要素

リポジトリ
https://github.com/lriki/Lumino

ビルド環境
Windows, macOS

ターゲット環境
Windows, macOS, iOS, Android, Web(Emscripten)

開発言語
C/C++, C#

以下、ビルドシステムの特徴です。


  • コマンドひとつでビルド、テスト、デプロイ(zipとインストーラの作成)が行える状態になっています。

  • ビルドスクリプトは C# で書かれており、リポジトリルートで "dotnet run" を実行します。

  • ほとんどの依存ライブラリ、ツール類はビルドスクリプト内でダウンロードを行います。

  • cmake など一部のツールはあらかじめインストールの必要があります。


注意点


  • 他の CI サービスは使ったことがないので「なぜ Azure Pipelines?」とかは触れません。

  • Azure PipeLines の設定は ビジュアルデザイナ で行います。YAML はまたこんど。

  • 今回は単にビルドするだけで、Pull Request にフックして自動ビルド実行とかはしないです。これもまたこんど。


Build Pipeline の作成


プロジェクトの作成

最初はまっさらなので、まずプロジェクトを作ります。


リポジトリの選択

GitHub を選びます。

初回は [Authorize using OAuth] をクリックして、自分の Github アカウントと Azure を連携させる必要があります。

認証したら、リポジトリと checkout してくるブランチを選択します。


テンプレートの選択

Pipeline を実行するための設定のひな型を選択します。

今回のターゲットは C++、C# の他にもビルドするものはたくさんあるのですが、まずはビルドの起点となる dotnet コマンドが使いたいので「ASP.NET core」を選んでおきます。(もしかしたら空テンプレートでも dotnet コマンドは入ってるかも)

選択すると、Build pipeline がひとつできます。


ビルド実行(テスト)

とりあえずデフォルト状態で実行して様子を見てみます。

[Save & queue] から実行できます。

ダイアログが出てきますが、そのまま [Save & queue] します。

画面上部に通知が出てきます。リンクをクリックするとビルドのページに移動します。

失敗してました。

ここからビルドできるようにいくつか設定を追加していきます。


Windows ビルド設定


Agent pool の変更

タスクリスト上部の [Pipeline] をクリックし、右の "Agent pool" から [Hosted VS2017] を選択します。


Test, Publish タスクの削除

今回のターゲットシステムでは、これらのタスクに相当する処理は "dotnet run" コマンドの中でまとめて行われるため、不要なので消しておきます。

タスクを右クリックして [Remove selected task(s)] です。


dotnet run コマンドの追加

任意のコマンドを実行するために「Command Line」タスクを追加します。

"Agent job 1" の右の + ボタンから追加します。

[Script] に実行するコマンドを書き込みます。


Chocolatey Tools の追加

本記事の執筆時点では、cmake や doxygen などのツールをインストールする Task は標準では用意されていないようでした。(この辺りの C++ サポートは少し弱い印象です。Go や Node はありますが・・・)

今回は Chocolatey でインストールしていきます。

Chocolatey は Marketplace から入手する必要がありました。"Add tasks" のビューで検索すると出てきます。

入手したら、"Chocolatey - Install Package" を追加します。

[Display name] と [Package] を指定していきます。

全部で 6 個のパッケージをインストールしました。


ビルド成果物を配布するための設定

成果物は Azure pipelines の環境変数で示されるフォルダにコピーしておく必要があります。

こうしておかないと永続的に保存できません。

"Copy Files" タスクを追加して、成果物ファイルを $(Build.ArtifactStagingDirectory) フォルダにコピーします。

今回はリポジトリルート下の build フォルダ内に生成される .zip と .msi を配布したいので、それぞれの Copy Files タスクを追加しています。

"Publish Artifact" タスクはデフォルトのままです。

成果物一式に "drop" という名前を付けて、ビルドのページからアクセスできるようにしてあります。

ここまでで設定は終了です。[Save & queue] からビルドを実行します。


ビルド成果物のダウンロード

ビルドが成功すると、ビルドのページの右上に [Artifacts] というボタンが表示されます。

ここからたどって、目的のファイルをダウンロードします。


macOS ビルド設定

ほとんどの設定は Build Pipeline の作成 及び Windows ビルド設定 と同様です。


新しい Build pipeline の追加

Pipeline のリストから、[New] > [New build pipeline] で追加します。



作成方法は先ほどの Build Pipeline の作成 と同様です。


Agent pool の変更

[Hosted macOS] を選択します。


Task の変更

Windows ではたくさんツールをインストールしましたが、macOS agent ではすでにインストールされていました。

そのため、念のためバージョンをビルドログに表示するだけにしてあります。



他のコマンドも Windows と同様です。

ちなみにタスク名が "Command Line" なところがいかにも Windows ぽいですが、macOS や Linux agent では bash で実行されます。


まとめ

C++ と C# で構築されたミドルウェアを Azure Pipelines でビルドし、成果物をダウンロードするまでの一連の流れを紹介しました。

CI サービスを利用するのは今回が初めてでしたが、意外とすんなり設定を終えることができました。

今回は単にビルドするだけでしたので、今後はもう少し CI ツールらしい運用も試してみようと思います。