Azure環境向けCI/CDパイプラインを自動作成できるDevOps Starterが便利すぎた

2021.10.18

いわさです。

みなさん、AWS CodeStarは使っていますか。
以前から「CodeStarはいいぞ」と一人で言っていたのですが、CodeBuild以外の環境のものも作成出来たらなあとも思っていました。

AWSじゃあないのですが、GitHub Actionsに対応したサービスがありました。
DevOps Starterというサービスで、Azureポータルからアクセス出来ます。

いつからあったのか、Azureたまに使ってましたけど気づいていませんでした。

数回ポチポチして終わり

アプリケーションの言語やランタイムを選択します。
GitHub以外に、Azure DevOpsもパイプライン環境として選択出来ます。
デフォルトはGitHubになっていました。

アプリケーションのデプロイ環境を選択します。
ASP.NETの場合だと、Windows Web App か、Function Appが選択出来ました。

デプロイ環境のリソース情報を設定して、これでもう完成です。

GitHubリポジトリが新規作成される

作成が完了したようなのでGitHubを見てみると、Privateなリポジトリが新規作成されていました。
見てみると、ワークフローが動いています。

ワークフロー完了後、Azureポータル上に新規リソースが作成されています。
App Serviceを参照してみましょう。

デフォルトのWebアプリがデプロイされていました。
すごい。

リポジトリは、デフォルトのWebアプリと、Azureリソース作成用のARMテンプレート、ワークフロー用のYAMLファイルで初期構成されていました。

ワークフローの構成ファイルがすぐ手に入るのが良いですね。
nuget restoreしてmsbuildしてとか、Visual Studioを触っていただけだとスルーしてそうな部分の設定方法がわかるのでとてもありがたいです。
Azureへの人認証情報はGitHub Secretsに格納されていました。

name: Build and Deploy ASP.NET MVC App to Azure Web App

on:
  push:
    branches:
      - master

env:
  AZURE_WEBAPP_NAME: "iwasa-devops-starter"    # set this to your application's name
  AZURE_WEBAPP_PACKAGE_PATH: "."      # set this to the path to your web app project, defaults to the repository root
  NUGET_VERSION: '5.8.0'
  DOTNETSDK_VERSION: '3.1.302'
  RESOURCEGROUPNAME: "iwasa-devops-starter-rg"
  LOCATION: "Japan East"
  HOSTINGPLANNAME: "iwasa-devops-starter-plan"
  APPINSIGHTLOCATION: "Japan East"
  SKU: "F1 Free"

