如何通过按下Git触发Jenkins CI进行掌握?


205

我正在尝试使用GitHub为项目建立Jenkins-ci。我已经使用适当的插件设置了Jenkins。我希望Jenkins仅在项目上的某人推动掌握时才运行构建脚本。到目前为止,我已经能够对其进行设置,以便任何人将其推送到任何地方都可以触发构建,但这太广泛了。我已经使用Git上的接收后服务挂钩完成了此操作。

我已经阅读了詹金斯(Jenkins)Wiki和一些教程,但是缺少此特定细节...可能与轮询有关吗?还是应该在Git方面完成工作,以便Git仅在master更改时触发Jenkins ?


3
Jenkins的原始作者川口浩介(Kohsuke Kawaguchi)描述了如何使用Git插件Git插件1.1.14从存储库中进行推送通知。见kohsuke.org/2011/12/01/...
GeraldScott

Answers:


190

正如gezzed在他的评论中已经指出的,与此同时,有一个很好的解决方案(《轮询必须消亡:从Git钩子触发Jenkins构建》中描述):

  • 将Jenkins作业的构建触发器设置为Poll SCM,但指定时间表。

  • 创建GitHub后接收触发器以通知URL

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • 这将触发所有轮询指定Git存储库的构建。

  • 但是,轮询实际上检查是否已将任何内容推送到使用的分支。

它完美地工作。


1
这对我也很有效,您可以对本地安装进行相同的安装:cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Justin Smith

4
也可以与Bitbucket的POST挂钩(不是Jenkins)一起使用。要指定身份验证凭据,可以使用user:password@my.ci.server/git/notifyCommit?url = ...作为URL。
loevborg 2014年

可以配置它,让jenkins仅构建受最新回购推送影响的库/项目吗?不再次建立整个分支吗?
Croolman

您能否澄清这一部分?“创建github接收后触发器以通知URL”
dewwwald

我认为github必须能够访问您的Jenkins实例,这意味着它必须可以公开访问。是否可以在非公开的Jenkins服务器上使用它?
A. Murray,

33

从0.5版开始,当将更改推送到GitHub时,Jenkins的GitHub插件可以触发构建


23
@asveikau-最初的问题是关于github的。
docwhat

这不是一个好的解决方案,因为它会触发构建,而不管推送了哪个分支。
香农

实际上,如果启用“轮询SCM”,则看起来它遵循git插件设置中的分支说明符(无需计划)。
香农

1
尽管这可能是正确的,但是当不存在任何工作空间时,它仍会错误地触发构建(“工作空间处于脱机状态。计划新的构建以获取工作空间。(nonexisting_workspace)完成。花费了0毫秒的更改时间”)。另请参阅issue.jenkins-ci.org/browse/JENKINS-18079
香农(Shannon)

GitHub的插件列表Git的插件作为依赖。在维基说:“在创建任务时,指定URL在‘Github上项目’,并选择Git的指定下URL‘源代码管理’。它说:‘这触发仅踢的Git插件内部轮询算法中针对匹配回购每一个进入的事件。’我认为这意味着它几乎做的民意调查SCM像接受的答案,但它有选项来自动设置网络挂接和一些其他功能。
dosentmatter

9

无需远程触发构建,而是将Jenkins项目配置更改为通过轮询触发构建。

Jenkins可以基于固定内部或URL进行轮询。如果该分支没有更改,则后者是您要跳过构建的内容。详细信息在文档中。基本上,您只需要选中“轮询SCM”选项,将计划部分保留为空白,然后设置一个远程URL即可访问JENKINS_URL / job / name / polling。

如果您拥有安全的Jenkins环境/build,那么一个陷阱就不同了,/pollingURL需要身份验证。此处的说明具有详细信息。例如,我有一个GitHub Post-Receive钩子转到username:apiToken@JENKIS_URL/job/name/polling


8

对于GitLab,请执行以下步骤:

  1. 转到项目的设置→Web挂钩
  2. 从您的Jenkins项目中输入“立即构建” URL作为推送事件URL:

    http://server.com/jenkins/job/project_name/build?delay=0sec 例如

  3. 点击Add Web Hook然后test hook

然后,无论何时提交到存储库,都会触发Web挂钩并创建一个构建。确保将您的Jenkins工作区设置为,delete workspace before each build以便获得新代码的新副本。


2
您如何解决有关仅在按下master分支时就构建的问题?
Custodio

4

