当前位置:网站首页>Pipeline流水线项目构建
Pipeline流水线项目构建
2022-06-13 00:51:00 【小柏ぁ】
目录
1)触发远程构建(需要第三方应用调用URL地址传递加密token字符串来触发远程构建)
其他工程构建后触发(当前项目需要依赖一个前置项目工程构建完成后才能触发构建)
Pipeline简介
概念
Pipeline,就是一套运行在Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
使用Pipeline有以下好处: ·
●代码: Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。
●持久:无论是计划内的还是计划外的服务器重启,Pipeline都是可恢复的。
●可停止: Pipeline可接收交互式输入,以确定是否继续执行Pipeline。
●多功能: Pipeline支持现实世界中复杂的持续交付要求。它支持fork/join、循环执行,并行执行任务的功能。
●可扩展: Pipeline插件支持其DSL的自定义扩展,以及与其他插件集成的多个选项。
3)如何创建Jenkins Pipeline呢
Pipeline 脚本是由Groovy语言实现的,但是我们没必要单独去学习Groovy
Pipeline 支持两种语法: Declarative (声明式)和 scripted Pipeline(脚本式〉语法 Pipeline有两种创建方法:
●直接在Jenkins 的web UI界面中输入脚本:
●通过创建一个Jenkinsfile 脚本文件放入项目源码库中(一般我们都推荐在Jenkins 中直接从源代码控制(scm)中直接载入、JenkinsilePipeline这种方法)。
安装Pipeline插件
(推荐的插件己默认安装) Manage Jenkins -> Manage Plugins ->可选插件->安装Pipeline
Pipeline语法快速入门
Scripted脚本式Pipeline
新建item ->任务名称(web_demo_pipeline) Pipeline ->确定
流水线->定义选择Pipeline script ->选择scripted Pipeline

生成内容如下:
node {
def mvnHome
stage('Preparation') { // for display purposes
// Get some code from a GitHub repository
git 'https://github.com/jglick/simple-maven-project-with-tests.git'
// Get the Maven tool.
// ** NOTE: This 'M3' Maven tool must be configured
// ** in the global configuration.
mvnHome = tool 'M3'
}
stage('Build') {
// Run the maven build
withEnv(["MVN_HOME=$mvnHome"]) {
if (isUnix()) {
sh '"$MVN_HOME/bin/mvn" -Dmaven.test.failure.ignore clean package'
} else {
bat(/"%MVN_HOME%\bin\mvn" -Dmaven.test.failure.ignore clean package/)
}
}
}
stage('Results') {
junit '**/target/surefire-reports/TEST-*.xml'
archiveArtifacts 'target/*.jar'
}
}● Node:节点,一个Node 代表一个Jenkins节点,Master或者Agent 节点,是执行 Step的具体运行环境,后续讲到Jenkins的Master-slave架构的时候用到。
● Stage:阶段,一个 Pipeline可以划分为若干个stage,每个stage 代表一组操作,比如: Build、Test、Deploy,Stage是一个逻辑分组的概念。
● Step:步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker镜像,由各类venkins 插件提供,比如命令:sh ‘make',就相当于我们平时shell 终端中执行make 命令一样。
写一个简单的脚本式Pipeline
node {
def mvnHome
stage('拉取代码') {
echo '拉取代码'
}
stage('代码编译') {
echo '代码编译'
}
stage('项目部署') {
echo '项目部署'
}
}构建

Declarative声明式Pipeline
流水线->选择Helloworld模板
生成内容如下:
pipeline {
agent any
stages { #stages:代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage
stage('Hello') { #stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段
steps { #steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容
echo 'Hello World'
}
}
}
}简单构建声明式Pipeline
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
echo 'pull code'
}
}
stage('编译构建') {
steps {
echo 'make & build'
}
}
stage('部署项目') {
steps {
echo 'deploy project'
}
}
}
}

使用代码生成器生成流水线脚本
流水线->流水线语法->片段生成器
生成一个pull stage 选择checkout : check out from version control

SCM选择Git,Repository URL: [email protected]:devops_group/web_demo.git
Credentials下拉选择gitlab-auth-ssh 指定分支 * /master 点击生成流水线脚本 把生成的脚本复制到流水线中后,点击保存,尝试构建;

