【Jenkins】pipeline流水线

news2024/12/23 13:24:52

【Jenkins】pipeline

  • 【一】什么是pipeline?
  • 【二】pipeline任务
    • 【1】安装pipeline插件
    • 【2】创建pipeline任务
      • (1)新增任务,选择流水线
      • (2)Pipeline定义有两种方式:
    • 【3】Pipeline Script 运行任务
      • (1)版本一:初始脚本结构如下
      • (2)版本二:使用流水线语法自动生成拉取git的代码
      • (3)版本三:测试执行maven命令的代码
      • (4)版本四:配置maven构建项目的代码
      • (5)版本五:把jar包和Dockerfile发送到测试服务器上,并执行命令
    • 【4】Pipeline script from SCM 通过代码库运行任务
      • (1)创建Jenkinsfile,由Groovy语言实现。一般是存放在项目根目录,随项目一起受源代码管理软件控制。
      • (2)在 job(任务)中配置Pipeline script from SCM
  • 【三】Jenkinsfile 语法学习
    • 【1】Jenkinsfile 支持两种语法形式:
    • 【2】Declarative pipeline 语法详解
    • 【3】agent:节点
    • 【4】stages :阶段集
    • 【5】steps :步骤
    • 【6】post :构建后的操作
    • 【7】parameters :参数
    • 【8】triggers :触发器

【一】什么是pipeline?

流水线既能作为任务的本身,也能作为jenkinsfile,使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同事参与进来,同时也可以编辑开发jenkinswebui不能完成的复杂的构建逻辑,作为开发者可读性也更好

pipeline就是一套运行于jenkins上的工作流程框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化;

Pipeline 是Jenkins 2.X 的最核心的特性,帮助Jenkins 实现从CI 到 CD 与 DevOps的转变。
Pipeline 是一组插件,让jenkins 可以实现持续交付管道的落地和实施。持续交付管道是将软件从版本控制阶段到交付给用户/客户的完整过程的自动化表现。

【二】pipeline任务

【1】安装pipeline插件

在这里插入图片描述
在这里插入图片描述

【2】创建pipeline任务

(1)新增任务,选择流水线

在这里插入图片描述

(2)Pipeline定义有两种方式:

一种是Pipeline Script ,是直接把脚本内容写到脚本对话框中;
另一种是 Pipeline script from SCM (Source Control Management–源代码控制管理,即从gitlab/github/git上获得pipeline脚本–JenkisFile)

在这里插入图片描述

【3】Pipeline Script 运行任务

一步一步来完善这个脚本

(1)版本一:初始脚本结构如下

pipeline{
    agent any
    stages{
        stage("拉取代码"){
            steps {
                echo '拉取成功'
            }
        }
        stage("执行构建"){
            steps {
                echo '构建完成'
            }
        }
        stage("发送jar包到测试服务器"){
            steps {
                echo '发送完成'
            }
        }
    }
    post{
        always{
            echo 'always say goodbay'
        }
    }
}

脚本中定义了2个阶段(stage):first和run test;post是jenkins完成构建动作之后需要做的事情。
运行任务,可以看到分为3个部分,如下图所示:
在这里插入图片描述

(2)版本二:使用流水线语法自动生成拉取git的代码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

pipeline{
    agent any
    stages{
        stage("拉取代码"){
            steps {
                git branch: 'pipeline', credentialsId: 'helloworld', url: 'http://192.168.19.8/root/hello-world.git'
                echo '拉取成功'
            }
        }
        stage("执行构建"){
            steps {
                echo '构建完成'
            }
        }
        stage("发送jar包到测试服务器"){
            steps {
                echo '发送完成'
            }
        }
    }
    post{
        always{
            echo 'always say goodbay'
        }
    }
}

(3)版本三:测试执行maven命令的代码

首先找到jenkins里配置的maven的名称
在这里插入图片描述

