Amazon Web Services ブログ

.NET Frameworkのためのカスタムビルド環境でAWS CodeBuildを拡張する

.NET Framework用のカスタムCodeBuildビルド環境の作成方法について説明している、この素晴らしいブログを書いたMicrosoftプラットフォーム担当シニア・ソリューション・アーキテクト、Greg Eppelに感謝します。

AWS CodeBuildは、ソースコードをコンパイルし、テストを実行し、展開可能なソフトウェアパッケージを生成する、フルマネージドなビルドサービスです。 CodeBuildは、Android、Go、Java、Node.js、PHP、Python、Ruby、Dockerなどのプログラミング言語とランタイムのためのビルド環境を提供します。 CodeBuildは、Microsoft Windows Serverプラットフォーム用のビルドもサポートしています。これには、Windows上の.NET Core用にあらかじめパッケージ化されたビルド環境も含まれます。アプリケーションで.NET Frameworkが使用されている場合は、独自のDockerイメージを使用して、Microsoftの.NET Frameworkクラスライブラリを含むカスタムビルド環境を作成する必要があります。この手順が必要な理由については、よくある質問を参照してください。この記事では、.NET Frameworkアプリケーション用のカスタムビルド環境を作成し、この環境を使用するようにCodeBuildを設定する手順を説明します。

ビルド環境は、プロジェクトのビルドとテストに必要なすべてのファイルシステムを含むDockerイメージです。 CodeBuildプロジェクトでカスタムビルド環境を使用するには、ビルドツールを含むプラットフォーム用のコンテナイメージを作成し、Amazon Elastic Container Registry(Amazon ECR)などのDockerコンテナレジストリにプッシュし、プロジェクトの構成で参照します。アプリケーションがビルドされる時に、CodeBuildはプロジェクトの構成で指定されたコンテナ レジストリからDockerイメージを取得し、その環境を使用してソースコードをコンパイルし、テストを実行し、アプリケーションをパッケージ化します。

要件

この記事の手順に従い、Dockerコンテナ イメージを構築するには、Docker for Windows(Windows Server with Containers AMIを使用するとインストールされます)、AWSコマンドラインインターフェイス、およびGitがインストールされている必要があります。 この記事では、Visual Studio Build Tools 2017を使用しています。

Step 1: EC2 Windows Server 2016 with Containersを起動する

  1. Amazon EC2コンソールで任意のリージョンを選択し、Microsoft Windows Server 2016 Base with Containers AMIからAmazon EC2インスタンスを起動します。
  2. Visual Studio Build Toolsのインストールと実行に必要なサイズよりも大きなサイズのコンテナ領域を確保するため、ブートボリュームのディスク領域を少なくとも50GB以上に増やしてください。
  3. インスタンスの実行時はリモートデスクトップを使用してインスタンスに接続します。

