作业在上一个作业完成之前开始

时间:2019-11-15 16:32:00

标签: azure-pipelines

我有一个包含两个作业(job: Publishdeployment: Deploy)的Azure Pipelines阶段。

有时deployment: Deploy会在job: Publish完成之前开始运行。

我遇到错误,然后需要等待job: Publish完成并重新运行deployment: Deploy

当我重新运行deployment: Deploy时,一切顺利...

问题
为什么deployment: Deployjob: 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'

1 个答案:

答案 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完成后运行。