Twitter を眺めていたら AWS CodeBuild が一部のリージョンで Windows に対応したとあったので、早速オレゴンで試して見ることにしました。
Windows が使えるビルドサービスは VSTS か AppVeyor ぐらいしか選択肢がなかったので貴重です。
AWS CodeBuild Adds Support for Windows Builds
Microsoft Windows Samples for AWS CodeBuild - AWS CodeBuild
buildspec.yml は特に Windows だから変わっている部分はないみたいです。新しいビルドプロジェクトを作成する時に OS や利用するランタイムを選べるようになっています。
AWS 管理のイメージも用意されていますが、Docker Hub で公開されている任意のイメージも利用できるようになっているみたいです。これは地味に良さそう。
ビルドした結果は S3 に保存できるので、結構扱いやすいです。実際に ASP.NET アプリケーションをビルドして、WebDeploy パッケージを作成してみましたが、すんなりと S3 に保存されてました。
試した感じでは、まだコンテナを利用した Windows アプリのビルド環境が未成熟という印象を持ちましたが、AppVeyor の地位危うしという感じがします。
やはり毎回 init で必要なパッケージをインストールしたりするのは時間の無駄ですからね。
CodeBuild の場合は利用するコンピューティングタイプを選択できるのも良いです。Windows Containers 自体が重いのもありますが、選択肢があるというのは重要です。
CodeBuild 提供の Windows イメージ
CodeBuild で提供されているイメージは msbuild へのパスが通っていないので、そのままだとビルドが通らないので地味に厄介です。フルパスで msbuild を指定しないとエラーになります。
ライセンス情報を見る感じでは .NET 4.6.2 までしか Targeting Pack が入っていないみたいなので、4.7 以降をターゲットにしたアプリケーションはビルド出来ないかも知れません。
AWS CodeBuild for Windows—Third Party Notices - AWS CodeBuild
.NET Core についても、パッと見た感じでは 2.0 しか SDK が入っていないように見えます。
それ以外のバージョンをビルドする場合には専用の Docker Image を用意するか、Microsoft から公式リリースされているものを使った方が良さそうです。
.NET Command Line Tools (2.1.103) Product Information: Version: 2.1.103 Commit SHA-1 hash: 60218cecb5 Runtime Environment: OS Name: Windows OS Version: 10.0.14393 OS Platform: Windows RID: win10-x64 Base Path: C:\Program Files\dotnet\sdk\2.1.103\ Microsoft .NET Core Shared Framework Host Version : 2.0.6 Build : 74b1c703813c8910df5b96f304b0f2b78cdf194d
.NET Core の場合は Nano Server ベースのイメージを使えるのでプロビジョニングの短縮が図れます。
カスタムイメージを作成する
Microsoft から提供されているイメージは何故か WebBuildTools がインストールされていないので、ASP.NET アプリケーションのビルドには微妙に問題が出ます。
予めパッケージをインストールしておきたいという要望もあるはずなので、AWS Blog に書いてあるようにカスタムなイメージを作成して対応しましょう。
Extending AWS CodeBuild with Custom Build Environments for the .NET Framework | AWS DevOps Blog
こっちはちゃんと WebBuildTools をインストールするコマンドになっているので、ASP.NET アプリケーションのビルドも問題ありません。
pull されたイメージはキャッシュされる
条件はよくわかっていませんが、同じイメージを使っている場合にはキャッシュが効いて素早くビルドまで実行できるようになっていました。
単純に同じホストに割り当てられた場合のみなんでしょうが、Server Core のイメージは重いので重要です。
欲を言えば、予めよく使われそうなイメージは pull 済みになっておいて欲しいですね。
LTSC 2016 のみ実行可能
.NET Framework SDK の Docker Image は LTSC 2016 以外に 1709 / 1803 が提供されているので、そのイメージを利用してビルドを実行してみましたが、コンテナが立ち上がることなく失敗しました。
なので Hyper-V Containers ではなくて Windows Server Containers を利用していることが分かります。
軽量化された Docker Image は CodeBuild では暫く使えそうにないですね。残念ながら Windows Server 2019 のリリースを待つしかなさそうです。