Step 2: Dockerイメージを構築してプッシュする

  1. 管理者用コマンドプロンプトを開きます(好きなシェルを右クリックし、[管理者として実行]を選択します)。
  2. ディレクトリを作成します。
    mkdir C:\BuildTools
    cd C:\BuildTools
  3. 以下のコンテンツをc:¥BuildTools¥Dockerfileに保存します。
    # escape=`
    
    FROM microsoft/dotnet-framework:4.7.2-runtime
    
    SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
    
    #Install NuGet CLI
    ENV NUGET_VERSION 4.4.1
    RUN New-Item -Type Directory $Env:ProgramFiles\NuGet; `
        Invoke-WebRequest -UseBasicParsing https://dist.nuget.org/win-x86-commandline/v$Env:NUGET_VERSION/nuget.exe -OutFile $Env:ProgramFiles\NuGet\nuget.exe
    
    # Install VS Test Agent
    RUN Invoke-WebRequest -UseBasicParsing https://download.visualstudio.microsoft.com/download/pr/12210068/8a386d27295953ee79281fd1f1832e2d/vs_TestAgent.exe -OutFile vs_TestAgent.exe; `
        Start-Process vs_TestAgent.exe -ArgumentList '--quiet', '--norestart', '--nocache' -NoNewWindow -Wait; `
        Remove-Item -Force vs_TestAgent.exe; `
    # Install VS Build Tools
        Invoke-WebRequest -UseBasicParsing https://download.visualstudio.microsoft.com/download/pr/12210059/e64d79b40219aea618ce2fe10ebd5f0d/vs_BuildTools.exe -OutFile vs_BuildTools.exe; `
        # Installer won't detect DOTNET_SKIP_FIRST_TIME_EXPERIENCE if ENV is used, must use setx /M
        setx /M DOTNET_SKIP_FIRST_TIME_EXPERIENCE 1; `
        Start-Process vs_BuildTools.exe -ArgumentList '--add', 'Microsoft.VisualStudio.Workload.MSBuildTools', '--add', 'Microsoft.VisualStudio.Workload.NetCoreBuildTools', '--add', 'Microsoft.VisualStudio.Workload.WebBuildTools;includeRecommended', '--quiet', '--norestart', '--nocache' -NoNewWindow -Wait; `
        Remove-Item -Force vs_buildtools.exe; `
        Remove-Item -Force -Recurse \"${Env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\"; `
        Remove-Item -Force -Recurse ${Env:TEMP}\*; `
        Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\"
    
    # Set PATH in one layer to keep image size down.
    RUN setx /M PATH $(${Env:PATH} `
        + \";${Env:ProgramFiles}\NuGet\" `
        + \";${Env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\TestAgent\Common7\IDE\CommonExtensions\Microsoft\TestWindow\" `
        + \";${Env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\")
    
    # Install Targeting Packs
    RUN @('4.0', '4.5.2', '4.6.2', '4.7.2') `
        | %{ `
            Invoke-WebRequest -UseBasicParsing https://dotnetbinaries.blob.core.windows.net/referenceassemblies/v${_}.zip -OutFile referenceassemblies.zip; `
            Expand-Archive -Force referenceassemblies.zip -DestinationPath \"${Env:ProgramFiles(x86)}\Reference Assemblies\Microsoft\Framework\.NETFramework\"; `
            Remove-Item -Force referenceassemblies.zip; `
        }
  4. そのディレクトリで次のコマンドを実行します。 このプロセスにはしばらく時間がかかります。 この時間は起動したEC2インスタンスのサイズによって異なります。 私のテストでは、t2.2xlargeはイメージを構築するのに30分もかからず、およそ15GBのイメージを生成します。
    docker build -t buildtools2017:latest -m 2GB .
  5. 次のコマンドを実行してコンテナをテストし、すべての開発者用環境変数と共にコマンドシェルを起動します。
    docker run -it buildtools2017
  6. Amazon ECSコンソールでリポジトリを作成します。 リポジトリ名には、buildtools2017と入力します。 [Next Step]を選択し、残りのステップを完了します。
  7. 次のコマンドを実行して、ローカルのDockerエンジンのためにレジストリのauthentication detailsを生成します。 コマンドを実行する前に、Amazon ECRレジストリへのアクセス権があることを確認してください。
    aws ecr get-login
  8. 同じコマンドプロンプト ウィンドウで、次のコマンドをコピーして貼り付けます。
    docker tag buildtools2017:latest [YOUR ACCOUNT #].dkr.ecr.[YOUR REGION].amazonaws.com/ buildtools2017:latest
    docker push [YOUR ACCOUNT #].dkr.ecr.[YOUR REGION].amazonaws.com/buildtools2017:latest

    注: [YOUR ACCOUNT #]をあなたのAWSアカウント番号に、[YOUR REGION]をあなたのリージョンに置き換えてください

Step 3: AWS CodeCommitの構成

  1. 初めてCodeCommitにアクセスする前に、初期設定手順を完了する必要があります。
  2. CodeCommitコンソールで、DotNetFrameworkSampleAppという名前のリポジトリを作成します。 [Configure email notifications]ページで、[Skip]を選択します。
  3. GitHubから.NET Framework Docker sample applicationをクローンします。 リポジトリには、カスタムビルド環境をデモするために使用するサンプルのASP.NET Frameworkアプリが含まれています。EC2インスタンスでコマンドプロンプトを開き、次のコマンドを実行します:
    git clone https://github.com/Microsoft/dotnet-framework-docker-samples.git
    cd dotnet-framework-docker-samples
    del /Q /S .git
    cd aspnetapp
    git init
    git add . 
    git commit -m "First commit"
    git remote add origin https://git-codecommit.[YOURREGION].amazonaws.com/v1/repos/DotNetFrameworkSampleApp
    git remote -v
    git push -u origin master
  4. CodeCommitリポジトリに移動して、プッシュしたファイルがそこにあることを確認します。

 

Step 4: build specの構成

CodeBuildを使用して.NET Frameworkアプリケーションを構築するには、ビルドコマンドと関連した設定のコレクションであるbuild specを使用します。これはYAMLフォーマットであり、AWB CodeBuildがビルドの実行に使用します。build specをソースコードの一部として含めることも、ビルドプロジェクトの作成時にbuild specを定義することもできます。 この例では、ソースコードの一部としてbuild specを含めています。

  1. ソースディレクトリのルートディレクトリに、buildspec.ymlという名前のYAMLファイルを作成します。
  2. 次の内容をbuildspec.ymlにコピーします。
    version: 0.2
    
    phases:
      pre_build:
        commands:
         - New-Item -ItemType Junction -Path C:\Src -Value $Env:CODEBUILD_SRC_DIR
         - cd C:\Src  
         - nuget.exe restore
      build:
        commands:
         - msbuild 
  3. buildspec.ymlの変更を保存し、次のコマンドを使用してファイルをCodeCommitリポジトリに追加します。
    git add . 
    git commit -m "Added a build spec file"
    git push

 

Step 5: CodeBuildの構成

この時点でVisual Studio Buld ToolsがインストールされたDockerイメージ出来上がり、Amazon ECRレジストリに格納されています。また、CodeCommitリポジトリにサンプルのASP.NET Frameworkアプリケーションもあります。次に、ASP.NET FrameworkアプリケーションをビルドするためにCodeBuildをセットアップします。

    1. Amazon ECRコンソールで、docker pushコマンドで先にプッシュされたリポジトリを選択します。 [Permissions]タブで[Add]を選択します。
      1. Sidに一意の名前を付けます。
      2. Effectに[Allow]を選択します。
      3. Principalにcodebuild.amazonaws.comと入力します。
      4. Actionは[Pull only actions]を選択します。
      5. Save ALLを選択します。
    2. CodeBuildコンソールで[Create Project]を選択します。
    3. Project Nameに[DotNetFrameworkSampleApp]と入力します。
    4. Source Providerに[AWS CodeCommit]を選択し、DotNetFrameworkSampleAppリポジトリを選択します。
    5. Environment imageに[Specify a Docker image]を選択します。
    6. Environment Typeに[Windows]を選択します。
    7. Custom image typeに[Amazon ECR]を選択します。
    8. Amazon ECRリポジトリで、Visual Studio Build Tools(buildtools2017)がインストールされたDockerイメージを選択します。あなたの設定は下記の画像のようになります:

  1. [Continue]を選択し、[Save and Build]を選択してCodeBuildプロジェクトを作成し、最初のビルドを開始します。 コンソールでビルドのステータスを監視できます。 ビルドが成功するか、失敗するか、あるフェーズから別のフェーズに移行するか、またはこれらのイベントの任意の組み合わせで、サブスクライバに通知するnotificationを設定することもできます。


まとめ

CodeBuildは、多数のプラットフォームと言語を標準でサポートしています。 カスタムビルド環境を使用することにより、CodeBuildを他のランタイムに拡張することができます。 この記事では、Windowsコンテナ上に.NET Framework環境を構築する方法を示し、CodeBuildで.NET Frameworkアプリケーションを構築する方法を示しました。

私たちは、お客様がWindowsアプリケーションの継続的インテグレーションと継続的デリバリーを可能にするために、どのようにCodeBuildを拡張し使用しているのかを知ることに喜びを感じています。 あなた自身のプロジェクトでCodeBuildを拡張することで学んだことを共有してください。 コメント欄に質問や提案の記入をお願いします。

日本語訳はSA福井厚が担当しました。原文はこちらです。
https://aws.amazon.com/blogs/devops/extending-aws-codebuild-with-custom-build-environments-for-the-net-framework/