如何在 DevOps 发布管道之外创建到 IIS 服务器的部署
How to create a deployment to an IIS server out of sight from DevOps Release pipeline
我搜索了一段时间,但未能找到在 IIS 上为 运行 的 Web 服务创建“安装包”的好方法。
我的问题是,出于安全考虑,我们需要手动将文件复制到本地服务器,因此不允许自动执行此工作。但据我所知,所有 IIS 部署模板都使用 Deployment group
将版本分发到注册服务器。
有没有办法为 IIS 创建一个发布管道,生成一个 zip file/artifact,可以从 DevOps 或从放置文件夹手动下载?
我已经使用任务 CopyFiles@2、FileTransform@1 和 UniversalPackages@0 创建了一个发布管道来复制构建工件、转换 appsettings.json 文件并发布包,但这并没有添加必要的IIS 的文件,例如 web.config 文件。
感谢任何回复:-)
这是构建管道 yml 文件:
trigger:
- release*
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: DotNetCoreCLI@2
displayName: 'dotnet build'
inputs:
command: build
projects: '**/*.sln'
configuration: '$(buildConfiguration)'
- task: DotNetCoreCLI@2
displayName: 'dotnet test'
inputs:
command: test
projects: '**/*Tests.csproj'
arguments: '--configuration $(buildConfiguration) --no-restore --collect "Code coverage"'
testRunTitle: 'Unit and Integrtion Tests'
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
publishWebProjects: true
arguments: '--configuration $(buildConfiguration) --output $(build.artifactStagingDirectory)'
zipAfterPublish: true
- task: PublishPipelineArtifact@1
displayName: 'publish pipeline artifact'
inputs:
targetPath: '$(build.artifactStagingDirectory)'
artifactName: 'WebAPI'
以及发布管道:
Release pipeline
您可以直接使用与构建管道关联的发布管道。
在 Artifacts 下添加相关的构建管道,另外,记得在构建管道下添加 Publish build artifacts 任务,这将有助于发布捕获最终的 zip 文件夹。
Then,您可以在 Stages 下创建一个 Release,使用 Manage IISWebsite Task 和部署 IIS Webiste/App 任务。
够了。
经过一些曲折我最终得到了这个解决方案,使用模板 yml 文件进行开发和发布。
如果有人有任何改进建议,请在下面发表评论。
希望这会有所帮助:-)
管道:
azure-pipelines-build-template.yml:
variables:
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
artifactPath: '$(build.artifactStagingDirectory)'
steps:
- task: DotNetCoreCLI@2
displayName: 'dotnet build solution'
inputs:
command: build
projects: '**/*.sln'
configuration: '$(buildConfiguration)'
- task: DotNetCoreCLI@2
displayName: 'dotnet test solution'
inputs:
command: test
projects: '**/*Tests.csproj'
arguments: '--configuration $(buildConfiguration) --no-restore'
testRunTitle: 'Unit and Integrtion Tests'
- task: DotNetCoreCLI@2
displayName: 'dotnet publish to pipeline'
inputs:
command: publish
publishWebProjects: true
arguments: '--configuration $(buildConfiguration) --output $(artifactPath)'
zipAfterPublish: true
- task: PublishPipelineArtifact@1
displayName: 'publish pipeline artifact Flyttavle'
inputs:
targetPath: '$(artifactPath)'
artifactName: 'WebAPI'
azure-pipelines-dev-build.yml:
trigger:
- dev
pool:
vmImage: 'windows-latest'
extends:
template: azure-pipelines-build-template.yml
azure-pipelines-release-build.yml:
trigger:
- release*
pool:
vmImage: 'windows-latest'
extends:
template: azure-pipelines-build-template.yml
发布:
我创建了 4 个版本,Azure_Dev_Deploy 和部署到 Azure 的 Azure_Release_Deploy,On_Prem_Prod_Deploy 和 On_Prem_Test_Deploy 为本地部署创建要下载的包。
Dev_Deploy 和 Release_Deploy:
这里的区别是:
- 针对开发和发布分支上的更改分别设置了触发器
- 部署指向 Azure 中的应用服务,分别用于开发和发布应用服务
- 变量分别指向变量组,用于开发和发布变量替换(在库中定义)
Release Pipeline and Tasks for Dev_Deploy and Release_Deploy
(两者的设置相同,但图片显示的是 Dev 部署)
以及任务的 yaml 视图:
部署 Azure 应用服务:
steps:
- task: AzureRmWebAppDeployment@4
displayName: 'Deploy Azure App Service'
inputs:
azureSubscription: '$(Parameters.ConnectedServiceName)'
appType: '$(Parameters.WebAppKind)'
WebAppName: '$(Parameters.WebAppName)'
packageForLinux: '$(System.DefaultWorkingDirectory)/_BEDevBuild/WebAPI.zip'
JSONFiles: '**/appsettings*.json'
On_Prem_Test_Deploy 和 On_Prem_Prod_Deploy:
这里的区别是:
- 分别为 on-prem-test 和 on-prem-prod 创建工件
- 变量分别指向变量组,用于本地测试和本地生产变量替换(在库中定义)
Release Pipeline and Tasks for On_Prem_Test_Deploy and On_Prem_Prod_Deploy
(两者设置相同,但图片显示测试部署)
以及任务的 yaml 视图:
文件转换:
steps:
- task: FileTransform@1
displayName: 'File Transform: on-prem/prod'
inputs:
folderPath: '$(System.ArtifactsDirectory)/_BEReleaseBuild/*.zip'
fileType: json
targetFiles: '**/appsettings*.json'
通用发布:
steps:
- task: UniversalPackages@0
displayName: 'Universal publish'
inputs:
command: publish
publishDirectory: '$(System.ArtifactsDirectory)/_BEReleaseBuild'
vstsFeedPublish: '********-****-****-****-************/********-****-****-****-************'
vstsFeedPackagePublish: 'on-prem-prod'
packagePublishDescription: 'Package for on premise production'
下载工件:
然后要下载 Artifacts 提要中的工件,我在本地使用 Powershell 中的以下语句。
PS!至于今天,无法从通用包的 REST 调用中下载,这破坏了我在 Wiki 中创建下载的宏伟计划 link,但希望将来会支持它。
预测试:
az artifacts universal download --organization "https://dev.azure.com/[my org name]/" --project "[DevOps project id]" --scope project --feed "on-premise" --name "on-prem-test" --version "*" --path .
本地产品:
az artifacts universal download --organization "https://dev.azure.com/[my org name]/" --project "[DevOps project id]" --scope project --feed "on-premise" --name "on-prem-prod" --version "*" --path .
参数提示:
--version "*"
将始终在 feed 中获取给定包名称的最新版本
--path .
下载包到你在Powershell中执行命令的地方
我搜索了一段时间,但未能找到在 IIS 上为 运行 的 Web 服务创建“安装包”的好方法。
我的问题是,出于安全考虑,我们需要手动将文件复制到本地服务器,因此不允许自动执行此工作。但据我所知,所有 IIS 部署模板都使用 Deployment group
将版本分发到注册服务器。
有没有办法为 IIS 创建一个发布管道,生成一个 zip file/artifact,可以从 DevOps 或从放置文件夹手动下载?
我已经使用任务 CopyFiles@2、FileTransform@1 和 UniversalPackages@0 创建了一个发布管道来复制构建工件、转换 appsettings.json 文件并发布包,但这并没有添加必要的IIS 的文件,例如 web.config 文件。
感谢任何回复:-)
这是构建管道 yml 文件:
trigger:
- release*
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: DotNetCoreCLI@2
displayName: 'dotnet build'
inputs:
command: build
projects: '**/*.sln'
configuration: '$(buildConfiguration)'
- task: DotNetCoreCLI@2
displayName: 'dotnet test'
inputs:
command: test
projects: '**/*Tests.csproj'
arguments: '--configuration $(buildConfiguration) --no-restore --collect "Code coverage"'
testRunTitle: 'Unit and Integrtion Tests'
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
publishWebProjects: true
arguments: '--configuration $(buildConfiguration) --output $(build.artifactStagingDirectory)'
zipAfterPublish: true
- task: PublishPipelineArtifact@1
displayName: 'publish pipeline artifact'
inputs:
targetPath: '$(build.artifactStagingDirectory)'
artifactName: 'WebAPI'
以及发布管道: Release pipeline
您可以直接使用与构建管道关联的发布管道。
在 Artifacts 下添加相关的构建管道,另外,记得在构建管道下添加 Publish build artifacts 任务,这将有助于发布捕获最终的 zip 文件夹。
Then,您可以在 Stages 下创建一个 Release,使用 Manage IISWebsite Task 和部署 IIS Webiste/App 任务。
够了。
经过一些曲折我最终得到了这个解决方案,使用模板 yml 文件进行开发和发布。
如果有人有任何改进建议,请在下面发表评论。 希望这会有所帮助:-)
管道:
azure-pipelines-build-template.yml:
variables:
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
artifactPath: '$(build.artifactStagingDirectory)'
steps:
- task: DotNetCoreCLI@2
displayName: 'dotnet build solution'
inputs:
command: build
projects: '**/*.sln'
configuration: '$(buildConfiguration)'
- task: DotNetCoreCLI@2
displayName: 'dotnet test solution'
inputs:
command: test
projects: '**/*Tests.csproj'
arguments: '--configuration $(buildConfiguration) --no-restore'
testRunTitle: 'Unit and Integrtion Tests'
- task: DotNetCoreCLI@2
displayName: 'dotnet publish to pipeline'
inputs:
command: publish
publishWebProjects: true
arguments: '--configuration $(buildConfiguration) --output $(artifactPath)'
zipAfterPublish: true
- task: PublishPipelineArtifact@1
displayName: 'publish pipeline artifact Flyttavle'
inputs:
targetPath: '$(artifactPath)'
artifactName: 'WebAPI'
azure-pipelines-dev-build.yml:
trigger:
- dev
pool:
vmImage: 'windows-latest'
extends:
template: azure-pipelines-build-template.yml
azure-pipelines-release-build.yml:
trigger:
- release*
pool:
vmImage: 'windows-latest'
extends:
template: azure-pipelines-build-template.yml
发布:
我创建了 4 个版本,Azure_Dev_Deploy 和部署到 Azure 的 Azure_Release_Deploy,On_Prem_Prod_Deploy 和 On_Prem_Test_Deploy 为本地部署创建要下载的包。
Dev_Deploy 和 Release_Deploy:
这里的区别是:
- 针对开发和发布分支上的更改分别设置了触发器
- 部署指向 Azure 中的应用服务,分别用于开发和发布应用服务
- 变量分别指向变量组,用于开发和发布变量替换(在库中定义)
Release Pipeline and Tasks for Dev_Deploy and Release_Deploy (两者的设置相同,但图片显示的是 Dev 部署)
以及任务的 yaml 视图:
部署 Azure 应用服务:
steps:
- task: AzureRmWebAppDeployment@4
displayName: 'Deploy Azure App Service'
inputs:
azureSubscription: '$(Parameters.ConnectedServiceName)'
appType: '$(Parameters.WebAppKind)'
WebAppName: '$(Parameters.WebAppName)'
packageForLinux: '$(System.DefaultWorkingDirectory)/_BEDevBuild/WebAPI.zip'
JSONFiles: '**/appsettings*.json'
On_Prem_Test_Deploy 和 On_Prem_Prod_Deploy:
这里的区别是:
- 分别为 on-prem-test 和 on-prem-prod 创建工件
- 变量分别指向变量组,用于本地测试和本地生产变量替换(在库中定义)
Release Pipeline and Tasks for On_Prem_Test_Deploy and On_Prem_Prod_Deploy (两者设置相同,但图片显示测试部署)
以及任务的 yaml 视图:
文件转换:
steps:
- task: FileTransform@1
displayName: 'File Transform: on-prem/prod'
inputs:
folderPath: '$(System.ArtifactsDirectory)/_BEReleaseBuild/*.zip'
fileType: json
targetFiles: '**/appsettings*.json'
通用发布:
steps:
- task: UniversalPackages@0
displayName: 'Universal publish'
inputs:
command: publish
publishDirectory: '$(System.ArtifactsDirectory)/_BEReleaseBuild'
vstsFeedPublish: '********-****-****-****-************/********-****-****-****-************'
vstsFeedPackagePublish: 'on-prem-prod'
packagePublishDescription: 'Package for on premise production'
下载工件:
然后要下载 Artifacts 提要中的工件,我在本地使用 Powershell 中的以下语句。
PS!至于今天,无法从通用包的 REST 调用中下载,这破坏了我在 Wiki 中创建下载的宏伟计划 link,但希望将来会支持它。
预测试:
az artifacts universal download --organization "https://dev.azure.com/[my org name]/" --project "[DevOps project id]" --scope project --feed "on-premise" --name "on-prem-test" --version "*" --path .
本地产品:
az artifacts universal download --organization "https://dev.azure.com/[my org name]/" --project "[DevOps project id]" --scope project --feed "on-premise" --name "on-prem-prod" --version "*" --path .
参数提示:
--version "*"
将始终在 feed 中获取给定包名称的最新版本--path .
下载包到你在Powershell中执行命令的地方