与Git无关,但是下面我将通过Mercurial来详细帮助Jenkins进行作业配置。它可能会帮助其他有类似问题的人。

  1. 安装URL触发器插件
  2. 转到作业配置页面,然后选择Poll SCM选项。将值设置为* * * * *
  3. 检查选项:[URLTrigger] - Poll with a URL。现在,您可以选择一些选项,例如修改日期更改,URL内容等。
  4. 在选项中,选择URL内容更改,然后选择第一个选项– Monitor change of content
  5. 保存更改。

现在,通过一些测试签入触发对Mercurial存储库的一些更改。

看到Jenkins作业现在通过检测SCM更改来运行。当由于Mercurial更改而运行构建时,您将看到text Started by an SCM change。否则,是手动启动它的用户。


3

我希望这会有所帮助:如何在Git commit上触发Jenkins构建

只需使用Git提供的Git钩子使用curl来触发Jenkins作业即可。

该命令curl http://localhost:8080/job/someJob/build?delay=0sec可以运行Jenkins作业,这someJob是Jenkins作业的名称。

在隐藏的.git文件夹中搜索“ hooks”文件夹。将“ post-commit.sample”文件重命名为“ post-commit”。使用记事本打开它,删除“:Nothing”行,然后将上面的命令粘贴到其中。

而已。每当执行提交时,Git都会触发文件中定义的提交后命令。


首先,我对您的评论感到困惑,因为,我认为我必须将上面url中的“职位”更改为职位名称。我也很困惑,因为当我在詹金斯按下“ New Item”时,我设置了一个“ Project”而不是工作,因此当您在上面引用“ someJob”时,我不知道那是我的项目的名称。我终于找到了所需的URL:localhost:8078 / job / codecept%20tests / build 其中“ codecept%20tests”是我的项目的名称。感谢您的解决方案
Paul

1
谢谢保罗。我已经通过附加注释更新了博客文章,其中提到了您的解决方案。“%20”对其他人特别有用。
导航

3

从Git命令/ GUI将代码推送到存储库后,与Jenkins进行持续集成:

  1. 在Jenkins中仅使用作业名称创建一个作业,然后选择项目自由式的类型。点击OK。下一页不添加任何内容-只需单击即可Save
  2. 转到具有源代码的本地Git存储库,然后导航到该.git/hooks文件夹。
  3. hooks文件夹包含一些文件。检查“提交后”。如果不存在,则创建一个没有文件扩展名的“后提交”文件:

    C:\work\test\\.git\hooks\post-commit
    
  4. 使用以下命令编辑“提交后”文件。确保它在本地源代码挂钩文件夹中。

    curl -u userName:apiToken -X POST http://localhost:8080/jenkins/job/jobName/build?token=apiToken
    

    例:

    curl -u admin:f1c55b3a07bb2b69b9dd549e96898384 -X POST http://localhost:8080/jenkins/job/Gitcommittest/build?token=f1c55b3a07bb2b69b9dd549e96898384
    

    5,

    userName:Jenkins用户名

    jobName:构建的工作名称

    apiToken:要获取您的API令牌,请转到您的Jenkins用户页面(界面右上方)。它在页面左侧的“配置”菜单中可用:“显示API令牌”

  5. 在源代码中进行更改,并将代码提交到存储库。

  6. 您的工作http://localhost:8080/jenkins/job/Gitcommittest/应该正在建立。


3

您需要指定分支。默认情况下,它听任何东西。请参阅博客文章Hudson:Git和Maven插件


我最近在工作中设置了Jenkins,以从指定分支上的git中提取更改。工作良好。+1
Greg K

我也设置了该设置。我要注意的是,每一次对github的推送都会通知Jenkins,并对它做出反应,但只有在分支主管更改后,才运行构建步骤。因此,我们收到大量虚假的构建报告,说“无变化”。您是否也在观察这种行为?
Ziggy

最初的问题是关于如何解决答案中配置的广泛且不必要的触发器(当任何人按下任何分支时触发)。如果您有5个具有相同配置的jenkin作业,除了第一个作业侦听master分支,第二个devel分支,第三个FeatureX分支等等,当您仅将其推送到FeatureX分支时,所有jenkins作业都会被触发,从而导致构建的工作超载非常慢。
geoom

2

通用Webhook触发插件可以配置过滤器来实现。

当配置为

  • 名为ref和表达式的变量$.ref
  • 具有文本$ref和过滤器表达式的过滤器,例如^refs/heads/master$

然后,每次按下都会触发该工作master。没有轮询。