Jenkins服务器将代码拉取下来了
生成一个构建stage
选择sh: shell script shell script输入mvn clean package点击生成流水线脚本 把生成的脚本复制到流水线中后,点击保存,尝试构建;

此时build now,查看Jenkins服务器,war包已经打包好了

生成一个部署stage
选择deploy: Deploy war/ear to a containerwAR files 输入targer/* . war containers -> Add container ->Tomcat 8.x Remote -> Credentials 下拉选择 tomcat-authTomcat URL输入http://192.168.37.108:8080/ 点击生成流水线脚本 把生成的脚本复制到流水线中后,点击保存,尝试构建部署。

测试一下,上传代码git服务器
[[email protected] /opt/web_demo/src/main/webapp]# vim index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>演示项目主页</title>
</head>
<body>
如果看到此页面,代表项目部署成功啦!
<div>
<li>人生若只如初见,何事秋风悲画扇</li>
<li>曾经沧海难为水,除却巫山不是云</li>
<li>众里寻他千百度。蓦然回首,那人却在,灯火阑珊处</li>
<li>纵使相逢应不识,尘满面,鬓如霜</li>
<li>相濡以沫,不若相忘于江湖</li>
</div>
</body>
</html>[[email protected] /opt/web_demo]# git add .
[[email protected] /opt/web_demo]# git commit -m "v1版本"
[master 8a4fb40] v1版本
1 file changed, 5 insertions(+), 5 deletions(-)
[[email protected] /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://[email protected]:85':
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 892 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To http://192.168.37.103:85/devops_group/web_demo.git
3ffee81..8a4fb40 master -> master
Branch master set up to track remote branch master from origin.此时代码发生改变

重新构建,看tomcat

管理Jenkinsfile脚本文件
之前我们都是直接在Jenkins的 Ur界面编写Pipeline代码,这样不方便脚本维护,而且如果Jenkins服务器崩溃也会导致Pipeline代码丢失,所以建议把Pipeline 脚本放在项目中来一起进行版本控制。
在项目根目录中建立Jenkinsfile文件,把 Pipeline 代码内容复制到该文件中,并上传到 Gitlab
[[email protected] /opt/web_demo]# vim Jenkinsfile
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
echo 'pull code'
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '91bb1853-c8d2-4a85-9033-acf0e62b8075', url: '[email protected]:devops_group/web_demo.git']]])
}
}
stage('编译构建') {
steps {
echo 'make & build'
sh 'mvn clean package'
}
}
stage('部署项目') {
steps {
echo 'deploy project'
deploy adapters: [tomcat9(credentialsId: '3506afe2-2e3c-4bfd-abab-e27489305d6c', path: '', url: 'http://192.168.37.108:8080/')], contextPath: null, war: 'target/*.war'
}
}
}
}[[email protected] /opt/web_demo]# ls
Jenkinsfile pom.xml src web_demo.iml
[[email protected] /opt/web_demo]# cd src/main/webapp/
[[email protected] /opt/web_demo/src/main/webapp]# vim index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>演示项目主页</title>
</head>
<body>
如果看到此页面,代表项目部署成功啦!
<hr>
<li>人生若只如初见,何事秋风悲画扇</li>
<li>曾经沧海难为水,除却巫山不是云</li>
<li>众里寻他千百度。蓦然回首,那人却在,灯火阑珊处</li>
<li>纵使相逢应不识,尘满面,鬓如霜</li>
<li>相濡以沫,不若相忘于江湖</li>
<p>唯美 诗句<p>
</body>
</html>[[email protected] /opt/web_demo]# git add .
[[email protected] /opt/web_demo]# git commit -m "添加Jenkins文件,加个标题"
[master 34b4c6b] 添加Jenkins文件,加个标题
2 files changed, 3 insertions(+)
create mode 100644 Jenkinsfile
[[email protected] /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://[email protected]:85':
Counting objects: 12, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (7/7), 613 bytes | 0 bytes/s, done.
Total 7 (delta 1), reused 0 (delta 0)
To http://192.168.37.103:85/devops_group/web_demo.git
4520d58..34b4c6b master -> master
Branch master set up to track remote branch master from origin.
2)在项目中引用该Jenkinsfile文件
流水线->定义下拉选择Pipeline script from SCM

#此处需与脚本文件名称相同 点击保存,尝试构建部署
再看tomcat服务器

Jenkins 项目构建细节
1、内置构建触发器
1、常用的内置构建触发器 前面我们使用的都是手动点击触发构建,而Jenkins 内置4种构建触发器来实现触发构建:
●触发远程构建
●其他工程构建后触发(Build after other projects are build)
●定时构建(Build periodically)
●轮询SCM( Poll SCM)
1)触发远程构建(需要第三方应用调用URL地址传递加密token字符串来触发远程构建)
web_demo_pipeline项目下点击配置->构建触发器->勾选触发远程构建
身份验证令牌输入abc123 #生产环境中这个token最好是加密的

复制下方URL地址:JENKINS_URL/job/web demo pipeline/build?token=TOKEN_NAME
在新建浏览器窗口访问: http://192.168.37.102:8088/job/web_demo_pipeline/build2token=abc123

通过远程触发构建就可以让 Jenkins开始构建了。

其他工程构建后触发(当前项目需要依赖一个前置项目工程构建完成后才能触发构建)
#创建一个前置项目工程 新建
item ->任务名称(pre_job) Freestyle Project ->确定
构建->添加构建步骤-> Execute shell,命令输入echo "构建前置工程"

点击保存
#配置需要触发的工程
web_demo_pipeline 项目下点击配置-→构建触发器-→勾选加build after other projects are built,并取消其它勾选项关注的项自输入pre_job 点击保存

#构建前置工程来触发项目工程构建 先构建pre_job前置项目工程,当此工程构建完成后则会立即引发构建web demo_pipeline项目工程


定时构建
定时字符串从左往右分别为:分时日月周
#定时表达式的示例
●每分钟构建一次:
* * * * *● 每小时构建一次:H为形参,代表以传入值为起点
H * * * *●每10分钟构建一次:
H/10 * * * *●每2个小时构建一次:
5 5/2 * * *●每天的8点,12点,22点,一天构建3次:(多个时间点中间用逗号隔开)
0 8,12,22 * * *●每天中午12点定时构建一次:
H 12 * * *●每天下午6点定时构建一次:
H 18 * * *●在每个小时的前半个小时内的每10分钟:
H(0-29)/10 * * * *●每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38):
H H(9-16)/2 * * 1-5
web_demo pipeline 项目下点击配置->构建触发器->勾选 Build periodically,并取消其它勾选项日程表输入
H/2 * * * *点击保存,尝试构建 会发现前后两次构建相隔2分钟


轮询SCM
轮询SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建:如果没有变更则不会触发项目构建。
web_demo_pipeline 项目下点击配置->构建触发器->勾选 poll SCM,并取消其它勾选项

上传代码到gitlab
[[email protected] /opt/web_demo/src/main/webapp]# vim index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>演示项目主页</title>
</head>
<body>
如果看到此页面,代表项目部署成功啦!
<hr>
<li>人生若只如初见,何事秋风悲画扇</li>
<li>曾经沧海难为水,除却巫山不是云</li>
<li>众里寻他千百度。蓦然回首,那人却在,灯火阑珊处</li>
<li>纵使相逢应不识,尘满面,鬓如霜</li>
<li>相濡以沫,不若相忘于江湖</li>
<p>唯美 诗句<p>
<hr>
<a href=/adduser>添加用户</a>
</body>
</html>[[email protected] /opt/web_demo/src/main/webapp]# cd /opt/web_demo/
[[email protected] /opt/web_demo]# git add .
[[email protected] /opt/web_demo]# git commit -m "添加用户"
[master 7f3835c] 添加用户
1 file changed, 3 insertions(+)
[[email protected] /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://[email protected]:85':
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 501 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To http://192.168.37.103:85/devops_group/web_demo.git
7b4921f..7f3835c master -> master
Branch master set up to track remote branch master from origin.会发现代码有变更,会触发项目构建。

注意:轮询scw构建触发器,Jenkins会定时扫描本地整个项目的代码,会增大系统的开销,不建议使用轮询sCM。
Git hook自动触发构建
在Jenkins的内置构建触发器中,虽然轮询sCM可以实现Gitlab代码更新,项目自动构建,但是该方案的性能不佳。我们利用Gitlab的webhook实现代码push到仓库,立即触发项目自动构建。
轮询SCM原理:
Jenkins --发生定时请求--> Gitlab变更
webhook原理:
Gitlab变更--发送构建请求--> Jenkins
安装Gitlab Hook插件:
Manage Jenkins -> Manage Plugins >可选插件->安装GitLab和Generic webhook Trigger

Jenkins 设置自动构建
web_demo_pipeline 项目下点击配置-〉构建触发器→取消其它勾选项,勾选 Build when a change is pushed to GitLiab,Gitiab webhook URL: http://192.168.37.102:8088/project/web_demo_pipeline等会需要把生成的webhook URL配置到Gitlab中 其它保持默认值,点击保存

#Gitlab配置 webhook
1)开启webhook功能 使用root账户登录到后台,
点击管理中心->点击左边菜单 设置-〉选择子菜单网络->点击外发请求展开勾选“Allow requests to the local network from web hooks and services"让网络钩子允许请求本地网络
点击save changes

在项目添加webhook
点击项目->点击左边菜单设置->选择子菜单集成 URL输入http://192.168.37.102:8088/project/web_demo_pipelineTrigger '勾选Push events,其它可根据使用场景自行选择 点击Add webhook Webhooks 下方即会出现保存的 webhook,但此时若点击Test ->选择 Push events测试连接,会报错

报错

解决方法:在Jenkins 中,Manage Jenkins -> Configure System -> Gitlab -〉取消勾选Enable authentication for '/project ' end-point点击保存

此时,已经构建,当我们再次修改代码,上传到gitlab时,钩子自动发现自动构建
[[email protected] /opt/web_demo/src/main/webapp]# vim index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>演示项目主页</title>
</head>
<body>
如果看到此页面,代表项目部署成功啦!
<hr>
<li>人生若只如初见,何事秋风悲画扇</li>
<li>曾经沧海难为水,除却巫山不是云</li>
<li>众里寻他千百度。蓦然回首,那人却在,灯火阑珊处</li>
<li>纵使相逢应不识,尘满面,鬓如霜</li>
<li>相濡以沫,不若相忘于江湖</li>
<p>唯美 诗句<p>
<hr>
<a href=/adduser>添加用户</a>
<hr>
<a href=/updatauser>修改用户</a>
</body>
</html>
[[email protected] /opt/web_demo]# git add .
[[email protected] /opt/web_demo]# git commit -m "修改用户"
[master efb82b4] 修改用户
1 file changed, 3 insertions(+)
[[email protected] /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://[email protected]:85':
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 502 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To http://192.168.37.103:85/devops_group/web_demo.git
7f3835c..efb82b4 master -> master
Branch master set up to track remote branch master from origin.
Jenkins 的参数化构建
有时在项目构建的过程中,我们需要根据用户的输入来动态传入一些参数,从而影响整个构建结果,这时我们可以使用参数化构建。比如在原来Jenkinsfile中只指定了 master 分支,那么我们可以使用参数替换分支。
通过输入gitlab项目的分支名称来部署不同分支项目:
Jenkins设置参数化构建
web_demo_pipeline项目下点击配置->构建触发器->取消构建触发器勾选项点击应用 General ->勾选 This project is parameterized ->添加参数选择string Parameter名称branch
默认值master 描述请输入一个分支的名称 点击保存,此时左边菜单会多出一个Build with Parameter选项

向git传入分支传入代码
[[email protected] /opt/web_demo]# vim Jenkinsfile
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
echo 'pull code'
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '91bb1853-c8d2-4a85-9033-acf0e62b8075', url: '[email protected]:devops_group/web_demo.git']]])
}
}
stage('编译构建') {
steps {
echo 'make & build'
sh 'mvn clean package'
}
}
stage('部署项目') {
steps {
echo 'deploy project'
deploy adapters: [tomcat9(credentialsId: '3506afe2-2e3c-4bfd-abab-e27489305d6c', path: '', url: 'http://192.168.37.108:8080/')], contextPath: null, war: 'target/*.war'
}
}
}
}
master分支
[[email protected] /opt/web_demo]# git add .
[[email protected] /opt/web_demo]# git commit -m "参数"
[master 63e307a] 参数
1 file changed, 1 insertion(+), 1 deletion(-)
[[email protected] /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://[email protected]:85':
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 381 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://192.168.37.103:85/devops_group/web_demo.git
eac55c1..63e307a master -> master
Branch master set up to track remote branch master from origin.
[[email protected] /opt/web_demo]# git branch
* master
v1v1分支
[[email protected] /opt/web_demo]# git checkout v1
Switched to branch 'v1'
Your branch is ahead of 'origin/v1' by 1 commit.
(use "git push" to publish your local commits)
[[email protected] /opt/web_demo]# git branch
master
* v1
[[email protected] /opt/web_demo]# vim src/main/webapp/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>演示项目主页</title>
</head>
<body>
<h1>这是V1分支页面</h1>
如果看到此页面,代表项目部署成功啦!
<hr>
<li>人生若只如初见,何事秋风悲画扇</li>
<li>曾经沧海难为水,除却巫山不是云</li>
<li>众里寻他千百度。蓦然回首,那人却在,灯火阑珊处</li>
<li>纵使相逢应不识,尘满面,鬓如霜</li>
<li>相濡以沫,不若相忘于江湖</li>
<p>唯美 诗句<p>
<hr>
<a href=/adduser>添加用户</a>
<hr>
<a href=/updatauser>修改用户</a>
</body>
</html>v1上传代码
[[email protected] /opt/web_demo]# git add .
[[email protected] /opt/web_demo]# git commit -m "v1版本参数"
[v1 47381f3] v1版本参数
1 file changed, 1 insertion(+), 1 deletion(-)
[[email protected] /opt/web_demo]# git push -u origin v1
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://[email protected]:85':
Counting objects: 17, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 887 bytes | 0 bytes/s, done.
Total 12 (delta 4), reused 0 (delta 0)
remote:
remote: To create a merge request for v1, visit:
remote: http://192.168.37.103:85/devops_group/web_demo/merge_requests/new?merge_request%5Bsource_branch%5D=v1
remote:
To http://192.168.37.103:85/devops_group/web_demo.git
2f7a67c..47381f3 v1 -> v1
Branch v1 set up to track remote branch v1 from origin.
刷新tomcat

同样选择master分支,tomcat页面会展示master代码
#################################新手上路,学无止境###########################
边栏推荐
- .net core 抛异常对性能影响的求证之路
- Stack overflow learning summary
- MySQL locates the position of the character in the string String substitution
- Aunt learning code sequel: ability to sling a large number of programmers
- [003] embedded learning: creating project templates - using stm32cubemx
- The seventh finals of the Blue Bridge Cup
- ImportError: cannot import name &#039;get_ora_doc&#039; from partially initialized module
- MySQL lpad() and rpad() concatenate string functions with specified length
- Self use notes for problem brushing learning
- Oceanbase is the leader in the magic quadrant of China's database in 2021
猜你喜欢

Three column simple Typecho theme lanstar/ Blue Star Typecho theme

Four startup modes of kotlin collaboration
![[sca-cnn interpretation] spatial and channel wise attention](/img/4b/bdcdab17d531481bf0222a96ace065.png)
[sca-cnn interpretation] spatial and channel wise attention

How many rounds of deep learning training? How many iterations?

Win10 home vs pro vs enterprise vs enterprise LTSC
![[JS component library] drag sorting component](/img/f9/4090b52da1a5784b834cb7dbbb948c.jpg)
[JS component library] drag sorting component

With a market value of more than trillion yuan and a sales volume of more than 100000 yuan for three consecutive months, will BYD become the strongest domestic brand?
![[JS] battle chess](/img/1f/83ca6bcb000a5567dc6d3b72463ff8.jpg)
[JS] battle chess

pytorch是什么?解释pytorch的基本概念

Opencv desaturation
随机推荐
Expression tree - medium order printout
Andersen global expands its business in northern Europe through cooperation agreements in Finland and Denmark
(01).NET MAUI实战 建项目
(01). Net Maui actual construction project
The grass is bearing seeds
Can GPU acceleration pytorch work?
Three column simple Typecho theme lanstar/ Blue Star Typecho theme
Browser console injection JS
Build your own PE manually from winpe of ADK
Arduino controls tb6600 driver +42 stepper motor
Mysql批量插入数据时如何解决重复问题?
Et5.0 value type generation
[JS component] customize the right-click menu
硬(磁)盘(一)
Three threads print digital demo alternately
Oceanbase is the leader in the magic quadrant of China's database in 2021
People and gods are angry. Details of Tangshan "mass beating of women incident"
antdPro - ProTable 实现两个选择框联动效果
sort
What is meebits? A brief explanation