通过API触发流水线

image-20220513202145810

目录

本节实践

  1. 实践:安装postman(测试成功)-2022.5.10
  2. 实践:用Postman调用一个接口,并结合使用Curl操作(测试成功)-2022.5.10
  3. 实践:通过API触发流水线-Jenkins(测试成功)-2022.5.11
  4. 实践:通过API触发流水线-GitLabCI(测试成功)-2022.5.13

实验环境

gitlab-ce:14.9.3-ce.0

实验代码

链接:https://pan.baidu.com/s/11h1TATVhq1JW7qZrFDdcPA?pwd=04rd
提取码:04rd
2020.5.14-通过API触发流水线-code

image-20220514085055112

1、预备知识

目标:学习HTTP基础知识,掌握如何使用Postman和Curl调用接口的方法。

1.Web HTTP基础知识

1、HTTP请求是什么

HTTP超文本传输协议,是确保服务器(Server)和客户端(Client)之间的正确通信。

一个请求和响应的过程:

image-20220509234026987

  • Request 用户通过浏览器向我们的服务端发起请求。
  • Response 服务端将客户端请求的资源数据进行响应。
2、调用接口的方法

请求类型:

  • GET 向指定的URL请求资源,可携带参数(明文)。
  • POST 向指定的URL提交资源,表单数据提交,数据进行封装(比Get方法安全)。
  • PUT 与POST类似,通常用于对资源数据的更新修改
  • DELETE 删除指定的资源。
💘 演示:安装postman(测试成功)-2022.5.10

postman专门就是调试接口的;

1️⃣ 下载软件包

可以提前装好postman https://www.postman.com/downloads/

image-20220510082332553

2️⃣ 注意,这个创建好,双击安装包,好像没有安装过程,就直接能使用了:……

image-20220510082651457

安装结束。😘

💘 演示:用Postman调用一个接口,并结合使用Curl操作(测试成功)-2022.5.10

1️⃣ 新建一个Http Request

image-20220510083800643

image-20220510083814062

可以看到常见的http请求如下:

image-20220510083917754

2️⃣ 打开jenkins,来到一个项目,在浏览器按f12打开检查选项,在Network位置找一个url并将其放在postman里进行测试

image-20220510085242965

注意:?fullStages=true&_=1652143738538 ?号后面的都是参数,以&分割,可以看到这里自动识别了其参数。

image-20220510085310406

但是发现我们收到的response是有问题的,因为jenkins访问是需要认证的。

3️⃣ 因此,这里需要添加一个认证“

来到Authorization,选择Basic Auth,填写jenkins的用户名和密码,点击Send:

image-20220510085750788

会发现本次就调用接口成功了,我么拿到了接口返回来的json格式的数据:

image-20220510085823889

之后,就需要我们做数据的过滤了!

👉🏼 使用postman的好处,可以为我们做一些转化,例如:

image-20220510123831021

image-20220510123750419

测试结束。😘

3、HTTP常见的错误码
  • 1xx : 服务已收到请求,请求者继续执行操作。

  • 2xx:请求成功,常见(201)

  • 3xx:请求成功,页面发生重定向(301)

  • 4xx:客户端发生了错误

    • 常见的是资源找不到了(404)
    • 资源请求需要认证认证失败(401)
    • 认证成功但是权限不够(403)
  • 5xx: 服务端发生了错误

    • 网关超时(504)
    • 内部错误(500)
    • 网关错误(502)
    • 服务不可用(503)

2、Jenkins Generic Webhook实践

💘 实践: 通过API触发流水线-Jenkins (测试成功)-2022.5.11
1. 安装Generic webhook 插件
2. 配置POSTMAN请求 
http://JENKINS_URL/generic-webhook-trigger/invoke
3. 配置Jenkins job中的webhook   
4. 编写Pipeline 读取请求参数
5. POSTMAN发起请求

目的: 为Jenkins作业添加触发器,便于其他系统调用。

image-20220513205012697

1.安装配置Generic WebHook

👉🏼 来到系统管理->创建管理->可选插件:搜索Generic Webhook Trigger

插件名称:Generic Webhook Trigger

image-20220510124912590

重启后,进入一个Pipeline项目设置,已经可以选择这个触发器了…

image-20220510124933570

👉🏼 本次新创建一个day4视图:

