How do I get my Azure DevOps Pipeline build to fail when my linting script returns an error?

14,697

Solution 1

this means your script "swallows" the exit code and exits normally. you need to add a check to your script that would catch the exit code of your npm run lint and exit with the same exit code, something like:

- script: |
    npm install
    npm run lint # Mapped to `eslint src` in package.json
    if [ $? -ne 0 ]; then
        exit 1
    fi
    npm run slint # `stylelint src` in package.json
    npm run build

Solution 2

You could also use an npm task. The default is to fail the build when there is an error. I had the same problem and the below worked for me:

- task: Npm@1
  displayName: 'Lint'
  inputs:
    command: 'custom'
    customCommand: 'run lint'

From the documentation for tasks:

- task: string  # reference to a task and version, e.g. "VSBuild@1"
  condition: expression     # see below
  continueOnError: boolean  # 'true' if future steps should run even if this step fails; defaults to 'false'
  enabled: boolean          # whether or not to run this step; defaults to 'true'
  timeoutInMinutes: number  # how long to wait before timing out the task

Solution 3

Neither approach above worked for my specific scenario (windows build agent, wanted to run a custom linting script, didn't want to use a script in package.json)

If you just throw an error from a node script, the pipeline treats it as a failed step.

pipelines yml:

  - script: 'node lint-my-stuff'
    displayName: 'Lint my stuff'

lint-my-stuff.js

// run eslint, custom checks, whatever

if (/* conditions aren't met */)
  throw new Error('Lint step failed')

console.log('Lint passed')
Share:
14,697
zagd
Author by

zagd

Updated on June 14, 2022

Comments

  • zagd
    zagd almost 2 years

    I am using the Azure Pipelines GitHub add-on to ensure that pull requests pass my linting. However, I have just made a test pull request which fails my linting, but the Azure Pipeline succeeds.

    Here is my azure-pipelines.yml

    # Node.js with React
    # Build a Node.js project that uses React.
    # Add steps that analyze code, save build artifacts, deploy, and more:
    # https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
    
    trigger:
    - master
    
    pool:
      vmImage: 'Ubuntu-16.04'
    
    steps:
    - task: NodeTool@0
      inputs:
        versionSpec: '8.x'
      displayName: 'Install Node.js'
    
    - script: |
        npm install
        npm run lint # Mapped to `eslint src` in package.json
        npm run slint # `stylelint src` in package.json
        npm run build
      displayName: 'npm install and build'
    

    And here is (part of) the output on a branch which I know fails on npm run lint

    > [email protected] lint /home/vsts/work/1/s
    > eslint src
    
    
    /home/vsts/work/1/s/src/js/components/CountryInput.js
      26:45  error  'onSubmit' is missing in props validation  react/prop-types
      27:71  error  'onSubmit' is missing in props validation  react/prop-types
    
    ✖ 2 problems (2 errors, 0 warnings)
    
    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! [email protected] lint: `eslint src`
    npm ERR! Exit status 1 # Exit status 1, yet the build succeeds?
    npm ERR! 
    npm ERR! Failed at the [email protected] lint script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
    
    npm ERR! A complete log of this run can be found in:
    npm ERR!     /home/vsts/.npm/_logs/2019-03-16T05_30_52_226Z-debug.log
    
    > [email protected] slint /home/vsts/work/1/s
    > stylelint src
    
    
    > [email protected] build /home/vsts/work/1/s
    > react-scripts build
    
    Creating an optimized production build...
    Compiled successfully.
    
    # Truncated...
    

    As you can see, linter runs nicely and catches my intentional error (I removed a prop type validation), and exits with code 1.

    However the build just carries on its merry way.

    What do I need to do to make such a linting error stop my build in its tracks and not return success?

    Thank you in advance.

  • reZach
    reZach almost 5 years
    Can you please provide a link that can explain the syntax around your following code? if [ $? -ne 0 ]; then.
  • 4c74356b41
    4c74356b41 almost 5 years
    it's explained in the answer. $? - returns last exit code
  • reZach
    reZach almost 5 years
    Is that azure-pipelines syntax ($?)? Where does it come from, npm? I'd like to do further reading on this.
  • Michal Ciechan
    Michal Ciechan almost 5 years
  • Ε Г И І И О
    Ε Г И І И О over 3 years
    Does anybody know a way to report these errors/warnings to the summary tab of the pipeline? (or somewhere else for that matter, other than drilling down)