使用git commit阻止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

我正在尝试创建一个Jenkins管道,它在高级别上执行以下步骤:

  • 发送生成通知
  • 运行lint测试
  • 运行CI测试
  • 在几个文件中更新版本信息
  • 使用git将更新提交到文件,创建标记,并将更改推送到源
  • 将project中的文件上载到其他系统
  • 发送通知
  • 我希望在特定分支发生提交时执行此管道。我现在已经开始工作了,但问题是当作业在构建过程中提交新的更改时(在上面的步骤5中),它会启动一个新的构建,并基本上进入一个无限循环

    我知道这在设计上是可行的,但是有没有办法阻止新的构建作业执行呢?我是否可以在Jenkins管道中执行某些操作以防止新提交启动新的Jenkins作业,或者这需要整个工作流的返工?

    您可以使用

    例如,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
    
    你可以用

    例如,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中报告一个成功的生成,因为它是该提交的最后一个生成。这不是伊苏