Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

use files checked out from previous job in another job in an Azure pipeline

I have a pipeline I created in Azure DevOps that builds an Angular application and runs some tests on it. I separated the pipeline into two jobs, Build and Test. The Build job completes successfully. The Test job checks out the code from Git again even though the Build job already did it. The Test job needs the files created in the Build job in order to run successfully like the npm packages.

Here is my YAML file:

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

My agent pool is declared at the stage level so both jobs would be using the same agent. Also I added a dependsOn to the Test job to ensure the same agent would be used. After checking logs, the same agent is in fact used.

How can I get the Test job to use the files that were created in the Build job and not checkout the code again? I'm using Angular 11 and Azure DevOps Server 2020 if that helps.

like image 741
mdailey77 Avatar asked Mar 02 '23 18:03

mdailey77


2 Answers

use files checked out from previous job in another job in an Azure pipeline

If you are using a self-hosted agent, by default, none of the workspace are cleaned in between two consecutive jobs. As a result, you can do incremental builds and deployments, provided that tasks are implemented to make use of that.

So, we could use - checkout: none in the next job to skip checking out the same code in the Build job:

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

But just as Bo Søborg Petersen said, DependsOn does not ensure that the same agent is used. You need add a User Capability to that specific build agent then in the build definition you put that capability as a demand:

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

Please check this document How to send TFS build to a specific agent or server for some more info.

In the test job, we could use predefined variables like $(System.DefaultWorkingDirectory) to access the files for Node and npm.

On the other hand, if you are using the Hosted agent, we need use PublishBuildArtifacts task to publish Artifact to the azure artifacts, so that we could use the DownloadBuildArtifacts task to download the artifacts in the next job:

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) 

You could check Official documents and examples for some more details.

like image 181
Leo Liu-MSFT Avatar answered Mar 05 '23 17:03

Leo Liu-MSFT


Assume that the agent is cleaned between jobs, so to access the files, you need to create an artifact during the build job and then download it during the test job.

Also, DependsOn does not ensure that the same agent is used, only that the second job runs after the first job.

Also you can set the second job to not checkout the code with "-checkout: none"

like image 23
Bo Søborg Petersen Avatar answered Mar 05 '23 16:03

Bo Søborg Petersen