Azure DevOps 发布.Net项目到Windows IIS站点之Azure项目发布内网VM
当你有一个需求,需要通过Azure DevOps发布到一个没有公网的VM的时候,你将需要使用以下脚本
trigger:
- master # 触发器设置为master分支,当master分支有更新时,自动执行此流程
pool:
vmImage: 'windows-2022' # 指定运行此流程的虚拟机镜像为windows-2022
variables:
# 定义了一系列变量,用于在后续步骤中使用
- name: Build.ArtifactStagingDirectory
value: '$(Build.Repository.LocalPath)\artifacts'
- name: buildConfiguration
value: 'Release'
- name: publishFolder
value: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId)'
- name: solution
value: '项目.sln'
- name: zipFileName
value: '压缩包xxx.zip'
- name: storageAccountName
value: 'storagea名称'
- name: resourceGroupName
value: '资源组'
- name: vmName
value: 'VM虚拟机名称'
- name: shareName
value: 'storage目录'
- name: destPath
value: "目录地址"
stages:
- stage: Build
displayName: Build stage # 构建阶段的显示名称
jobs:
- job: Build
displayName: 'Build job' # 构建作业的显示名称
steps:
- script: dotnet restore $(solution)
displayName: 'Build solution' # 恢复解决方案的依赖项
- script: dotnet publish $(solution) --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)
displayName: 'Publish solution' # 发布解决方案到指定目录
- task: ArchiveFiles@2
inputs:
rootFolderOrFile: '$(Build.ArtifactStagingDirectory)'
includeRootFolder: false
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)\$(zipFileName)'
replaceExistingArchive: true # 将发布的文件打包成zip格式
- script: |
echo "===== Listing files in ArtifactStagingDirectory ====="
ls "$(Build.ArtifactStagingDirectory)"
echo "===== Finished listing files ====="
displayName: 'List files in ArtifactStagingDirectory' # 列出ArtifactStagingDirectory目录下的文件,用于调试
- task: PublishBuildArtifacts@1
inputs:
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: 'drop'
publishLocation: 'Container' # 发布构建产物到Azure DevOps
- stage: Deploy
displayName: 'Deploy to IIS on Azure VM using ARM'
jobs:
- deployment: DeployJob
displayName: 'Deploy'
environment: 'YourEnvironmentName' # 指定部署环境的名称
strategy:
runOnce:
deploy:
steps:
- task: DownloadBuildArtifacts@0
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'drop'
downloadPath: '$(System.ArtifactsDirectory)' # 下载构建产物
- task: AzurePowerShell@5
inputs:
azureSubscription: 'PublishAreaDts'
azurePowerShellVersion: LatestVersion
ErrorActionPreference: 'Continue'
ScriptType: 'InlineScript'
Inline: |
# 后续为PowerShell脚本,用于在Azure VM上部署应用
# 脚本包括验证文件路径、检查文件是否存在、获取存储账户和文件共享、上传文件到存储账户、生成SAS令牌、在目标VM上执行脚本等步骤
env:
ArtifactStagingDirectory: $(Build.ArtifactStagingDirectory: $(Build.ArtifactStagingDirectory) # 设置环境变量,供脚本使用
结尾
这个YAML脚本利用了Azure DevOps的CI/CD(持续集成/持续部署)能力,自动化了从代码提交到部署的整个流程。CI/CD是现代软件开发实践中的一个核心概念,它使得软件的构建、测试和部署过程更加快速、自动化和可靠。
持续集成(CI):频繁地(一天多次)将代码集成到主干。每次集成都通过自动化的构建(包括编译、发布和自动化测试)来验证,从而尽早地发现集成错误。
持续部署(CD):代码在通过所有测试后,自动部署到生产环境。这意味着除了自动化测试外,还需要有自动化的部署过程。
在这个脚本中,构建阶段使用了.NET Core的dotnet命令来恢复依赖、构建和发布解决方案,然后将发布的文件打包成zip格式,并将其发布为构建产物。部署阶段则涉及到将构建产物下载到部署环境、上传到Azure存储账户,并在目标虚拟机上执行脚本来部署应用。