Azure環境向けCI/CDパイプラインを自動作成できるDevOps Starterが便利すぎた
いわさです。
みなさん、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だとコンテナー一択だったりと様々です。
自分が探すパイプラインの雛形が見つかるかわかりませんが、一度探してみても良いんじゃないでしょうか。