在 Azure 管道中的另一个作业中使用从上一个作业检出的文件

mda*_*y77 9 azure-devops azure-pipelines

我在 Azure DevOps 中创建了一个管道,用于构建 Angular 应用程序并对其运行一些测试。我将管道分为两个工作:构建和测试。构建作业成功完成。即使构建作业已经完成,测试作业仍会再次从 Git 中检查代码。测试作业需要在构建作业中创建的文件才能像 npm 包一样成功运行。

这是我的 YAML 文件:

trigger:
  - develop
variables:
    npm_config_cache: $(Pipeline.Workspace)/.npm
    system.debug: false
stages:
  - stage: Client
    pool:
        name: Windows
    jobs:
      - job: Build
        displayName: Build Angular
        steps:
          - template: templates/angularprodbuild.yml
      - job: Test
        displayName: Run Unit and Cypress Tests
        dependsOn: Build
        steps:
          - template: templates/angularlinttest.yml          
          - template: templates/angularunittest.yml
          - template: templates/cypresstest.yml
Run Code Online (Sandbox Code Playgroud)

我的代理池是在阶段级别声明的,因此两个作业将使用相同的代理。此外,我还向测试作业添加了 dependentOn,以确保使用相同的代理。检查日志后发现,实际上使用的是同一个代理。

如何让测试作业使用在构建作业中创建的文件而不再次检出代码?如果有帮助的话,我正在使用 Angular 11 和 Azure DevOps Server 2020。

Leo*_*SFT 13

\n

在 Azure 管道中的另一个作业中使用从上一个作业检出的文件

\n
\n

如果您使用自托管代理默认情况下,在两个连续作业之间不会清理任何工作区。因此,您可以进行增量构建和部署,前提是实施任务以利用它。

\n

因此,我们可以- checkout: none在下一个作业中使用来跳过在构建作业中检查相同的代码:

\n
- job: Test\n  displayName: Run Unit and Cypress Tests\n  dependsOn: Build\n  steps:\n    - checkout: none\n    - template: templates/angularlinttest.yml\n
Run Code Online (Sandbox Code Playgroud)\n

但正如 Bo S\xc3\xb8borg Petersen 所说,DependsOn 并不能确保使用相同的代理。您需要向该特定构建代理添加用户功能,然后在构建定义中将该功能作为需求:

\n
  pool:\n    name: string\n    demands: string | [ string ]\n
Run Code Online (Sandbox Code Playgroud)\n

请查看此文档如何将 TFS 构建发送到特定代理或服务器以获取更多信息。

\n

在测试作业中,我们可以使用预定义的变量,例如$(System.DefaultWorkingDirectory)访问 Node 和 npm 的文件。

\n

另一方面,如果您使用Hosted Agent,我们需要使用PublishBuildArtifacts任务将 Artifact 发布到 azure 工件,以便我们可以DownloadBuildArtifacts在下一个作业中使用该任务下载工件:

\n
jobs:\n- job: Build\n  pool:\n    vmImage: \'ubuntu-16.04\'\n  steps:\n  - script: npm test\n  - task: PublishBuildArtifacts@1\n    inputs:\n      pathtoPublish: \'$(System.DefaultWorkingDirectory)\'\n      artifactName: WebSite\n\n# download the artifact and deploy it only if the build job succeeded\n- job: Deploy\n  pool:\n    vmImage: \'ubuntu-16.04\'\n  steps:\n  - checkout: none #skip checking out the default repository resource\n  - task: DownloadBuildArtifacts@0\n    displayName: \'Download Build Artifacts\'\n    inputs:\n      artifactName: WebSite\n      downloadPath: $(System.DefaultWorkingDirectory) \n
Run Code Online (Sandbox Code Playgroud)\n

您可以查看官方文档和示例以了解更多详细信息。

\n


Bo *_*sen 6

假设在作业之间清理代理,因此要访问文件,您需要在构建作业期间创建一个工件,然后在测试作业期间下载它。

此外,DependsOn 不确保使用相同的代理,仅确保第二个作业在第一个作业之后运行。

您还可以将第二个作业设置为不使用“-checkout: none”检出代码