image-20220510232138977

这里使用正则表达式配置:day4-.*?,点击保存:

image-20220510232223337

👉🏼 在新创建的视图里创建一个项目day4-jenkins-trigger:

image-20220510232456103

在构建触发器这里,我们就能看到Generic Webhook Trigger选项了:

image-20220510232514773

2.Jenkins作业配置触发器

🍀 配置POSTMAN请求

1️⃣ 获取jenkins的接口地址:Jenkins Trigger URL

启动Generic Webhook触发器后, 相当于给Jenkins加了一个新的接口(http://JENKINS_URL/generic-webhook-trigger/invoke)。

image-20220510125130651

调用的时候:这里要把 JENKINS_URL 换成自己真实的Jenkins 服务器地址,有端口就加上端口,是域名就写域名。下面是一个参考的URL:

http://172.29.9.101:8080/generic-webhook-trigger/invoke

2️⃣ 这里先在postman里创建一个post请求:

在Collections里新建一个post请求,配置一端json内容:

{
    "name": "jenkins",
    "version": "1.1.1",
    "envName": "dev",
    "users": [ //注意:json数据这里也是可以写列表的!
        "aa",
        "bb"
    ]
}

image-20220510233734862

🍀 配置Jenkins job中的webhook

1️⃣ 在jenins刚创建的项目里配置一下Post content parameters内容:

Post content parameters: 获取调用接口传进来的数据

img

$代表从postman发过来的request请求的数据。

👉🏼 本次实际配置内容如下:

image-20220511074058832

image-20220511074120132

2️⃣ Token: 给URL添加一个触发的认证

curl http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=devops-service

img

这里也配置一下token吧,一般习惯使用项目名作为token:

image-20220511074514341

增加了token之后,记得在postman那里的请求参数后面也要加上token参数:

http://172.29.9.101:8080/generic-webhook-trigger/invoke?token=day4-jenkins-trigger

image-20220511074613093

⚠️ 流水线会触发相同token的作业, 建议触发token 唯一性;

🍀 编写Pipeline 读取请求参数

1️⃣ 配置一下流水线

image-20220511075518186

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo "${VERSION}"
                echo "${USERS}"
            }
        }
    }
}

保存。

🍀 POSTMAN发起请求

👉🏼 配置完pipeline后,直接在postman里发起请求,观察效果

image-20220511074733245

可以看到这个流水线项目被成功触发了:

image-20220511075629740

image-20220511075644352

👉🏼 注意:关于配置Jenkins job中的webhook$的解释

Post content parameters: 获取调用接口传进来的数据

img

image-20220511074058832

$代表从postman发过来的request请求的整体数据,可以理解为post请求的根路径!

https://github.com/json-path/JsonPath

image-20220511085822372

image-20220511085218187

🍀 我们可以来增加一个webhookData的变量,然后在Pipeline里调用这个变量,最后在postman里发起post请求,并观察效果:

image-20220511085320813

image-20220511085503025

image-20220511085548526

3.解析GET/POST请求数据

1.解析POST数据

以上过程就是post请求过程。

2.解析GET数据

Request parameters: 获取URL中的请求参数

curl http://192.168.1.200:8080/generic-webhook-trigger/invoke?runopts=gitlab

img

🍀 本次测试过程:(测试成功)

1️⃣ 编写postman get请求

将原来的post请求拷贝下,然后修改删除body里的内容,修改请求类型为get,添加一个变量为versions:2.2.2

image-20220511094402526

2️⃣ 配置jenkins中的webhook及编写pipeline流水线

这里要下删除一下前面的webhook及pipeline里post相关数据:

image-20220511094705801

image-20220511094727257

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo "${versions}"
            }
        }
    }
}

3️⃣在postman里进行触发验证

image-20220511094821699

image-20220511094845700

符合预期,测试结束。😘

3.解析HEADER参数数据

Header parameters: 获取Header中的参数

img

img

🍀 本次测试过程:(测试成功)

1️⃣ postman里编写head请求

image-20220511101017528

2️⃣ 在jenkins的job的webhook里配置Header parameters及编写pipeline流水线脚本

image-20220511100452021

image-20220511100801391

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo "demo header:${header_version}"
            }
        }
    }
}

⚠️ 注意:Header parameters这里只能使用_,而不能使用-

