我有一个包含两个作业(job: Publish
和deployment: Deploy
)的Azure Pipelines阶段。
有时deployment: Deploy
会在job: Publish
完成之前开始运行。
我遇到错误,然后需要等待job: Publish
完成并重新运行deployment: Deploy
。
当我重新运行deployment: Deploy
时,一切顺利...
问题
为什么deployment: Deploy
在job: Publish
完成之前开始?
以下是该阶段的YML代码:
- stage: Production
dependsOn: Staging
jobs:
- job: Publish
pool:
vmImage: 'Ubuntu 16.04'
steps:
- task: UseDotNet@2
displayName: Setup
inputs:
packageType: sdk
version: 3.0.x
- task: DotNetCoreCLI@2
displayName: Publish
inputs:
command: publish
publishWebProjects: false
projects: 'src/**/*.csproj'
arguments: '--configuration production --output $(Build.ArtifactStagingDirectory)'
zipAfterPublish: true
- task: PublishPipelineArtifact@0
displayName: Export
inputs:
artifactName: Production
targetPath: '$(Build.ArtifactStagingDirectory)'
- deployment: Deploy
pool:
vmImage: Ubuntu-16.04
environment: production
strategy:
runOnce:
deploy:
steps:
- task: DownloadPipelineArtifact@1
displayName: Import
inputs:
artifactName: Production
- task: AzureRmWebAppDeployment@3
displayName: Api
inputs:
package: '$(Build.ArtifactStagingDirectory)/Api.zip'
removeAdditionalFilesFlag: true
azureSubscription: '$(azure.subscription)'
appType: 'Web App on Linux'
webAppName: 'app-api'
答案 0 :(得分:3)
因为当您使用的语法不包括作业依赖性时,这时它就是build in parallel (no dependencies)。
如果未指定依赖关系,并且实际组织状况允许parallelism,则这些作业将并行运行。
但是,如果组织本身不满足并行条件,则用户也不会指定工作顺序(相关性)。现在,服务器将随机运行作业。因为没有依赖关系的作业是服务器的两个单独的作业。
注意:这仅在YAML模式下发生,Classic编辑器具有默认执行顺序。
要解决您遇到的麻烦,只需在您的dependsOn: Publish
工作中添加deployment: Deploy
:
- deployment: Deploy
dependsOn: Publish
pool:
vmImage: Ubuntu-16.04
environment: production
现在,deployment: Deploy
仅在job: Publish
完成后运行。