在Github上触发特定的Jenkins作业推送到特定目录

问题描述 投票:0回答:2

我有几个 Jenkins 作业正在运行,将代码部署到应用程序服务器。只要通过 Github 中的 Jenkins 插件和 webhook 配置了 Github 存储库中的 Commit,这些作业就会自动运行。 Jenkins 运行在 Windows 系统上。

我们在存储库中有多个应用程序,由包含代码的目录表示,每个应用程序都有一个相应的 Jenkins 作业,当作业运行时,该作业将代码部署到服务器。 由于所有应用程序都位于同一个存储库中,因此任何一个应用程序中的更改都会创建一个 Push 事件,从而触发所有作业。

假设有三个应用程序App1App2App3,它们对应的作业是J1J2J3 App1 发生更改,并在 Github 存储库中进行提交,这会导致所有作业 J1J2J3 触发并在服务器中部署 App1App2App3

它会导致不必要的混乱,因为App2App3在存储库中没有任何更改,但仍然部署到服务器。 有什么方法可以根据 Github 存储库中的目录级别更改/提交触发特定的 Jenkins 作业构建。我们可以使用任何 git hooks 来实现这一点吗?

git github jenkins githooks
2个回答
3
投票

为此,您可以稀疏签出到 git 中的特定目录,以便每个 jenkins 作业都是相互的。

jenkins 作业配置 -> 源代码管理 -> Git -> 其他行为 -> 添加 -> 稀疏签出路径

这将简单地稀疏检出到子目录,并仅检查该目录上是否有任何提交。希望这有帮助。


0
投票

我花了 4 天来解决这个问题。这是我的,确实有效

pipeline {
    agent any
    
    environment {
        // custom your own environment
    }
    
    stages {
        stage("Clone Repository") {
            steps {
                script {
                    echo "Clone ${DIRECTORY} repository..."
                    checkout([$class: 'GitSCM', branches: [[name: "${BRANCH}"]],
                        doGenerateSubmoduleConfigurations: false,
                        extensions: [[$class: 'SparseCheckoutPaths', sparseCheckoutPaths: [[path: env.DIRECTORY]]]],
                        submoduleCfg: [],
                        userRemoteConfigs: [[credentialsId: "${GIT_CREDENTIALS}", url: "${GIT_REPO}"]]])
                }
            }
        }
        
        stage("Check Changes") {
            steps {
                script {
                    echo "Check changes ${DIRECTORY}..."
                    def changes = checkForChanges(env.DIRECTORY)
                    if (changes) {
                        echo "Changes detected in ${DIRECTORY}."
                        env.BUILD_IMAGE_CHANGED = "true"
                    } else {
                        currentBuild.result = 'NOT_BUILT'
                        echo "No changes detected in ${DIRECTORY}. Skipping build."
                        env.BUILD_IMAGE_CHANGED = "false"
                    }
                }
            }
        }
        
        stage("Build Image") {
            when {
                expression { return env.BUILD_IMAGE_CHANGED == "true" }
            }
            steps {
                script {
                    echo "Building ${DIRECTORY} image..."
                    sh 'docker build -t $IMAGE -f ${DIRECTORY}/Dockerfile .'
                }
            }
        }
    }
}

def checkForChanges(dir) {
    def diff = sh(script: "git diff HEAD HEAD~ --name-only | grep ${dir}", returnStatus: true)
    return diff == 0
}
© www.soinside.com 2019 - 2024. All rights reserved.