您可能希望从Webhook获得更多值来实际执行构建。只需使用JSONPath添加更多变量,即可选择所需的内容。

这里有一些用例:https : //github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd


什么是“ achi”
彼得·莫滕森

这是/是一个拼写错误。
Tomas Bjerre '18年

您如何在Jenkins中获取$ GITCOMMIT,它在使用webhook时似乎总是为空。然后无法将状态发送回说成功或失败。
user3520245 '19


1

上面的答案是正确的,但我在这里是为他们的新手而写的

特别是为管道设置构建触发器:

假设您有两个Github分支:1.master,2.dev和Jenkinsfile(编写管道脚本的位置),并且每个分支上都有其他文件

配置新的管道项目(针对dev分支)

## 1。使用git-plugin和基于cron的方法进行代码集成 先决条件应该安装git插件并使用您的姓名和电子邮件对其进行配置

  1. 常规部分。选中复选框-'此项目已参数化'并添加名称-SBRANCH默认值-'引用/远程处理/来源/开发'
  2. 构建触发器部分”复选框-“轮询SCM”,并根据检查提交的需要安排时间,例如“ * / 1 * * * *”以每分钟检查一次
  3. 管道定义部分。选择-来自SCM的管道脚本->选择git-> addRepository URL->添加git凭据->选择高级->添加名称-起源,RefSpec-'+ refs / heads / dev:refs / remotes / origin / dev'(dev是github分支)—>要构建的分支-$ {SBRANCH}(来自参考点1的参数名称)—>脚本路径—> Jenkinsfile —>取消选中Lightweightcheckout
  4. 申请—>保存

## 2。代码集成:github-plugin和webhook方法 先决条件应该安装Github插件并配置Github服务器,如果不考虑以下配置,则应测试连接

在Jenkins上使用帐户配置Github插件

GitHub部分如果不存在,则添加Github服务器API URL:https : //api.github.com凭据:添加具有值Personal Access Token(从您的Github帐户生成它->设置)的秘密文本(单击添加按钮:选择键入秘密文本)。 —>开发人员设置—>个人访问令牌—>添加令牌—>检查范围—>复制令牌)测试连接—>检查它是否已连接到您的Github帐户选中“管理钩子”复选框预先选择小节以前的“共享秘密”凭证

如果没有将webhook添加到存储库中,则添加

  1. 转到Github存储库设置->添加webhook->添加URL
    http:// Public_IP:Jenkins_PORT / github-webhook /
  2. 或者,如果您没有Public_IP,请使用ngrok。从命令./ngrok http 80(使用您的jenkins_port)安装,认证并获取公共IP,然后添加webhook —>添加URL http:// Ngrok_IP / github-webhook /
  3. 通过从webhook页面传递有效负载进行测试,并检查是否获得200状态。

如果您有Github Pull请求插件,请使用已发布的Jenkins URL对其进行配置。

  1. 常规部分。复选框-'Github项目'添加项目URL-(以'.git /'结尾的github链接)
  2. 常规部分。选中复选框-'此项目已参数化'并添加名称-SBRANCH默认值-'引用/远程处理/来源/开发'
  3. 生成triggers.section.Check复选框-'用于GITScm轮询的GitHub挂钩触发器'
  4. 管道定义部分:选择-来自SCM的管道脚本->选择git-> addRepository URL->添加git凭据->选择高级->添加名称-来源,RefSpec-'+ refs / heads / dev:refs / remotes / origin / dev'(dev是github分支)—>要构建的分支-$ {SBRANCH}(来自ref 1.st点的参数名)—>脚本路径—> Jenkinsfile—>取消选中Lightweightcheckout
  5. 申请—>保存


0

我对本地git服务器的解决方案:转到本地git服务器的钩子目录,忽略现有的update.sample并创建一个名为“ update”的新文件,例如:

gituser@me:~/project.git/hooks$ pwd
/home/gituser/project.git/hooks
gituser@me:~/project.git/hooks$ cat update
#!/bin/sh
echo "XXX from  update file"
curl -u admin:11f778f9f2c4d1e237d60f479974e3dae9 -X POST http://localhost:8080/job/job4_pullsrc_buildcontainer/build?token=11f778f9f2c4d1e237d60f479974e3dae9

exit 0
gituser@me:~/project.git/hooks$ 

echo语句将显示在您的git push结果下,可以从您的jenkins作业配置中获取令牌,浏览找到它。如果未调用文件“ update”,请尝试使用其他没有扩展名“ sample”的相同名称的其他文件。

这就是你所需要的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.