Pipeline流水线项目构建

目录

Pipeline简介

        概念

安装Pipeline插件

        Scripted脚本式Pipeline 

        Declarative声明式Pipeline

使用代码生成器生成流水线脚本

        管理Jenkinsfile脚本文件 

Jenkins 项目构建细节

        1、内置构建触发器

                1)触发远程构建(需要第三方应用调用URL地址传递加密token字符串来触发远程构建)

                其他工程构建后触发(当前项目需要依赖一个前置项目工程构建完成后才能触发构建)

                定时构建

                轮询SCM

        Git hook自动触发构建

                Jenkins 设置自动构建

                在项目添加webhook 

Jenkins 的参数化构建

                Jenkins设置参数化构建 


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: git@192.168.37.103: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服务器

[root@gitlab /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>
[root@gitlab /opt/web_demo]# git add .
[root@gitlab /opt/web_demo]# git commit -m "v1版本"
[master 8a4fb40] v1版本
 1 file changed, 5 insertions(+), 5 deletions(-)
[root@gitlab /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://zhangsan@192.168.37.103: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

[root@gitlab /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: 'git@192.168.37.103: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'
            }
        }
    }
}
 
[root@gitlab /opt/web_demo]# ls
Jenkinsfile  pom.xml  src  web_demo.iml
[root@gitlab /opt/web_demo]# cd src/main/webapp/
[root@gitlab /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>

[root@gitlab /opt/web_demo]# git add .
[root@gitlab /opt/web_demo]# git commit -m "添加Jenkins文件,加个标题"
[master 34b4c6b] 添加Jenkins文件,加个标题
 2 files changed, 3 insertions(+)
 create mode 100644 Jenkinsfile
[root@gitlab /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://zhangsan@192.168.37.103: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

[root@gitlab /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>

[root@gitlab /opt/web_demo/src/main/webapp]# cd /opt/web_demo/
[root@gitlab /opt/web_demo]# git add .
[root@gitlab /opt/web_demo]# git commit -m "添加用户"
[master 7f3835c] 添加用户
 1 file changed, 3 insertions(+)
[root@gitlab /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://zhangsan@192.168.37.103: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时,钩子自动发现自动构建

[root@gitlab /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>
[root@gitlab /opt/web_demo]# git add .
[root@gitlab /opt/web_demo]# git commit -m "修改用户"
[master efb82b4] 修改用户
 1 file changed, 3 insertions(+)
[root@gitlab /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://zhangsan@192.168.37.103: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传入分支传入代码

[root@gitlab /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: 'git@192.168.37.103: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分支

[root@gitlab /opt/web_demo]# git add .
[root@gitlab /opt/web_demo]# git commit -m "参数"
[master 63e307a] 参数
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@gitlab /opt/web_demo]# git push -u origin master
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://zhangsan@192.168.37.103: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.
[root@gitlab /opt/web_demo]# git branch
* master
  v1

v1分支

[root@gitlab /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)
[root@gitlab /opt/web_demo]# git branch
  master
* v1
[root@gitlab /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上传代码

[root@gitlab /opt/web_demo]# git add .
[root@gitlab /opt/web_demo]# git commit -m "v1版本参数"
[v1 47381f3] v1版本参数
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@gitlab /opt/web_demo]# git push -u origin v1
Username for 'http://192.168.37.103:85': zhangsan
Password for 'http://zhangsan@192.168.37.103: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代码

#################################新手上路,学无止境###########################

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柏ぁ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值