Jenkins multibranch pipeline only for subfolder

Jenkinsjenkins-blueoceanjenkins-pipelinemonorepo

I have git monorepo with different apps. Currently I have single Jenkinsfile in root folder that contains pipeline for app alls. It is very time consuming to execute full pipeline for all apps when commit changed only one app.

We use GitFlow-like approach to branching so Multibranch Pipeline jobs in Jenkins as perfect fit for our project.

I'm looking for a way to have several jobs in Jenkins, each one will be triggered only when code of appropriate application was changed.

Perfect solution for me looks like this:

I have several Multibranch Pipeline jobs in Jenkins. Each one looks for changes only to given directory and subdirectories. Each one uses own Jenkinsfile. Jobs pull git every X minutes and if there are changes to appropriate directories in existing branches – initiates build; if there are new branches with changes to appropriate directories – initiates build.

What stops me from this implementation

  1. I'm missing a way to define commit to which folders must be ignored during scan execution by Multibranch pipeline. "Additional behaviour" for Multibranch pipeline doesn't have "Polling ignores commits to certain paths" option, while Pipeline or Freestyle jobs have. But I want to use Multibranch pipeline.

  2. Solution described here doesnt work for me because if there will be new branch with changes only to "project1" then whenever Multibranch pipeline for "project2" will be triggered it will discover this new branch anyway and build it. Means for every new branch each of my Multibranch pipelines will be executed at least once no matter if there was changes to appropriate code or not.

Appreciate any help or suggestions how I can implement few Multibranch pipelines watching over same git repository but triggered only when appropriate pieces of code changed

Best Answer

I solved this by creating a project that builds other projects depending on the files changed. For example, from your repo root:

/Jenkinsfile

#!/usr/bin/env groovy

pipeline {
    agent any
    options {
        timestamps()
    }
    triggers {
        bitbucketPush()
    }
    stages {
        stage('Build project A') {
            when {
                changeset "project-a/**"
            }
            steps {
                build 'project-a'
            }
        }
        stage('Build project B') {
            when {
                changeset "project-b/**"
            }
            steps {
                build 'project-b'
            }
        }
    }
}

You would then have other Pipeline projects with their own Jenkinsfile (i.e., project-a/Jenkinsfile).