Skip to content

Azure DevOps pipeline task to get changed files since last succeeded build

License

Notifications You must be signed in to change notification settings

touchifyapp/vsts-changed-files

Repository files navigation

Azure DevOps Task: Changed Files

CI

Pipeline task to get changed files and apply conditions according to those changes.

Important

This task has been upgraded to latest execution environment (Node 20 + azure-pipelines-task-lib v4) to adress security issues and deprecation warnings. This upgrade has been released in a major version (v2).

  • If you're using a self-hosted Azure Agent prior to v3.224.1, please stick on version 1.
  • If you're using an Azure hosted Azure Agent or a self-hosted Azure Agent upgraded to v3.224.1 or above, please upgrade to version 2 to ensure you're on the latest execution environment.

Installation

Installation can be done using Visual Studio MarketPlace.

Source Code

Source code can be found on Github.

Simple usage

jobs: 
  - job: check
    displayName: Check changed files
    pool:
        vmImage: ubuntu-latest
    steps:
      - task: ChangedFiles@2
        name: CheckChanges
        inputs:
          rules: src/**/*.ts
          variable: HasChanged

  - job: build
    displayName: Build only when code changes
    dependsOn: check
    condition: eq(dependencies.check.outputs['CheckChanges.HasChanged'], 'true')
    steps:
        - # Add your build steps here

Multi-variable usage

jobs: 
  - job: check
    displayName: Check changed files
    pool:
        vmImage: ubuntu-latest
    steps:
      - task: ChangedFiles@2
        name: CheckChanges
        inputs:
          rules: |
            [CodeChanged]
            src/**/*.ts
            src/**/*.html

            [TestsChanged]
            tests/**/*.ts

  - job: build
    displayName: Build only when code changes
    dependsOn: check
    condition: eq(dependencies.check.outputs['CheckChanges.CodeChanged'], 'true')
    steps:
        - # Add your build steps here
        
  - job: tests
    displayName: Tests only when code changes or tests changes
    dependsOn: check
    condition: or(eq(dependencies.check.outputs['CheckChanges.CodeChanged'], 'true'), eq(dependencies.check.outputs['CheckChanges.TestsChanged'], 'true'))
    steps:
        - # Add your build steps here

Multi-branch usage

jobs: 
  - job: check
    displayName: Check changed files
    pool:
        vmImage: ubuntu-latest
    steps:
      - task: ChangedFiles@2
        name: CheckChanges
        inputs:
          refBranch: master
          rules: |
            [CodeChanged]
            src/**/*.ts
            src/**/*.html

            [TestsChanged]
            tests/**/*.ts

  - job: build
    displayName: Build only when code changes
    dependsOn: check
    condition: eq(dependencies.check.outputs['CheckChanges.CodeChanged'], 'true')
    steps:
        - # Add your build steps here
        
  - job: tests
    displayName: Tests only when code changes or tests changes
    dependsOn: check
    condition: or(eq(dependencies.check.outputs['CheckChanges.CodeChanged'], 'true'), eq(dependencies.check.outputs['CheckChanges.TestsChanged'], 'true'))
    steps:
        - # Add your build steps here

Multi-stage usage

stages:
  - stage: pre
    jobs:
      - job: check
        displayName: Check changed files
        pool:
          vmImage: ubuntu-latest
        steps:
          - task: ChangedFiles@2
            name: CheckChanges
            inputs:
              refBranch: main 
              rules: |
                [BarChanged]
                bar/**

                [FooChanged]
                foo/**

  - stage: bar_has_changed
    dependsOn: ["pre"]
    displayName: This stage runs only when the `BarChanged` variable is true
    condition: eq(dependencies.pre.outputs['check.CheckChanges.BarChanged'], 'true')
    jobs: 
      - job: run
        steps:
           - # Add your build steps here

  - stage: foo_has_changed
    dependsOn: ["pre"]
    displayName: This stage runs only when the `FooChanged` variable is true
    condition: eq(dependencies.pre.outputs['check.CheckChanges.FooChanged'], 'true')
    jobs: 
      - job: run
        steps:
           - # Add your build steps here
           
  - stage: stage_with_conditional_job
    dependsOn: ["pre"]
    displayName: The stage always runs but contains a job that runs only when `FooChanged` is true
    jobs: 
      - job: job_when_foo_has_changed
        displayName: This job runs only when `FooChanged` is true
        condition: eq(stageDependencies.pre.check.outputs['CheckChanges.FooChanged'], 'true')
        steps:
          - # Add your build steps here

Options

  • rules: Filter files to check changes for. Default: ** (match all files).
  • variable: The name of the default output variable to set to be available in next steps/jobs/stages. Default: HasChanged.
  • isOutput: Are variables available in next stages? Default: true.
  • refBranch: The branch that will be used as reference to check changes in case multi-branches pipeline.
  • cwd: Change the current working directory. Default: $(System.DefaultWorkingDirectory)
  • verbose: Enable verbose logging. Default: false.

Troubleshooting

If you encounter the error: fatal: ambiguous argument 'origin/{branch}...': unknown revision or path not in the working tree.

It means that you should fetch the full depth of your git history to be sure to include all necessaries artifacts:

jobs: 
  - job: check
    displayName: Check changed files
    pool:
        vmImage: ubuntu-latest
    steps:
      - checkout: self
        fetchDepth: "0"
        
      - task: ChangedFiles@2
        name: CheckChanges
        inputs:
          rules: src/**/*.ts
          variable: HasChanged

License

MIT

Git tested changes

  • git repo with only one branch or a pipeline for only one branch
  • git create new branch without changes vs reference branch
  • git push with single commit
  • git push with several commits
  • git repo with multiple branches and a pipline for multiple branches
  • git merge a branch into another branch
  • git cherry-pick
  • git rebase and push force
  • git revert

About

Azure DevOps pipeline task to get changed files since last succeeded build

Resources

License

Stars

Watchers

Forks

Packages

No packages published