image-20220511100354718

3️⃣ postman里发起HEAD请求并验证

image-20220511100705030

image-20220511100821164

符合预期,测试结束。😘

4.扩展流水线解析JSON数据

安装插件: Pipeline Utility Steps

img

readJSON: 处理json数据

println("所有body数据 --> ${allData}")

def webHookData = readJSON  text: "${allData}"

String userName = webHookData["name"]
String userName2 = webHookData.name

String group1Name = webHookData["group1"]["name"]
String group1Name2 = webHookData.group1.name

println('最外层name ---> $.name' + "${userName}")
println('最外层name ---> $.name' + "${userName2}")

println('第二层name ---> $.group1.name' + "${group1Name}")
println('第二层name ---> $.group1.name' + "${group1Name2}")

🍀 本次测试过程:

1️⃣ 来到刚才那个pipeline流水线项目里,删除之前的配置,只配置成如下的Post content parameters内容,然后编写pieline脚本:

image-20220511152426544

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo "${webhookData}"
            }
        }
    }
}

在postman里触发一下,观察效果:

image-20220511152902775

image-20220511152919794

可以看到,能正常触发成功。

2️⃣ 但是,在流水线里怎么去处理这个数据?

image-20220511153506453

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                script {
                    echo "${webhookData}"
                
                    data = readJSON text: "${webhookData}"
                    println(data.version)
                }
            }
        }
    }
}

编写好后我们rebuild一下,看下效果:

image-20220511153614039

我们会看到一个常见的报错,提示: No such DSL method 'readJSON' found among steps [archive, ba,这是因为换需要安装下Pipeline Utility Steps插件才行。

3️⃣ 安装Pipeline Utility Steps插件并再次构建测试效果

对Jenkins Pipeline中的数据处理(readJSON),使用Pipeline utils step插件

image-20220511153811763

image-20220511154125394

5.自定义构建描述信息

1️⃣ 是否可以在构建后的状态这里显示更多的信息呢?

image-20220511155402628

可以在项目的流水线语法哪里查找下全局变量:

image-20220511155527439

编写下pipeline代码:

image-20220511155754798

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                script {
                    echo "${webhookData}"
                
                    data = readJSON text: "${webhookData}"
                    println(data.version)
                    
                    currentBuild.description = "version: ${data.version}\n env: ${data.envName}"
                }
            }
        }
    }
}

重新构建下,这里就可以看到构建后状态上有显示其他一些信息了:

image-20220511155857462

2️⃣ 是否可以把这里的数字改成例如构建版本呢?

我们来编辑下pipeline代码:

image-20220511160115854

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                script {
                    echo "${webhookData}"
                
                    data = readJSON text: "${webhookData}"
                    println(data.version)
                    
                    currentBuild.description = "version: ${data.version}\n env: ${data.envName}"
                    currentBuild.displayName = "version: ${data.version}"
                }
            }
        }
    }
}

rebuild后,就可以看到效果了:

image-20220511160210442

测试成功,符合预期。😘

6.Rebuilder 插件使用

可以直接携带原触发参数进行触发,不用重复触发(不用在重复的提交代码了)。

👉🏼 现在有个需求,我们想重新再触发一次,难道每次都要去postman再发起一个请求吗?其实,可以使用jenkins的Rebuild插件即可

此时,我们安装一下这个插件。(注意:回放,这个远程构建的参数是拿不到的,但rebuilder是可以拿到之前的那些构建参数的!)

image-20220511075836774

此时,我们再重新构建一次看下效果:

进入某一次构建后,可以点击rebuild:

image-20220511080312896

image-20220511080329861

Rebuild成功。

3、GitLabCI 流水线触发实践

💘 实践:通过API触发流水线-GitLabCI(测试成功)-2022.5.13
1. B项目中开启Pipeline Trigger
2. 先通过postman进行触发测试
3. A项目中创建token变量, 然后集成到pipeline触发。

1.准备工作

  • 本次在gitlab的devops4-app-serice项目里开启trigger:

img

  • 创建一个认证token并赋值token:

image-20220513090106379

image-20220513090218221

image-20220513090234042

2.使用API触发

  • 使用curl命令进行测试

image-20220513092848901