pipeline{
    agent any
    tools{
    		maven "maven"
    }
    stages{
        stage("拉取代码"){
            steps {
                git branch: 'pipeline', credentialsId: 'helloworld', url: 'http://192.168.19.8/root/hello-world.git'
                echo '拉取成功'
            }
        }
        stage("执行构建"){
            steps {
                sh "mvn --version"
                echo '构建完成'
            }
        }
        stage("发送jar包到测试服务器"){
            steps {
                echo '发送完成'
            }
        }
    }
    post{
        always{
            echo 'always say goodbay'
        }
    }
}

报错了
在这里插入图片描述
解决方案
在这里插入图片描述点击Approve(批准)即可

再点击构建,然后查看日志,可以看到git代码拉取成功了,执行的maven命令也成功了

(4)版本四:配置maven构建项目的代码

pipeline{
    agent any
    tools{
    		maven "maven"
    }
    stages{
        stage("拉取代码"){
            steps {
                git branch: 'pipeline', credentialsId: 'helloworld', url: 'http://192.168.19.8/root/hello-world.git'
                echo '拉取成功'
            }
        }
        stage("执行构建"){
            steps {
                //sh "mvn --version"
                sh """
                cd /var/jenkins_home/workspace/helloworld_pipeline
                mvn clean package -Dmaven.test.skip=true
                """
                echo '构建完成'
            }
        }
        stage("发送jar包到测试服务器"){
            steps {
                echo '发送完成'
            }
        }
    }
    post{
        always{
            echo 'always say goodbay'
        }
    }
}

保存,然后开始构建,成功

(5)版本五:把jar包和Dockerfile发送到测试服务器上,并执行命令

(1)在项目准备好Dockerfile文件
在这里插入图片描述

FROM java:8
ENV APP_PATH=/docker/helloworld_pipeline
WORKDIR $APP_PATH
ADD ./helloworld_pipeline-0.0.1-SNAPSHOT.jar $APP_PATH/helloworld_pipeline.jar
EXPOSE 8093
ENTRYPOINT ["java","-jar"]
CMD ["helloworld_pipeline.jar","-Dfile.encoding=GBK", "--server.port=8093"]

(2)这里要用到ssh,继续使用片段代码生成器
在这里插入图片描述
(3)配置的内容可以直接从之前maven项目的配置里复制过来
一共分为三步
1-删除旧的jar包和Dockerfile文件
2-发送新的jar包
3-发送新的Dockerfile,并且执行构建命令

在这里插入图片描述
最后点一下【生成流水线脚本】就可以得到自动生成的命令了,直接复制来用

完整的pipeline命令如下

pipeline{
    agent any
    tools{
    		maven "maven"
    }
    stages{
        stage("拉取代码"){
            steps {
                git branch: 'pipeline', credentialsId: 'helloworld', url: 'http://192.168.19.8/root/hello-world.git'
                echo '拉取成功'
            }
        }
        stage("执行构建"){
            steps {
                //sh "mvn --version"
                sh """
                cd /var/jenkins_home/workspace/helloworld_pipeline
                mvn clean package -Dmaven.test.skip=true
                """
                echo '构建完成'
            }
        }
        stage("发送jar包到测试服务器"){
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'testserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf helloworld_pipeline.*
docker stop helloworld_pipeline
docker rm helloworld_pipeline
docker rmi helloworld_pipeline:1.0''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/docker/helloworld_pipeline', remoteDirectorySDF: false, removePrefix: '', sourceFiles: ''), sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/docker/helloworld_pipeline', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: '**/helloworld_pipeline*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /root/docker/helloworld_pipeline
docker build -t helloworld_pipeline:1.0 .
docker run -d -p 8093:8093 --name helloworld_pipeline helloworld_pipeline:1.0''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/docker/helloworld_pipeline', remoteDirectorySDF: false, removePrefix: 'docker', sourceFiles: 'docker/Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo 'jar包发送完成'
            }
        }
    }
    post{
        always{
            echo 'always say goodbay'
        }
    }
}