jobs:
  build:
    runs-on: windows-latest
    steps:

    # checkout the repo
    - uses: actions/checkout@master

    - name: Creating artifact directories
      run: |
        mkdir buildartifacts
        mkdir deploymenttemplates
    
    - name: Install Nuget
      uses: nuget/setup-nuget@v1
      with:
        nuget-version: ${{ env.NUGET_VERSION }}
    - name: NuGet to restore dependencies as well as project-specific tools that are specified in the project file
      run: |
        cd Application
        nuget restore
  
    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@v1.0.0
      env:
        ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
    
    - name: Run MSBuild
      run: |
        cd Application
        msbuild .\SampleWebApplication.sln -p:Configuration=Release
    - name: Setup .NET sdk
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: ${{ env. DOTNETSDK_VERSION }}
    
    - name: Run unit tests
      run: | 
        cd Application\SampleWebApplication.UnitTests
        dotnet test bin\Release\*.UnitTests.dll --verbosity normal
    - name: Archive Application
      run: |
        Compress-Archive -Path ./Application/SampleWebApplication -DestinationPath ./buildartifacts/Application.zip
    - name: Upload Application to Build Artifact
      continue-on-error: false
      uses: actions/upload-artifact@v2
      with:
        name: buildartifacts
        path: buildartifacts

    - name: Archive ArmTemplates
      run: |
        Compress-Archive -Path ./ArmTemplates -DestinationPath ./deploymenttemplates/ArmTemplates.zip
    - name: Upload Arm templates to Artifact
      continue-on-error: false
      uses: actions/upload-artifact@v2
      with:
        name: deploymenttemplates
        path: deploymenttemplates

  deploy:
    needs: build
    runs-on: ubuntu-latest

    steps:

    - name: Download Build Artifact
      uses: actions/download-artifact@v2
      continue-on-error: false
      with:
        name: buildartifacts
        path: buildartifacts

    - name: Unzipping Build Artifact
      run: | 
        unzip -qq ./buildartifacts/Application.zip -d ./
    - name: Download an Arm template
      uses: actions/download-artifact@v2
      continue-on-error: false
      with:
        name: deploymenttemplates
        path: deploymenttemplates

    - name: Unzipping ARM Artifact
      run: |
        unzip -qq ./deploymenttemplates/ArmTemplates.zip -d ./
    - name: Login to Azure
      uses: azure/login@v1
      continue-on-error: false
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
    
    # Deploy Arm template
    - name: Deploy ARM Template
      uses: azure/CLI@v1
      continue-on-error: false
      with:
        inlineScript: |
          az group create --name "${{ env.RESOURCEGROUPNAME }}" --location "${{ env.LOCATION }}"
          az deployment group create --resource-group "${{ env.RESOURCEGROUPNAME }}" --template-file ./ArmTemplates/windows-webapp-template.json --parameters webAppName="${{ env.AZURE_WEBAPP_NAME }}" hostingPlanName="${{ env.HOSTINGPLANNAME }}" appInsightsLocation="${{ env.APPINSIGHTLOCATION }}" sku="${{ env.SKU }}"
    - name: 'Deploy web app'
      uses: azure/webapps-deploy@v2
      with:
        app-name: ${{ env.AZURE_WEBAPP_NAME }}
        package: '${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/SampleWebApplication'

  FunctionalTests:
    name: Functional tests
    runs-on: windows-latest
    needs: deploy
    steps:

    - uses: actions/checkout@master

    - name: Install Nuget
      uses: nuget/setup-nuget@v1
      with:
        nuget-version: ${{ env.NUGET_VERSION }}

    - name: NuGet to restore dependencies as well as project-specific tools that are specified in the project file
      run: |
        cd Application
        nuget restore
  
    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@v1.0.0
      env:
        ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
    
    - name: Run MSBuild
      run: |
        cd Application
        msbuild .\SampleWebApplication.sln -p:Configuration=Release
    - name: Setup .NET sdk
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: ${{ env. DOTNETSDK_VERSION }} 

    - name: Update web app url in Run Settings
      shell: powershell
      run: |
        cd Application\SampleWebApplication.FunctionalTests
        $doc = Get-Content functionalTests.runsettings
        $doc.RunSettings.TestRunParameters.ChildNodes.Item(0).value = 'https://${{ env.AZURE_WEBAPP_NAME }}.azurewebsites.net/'
        $doc.Save("$(pwd)/functionalTests.runsettings")
    # Run functional tests
    - name: Run tests
      continue-on-error: false
      run: |
        cd Application\SampleWebApplication.FunctionalTests
        dotnet test bin\Release\*.FunctionalTests.dll -s functionalTests.runsettings

まとめ

CodeStarもDevOps Starterも、CI/CD環境の自動作成サービスは本当に便利ですね。
ここで作られるパイプラインはAzure向けのものですが、デプロイの部分をAWSに変更してCloudFormationを使えばAWS環境にも対応できそうですし、GitHub Actionsを使う際は参考にすると捗りそうなので活用したいです。

デプロイ環境は色々選択肢があって、例えばNode.js + ExpressだとKubernetes環境が選べたり、Ruby on Railsだとコンテナー一択だったりと様々です。
自分が探すパイプラインの雛形が見つかるかわかりませんが、一度探してみても良いんじゃないでしょうか。