在Azure发布管道(YAML)中有这样一个东西作为while循环吗?我的用例是使用runOnce策略将工件部署到干净的环境中,部署客户端数据,在移动到下一个客户端之前,我需要运行查询以确保完成所有处理并完成健康检查。所有的检查都可以通过SQL脚本在Azure SQL数据库中完成,最终我需要将结果和任务时间与预期集合进行比较。
。e跨分支处理客户端数据是否产生预期的结果和时间?
可能是一个方钉圆孔,所以如果有更简单的方法,我很乐意使用不同的方法。
- deployment : Install
pool:
vmImage: ubuntu-latest
environment:
name: 'Test_Env'
resourceType: VirtualMachine
strategy:
runOnce:
deploy:
steps:
# Remove and re-create blank database on the Elastic Pool.
- task: SqlAzureDacpacDeployment@1
displayName: Drop DB
inputs:
azureSubscription: 'Azure'
AuthenticationType: 'server'
ServerName: '$(DB_SERVER)'
DatabaseName: 'master'
SqlUsername: '$(DB_USERNAME)'
SqlPassword: '$(DB_PASSWORD)'
deployType: 'InlineSqlTask'
SqlInline: |
IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'$(DB_DATABASE)') DROP DATABASE [$(DB_DATABASE)]
IpDetectionMethod: 'AutoDetect'
- task: SqlAzureDacpacDeployment@1
displayName: Create DB
inputs:
azureSubscription: 'Azure'
AuthenticationType: 'server'
ServerName: '$(DB_SERVER)'
DatabaseName: 'master'
SqlUsername: '$(DB_USERNAME)'
SqlPassword: '$(DB_PASSWORD)'
deployType: 'InlineSqlTask'
SqlInline: |
CREATE DATABASE $(DB_DATABASE) ( SERVICE_OBJECTIVE = ELASTIC_POOL (name = [SQL_ElasticPool] ));
IpDetectionMethod: 'AutoDetect'
- task: CmdLine@2
displayName: Install Product
inputs:
script: |
start /wait msiexec.exe /i "$(System.ArtifactsDirectory)installer.msi" client_data= $(client_data) DB_USERNAME=$(DB_USERNAME) DB_PASSWORD=$(DB_PASSWORD)
workingDirectory: $(System.ArtifactsDirectory)
- task: CmdLine@2
displayName: Start Service
inputs:
script: |
sc start $(WIN_SERVICE)
# This is where I would want a while-loop
- task: SqlAzureDacpacDeployment@1
displayName: Check if processing finished
inputs:
azureSubscription: 'Azure'
AuthenticationType: 'server'
ServerName: '$(DB_SERVER)'
DatabaseName: '$(DB_DATABASE)'
SqlUsername: '$(DB_USERNAME)'
SqlPassword: '$(DB_PASSWORD)'
deployType: 'InlineSqlTask'
SqlInline: |
select 1 from eventlog if complete = 0
IpDetectionMethod: 'AutoDetect'
Azure Devops YAML管道- While循环?
您可以创建一个模板,其中将有一组Check if processing finished
任务,并在构建期间将循环时间作为参数传递,如:
- template: CheckProcessingFinished.yaml
parameters:
param: ["1","2","3"]
CheckProcessingFinished.yaml:
parameters:
param : []
steps:
- ${{each Looptimes in parameters.param}}:
- task: SqlAzureDacpacDeployment@1
displayName: Check if processing finished
inputs:
azureSubscription: 'Azure'
AuthenticationType: 'server'
ServerName: '$(DB_SERVER)'
DatabaseName: '$(DB_DATABASE)'
SqlUsername: '$(DB_USERNAME)'
SqlPassword: '$(DB_PASSWORD)'
deployType: 'InlineSqlTask'
SqlInline: |
select 1 from eventlog if complete = 0
IpDetectionMethod: 'AutoDetect'
- task: PowerShell@2
inputs:
targetType: 'Sleep 30 seconds'
script: |
Start-Sleep 30
你可以查看文档解决Azure DevOps管道中的循环问题了解更多细节。
- 在YAML中我们使用
each
关键字,它相当于for loop
。 - 在满足条件之前不能运行一个任务,但可以运行多个任务任务可以一个一个地写,也可以使用
each
语句,相当于for循环。 但是你可以使用 - 门可以在管道的起点,也可以在管道的末端管道。
- Gates有很多类型,比如使用调用函数和azure监视器的Gates,一些Gates也使用rest api。你也可以创建自定义门。
- Gates将继续检查用户指定的条件,直到满足。 因此,您可以使用azure函数门运行所需的脚本并在门中返回结果以进行验证。
GATE
,这是一种控制部署的方式。它们主要用于基础设施的健康检查、部署的外部批准等。参考:
Azure Pipeline Gate