点击构建,访问链接:http://192.168.19.11:8093/hello,测试成功

【4】Pipeline script from SCM 通过代码库运行任务

将pipeline代码(Jenkinsfile)保存到代码库中,然后通过指定代码位置(脚本位置)的方式来运行pipeline任务。

(1)创建Jenkinsfile,由Groovy语言实现。一般是存放在项目根目录,随项目一起受源代码管理软件控制。

在这里插入图片描述

Jenkinsfile :创建在根目录
脚本的第二stage 是执行pytestzwf文件下的test_json.py脚本
将项目提交到代码库。

(2)在 job(任务)中配置Pipeline script from SCM

在这里插入图片描述
在这里插入图片描述
运行任务,查看结果:
在这里插入图片描述

【三】Jenkinsfile 语法学习

5个必备的组成部分
(1)pipeline:整条流水线
(2)agent:指定执行器
(3)stages:所有阶段
(4)stage:某一阶段,可有多个
(5)steps:阶段内的每一步,可执行命令

【1】Jenkinsfile 支持两种语法形式:

(1)Declarative pipeline – 在pipeline v2.5 之后引入,结构化方式,比较简单,容易上手。这种类似于我们在做自动化测试时所接触的关键字驱动模式,只要理解其定义好的关键词,按要求填充数据即可。入门容易,但是灵活性欠缺。

(2)Scripted pipeline – 基于grjoovy的语法,相较于Declarative,扩展性比较高,好封装,但是有些难度,需要一定的编程工具。

【2】Declarative pipeline 语法详解

(1)必须包含在固定格式Pipeline{} 块内,每个声明语句必须独立一行,行尾无需使用分号。
(2)块 blocks{} 只能包含章节(Sections),指令(Directves),步骤(Steps) 或 赋值语句。

【3】agent:节点

(1)必须存在,agent必须在pipeline块内的顶层定义
(2)any :可以在任意agent 上执行pipeline
(3)none :pipeline 将不分配全局agent,每个stage分配自己的agent
(4)label :指定运行节点的label
(5)node:自定义运行节点配置,指定label ,指定customWorkspace(工作空间)
(6)docker:控制目标节点上的docker运行相关内容

agent any

agent { label 'my-master'}
agent{
	node{
		label "myslave"
		customWorkspace "myworkspace"
	}
}

【4】stages :阶段集

(1)必须存在,包含顺序执行的一个或者多个stage命令
(2)在pipeline内仅能使用一次
(3)需要定义stage的名字

【5】steps :步骤

(1)必须存在
(2)steps位于stage指令块内部,包含一个或者多个step

stages{
	stage("stage name"){
		steps{
			echo "this is a step"
		}
	}
}

【6】post :构建后的操作

(1)非必须
(2)always:无论pipeline运行的完成的状态如何都会运行
(3)success:仅当当前pipeline具有 成功 状态时才运行
(4)failure: 仅当当前pipeline 具有 失败 状态时才运行

当然还有其他选项,这里不再做扩展介绍;

【7】parameters :参数

(1)非必须
(2)参数化构建的参数设置,参数类型有booleanParam、choice(选择)、file、text、string 等

parameters{
        string( name :'name',defaultValue:'beauty',description:'姓名是')
}

等同于如下设置:

在这里插入图片描述
构建时效果如下:

在这里插入图片描述

【8】triggers :触发器

(1)非必须
(2)定义了pipeline自动化触发的方式
(3)cron:接受一个cron风格的字符串来定义pipeline触发的常规间隔
(4)pollSCM:接受一个cron风格的字符串来定义jenkins检查SCM源更改的常规间隔;如果存在新的更改,则pipeline将被重新触发

triggers{
	cron('*/1 * * * *')
}

每隔一分钟执行一次

triggers{
	pollSCM('*/1 * * * *')
}

