Home > Blockchain >  How to run a single jenkinsfile for specific github components
How to run a single jenkinsfile for specific github components

Time:06-29

I want to be able to execute specific components that I organized in Files in the repository with only one main jenkinsfile.

For example I have this repo structure:

basic_structure

And I have three different components: Topic_A, Topic_B, Topic_C (same type of components but will be created for different teams). I want to be able to modify only Topic_A and C and after I push the branch I want my jenkinsfile to able to execute just those changes instead also redeploying Topic_B which it was not modified.

My question is if this possible? Could it be done with a jenkins pipeline? or any other component? (script)

Thank you.

CodePudding user response:

There is a changeset directive that allows you to check whether a file has changed in the Git repository. But it doesn't support checking directories, hence you can do something like the below.

pipeline {
    agent any

    stages {
        stage('Cloning') {
            steps {
                // Get some code from a GitHub repository
                git branch: 'main', url: 'https://github.com/xxxx/sample.git'
            }
        }
        
        stage('TOPIC_A') {
            when { expression { isChanged("Topic_A") } }
            steps {
                echo 'Doing something for Topic A'
                }
            }
            
        stage('TOPIC_B') {
            when { expression { isChanged("Topic_B") } }
            steps {
                echo 'Doing something for Topic B'
                }
            }
    }
}

def isChanged(dirName) {
    def changeLogSets = currentBuild.changeSets
    def folderName = dirName
        for (int i = 0; i < changeLogSets.size(); i  ) {
            def entries = changeLogSets[i].items
            for (int j = 0; j < entries.length; j  ) {
                def entry = entries[j]
                def files = new ArrayList(entry.affectedFiles)
                for (int k = 0; k < files.size(); k  ) {
                    def file = files[k]
                    if(file.path.contains(folderName)){
                        return true
                    }
                }
            }
        }
    return false
}
  • Related