【问题标题】:use files checked out from previous job in another job in an Azure pipeline在 Azure 管道中的另一个作业中使用从先前作业签出的文件
【发布时间】:2021-05-10 04:44:52
【问题描述】:

我在 Azure DevOps 中创建了一个管道,用于构建 Angular 应用程序并在其上运行一些测试。我将管道分为两个作业,构建和测试。构建作业成功完成。即使 Build 作业已经完成,Test 作业也会再次从 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

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

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

【问题讨论】:

    标签: azure-devops azure-pipelines


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的帮助。您的解决方案适用于生成的 Angular 文件,但 Node 和 npm 呢?我在 Build 作业中安装 Node。有没有办法使用变量或其他东西在测试作业中访问它?
    • 在这种情况下,我将在同一个作业中运行模板,这很容易,因为唯一似乎包含步骤。在托管代理上,您还应该假设工具已经消失,一旦作业结束,因此您必须在测试作业中再次安装它,除非它是同一个作业。
    • 对于单元测试,我认为将它们作为构建作业的一部分运行是有意义的,但对于集成测试,我会将它们放在另一个阶段(或至少是作业),然后共享工件。
    • 感谢您的帮助。我决定将构建和测试工作合并为一项工作。这样就容易多了。我不知道'-checkout:none'。知道这一点很有用。
    【解决方案2】:

    在 Azure 管道中的另一个作业中使用从先前作业签出的文件

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

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

    - job: Test
      displayName: Run Unit and Cypress Tests
      dependsOn: Build
      steps:
        - checkout: none
        - template: templates/angularlinttest.yml
    

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

      pool:
        name: string
        demands: string | [ string ]
    

    请查看此文档How to send TFS build to a specific agent or server 了解更多信息。

    在测试作业中,我们可以像$(System.DefaultWorkingDirectory) 一样使用predefined variables 来访问Node 和npm 的文件。

    另一方面,如果您使用的是托管代理,我们需要使用PublishBuildArtifacts 任务将Artifact 发布到Azure 工件,以便我们可以使用DownloadBuildArtifacts 任务下载下一项工作中的工件:

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

    您可以查看Official documents and examples 了解更多详情。

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 2021-08-27
      • 2020-03-29
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 2022-01-20
      • 2020-06-16
      相关资源
      最近更新 更多