Jenkins是否可以在git仓库中自动检测和构建新创建的标签?

时间:2011-10-18 10:11:48

标签: git jenkins

我们的Jenkins CI服务器在我们的Github存储库中创建标签时会自动检测,部署和构建标签。

这可能吗?

5 个答案:

答案 0 :(得分:34)

使用以下配置,您可以构建所有标记的作业:

  1. 使作业获取标记就像它们是分支一样:单击存储库URL下方的“高级”按钮,然后输入Refspec +refs/tags/*:refs/remotes/origin/tags/*
  2. 使用Branch Specifier */tags/*
  3. 构建所有标记“branches”
  4. 启用SCM轮询,以便作业检测到新标记。
  5. 这种方法有一个缺点:作业将构建所有标记,而不仅仅是新添加的标记。因此,在创建作业后,将为每个现有标记触发一次。所以你可能希望让工作一开始就什么都不做,然后等到所有现有的标签都被处理完毕,然后才为每个新标签配置你想要完成的构建步骤。

    由于标签在git中没有变化,因此每个新标签只会触发一次作业。

答案 1 :(得分:17)

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

构建 - >执行shell:

# 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”。

答案 2 :(得分: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. 在'源代码管理 - &gt;分支建立'put'$ branch'
  3. 这提供了一种相当安全且强大的构建方式。要测试,通过Web界面运行构建,它将询问参数的值。

答案 3 :(得分:0)

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

  1. 添加“行为”以发现标签:
    enter image description here
  2. 使用插件Basic Branch Build Strategies为标签添加“构建策略”: enter image description here 不要忘记为分支机构添加构建策略。该插件会完全禁用默认设置!

答案 4 :(得分:-3)

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