如何在 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_DeployOn_Prem_Prod_DeployOn_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中执行命令的地方