【问题标题】:How to detect Jenkins started a job with a tag push?如何检测 Jenkins 通过标签推送开始工作?
【发布时间】:2018-03-26 00:35:08
【问题描述】:

我将 Jenkins 用于 CI/CD。 Git 存储库有一个 Jenkins 钩子,因此它会在每次推送时触发新构建,其中包括标签。

我的构建,由标签触发,产生以下输出。

    commit notification 282aa9df9bc037df26f82d0aaf7d65e57b3c6c00
    Building in workspace /var/jenkins_home/workspace/testproject
    > git rev-parse --is-inside-work-tree # timeout=10
    Fetching changes from the remote Git repository
    > git config remote.origin.url ssh://GIT-HOST/PRJ/REPO.git # timeout=10
    Cleaning workspace
    > git rev-parse --verify HEAD # timeout=10
    Resetting working tree
    > git reset --hard # timeout=10
    > git clean -fdx # timeout=10
    Fetching upstream changes from ssh://GIT-HOST/PRJ/REPO.git
    > git --version # timeout=10
    > git fetch --tags --progress ssh://GIT-HOST/PRJ/REPO.git +refs/heads/*:refs/remotes/origin/*
(1) > git rev-parse 282aa9df9bc037df26f82d0aaf7d65e57b3c6c00^{commit} # timeout=10
(2) > git branch -a -v --no-abbrev --contains 18dea36c9ada06c1c176b8864bb28166e2bdac3f # timeout=10
    Checking out Revision 18dea36c9ada06c1c176b8864bb28166e2bdac3f (tagtag, origin/tagtag)
    > git checkout -f 18dea36c9ada06c1c176b8864bb28166e2bdac3f

如您所见,构建是由 282aa9d (1) 触发的,它是一个标签,但后来,它被转换为提交 18dea36 (2),从那时起,只有一个提交信息可供用户使用(例如: env 变量。)这是一个有效的提交,但标签信息不再可用。

我如何知道构建已由标签触发,获取该标签信息并能够在管道中使用它?

编辑:只是为了澄清-我正在寻找一个选项来触发所有推送的构建,但如果标签确实执行其他步骤(或禁止其他步骤)。

【问题讨论】:

    标签: git jenkins


    【解决方案1】:

    似乎单独使用 Jenkins 是不可用的。有两种可能的解决方案。

    1. 过滤源通知 - Bitbucket、GitHub 等可能仅在某些事件的情况下或在除某些事件之外的所有事件的情况下才能通知 Jenkins。此类事件之一可能是标签创建。
    2. 如果上述选项不可行,请编写一个过滤服务来模拟 Jenkins。 Git 服务器会向过滤服务发送通知,然后您可以根据自己的喜好对其进行过滤,然后向真正的 Jenkins 发送(或不发送)通知。

    前者是微不足道的,但并不总是可用。后者需要一些工作(但实际上并不多)并且提供了很大的灵活性。

    【讨论】:

      【解决方案2】:

      我怎么知道一个构建已经被标签触发了

      您可以通过标签触发作业,如this setup

      从那里,构建使用的任何提交都是从标签中获得的,这意味着您可以find back the tag from the commit

      【讨论】:

      • 感谢您的回答,但我知道。我会更新这个问题。我的意思是 - 得到一份工作,但在标签的情况下运行额外的步骤。
      • @waste 那么我的回答的第二部分应该是相关的:从提交中,您可以检查是否有标签。
      • 只有按照您的建议,标签推送可以触发构建时才有意义。查看更新的问题 - 我需要始终触发构建。在这种情况下,在将新提交推送到带有标签的 master 之后,Jenkins 将触发两次构建。 Git-describe 会让你知道构建 checkout master commit 和 tag 都存在于这个提交上。你会怎么区分?还是在提交推送时发布,但只在标签推送时发送通知?现在,Jenkins 确切地知道是哪个 objectId 启动了构建。如果詹金斯知道——我也想知道。
      【解决方案3】:

      有一个新的“when”参数:buildingTag。

      buildingTag - 一个简单的条件,只检查管道是否是 针对 SCM 中的标签运行,而不是针对分支或特定 提交参考。

      https://jenkins.io/blog/2018/04/09/whats-in-declarative/

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2013-06-20
        • 2016-03-24
        • 1970-01-01
        相关资源
        最近更新 更多