使用git commit阻止Jenkins作业启动其他作业
我正在尝试创建一个Jenkins管道,它在高级别上执行以下步骤:使用git commit阻止Jenkins作业启动其他作业,git,jenkins,jenkins-pipeline,pipeline,jenkins-groovy,Git,Jenkins,Jenkins Pipeline,Pipeline,Jenkins Groovy,我正在尝试创建一个Jenkins管道,它在高级别上执行以下步骤: 发送生成通知 运行lint测试 运行CI测试 在几个文件中更新版本信息 使用git将更新提交到文件,创建标记,并将更改推送到源 将project中的文件上载到其他系统 发送通知 我希望在特定分支发生提交时执行此管道。我现在已经开始工作了,但问题是当作业在构建过程中提交新的更改时(在上面的步骤5中),它会启动一个新的构建,并基本上进入一个无限循环 我知道这在设计上是可行的,但是有没有办法阻止新的构建作业执行呢?我是否可以在Jenki
git repository name
branch which was changed
commit id
commit message
commit author
etc ...
避免循环
- 将Jenkins提交ID保存到文件并将文件添加到git ignore
- 使用通用webhook触发器从push读取远程提交ID
- 比较本地文件提交ID和远程提交ID
- 如果是相同的,那是来自詹金斯的卑鄙的承诺,如果不是,那是来自詹金斯的卑鄙的承诺
#!/bin/bash
webhook_commit_id=$commit
commit_by_jenkins=commit_by_jenkins.txt
if [ ! -f $commit_by_jenkins ]
then
echo "creating local file name commit_by_jenkins.txt, please add this file to git ignore"
touch commit_by_jenkins.txt
fi
jenkins_commit=`cat commit_by_jenkins.txt`
if [ "${webhook_commit_id}" == "${jenkins_commit}" ]; then
echo "commit by jekins server, ignoring commit"
else
echo "commiting code from jenkins servver"
git add -A && git commit -m "commit by jenkins server" && git rev-parse HEAD > commit_by_jenkins.txt
fi
你可以用
例如,Jenkins中的GitHub webhook用于在开发人员向分支提交内容时触发构建,在每个webhook中,我们都有以下信息
git repository name
branch which was changed
commit id
commit message
commit author
etc ...
避免循环
- 将Jenkins提交ID保存到文件并将文件添加到git ignore
- 使用通用webhook触发器从push读取远程提交ID
- 比较本地文件提交ID和远程提交ID
- 如果是相同的,那是来自詹金斯的卑鄙的承诺,如果不是,那是来自詹金斯的卑鄙的承诺
#!/bin/bash
webhook_commit_id=$commit
commit_by_jenkins=commit_by_jenkins.txt
if [ ! -f $commit_by_jenkins ]
then
echo "creating local file name commit_by_jenkins.txt, please add this file to git ignore"
touch commit_by_jenkins.txt
fi
jenkins_commit=`cat commit_by_jenkins.txt`
if [ "${webhook_commit_id}" == "${jenkins_commit}" ]; then
echo "commit by jekins server, ignoring commit"
else
echo "commiting code from jenkins servver"
git add -A && git commit -m "commit by jenkins server" && git rev-parse HEAD > commit_by_jenkins.txt
fi
谢谢-在使用BranchAPI插件时有没有类似的方法?我们用GitHub组织的多分支管道插件配置了Jenkins实例,我相信在每次提交新版本时都会使用分支API插件。我正在浏览插件代码,我不确定在使用这些插件时是否有办法提取webhook数据或任何提交信息。我不确定,但我在使用分支API时的经验不是,泛型web钩子是您需要的,如果您正在使用此插件,那么您也可以这样做,但为此,您需要使用
标记谢谢-在使用分支API插件时,是否有类似的方法?我们用GitHub组织的多分支管道插件配置了Jenkins实例,我相信在每次提交新版本时都会使用分支API插件。我正在浏览插件代码,我不确定在使用这些插件时是否有办法提取webhook数据或任何提交信息。我不确定,但我在使用分支API时的经验不是,如果你使用这个插件,那么你也可以这样做,但是你需要使用tag
Jeff,你知道如何处理这个问题了吗?我正在考虑使用“when GIT\u COMMITTER\u NAME!=Jenkins”,但我需要在每个阶段进行以下检查:-(有更好的解决方案吗?是的,对于这个特定的管道,我们正在修改文件中的版本信息,推动这些更改,创建一个标记并发布,然后将这些更改推送到GitHub。我正在获取git repo中的所有标记,并找到最近标记的最新提交。然后,它将提交sha与最新的commit sha在git repo中。如果它们匹配,那么我知道这个存储库已经发布并且是最新的。下面是管道中的示例代码——希望这有帮助:只是澄清一下——我无法阻止推送事件启动另一个Jenkins构建作业,但最新的提交验证阶段将允许我退出新的构建作业到目前为止,我发现的唯一一个小问题是,如果上一个作业在提交了新版本文件并在GitHub中创建了新的标记和版本后失败,那么在提交验证阶段后成功退出的下一个生成将在GitHub中报告一个成功的生成,因为它是该提交的最后一个生成。这不是不过,我们的管道没有问题。杰夫,非常感谢你的回答!经过一些调查,找到并使用了。杰夫,你知道如何处理这个问题了吗?我正在考虑使用“when GIT_COMMITTER_NAME!=Jenkins”,但我需要在每个阶段进行检查:-(有更好的解决方案吗?是的,对于这个特定的管道,我们正在修改文件中的版本信息,推动这些更改,创建一个标记并发布,然后将这些更改推送到GitHub。我正在获取git repo中的所有标记,并找到最近标记的最新提交。然后,它将提交sha与最新的commit sha在git repo中。如果它们匹配,那么我知道这个存储库已经发布并且是最新的。下面是管道中的示例代码——希望这有帮助:只是澄清一下——我无法阻止推送事件启动另一个Jenkins构建作业,但最新的提交验证阶段将允许我退出新的构建作业到目前为止,我发现的唯一一个小问题是,如果上一个作业在提交了新版本文件并在GitHub中创建了新的标记和版本后失败,那么在提交验证阶段后成功退出的下一个生成将在GitHub中报告一个成功的生成,因为它是该提交的最后一个生成。这不是伊苏