我正在尝试使用GitHub为一个项目设置Jenkins-ci。我已经使用适当的插件设置了Jenkins。我希望Jenkins只在项目中有人推动掌握时运行构建脚本。到目前为止,我已经能够设置它,以便在任何人推送到任何地方时都会触发构建,但这太宽泛了。我在Git上使用post-receive服务挂钩完成了这个。
我已经阅读了Jenkins wiki和一些教程,但是缺少这个特殊的细节......它可能与民意调查有关吗?或者应该在Git方面完成工作,以便Git只在master
被更改时触发Jenkins?
答案 0 :(得分:182)
正如 gezzed 在评论中已经指出的那样,同时有一个很好的解决方案(在 Polling must die: triggering Jenkins builds from a Git hook 中描述):
将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 :(得分:32)
从版本0.5开始,Jenkins的GitHub插件可以trigger a build when a change is pushed to GitHub。
答案 2 :(得分:9)
不是远程触发 builds ,而是通过轮询更改Jenkins项目配置以触发构建。
Jenkins可以根据固定的内部或URL进行轮询。如果没有针对该分支的更改,则后者是您要跳过构建的内容。确切的细节是 在the documentation。基本上你只需要检查“轮询SCM”选项,将计划部分留空,并设置一个远程URL以命中JENKINS_URL / job / name / polling。
如果您拥有安全的Jenkins环境,则与/build
不同,/polling
URL需要身份验证。说明here包含详细信息。例如,我有一个GitHub Post-Receive挂钩转到username:apiToken@JENKIS_URL/job/name/polling
。
答案 3 :(得分:4)
与Git无关,但在下面我将使用Mercurial详细介绍Jenkins作业配置。它可能会帮助其他人遇到类似的问题。
Poll SCM
选项。将值设置为* * * * *
[URLTrigger] - Poll with a URL
。
现在,您可以选择一些选项,例如修改日期更改,URL内容等。Monitor change of content
现在,通过一些测试签到来触发对Mercurial存储库的一些更改。
通过检测SCM更改,可以看到Jenkins作业现在正在运行。当由于Mercurial更改而运行构建时,您将看到文本Started by an SCM change
。否则,手动启动它的用户。
答案 4 :(得分:3)
您需要指定分支。默认情况下,它会侦听任何内容。请参阅博客文章 Hudson: Git and Maven plugins 。
答案 5 :(得分:3)
我希望这会有所帮助: How to trigger a Jenkins build on Git commit
只需使用curl使用Git提供的Git钩子来触发Jenkins作业。
命令curl http://localhost:8080/job/someJob/build?delay=0sec
可以运行Jenkins作业,其中someJob
是Jenkins作业的名称。
在隐藏的.git文件夹中搜索“hooks”文件夹。将“post-commit.sample”文件重命名为“post-commit”。用记事本打开它,删除“:Nothing”行并将上面的命令粘贴到其中。
就是这样。无论何时进行提交,Git都会触发文件中定义的提交后命令。
答案 6 :(得分:3)
在将代码从Git命令/ GUI推送到存储库之后,与Jenkins持续集成:
.git/hooks
文件夹。 hooks
文件夹包含少量文件。检查“提交后”。如果不存在,则创建一个没有文件扩展名的“post-commit”文件:
C:\work\test\\.git\hooks\post-commit
使用以下命令编辑“post-commit”文件。确保它存在于您的本地源代码钩子文件夹中。
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令牌”
在源代码中进行更改并将代码提交到存储库。
你的工作http://localhost:8080/jenkins/job/Gitcommittest/
应该在建设。
答案 7 :(得分:2)
Generic Webhook Trigger Plugin来实现此目的。
配置
时ref
和表达式$.ref
。$ref
和过滤器表达式的过滤器,如^refs/heads/master$
。然后,该作业将触发每次推送到master
。没有民意调查。
您可能希望webhook中有更多值来实际执行构建。只需使用JSONPath添加更多变量即可选择所需的变量。
答案 8 :(得分:1)
在我目前的组织中,我们不是在master上执行此操作,而是在development和release /分支上执行此操作(我们正在使用Git Flow),以便生成快照构建。
由于我们使用的是多分支管道,因此我们在Jenkinsfile中使用 when {} 语法...
stage {
when {
expression {
branch 'develop'
}
}
}
此博客文章中对此进行了详细说明: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline
答案 9 :(得分:1)
以上答案是正确的,但我在此向他们是新手,以求简单
尤其是用于设置管道的构建触发器:
考虑您有两个github分支:1.master 2.dev 和Jenkinsfile(编写管道脚本的位置)以及每个分支上的其他文件
配置新的Pipeline项目(用于dev分支)
## 1。使用git-plugin和基于cron的方法进行代码集成 必备的git插件应已安装,并使用您的姓名和电子邮件进行配置
1.General(常规)部分。选中复选框-“此项目已参数化”,并添加Name-SBRANCH默认值-“ refs / remotes / origin / dev” 2.建立triggers.section.Check复选框-“ Poll SCM”并根据检查提交的需要安排时间,例如‘* / 1 * * * *'每分钟检查一次 3.管道定义部分。从SCM中选择-管道脚本->选择git-> addRepository URL->添加git凭证->选择高级 —>添加名称-原点,RefSpec-'+ refs / heads / dev:refs / remotes / origin / dev' (dev是github分支)—>要构建的分支-$ {SBRANCH}(参数 引用1.st点的名称)->脚本路径-> Jenkinsfile->取消选中 轻量结帐 4.应用->保存
## 2。代码集成:github-plugin和webhook方法 先决条件应安装github插件并配置github服务器,如果不考虑以下配置,则应测试连接
在jenkins上使用帐户配置Github插件
GitHub部分,如果不存在,则添加Github服务器API URL:https://api.github.com凭证:添加具有值Personal Access Token(从您的github帐户中生成它-> settings)的秘密文本(点击添加按钮:选择键入秘密文本)。 >开发人员设置->个人访问令牌->添加令牌->检查范围->复制令牌)测试连接->检查它是否已连接到您的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.“常规”部分。选中复选框-“此项目已参数化”,然后添加Name-SBRANCH默认值-“ refs / remotes / origin / dev” 3.Build triggers.section.Check复选框-“ GitHub触发GITScm轮询的触发器” 4.Pipeline defn部分。从SCM中选择-Pipeline脚本->选择git-> addRepository URL->添加git凭证->选择高级->添加 名称-来源,RefSpec-'+ refs / heads / dev:refs / remotes / origin / dev'(dev 是github分支)—>要构建的分支-$ {SBRANCH}(参数名称 从参考1.st点开始)->脚本路径-> Jenkinsfile->取消选中 轻量结帐 5.应用->保存
答案 10 :(得分:0)
使用拉取请求构建器插件: https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin
这非常简单。然后,您可以设置GitHub webhooks来触发构建。
答案 11 :(得分: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”的相同名称的文件。
这就是您所需要的
答案 12 :(得分:0)