curl -X POST \
     --fail \
     -F token=7bddfd450d0de1aa1bad602ad9b44b \
     -F ref=main \
     http://172.29.9.101/api/v4/projects/2/trigger/pipeline     

image-20220513093043249

可以看到pipeline流水线项目被触发了:

image-20220513093020577

  • 使用postman测试

在postman里创建一个post请求,填写Body里的数据,然后点击Send:

image-20220513093643601

验证:可以看到触发项目构建了。

image-20220513093406368

  • gitlabci作业中触发

image-20220513100848461

本次在devops4-commit-service项目新建一个.gitlab-ci.yml文件,进行提交触发测试:

script:
  - "curl -X POST -F token=TOKEN -F ref=REF_NAME http://192.168.1.200/api/v4/projects/31/trigger/pipeline"

本次完整代码:

stages:
  - build 
  - test
  - deploy
before_script:
  - echo "Before script section"
  - echo "For example you might run an update here or install a build dependency"
  - echo "Or perhaps you might print out some debugging details"

after_script:
  - echo "After script section"
  - echo "For example you might do some cleanup here"

build:
  stage: build
  script:
    - echo "Do your build here"

test:
  stage: test
  script:
    - echo "Do another parallel test here"
    - echo "For example run a lint test"

build-job:   
  stage: build
  script:
    - "curl -X POST -F token=7bddfd450d0de1aa1bad602ad9b44b -F ref=main http://172.29.9.101/api/v4/projects/2/trigger/pipeline"
    - echo "Compile complete."
    - sleep 1


deploy:
  stage: deploy
  script:
    - echo "Do your deploy here"

可以看到devops4-app-serice流水线被触发了:

image-20220513101347253

image-20220513101156607

  • 优化: 将token以变量的方式存储到项目中。

image-20220513101510626

image-20220513101614254

stages:
  - build 
  - test
  - deploy
before_script:
  - echo "Before script section"
  - echo "For example you might run an update here or install a build dependency"
  - echo "Or perhaps you might print out some debugging details"

after_script:
  - echo "After script section"
  - echo "For example you might do some cleanup here"

build:
  stage: build
  script:
    - echo "Do your build here"

test:
  stage: test
  script:
    - echo "Do another parallel test here"
    - echo "For example run a lint test"

build-job:   
  stage: build
  script:
    - "curl -X POST -F token=${CITOKEN} -F ref=main http://172.29.9.101/api/v4/projects/2/trigger/pipeline"
    - echo "Compile complete."
    - sleep 1


deploy:
  stage: deploy
  script:
    - echo "Do your deploy here"

验证:

image-20220513101737044

3.触发并传递参数

curl -X POST \
     --fail \
     -F token=7bddfd450d0de1aa1bad602ad9b44b \
     -F ref=main \
     -F "variables[BUILD_TOOL]=mavenandmaven" \
     http://172.29.9.101/api/v4/projects/2/trigger/pipeline  

devops4/devops4-app-serice项目里编辑.gitlab-ci.yml文件:

image-20220513102130766

stages: #对stages的编排
  - build
  - test
  - deploy


# workflow:
#   rules:
#     - if: $CI_PIPELINE_SOURCE == "push"
#       when: never
#     - when: always

variables:
  DEPLOY_ENV: "dev"
  RUNNER_TAG: "maven"

deploy_job:
  # rules:
  #   - if: '$DEPLOY_ENV == "dev"'
  #     when: manual
  #   - when: on_success
  stage: deploy
  tags:
    - ${RUNNER_TAG}
  variables:
    DEPLOY_ENV2: "test"
  script:
    - echo  ${DEPLOY_ENV}



deploy:
  tags:
    - ${RUNNER_TAG}
  stage: deploy
  script:
    - echo "Do your deploy here"
    - echo ${BUILD_TOOL}
  # when: manual

然后触发测试:

image-20220513102253654

image-20220513102326982

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
  1. 个人微信二维码:x2675263825 (舍得), qq:2675263825。

    image-20211002091450217

  2. 个人微信公众号:《云原生架构师实战》

    image-20211002141739664

  3. 个人csdn

    https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

    image-20211002092344616

  4. 个人博客:(www.onlyyou520.com)

    image-20220513150311181

  5. 开源干货😘

    语雀:https://www.yuque.com/go/doc/73723298?#

    image-20220513150633944

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值