jenkinsjenkins-github-plugin

Trigger specific job on push to specific directory


We have 12 different projects inside the same repository and have a different job to run for each of these.

I want to know how I can trigger a job only when a change has happened in a specific folder, since running all 12 on every push takes too long to finish.


Solution

  • Well I have hacked a solution that works for us.

    First, add an Execute Shell Build Step:

    #!/bin/bash
    export DIRS="api objects"
    DIFF=`git diff --name-only develop`
    
    echo "export RUN_TEST=0" > "$WORKSPACE/RUN_TEST"
    
    for DIR in $DIRS; do
      for LINE in $DIFF; do
        # Is this file inside an interesting directory?
        echo $LINE | grep -e "^$DIR/"
        # Checking if it is inside
        if [ $? -eq 0 ]; then
          echo "export RUN_TEST=1" > "$WORKSPACE/RUN_TEST"
        fi
      done
    done
    

    Here:

    Then in the time-consuming build steps add:

    #!/bin/sh
    . "$WORKSPACE/RUN_TEST"
    
    if [ $RUN_TEST -eq 1 ]; then
      # Time consuming code here
    fi
    

    That way the job is triggered but runs as fast as if it wasn't triggered.


    Now I modified it to:

    #!/bin/bash
    export DIRS="api objects"
    DIFF=`git diff --name-only origin/develop`
    
    RUN_TEST=111
    
    for DIR in $DIRS; do
      for LINE in $DIFF; do
        # Is this file inside an interesting directory?
        echo $LINE | grep -e "^$DIR/"
        # Checking if it is inside
        if [ $? -eq 0 ]; then
          RUN_TEST=0
        fi
      done
    done
    
    echo "RUN_TEST=$RUN_TEST"
    echo "return $RUN_TEST" > "$WORKSPACE/RUN_TEST"
    exit $RUN_TEST
    

    And set Exit code to set build unstable to 111 on all build steps. Then, in all following build steps I did:

    #!/bin/bash
    # Exit on any error
    set -euo pipefail
    . "$WORKSPACE/RUN_TEST"
    
    # Rest of build step