webhook给jenkins发了什么

gitlab触发jenkins的job是通过webhook完成的,也就是一次http请求,请求体在jenkins的job的ConsoleOutput中可以看到。长这样子(网页上的json是一坨,这里format了一下):

GenericWebhookEnvironmentContributor
 Received:
    "object_kind": "push",
    "before": "0000000000000000000000000000000000000000",
    "after": "1d09c45658d42cd6c8c41d3370d4a2d5b46690b4",
    "ref": "refs/heads/xxx-dev",
    "checkout_sha": "1d09c45658d42cd6c8c41d3370d4a2d5b46690b4",
    "message": null,
    "user_id": 142,
    "user_name": "xxx",
    "user_email": "xxx@x.com",
    "project_id": 531,
    "repository": {
        "name": "test",
        "url": "ssh://git@172.16.*.*:*/test.git",
        "description": "test",
        "homepage": "http://172.16.*.*:*/test",
        "git_http_url": "http://172.16.*.*:*/test.git",
        "git_ssh_url": "ssh://git@172.16.*.*:*/test.git",
        "visibility_level": 10
    "commits": [
            "id": "1d09c45658d42cd6c8c41d3370d4a2d5b46690b4",
            "message": "test\n",
            "timestamp": "2020-03-17T21:34:10+08:00",
            "url": "http://172.16.*.*:*/test/commit/1d09c45658d42cd6c8c41d3370d4a2d5b46690b4",
            "author": {
                "name": "xxx",
                "email": "xxx@x.com"
    "total_commits_count": 1

找对分支名了吗

在单元测试之类的触发中,通常需要跑pipeline的分支是不可预知的,这就需要在jenkins脚本中进行动态获取。我们可以注意到上面有一个字段ref的值为refs/heads/xxx-dev,看上就是他了,但实际上这是不能用的,我们先试一下。

在jenkinsJob的Post content parameters中配置了ref后,就可以获取到ref的值:

node(label) {
    println ref

这里println是groovy的语法,jenkins的PiplineScript基本上就是groovy。

然后我们来试一下直接用ref当分支:

node(label) {
    stage('test') {
        dir('/home/jenkins/agent/workspace/test') {
            git branch: ref, credentialsId: 'xxxx', url: 'http://172.16.*.*:*/test.git'

然后会看到这样的报错:

using GIT_ASKPASS to set credentials 
 > git fetch --tags --force --progress -- http://172.16.*.*:*/test.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git rev-parse refs/remotes/origin/refs/heads/xxx-dev^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/refs/heads/xxx-dev^{commit} # timeout=10
 > git rev-parse origin/refs/heads/xxx-dev^{commit} # timeout=10
ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.

第一种方法调整分支

我们有两个办法让jenkins拿到准确分支,先说第一种,checkout的方式:

node(label) {
    stage('test') {
        dir('/home/jenkins/agent/workspace/test') {
            git branch: 'develop', credentialsId: 'xxxx', url: 'http://172.16.*.*:*/test.git'
            sh '''
            git checkout ${ref##*/}

在script里调用sh来实现checkout,这里${ref##*/}就是xxx-dev,如果写${ref#*/}就是heads/xxx-dev,如果写${ref}就是refs/heads/xxx-dev

但是有些情况下,checkout会报错:

+ git checkout xxx-dev
error: The following untracked working tree files would be overwritten by checkout:
vendor/github.com/PuerkitoBio/purell/.gitignore
vendor/github.com/PuerkitoBio/purell/.travis.yml

这时我们就该考虑能不能让jenkins上来就在指定分支上工作呢,其实是可以的,我们来看第二种方法。

第二种方法调整分支

第二种方法就是借助groovy代码对ref变量做手脚,简单思路就是用split函数将字符串分割,然后取后面的部分。

ref.split("refs/heads/")

这里有点奇怪的是,他的返回值首先是个引用类型,如果直接println ref.split("refs/heads/")会看到[Ljava.lang.String;@618657aa,所以不能直接ref.split("refs/heads/")[0]

def arr = ref.split("refs/heads/") as List

第二点比较奇怪的是,在其他语言比如C#、Java、go中,这种情况返回的数组只包含一个元素,而这里返回的却是两个元素:

def arr = ref.split("refs/heads/") as List
println arr
// [, xxx-dev]

所以我们需要取arr[1]来拿到分支名,这样一来我们就可以将上面的脚本改写:

node(label) {
    stage('test') {
        dir('/home/jenkins/agent/workspace/test') {
            def arr = ref.split("refs/heads/") as List
            def currentBranch = arr[1]
            git branch: currentBranch, credentialsId: 'xxxx', url: 'http://172.16.*.*:*/test.git'

参考文章:我在这里看到了split;在这里看到了as LinkedList。感谢以上作者的文章!如果你有更巧妙的方法,欢迎留言告诉我!

文章目录webhook给jenkins发了什么找对分支名了吗第一种方法调整分支第二种方法调整分支感谢webhook给jenkins发了什么gitlab触发jenkins的job是通过webhook完成的,也就是一次http请求,请求体在jenkins的job的ConsoleOutput中可以看到。长这样子(网页上的json是一坨,这里format了一下):GenericWebhookEnvi...
GitLab CE Webhook服务器 适用于GitLab CE安装的最简单的,可配置的NodeJS驱动的Webhook服务器。 ###什么是Webhook? 简短的回答:Webhook是一个HTTP事件,当某些事情发生时会触发该事件。 长答案:请阅读此。 ###为什么? 为了使用Webhook,您需要一个侦听此类Webhook的服务器,并且此类任务通常由“ Continuous Integration Server”处理。 如果您已将防火墙服务器配置为运行GitLab CE,并且未配置任何CI(例如或 ),那么您将有可能在手动更改代码后管理构建和部署(这是不推荐)。 但是,您还是出于以下几个原因而这样做: 您需要在一个小团队评估GitLab CE,然后再将代码库迁移到这里以供全时使用,或者您不希望代码泛滥成灾,或者您有足够的勇气自行处理这些任务。 GitLab CE网络挂接服
使用分支的最新内容克隆和维护目录。 $ ./gitlab-webhook.py --port 8000 git@github.com:vinodc/gitlab-webhook-branch-deployer.git /home/vinod/gwbd 这将运行该进程并在端口 8000 上侦听来自 Gitlab 的 POST 请求,这些请求对应于存储库vinodc/gitlab-webhook-branch-deployer 。 当它收到请求时,它会将指示为已更新的分支克隆到目录/home/vinod/gwbd 。 它将忽略名称带有“/”的任何分支。 这是有意的,以允许不会克隆的功能分支或类似。 寻求帮助: $ ./gitlab-webhook.py -h 我建议使用或类似的工具来运行脚本。 为了完成起见,这
gitlab-webhook-handler 修改以适合GitlabGitLab允许您为存储库注册 。 每当您的存储库发生事件时,无论是推送代码,填充问题还是创建请求请求,都可以将您注册的Webhook地址配置为使用详细信息进行ping操作。 该库是Node.js Web服务器的小型处理程序(如果需要,则为“间件”),用于处理从GitHub接收和验证Webhook请求的所有逻辑。 $ npm安装gitlab-webhook-handler var http = require ( 'http' ) var createHandler = require ( 'gitlab-webhook-handler' ) var handler = createHandler ( { path : '/webhook' } ) http . createServer ( func
gitlab配置触发 触发地址 https://jenkins.uat.wuxingge.com.cn/generic-webhook-trigger/invoke?token=trigger 配置流水线 def registry 最近不知道写点,想着补充一下自己的以前的文档,有时间就补充一下jenkins,nginx。。。 以前个人总结的jenkins文档:https://blog.csdn.net/gx_1_11_real/category_9186060.html Jenkins官方文档: https://www.jenkins.io/zh/doc/book/pipeline/ 下面介绍一下Jenkins Pipeline的基本用法 由于内容较多,为了讲解编辑了大量的补充性的内容,建议首次看的可以不看补充内容 这个月有那么一次jenkins在自动升级(SCM)时失败了,那时刚好晚上7点,直到第二天早上有人点击时,才意识到升级失败,所以想想,我还是配置下构建失败的邮件通知吧! Email Extension Plugin (安装插件,我喜欢先去下载hpi文件,然后再去手动安装)
最近公司的Jenkins升级,升级后限制账号访问,然后之前可以用的一些任务都不好使了出现如下 "git fetch --tags --progress -- origin +refs/heads/*:refs/remotes/origin/*" returned status code 128: 一开始以为是权限问题,修改.git目录权限后还是不行,后面看到 Kudos:https://vsjttyk.blogspot.com/2018/11/jenkins-cannot-access-git.htm
集成GitLabJenkins可以实现自动化CI/CD流程。下面是触发自动化的几种方式: 1. GitLab Webhook:在GitLab项目的设置,配置WebhookJenkins发送POST请求,当有代码提交或合并请求时触发Jenkins构建。 2. Jenkins GitLab Plugin:在Jenkins安装GitLab插件,配置GitLab项目的API Token和Webhook URL,当有代码提交或合并请求时,GitLab会向Jenkins发送Webhook请求,触发Jenkins构建。 3. Jenkins Pipeline:在Jenkins创建Pipeline,使用GitLab提供的API获取代码仓库的变更,当有变更时触发Jenkins构建。 4. GitLab CI/CD:在GitLab项目配置CI/CD,使用GitLab Runner自动构建和部署应用程序。 无论哪种方式,都需要在GitLabJenkins之间建立有效的连接,确保能够互相通信。