2018年10月15日月曜日

AppVeyor のジョブを1つのマトリックスにまとめました

AppVeyor は1つのリポジトリに対して、複数のプロジェクトを作成することができます。
GUI Config では複雑なマトリックスを構築できないですが、複数のプロジェクトを作成することによって、擬似的に複雑なマトリックスを組みことができてました。

これで十分ではあったのですが、 iutest で使用している CI サービスも増えてきて(現在 15 サービス超)、管理する場所をなるべく少なくしたいという点と、Webhook が足りなくなってきたという2点の理由から、なるべくまとめることとしました。
(1プロジェクトにつき、GitHub の Webhook を1つ消費する。GitHub の Webhook は1リポジトリにつき、20 まで)

複雑なマトリックスの鍵: for
通常マトリックスは matrix: で環境変数やワーカーを複数用意して、"同じ"ビルド処理を行います。
environment:
  matrix:
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
      PROJECT_DIR: msvc12
      CMAKE_GENERATOR_NAME: Visual Studio 12 2013
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
      PROJECT_DIR: msvc14
      CMAKE_GENERATOR_NAME: Visual Studio 14 2015
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
      PROJECT_DIR: msvc15
      CMAKE_GENERATOR_NAME: Visual Studio 15 2017
    - BUILD_NUGET: yes

ただ、これでは同じリポジトリで、ビルド・テスト以外のリリース(デプロイ)ビルドや、全く別環境(Windows vs Ubuntu)でビルドフローが異なるような場合には対応できず、
iutest でももともとやっていたような複数プロジェクト化による対応が必要でした。
(設定をパラメタライズドにして状態の異なるビルド・テストはできる。処理が単一で設定でいろいろ複雑に処理を変えるのは面倒だった)

しかし、今回紹介する for を利用することで、任意のマトリックスに対して通常とは異なるビルドやテスト・デプロイを記述することができるようになります。
for の使い方はこちらです。 Build configuration | AppVeyor

上記のマトリックスは iutest で実際に利用している yml の抜粋になりますが、NuGet ビルドの特殊化の部分を例として以下に載せます。
for:
# NuGet
-
  matrix:
    only:
      - configuration: Release
        BUILD_NUGET: yes
  before_build:
    cmd: echo.
  build_script:
    ps: |
      $nuspecPath = "projects\nuget\iutest.nuspec"
      Write-Output "Building NuGet package"
      nuget pack $nuspecPath -OutputDirectory ".\"
  test: off
for の要素として、特殊化するマトリックスの条件を matrix に記述し、任意のステップを上書き設定します。

注意したいこと
for を使った特殊化は、通常フローの上書きになります。
特殊化するケースで使用しないステップ(未記載)でも、通常フローでそのステップを使用している場合はそちらが呼ばれてしまいます
そのため、何もしない場合でも、空の状態に上書きする必要があります。
上記例では、before_build と test のステップを空にしています。

YAML の構文チェック
さて、YAML Config は記述を間違うと、YAML 解析時に失敗してジョブが即失敗してしまいます。
なので、 push するまえに YAML の構文チェックをしておきましょう。

AppVeyor では以下のページで構文チェックができます。
構文がエラーがあると以下のように、エラーの箇所を教えてくれるので便利です。
https://ci.appveyor.com/tools/validate-yaml


特に問題がなければ、グリーン表示になります。


最後に
for でまとめた結果、複数に分かれていたプロジェクトの統一ができました。(全部じゃないけど)

for を使った高度なマトリックスは本家ブログでも紹介されています。
Advanced build matrix configuration in AppVeyor | AppVeyor
詳細は、公式ドキュメントや上記を参考にすると良いと思います。

では。

0 件のコメント:

コメントを投稿