每隔一分钟监控SCM源,更改即触发

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1003824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云平台】遥感地信云平台收录

文章目录 国内1 航天宏图PIE-Engine2 商汤科技3 AI Earth4 EarthDataMiner国外结语国内 1 航天宏图PIE-Engine https://engine.piesat.cn/live-show-list 在这里插入图片描述 2 商汤科技 https://senseearth-cloud.com/map 3 AI Earth https://engine-aiearth.aliyun.com…

一场深刻的开源聚会:KCC@北京 9.2 活动回顾

开源为我们带来了什么?这是这场聚会的宣传文的标题:https://mp.weixin.qq.com/s/5sR6TPEpQmYNBnCtVilkzg 同样这个问题也可以是极具个体化的:开源为我带来了什么?秋天的周末,预报有雨,北京的开源人还是相聚…

解决element ui Table 最后的数据没有子数据也有展开按钮的问题

先添加类 :row-class-name"getRowClass" 写个方法 getRowClass(row, rowIndex) {let data row.row;let res [];if (data.realyTask && data.realyTask.length > 0) {res.push(row-expand-has)return res;} else {res.push(row-expand-unhas)return res;…

vue2+three.js(入门级)

20232.9.12今天我学习了如何使用vue2three制作一个3d图形&#xff0c;效果&#xff1a; 首先安装&#xff1a; npm install three 相关代码&#xff1a; <!--3d基础版&#xff0c;实现单个3d图形--> <template><div><div id"content"/><…

Mac端交互式原型设计 Axure RP 8 for Mac汉化

Axure RP 8是一款专业的交互原型设计工具&#xff0c;它被广泛应用于用户体验设计、界面设计和产品原型制作等领域。该软件提供了丰富的功能和工具&#xff0c;使用户能够创建出具有高度交互性和可视化效果的原型。 Axure RP 8的主要特点和功能包括&#xff1a; 1. 快速原型&a…

UI设计怎么切图?初学者入门必读篇

切图是开发无法使用代码直接实现的元素&#xff0c;是UI设计师的重要产出成果和交付物。切图看似简单&#xff0c;实则也有超级多的专业细节需要了解&#xff0c;以及各种方法来提高切图效率。本文将全面介绍UI设计怎么切图所需要的所有知识。 本文大纲&#xff1a; UI设计切图…

商城售后系统_换货、维修、退货退款_OctShop

OctShop商城售后系统&#xff1a;售后分为&#xff1a;换货&#xff0c;返修&#xff0c;退货退款三种。售后即支持物流售后也支持上门售后服务。售后信息由&#xff1a;申请信息&#xff0c;问题图片凭证&#xff0c;发货信息&#xff0c;发回信息&#xff0c;上门服务信息等组…

Java后端开发工程师学习路线是什么?

击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 关于这个问题&#xff0c;我之前也是回答过好几遍了&#xff0c;当然也给很多知友带来了帮助~ 虽然目前互联网行情不是太景气&#xff0c;但是对于求职找工作的朋友来说&#xff0c;Java可能仍然…

element el-table 设置fixed导致行错乱问题

首先看有问题的样式&#xff1a; 解决&#xff1a; // 解决左右 对不齐 的情况 // el-table 左右有列固定时&#xff0c;fixed为left和right时&#xff0c;行未对齐解决办法 // * 产生原因&#xff1a; el-table底部有滚动条&#xff0c;固定列底部没有滚动条 // * 解决办法&…

数据结构之位图【原理与实现】

文章目录 前言一、位图bitap是什么&#xff1f;二、位图的引用场景1、查询统计、定位查询&#xff0c;排序&#xff0c;去重2、取两个集合的交集&#xff0c;并集等 三、位图C实现 前言 bitmap意为位图&#xff0c;它的每一位用于存放状态&#xff0c;适用于大规模并且不重复的…

服务器数据恢复-EVA存储多块硬盘磁头和盘片损坏离线的数据恢复案例

服务器数据恢复环境&#xff1a; HP EVA某型号存储&#xff0c;存储中一共有23块磁盘&#xff0c;上层映射给一台windows server服务器上。 服务器故障&检测&分析&#xff1a; 该EVA存储上三块硬盘指示灯显示黄色&#xff0c;此时存储设备还能正常工作。运维更换显示黄…

Dell 服务器常见报错信息汇总

Dell 服务器常见报错汇总 如果有别的报错信息欢迎补充

电子烟行业常用的英文表达

1. 电子烟的各种表达 a) 电子烟 i. Electronic-cigarette, ii. Electronic smoke, iii. electronic cigarettes iv. Electric cigarette, v. E-Cigarettes vi. e-cigarette, vii. e-Cig viii. E cigar,e-cigar 电子烟雪茄 2. 电子烟特指词汇及衍生 a) VAPE i. Vapo…

