【问题标题】:Is it possible for Jenkins to automatically detect and build newly created tags in a git repo?Jenkins 是否可以在 git repo 中自动检测和构建新创建的标签?
【发布时间】:2011-10-18 10:11:47
【问题描述】:

如果我们的 Jenkins CI 服务器能够自动检测、部署和构建在我们的 Github 存储库中创建的标签,那就太好了。

这可能吗?

【问题讨论】:

  • 通常遵循的做法是在成功构建和部署后创建标签。有什么理由要构建标签而不是 master?
  • 我正在使用 Tycho,它还不支持 mvn:release,但按照你的方式做也可以。

标签: git jenkins


【解决方案1】:

通过如下配置,可以让一个job构建所有标签:

  1. 使作业获取标签就像它们是分支一样:单击存储库 URL 下方的高级按钮并输入 Refspec +refs/tags/*:refs/remotes/origin/tags/*
  2. 让它使用分支说明符*/tags/* 构建所有标记“分支”
  3. 启用 SCM 轮询,以便作业检测新标签。

这种方法有一个缺点:该作业将构建所有标签,而不仅仅是新添加的标签。因此,在您创建作业后,它将为每个现有标签触发一次。因此,您可能希望一开始什么都不做,然后等到所有现有标签都已处理完毕,然后才配置您希望为每个新标签完成的构建步骤。

由于 git 中的标签不会更改,因此每个新标签只会触发一次作业。

【讨论】:

  • 你真的做到了吗?我正在尝试启用,但没有成功。标签不在 master 分支上。在 Jenkins Git 插件中,将 Name 定义为 origin,将 refspec 定义为 '+refs/tags/*:refs/remotes/origin/tags/*'。将要构建的分支定义为“/tags/”,但不断收到提示“没有候选修订错误:找不到要构建的任何修订。验证此作业的存储库和分支配置。完成:失败”。有什么想法吗?我是否也需要以某种方式识别分支?
  • 抱歉,我在最后一条评论的开头确实很糟糕。我真的很感谢你在这里的帮助。看来要么我没有正确输入,要么stackoverflow去掉了'*',但我会重新确认,然后重试。再次感谢您以这种“愚弄” git 将标签视为分支的方式。
  • 不幸的是,正如here 所提到的,这种在新标签上触发构建的方式目前似乎已被破坏。
  • 我的问题是构建是每隔一段时间随机触发的,而没有对存储库进行任何更改。有点不对劲:/
  • 似乎这仍然不起作用。它在每次民意调查中为我构建。
【解决方案2】:

为了克服@oberlies 回答的所有标签都将被构建的缺点,我使用了一个特殊的触发器构建。触发器构建使用与主构建相同的 git 存储库和分支以及以下(后)构建步骤。

构建 -> 执行外壳:

# Get the most recent release tag.
PATTERN="release-tag-[0-9][0-9]-[0-9][0-9][0-9][0-9]"
TAG=$(git log --tags=$PATTERN --no-walk --pretty="format:%d" | grep -m 1 -o $PATTERN)

# Due to a Jenkins limitation (https://issues.jenkins-ci.org/browse/JENKINS-8952)
# when passing environment variables we have to write the tag to a file and
# inject it later again.
mv release.properties release-old.properties || true
echo "TAG = $TAG" > release.properties

# Fail the build if the most recent release tag did not change.
! diff release.properties release-old.properties

构建 -> Inject environment variables:

Properties File Path: release.properties

构建后操作 -> : Trigger parameterized build on other projects

Projects to build: <your main project>
Trigger when build is: Stable
Parameters: TAG=$TAG

最后,在您的主构建中,使用以下字符串参数勾选“此构建已参数化”

Name: TAG
Default Value: <your release branch>

并且在“源代码管理”部分的“要构建的分支”字段中使用“$TAG”。

【讨论】:

    【解决方案3】:

    你可以安装一个 post-receive 钩子,它检查标签是否被提交,并在 jenkins 中创建一个构建。

    钩子看起来像这样 [*]:

    #!/usr/bin/env python
    
    import sys
    from subprocess import Popen, PIPE, check_call
    
    def call_git(command, args):
        return Popen(['git', command] + args, stdout=PIPE).communicate()[0]
    JENKINS = 'http://localhost:8002/jenkins'
    TOKEN = 'asdf8saffwedssdf'
    jobname = 'project-tag'
    
    def handle_ref(old, new, ref):
         print 'handle_ref(%s, %s, %s)' % (old, new, ref)
         if not ref.startswith('refs/tags/'):
              return
         url = '%s/job/%s/buildWithParameters?token=%s&branch=%s' % (
            JENKINS, jobname, TOKEN, new)
         print "queueing jenkins job " + jobname + " for " + new
         check_call(["wget", "-O/dev/null", "--quiet", url])
    if __name__ == '__main__':
        for line in sys.stdin:
            handle_ref(*line.split())
    

    [*] 注意:这只是一个稍微不同的脚本的快速转换,所以很可能这里有一些小错误。这主要是为了展示这个想法。

    在 jenkins 方面,您需要配置参数化作业。唯一的参数是'branch'。

    1. 选中“此构建已参数化”并添加参数
    2. 在“源代码管理 -> 要构建的分支”中放入“$branch”

    这提供了一种相当安全和健壮的构建方式。要进行测试,请通过 Web 界面运行构建,它会询问参数的值。

    【讨论】:

      【解决方案4】:

      在现代 (?) 多分支管道的世界中,构建标签的工作方式如下。

      1. 添加“行为”以发现标签:
      2. 使用插件Basic Branch Build Strategies为标签添加“构建策略”: 不要忘记为分支添加构建策略;该插件完全禁用默认值!

      【讨论】:

      • 我有这个确切的配置。但是 Jenkins 只在标签部分为标签创建了一个新项目,并没有构建它们。关于可能缺少什么的任何想法? FWIW,我还在 Project Behavior 选项卡中检查了 fetch tags 的高级克隆行为。
      • @RheaS 已经有一段时间了,我现在没有方便的 Jenkins 安装。我认为您最好发布一个新问题;祝你好运!
      • @RheaS 你能解决这个问题吗?我正在经历同样的事情
      • @WilliamReed 后来我发现组织中只有少数存储库是这种情况,而不是全部。找不到为什么它不适用于某些存储库的根本原因。我的配置与此答案中描述的完全相同。
      【解决方案5】:

      您可以使用作为Git Plugin 一部分的选项“Git Publisher”在成功构建/部署后创建标签。

      【讨论】:

      • 我认为,问题是构建由 maven 发布插件标记的版本。
      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      相关资源
      最近更新 更多