我们在Github存储库中有一个包含多个Jenkins文件的项目:
my-project
app
Jenkinsfile
lib1
Jenkinsfile
lib2
Jenkinsfile
我们创建了3个Jenkins管道,每个管道都引用了一个Jenkins文件。
问题:当“lib2”中有新的提交时,如何避免触发“app”和“lib1”管道?我们不希望每次提交都运行N个作业。
我已经看到问题在https://issues.jenkins-ci.org/browse/JENKINS-43749中得到了解决,但我还没有找到解决方案。
答案 0 :(得分:4)
最近更新:
我后来使用以下代码段修复了此问题: 如果看到命令dir('servicelayer'),使用它移动到目录中,执行git命令以查找提交之间的差异并引发标志。这样,我已经在一个存储库中管理了3个Jenkins文件。
stage('Validation') {
steps {
//Moving in to the directory to execute the commands
dir('servicelayer') {
script {
//Using the git command to check the difference between previous successful commit. ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} is an environment variable comes with GIT Jenkins plugin
//There is a drawback though, if it is the first time you are running this job, this variable is not available and fails the build
//For the first time i had to use ${env.GIT_COMMIT} itself at both places to pass the build. A hack but worth it for future builds.
def strCount = sh(returnStdout: true, script: "git diff --name-only ${env.GIT_COMMIT} ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} | grep servicelayer | wc -l").trim()
if(strCount=="0") {
echo "Skipping build no files updated"
CONTINUE_BUILD = false
} else {
echo "Changes found in the servicelayer module"
}
}
}
}
}
旧答案:
您可以通过2种方式来做到这一点:
a)通过添加“其他行为”->“轮询特定区域中的忽略提交”来配置构建作业 此行为使您可以添加不想轮询以触发构建作业的“白名单区域”或“黑名单区域”。
b)编写一个自定义的shell脚本,以验证每次提交更改的文件并验证位置。然后可以将此Shell脚本添加到您的Jenkinsfile中,无论是声明式还是脚本式,您都可以相应地调整行为。
我将建议选项a),因为它也更易于配置和维护。希望这会有所帮助。
答案 1 :(得分:2)
我实现了在单个存储库中具有多个管道(Jenkinsfile)。它不是hacky,但并非完全无关紧要,需要最新版本的Jenkins和更新的Lockable Resources plugin,并且可能需要在构建过程中执行其他步骤。
创建一个仅“源代码管理”项目。在詹金斯 术语可以是一个Freestyle项目,只关心 保持源代码更新,并带有SCM部分和已触发的代码 配置(示例名称“ MyProjectSCM”)。就我而言,我有一个git 带有轮询计划的存储库。确保未未选中“如有必要,执行并发构建”标志;
在项目存储库中,提交一个或多个Jenkins管道,例如“ JenkinsfileBuild”,“ JenkinsfileRelease”。确保管道:
在skipDefaultCheckout
部分中有options
;
在配置的SCM项目(“ MyProjectSCM”)上具有触发器;
在构建期间锁定SCM项目。
pipeline {
agent any
options {
disableConcurrentBuilds()
skipDefaultCheckout()
}
triggers {
upstream(upstreamProjects: 'MyProjectSCM')
}
stages {
stage('Build') {
lock('MyProjectSCM') {
steps {
echo 'Build within MyProjectSCM lock...'
}
}
}
}
}
创建管道项目,每个在存储库中提交的Jenkins文件一个。管道应具有已配置的“来自SCM的管道脚本”(在此示例中,管道可以命名为“ MyProject_Build”,已配置“ JenkinsfileBuild”),并且已选中“轻量检出”标志(实际上是默认设置):>
“ MyProject_Build”管道中的skipDefaultCheckout
指令将阻止在该工作空间中签出存储库,奇怪的是,“轻量签出”标志本身不足以阻止签出。因为“ MyProject_Build”工作空间实际上是空的,所以您必须通过环境变量或相对路径来引用构建脚本中仅SCM项目目录。 lock
指令很有用,因此在实际构建项目时不会进行新的提交。
答案 2 :(得分:1)
答案 3 :(得分:-3)
如果所有内容都在同一个存储库下,并且在同一分支下,jenkins将在执行pull请求/提交时触发该分支中的所有作业。您可以使用multibranch pipeline,其中每个分支可以包含不同的Jenkinsfile,因此只有在创建了pull request / commit的地方才会触发那些管道作业