Jenkins+webhooks-多分支参数化构建-

2023-11-09

Jenkins+webhooks-多分支参数化构建-

需求:
我这里是因为公司有个静态资源,构建完成是需要放在nginx的发布目录,但是每次手动构建不是很方便,我这里配置的是webhook更新代码触发自动构建,但是我们环境又分为正式环境跟测试环境,需要构建发布到不同的环境跟服务器里面

我的解决方案:
方案一:
第一种办法就是创建俩个pipeline,针对不同分支触发webhook,不是很建议太占用内存
方案二:
如果是俩个分支,开发-测试
把jenkinsfile写完整,放到开发分支,jenkins-webhook识别到开发分支更新了,然后拉取开发分支代码,识别到里面的jenkinsfile,会去按照要求构建发布
高级大佬文档
https://xie.infoq.cn/article/600f642fcb26f0c280a7acf59
https://www.cnblogs.com/testopsfeng/p/15139538.html
https://blog.csdn.net/weixin_39637661/article/details/110087309?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-110087309-blog-106900128.pc_relevant_antiscanv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-110087309-blog-106900128.pc_relevant_antiscanv3&utm_relevant_index=14
https://blog.csdn.net/shm19990131/article/details/107529357
https://gitbook.curiouser.top/origin/jenkins-generic-webhook-trigger%E6%8F%92%E4%BB%B6.html

采用第二种方案

pipeline 通过 自定义参数(This project is parameterized - String Parame),来构建部署。

( 注释: 参数化构建 - 字符串参数 )

一、 实现内容

Gitlab --或者gitea 主分支、从分支 代码修改后,通过 webhook 触发 jenkins。

jenkins 可以通过 分支变量 来构建部署。

二、实现步骤

1、在 pipeline 流水线项目开启参数化构建

image-20220623112529293

我这里定义了俩个

image-20220623112815855

2、修改 pipeline 的 Jenkinsfile 文件,指定变量来拉取代码

注意:此处使用的是 Jenkinsfile - pipeline,每个分支都需要有这样一个文件

image-20220623113345810