计网第五章(运输层)(一)

在前面的博客中&#xff0c;总是说主机之间进行通信。但实际上通信的真正的实体是位于通信两端主机中的进程。 一、运输层基本概述 运输层的任务就是为运行在不同主机上的应用进程提供直接的通信服务&#xff0c;运输层的协议又称为端到端协议。运输层中使用不同的端口来对应…

ARM接口编程—PWM(exynos 4412平台)

PWM简介 PWM(Pulse Width Modulation)即脉冲宽度调制&#xff0c;通过对脉冲的宽度进行调制&#xff0c;来获得所需要波形 PWM参数 周期 一次高低电平所占用的时间 占空比 一个周期中高电平时间与整个周期的比例称为占空比 PWM工作原理 pwm原理图 由电路原理图可知道蜂鸣…

在Windows系统上用Nginx搭建图片服务器

1、nginx.conf中的配置&#xff1a; server { listen 8088; #server_name localhost; server_name 127.0.0.1 ; #charset koi8-r; #charset utf-8,gbk; charset utf-8; location ~ .*.(gif|jpg|jpeg|png)$ { e…

恒运资本:减肥药概念涨疯了!特斯拉一夜暴涨5800亿市值,汽车股狂飙

今天早盘&#xff0c;A股微幅震荡&#xff0c;主要股指涨跌互现&#xff0c;两市成交呈萎缩趋势。 盘面上&#xff0c;减肥药、轿车、工业大麻、鸡肉等板块涨幅居前&#xff0c;光刻机、稳妥、互联网、知识产权等板块跌幅居前。北上资金净流出1.99亿元。 减肥药概念飙涨 续昨…

动态规划总结(持续更新中……)

注意&#xff1a;我这里定义的所有dp的索引相对于实际问题都是从1开始的&#xff0c;也就是空间长度会比实际大1&#xff0c;这样的好处是在部分题目场景下不需要条件判断也不会越界。 字符串/数组类 区间 1.最长回文子串 dp定义 dp[i][j]表示第i个字符到第j个字符组成的子…

一文了解VR全景,VR全景有哪些优势?

引言&#xff1a; VR全景技术近年来崭露头角&#xff0c;已经成为宣传领域的一大亮点。不仅在娱乐&#xff0c;旅游行业广泛应用&#xff0c;还在商业和教育等领域崭露头角。 一&#xff0e;什么是VR全景&#xff1f; VR全景&#xff0c;全名Virtual Reality Panorama&#x…

Python代码扫描:新一代 Python Linter工具Ruff -极力推荐-快的原因是Rust写的?

目录 RUFF概述 特点 安装和使用 应用场景 配置 编辑器集成 PyCharm(外部工具) Ruff的规则 Ruff速度快的几个原因 最后 注意&#xff1a;后续技术分享&#xff0c;第一时间更新&#xff0c;以及更多更及时的技术资讯和学习技术资料&#xff0c;将在公众号CTO Plus发布…