7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Azure DevOps の Pipeline で Core じゃない ASP.NET のプロジェクトをビルドして runFromZip でデプロイする

Posted at

アプリを動かすのに必要な zip ファイルさえ作れたら勝利なのでコマンドで FileSystem へのデプロイ方法を調べたんですが、なかなか情報がありませんでした。ということで、見つけたのはこちらの Stackoverflow の質問

How to use MsBuild MsDeployPublish to target local file system?

上記質問の回答から引用:

msbuild ProjectFile.csproj /p:Configuration=Release ^
                           /p:Platform=AnyCPU ^
                           /t:WebPublish ^
                           /p:WebPublishMethod=FileSystem ^
                           /p:DeleteExistingFiles=True ^
                           /p:publishUrl=c:\output

Or if you are building the solution file:

msbuild Solution.sln /p:Configuration=Release ^ 
                     /p:DeployOnBuild=True ^
                     /p:DeployDefaultTarget=WebPublish ^
                     /p:WebPublishMethod=FileSystem ^
                     /p:DeleteExistingFiles=True ^
                     /p:publishUrl=c:\output

なるほどね。DeployOnBuild, DeployDefaultTarget, WebPublishMethod, publishUrl あたりが肝かな?ということでコマンドでのやり方がわかったら、あとはビルドパイプラインの YAML に落とし込むだけです。

ASP.NET のビルドを行うパイプラインのひな型をベースに少し弄って対応しました。とりあえず trigger はお試しなので CI Tirgger で master ブランチに変更があったらという感じにしてデプロイ先も 1 つの環境だけにしてます。

ということで以下のような YAML ファイルが完成しました。

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

stages:
# ビルドを行うステージ
- stage: Build
  jobs:
  - job: build
    steps:
    - task: NuGetToolInstaller@1

    - task: NuGetCommand@2
      inputs:
        restoreSolution: '$(solution)'
    
    # ここで $(Build.BinariesDirectory) に対してデプロイするファイルを出力している
    - task: VSBuild@1
      inputs:
        solution: '$(solution)'
        msbuildArgs: '/p:DeployBuild=true /p:DeployOnBuild=true /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=$(Build.BinariesDirectory) /p:DeployDefaultTarget=WebPublish'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'

    - task: VSTest@2
      inputs:
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
    
    # ビルド成果物を zip に固める
    - task: ArchiveFiles@2
      inputs:
        rootFolderOrFile: '$(Build.BinariesDirectory)'
        includeRootFolder: false
        archiveType: 'zip'
        archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
        replaceExistingArchive: true
    
    # 固めた zip をビルド成果物としてアップロード
    - publish: '$(build.artifactStagingDirectory)/$(Build.BuildId).zip'
      artifact: webapp

# デプロイを行うステージ
- stage: Deploy
  dependsOn:
  - Build
  jobs:
  - deployment: Deploy
    environment: Production
    strategy:
      runOnce:
        deploy:
          steps:
          # ビルドで作った成果物をダウンロードして
          - download: current
            artifact: webapp

          # Azure App Service の staging スロットめがけてデプロイ
          - task: AzureRmWebAppDeployment@4
            inputs:
              ConnectionType: 'AzureRM'
              azureSubscription: 'DevOpsLab'
              appType: 'webApp'
              WebAppName: 'webformsappdemo'
              deployToSlotOrASE: true
              ResourceGroupName: 'AzureDevOpsLab-rg'
              SlotName: 'staging'
              packageForLinux: '$(Pipeline.Workspace)/**/*.zip'
              enableCustomDeployment: true
              DeploymentType: 'runFromZip'

          # staging と production をスワップ
          - task: AzureAppServiceManage@0
            inputs:
              azureSubscription: 'DevOpsLab'
              Action: 'Swap Slots'
              WebAppName: 'webformsappdemo'
              ResourceGroupName: 'AzureDevOpsLab-rg'
              SourceSlot: 'staging'

ASP.NET Web Forms のプロジェクトを単体テストつきで新規作成したプロジェクトを突っ込んだリポジトリーに上記パイプラインを設定すると、ちゃんと Azure のほうにデプロイされました。

めでたしめでたし。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?