pipeline语法
pipeline { 
   agent any 
   stages { 
      stage('拉取代码') { 
          steps { 
              checkout([$class: 'GitSCM', branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '7f49313d-880d-4a5e-836f-cef4bf2ec37a', url: 'http://192.168.2.204:3000/aike/test.git']]])
            } 
        }
      stage('选择node版本编译打包') { 
             steps { 
              nodejs('node') {
                sh '''cd ${single_project_name}
                      npm  install 
                      npm run build
                      tar -zcvf  ./front.end-levee.tar.gz   ./dist'''
              }
            } 
        } 
      stage('发布到服务器') { 
             steps { 
              sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.2.204', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''
            cd /a
            tar -xzf front.end-levee.tar.gz -C ./
            cp -r dist/* ./ 
            rm -rf   front.end-levee.tar.gz''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/a', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'front.end-levee.tar.gz')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            } 
        }             
   }
}
代码仓库

image-20220623133209481

把这个代码,上传到每个分支上面

image-20220623132928596

查看代码

image-20220623133435755

①、配置webhook,注意有几个分支,就要开几个webhook

主分支webhook:

image-20220623134435741

配置 jenkins - Pipeline构建任务

构建触发器

image-20220623134808026

问题总结
上面的构建,基本已经实现触发自动构建,但是唯一缺点就是每次构建拉取的都是默认master分支代码

完整版

在Jenkinsfile中,添加配置:变量详解

triggers {
    GenericTrigger (
            // 构建时的标题
            causeString: 'Triggered by $ref',
            // 获取POST参数中的变量,key指的是变量名,通过$ref来访问对应的值,value指的是JSON匹配值(参考Jmeter的JSON提取器)
            // ref指的是推送的分支,格式如:refs/heads/master
            genericVariables: [[key: 'ref', value: '$.ref']],
            // 打印获取的变量的key-value,此处会打印如:ref=refs/heads/master
            printContributedVariables: true,
            // 打印POST传递的参数
            printPostContent: true,
            // regexpFilterExpression与regexpFilterExpression成对使用
            // 当两者相等时,会触发对应分支的构建
            regexpFilterExpression: '^refs/heads/(master|production)$',
            regexpFilterText: '$ref',
            // 与webhook中配置的token参数值一致
            token: 'mytoken'
    )
}

梳理一下思路

这个多流水线构建,是管理很多pipeline流水线的,有几个流水线就管理几个
但是你要把Jenkinsfile文件放到你的代码里面,才能识别到,J是大写

image-20220624142303375

识别到的
image-20220624142333562

代码仓库配置

image-20220624142459807

流水线配置

这里是创建的流水线
定义变量

image-20220624142641700

Post content parameters中配置

例如此处我们想要获取到ref的值可以这样配置

# 自定义变量名称
Variable: ref
 
# 表达式采用 JSONPath 方式
Expression: $.ref      # ref 值
 
# 表达式获取值过滤与匹配,例如 refs/tags/Test_cet_v1.0.0 , 当配置如下时则ref其值为 Test_cet_v1.0.0 
Value filter: refs/tags/ 
 
# 未匹配到默认值
Default value:master

image-20220624142746689

配置token

image-20220624142956909

Cause配置
Triggered by  $ref

image-20220624163221227

忽略某些分支

可通过Filter by name (with wildcards)实现:

image-20220624143138314

配置Optional filter
^refs/heads/(master|release)$

image-20220624143251785

完整的jenkinsfile你们可以参考一下
pipeline { 
   agent any 
      triggers {
    GenericTrigger (
            // 构建时的标题
            causeString: 'Triggered by $ref',
            // 获取POST参数中的变量,key指的是变量名,通过$ref来访问对应的值,value指的是JSON匹配值(参考Jmeter的JSON提取器)
            // ref指的是推送的分支,格式如:refs/heads/master
            genericVariables: [[key: 'ref', value: '$.ref']],
            // 打印获取的变量的key-value,此处会打印如:ref=refs/heads/master
            printContributedVariables: true,
            // 打印POST传递的参数
            printPostContent: true,
            // regexpFilterExpression与regexpFilterExpression成对使用
            // 当两者相等时,会触发对应分支的构建
            regexpFilterExpression: '^refs/heads/(master|release)$',
            regexpFilterText: '$ref',
            // 与webhook中配置的token参数值一致
            token: 'aikeya'
    )
}
   stages { 
    	stage("测试部署") {
            when {
                branch 'release'
            }
    	    steps {
                echo 'release branch'
    	    }
    	}
    	stage("生产部署") {
            when {
                branch 'master'
            }
    	    steps {
                echo 'master branch'
    	    }
    	}
        stage('选择node版本编译打包') { 
             steps { 
              nodejs('node') {
                sh '''cd ${single_project_name}
                      npm  install 
                      npm run build
                      tar -zcvf  ./front.end-levee.tar.gz   ./dist'''
              }
            } 
        } 
        stage('发布到服务器') { 
             steps { 
              sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.2.204', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''
            cd /b
            tar -xzf front.end-levee.tar.gz -C ./
            cp -r dist/* ./ 
            rm -rf   front.end-levee.tar.gz''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/a', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'front.end-levee.tar.gz')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            } 
        }             
   }
}

efaultExcludes: false, patternSeparator: ‘[, ]+’, remoteDirectory: ‘/a’, remoteDirectorySDF: false, removePrefix: ‘’, sourceFiles: ‘front.end-levee.tar.gz’)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}




###### 配置完成 测试即可
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins+webhooks-多分支参数化构建- 的相关文章

随机推荐

  • 支付宝小程序中网络请求 my.request({}) 的用法

    支付宝小程序网络请求官方文档 https docs alipay com mini api network Page data name 支付宝小程序 onLoad query 页面加载 在这里请求接口 console info Page
  • 2022年9月电子学会C语言等级考试试卷(四级)答案解析

    一 上升子序列 一个数字的序列b i 当b 1 lt b 2 lt lt b S的时候 我们称这个序列是上升的 对于给定的一个序列 a
  • visual studio 2022换背景遇到的问题

    如果要自定义背景图 则可以下载ClaudialIDE 1 在拓展 gt 点击拓展管理 gt 右上角搜索background gt 点击下载ClaudialIDE gt 加载完之后需要关闭vs界面进行下载 下载失败 弹出 由于出现以下错误 无
  • html ul纵向不换行,ul li列表并排 不换行css布局

    如何使用CSS样式让ul li列表标签布局并排显示不换行篇 默认ul li布局竖列显示 这里CSS5介绍使用两种使用css样式让li标签布局并排显示 一种使用css display 另外一种使用css float浮动 一 使用display
  • GitWeb

    本文转载至 http www gitchina org getting started pro git gitweb html 现在我们的项目已经有了可读可写和只读的连接方式 不过如果能有一个简单的 web 界面访问就更好了 Git 自带一
  • 算法_统计二叉树第k层的结点个数

    统计第k层的结点个数 全局变量版 int cnt 0 void count node k BTNode bt int k int h if bt NULL return else if h k cnt else if h lt k coun
  • 应用pca和K-means实现用户对物品类别的喜好细分划分

    学习目标 应用pca和K means实现用户对物品类别的喜好细分划分 数据如下 order products prior csv 订单与商品信息 字段 order id product id add to cart order reorde
  • python中的类的基本概念

    主要参考博客 https www cnblogs com chengd articles 7287528 html 以下内容主要摘抄以上博主博客 一 基本概念 类 就是类似于C 中的类 类变量 类变量在整个实例化的对象中是公用的 类变量定义
  • 华为HCIE云计算之FA云桌面发放(Microsoft AD方式)

    华为HCIE云计算之FA云桌面发放 windowsAD方式 一 检查FC状态 二 FA01虚拟机安装FA组件 1 一键安装FA组件 选择Microsoft AD模式 2 配置本地服务器IP 3 查看组件安装状态 三 FA02虚拟机安装VAG
  • 软件测试基础(三)代码检查与走查

    两种主要的人工测试方法 都是以一组人员为单位 用于代码检查的错误列表 1 数据引用错误 2 数据声明错误 3 运算错误 4 比较错误 5 控制流程错误 6 接口错误 7 输入输出错误 代码走查与检查
  • HTML5的魅力,10个Demo展示

    Flash和HTML5的比较已经成为现在最热门的主题之一 我们不去争论哪个好哪个不好 和HTML5在很酷的动画和简单的游戏等方面一样 除非HTML5在未来几年有一些重大发展 否则Flash在富内容网页应用和游戏方面永远是不错的选择 下面收集
  • [数据库] Navicat for MySQL触发器更新和插入操作

    一 触发器概念 触发器 trigger 监视某种情况 并触发某种操作 它是提供给程序员和数据分析员来保证数据完整性的一种方法 它是与表事件相关的特殊的存储过程 它的执行不是由程序调用 也不是手工启动 而是由事件来触发 例如当对一个表进行操作
  • 获取机器人turtlebot3 在gazebo 中仿真导航时的位姿真值

    背景 机器人在gazebo环境中仿真导航 除了实时获取传感器数据估计机器人位姿外 为了验证定位算法的精度 我们需要获得机器人在gazebo worlds下的真实位姿 方法一 在机器人模型的urdf文件或者sdf文件中加入一个ros plug
  • ruoyi+vue回显数字的问题,解决方案

    在项目中用ruoyi框架和前端vue进行开发 需求是在前端生成下拉框 下拉框中的内容需要调用后端接口进行数据返回 现在新增的时候 数据已经返回了 但是再修改的时候 进行回显数据导致前端列表中展示出来的数字 不是我们想要的 我们想要的是回显成
  • react学习笔记之三--State

    State概述 state可以理解成vue中的data 没学过vue也不要紧 就相当于设置一个页面的全局变量 设置的同时也要设置setter 这样就能实现更新state并重新渲染组件 定义的规则如下 const index setIndex
  • C/C++ 关于double和float两种类型的区别

    float 是单精度浮点数 内存占4个字节 有效数字8位 表示范围是 3 40E 38 3 40E 38 double 是双精度浮点数 内存占8个字节 有效数字16位 表示范是 1 79E 308 1 79E 308 include
  • YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析

    前言 前面简单介绍了YOLOv5的网络结构和创新点 直通车 YOLO系列 YOLOv5超详细解读 网络详解 在接下来我们会进入到YOLOv5更深一步的学习 首先从源码解读开始 因为我是纯小白 刚开始下载完源码时真的一脸懵 所以就先从最基础的
  • 高级实战案例:Python反反爬之JavaScript混淆

    写在前面 很早之前在吾爱破解论坛上看见了 猿人学 Web端爬虫攻防大赛 当时进入他们官网的时候 比赛已经结束了 看着那些题目还挺有意思的 但由于各种原因一直没有机会去做那些题目 最近比较闲 就去把猿人学官网打开看了一下 尝试着完成了第一道题
  • 输入框不能输入空格

    就酱 yourInputValue indexOf gt 0 复制代码 转载于 https juejin im post 5a39da775188256970782058
  • Jenkins+webhooks-多分支参数化构建-

    Jenkins webhooks 多分支参数化构建 需求 我这里是因为公司有个静态资源 构建完成是需要放在nginx的发布目录 但是每次手动构建不是很方便 我这里配置的是webhook更新代码触发自动构建 但是我们环境又分为正式环境跟测试环