Jenkins Pipline流水线

提到 CI 工具,首先想到的就是"CI 界"的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很复杂的需求。但是 Jenkins丰富的插件基本上可以满足任何场景。

一、流水线概念

1.什么是流水线

Jenkins 流水线是一套插件,它支持在 Jenkins 中实现和集成持续交付流水线(continuousDeliveryPipeline)。流水线提供了一组可扩展的工具,用于通过 Pipeline Dsl(DomainSpecific Language)将简单到复杂的交付流水线以代码的形势展现,类似于基础设施即代码。

持续交付流水线会经历一个复杂的过程:从版本控制、向用户和客户提交软件、软件的每次变更(提交代码到仓库)到软件发布(Release)。这个过程包括以一种可靠并可重复的方式构建软件,以及通过多个测试和部署阶段来开发构建好的软件(称为 Build)。

Jenkins 流水线的定义被写在一个文本文件中(一般为 Jenkinshle),该文件"定制"了整个构建软件的过程。Jenkinsfile 也可以被提交到项目的代码仓库中,在 Jenkjns 中可以直接引用。将持续交付流水线作为应用程序的一部分,像其他代码一样进行版本化和审查,这是流水线即代码的基础。

创建 Jenkinsfile 并提交到代码仓库中的好处如下:

  • 自动为所有分支创建流水线构建过程。
  • 在流水线上进行代码复查/迭代。
  • 对流水线进行审计跟踪。
  • 流水线的代码可以被项目的多个成员查看和编辑。
  • 可以对 Jenkinsfile 进行版本控制。

2.Jenkins 流水线组成

Jenkins 流水线主要分为声明式分和脚本式两种,包含 pipline(流水线)、node(节点)、stage(阶段)、step(步骤)等区块。

(1)pipeline

pipeline 是用户定义的一个持续交付(CD)流水线模型。流水线的代码定义了整个构建过程,包括构建、测试和交付应用程序的阶段。另外,pipeline 块是声明式流水线语法的关键部分。

(2)node

node 是一个机器,它是 Jenkins 环境的-部分,另外,node 块是脚本化流水线语法的关键部分。

(3)stage

stage 块定义了在整个流水线的执行任务中概念不同的子集(比如 Bujld、Test、Deploy 阶段)它被许多插件用于可视化 Jenkins 流水线当前的状态/进展。

(4)step

本质上是指通过一个单一的任务告诉 Jenkins 在特定的时间点需要做什么,比如要执行 shel1 命令,可以使用 Sh SHELL_COMMAND。其运行流程如下图所示:

从上文可以了解,Jenkins 流水线分为脚本式和声明式,而声明式是"新一代"的流水线,比脚本式更加灵活,可读性更强,并且声明式流水线支持以图形化的方式进行编辑,所以声明式流水线是着重学习的对象。

3.创建一个简单的流水线

(1)创建Pipeline项目
(2)选择模板

在流水线的定义中选择"Pipline script",模板使用"Hello World"

(3)生成代码
  • agent:用于声明流水线的执行环境
  • stages:代表整个流水线的所有执行阶段。通常 stages 只有1个,里面包含多个 stage
  • stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。
  • steps:代表一个阶段内需要执行的逻辑。steps 里面是 shell脚本,git 拉取代码,ssh 远程发布等任意内容。
(4)修改模板代码

编写一个简单声明式 Pipeline:

复制代码
pipeline {
    agent any

    stages {
        stage('拉取代码') {
            steps {
                echo '拉取代码'
            }
        }
        
         stage('编译构建') {
            steps {
                echo '编译构建'
            }
        }
        
         stage('项目部署') {
            steps {
                echo '项目部署'
            }
        }
        
    }
}
(5)保存后点击构建

可以看到阶段视图

二、pipeline代码生成器

1.设备清单

2.实验环境设置

(1)在web01 主机上安装 httpd
复制代码
[root@localhost ~]# hostnamectl set-hostname web01
[root@localhost ~]# bash
[root@web01 ~]# yum -y install httpd
[root@web01 ~]# setenforce 0
[root@web01 ~]# systemctl stop firewalld
[root@web01 ~]# systemctl start httpd
(2)在Jenkins 中添加 SSH server

"Manage Jenkins"-->"system",添加"Publish over SSH",

点击 SSH Servers 的新增按钮,添加一个 SSH 的主机。参数如下图所示,并保存设置

2.添加 gitlab 项目

(1)导入项目

导入 gitee 中的项目:https://gitee.com/kgc-wjq/qqmusic.git

(2)复制仓库 URL

复制出该项目的 URL:http://192.168.10.105/root/qqmusic.git

3.编辑pipeline 代码

(1)修改配置

进入刚才创建的 pipeline 项目,点击"配置"选项

(2)在流水线页面点击"流水线语法"
(3)生成拉取代码

在片段生成器中选择示例步骤为"git:Git"并填写仓库 URL

将生成的代码复制出来,填写在第一个阶段的 steps 中,如下所示。

(4)生成项目部署代码

设置参数如下:

在片段生成器中的示例步骤中选择"step:General Build step"

Build Step 选择"Send build artifacts over SSH"

SSH Server 部分的Name:web1

Transfer set 部分的"Source files"填写"**/*"

Remote directory填写"//var/www/html"

点击"生成流水线脚本",将得到的代码填写到项目部署部分的 steps 中,如下所示:

(5)此部分完整pipeline 代码

4.部署项目

(1)将代码填写到流水线代码区域
(2)保存后点击构建按钮

通过阶段视图观察构建流程和结果。

(3)浏览器查看构建结果

5.也可以将 pipeline 放在 git 仓库

(1)创建一个文件"Jenkinsfile",将刚在的 pipline 代码填写到此文件

注意:Jenkinsfile 首字母要大写

(2)将这个文件上传到代码仓库的根目录下
(3)设置流水线

在定义中选择"Pipline script from ScM",SCM 使用"Git",填写好仓库 URL,然后保存。

备注:SCM 叫做源代码控制。

(4)点击构建按钮,查看结果

三、pipeline 语法说明

1.声明式 pipeline

声明式 Pipeline 是最近添加到 Jenkins 流水线的,它在流水线子系统之上提供了一种更简单,更有主见的语法。所有的声明式 Pipeline 都必须包含一个 pipeline 块中,比如:

复制代码
pipeline {
//run
}

在声明式 Pipeline 中的基本语句和表达式遵循 Groovy 的语法。但是有以下例外:

  • 流水线顶层必须是一个块,特别是 pipeline{}。
  • 不需要分号作为分割符,是按照行分割的。
  • 语句块只能由阶段、指令、步骤、赋值语句组成。例如:input 被视为 input()。
(1)agent(代理)

agent 指定了流水线的执行节点。

参数:

any 在任何可用的节点上执行 pipeline。

none 没有指定 agent 的时候默认。

label 在指定标签上的节点上运行 Pipeline。

node 允许额外的选项。

这两种是一样的

复制代码
agent { node { label 'labelname' }}
aget { label'labelname '}
(2)post

根据流水线或阶段的完成情况而运行(取决于流水线中post 部分的位置)。 post 支持以下post-condition 块中的其中之-:always,changed,failure,success,unstable,和 aborted.这些条件块允许在 post 部分的步骤的执行取决于流水线或阶段的完成状态。

always 无论流水线或者阶段的完成状态。

changed 只有当流水线或者阶段完成状态与之前不同时。

failure 只有当流水线或者阶段状态为"failure"运行。

success 只有当流水线或者阶段状态为"success"运行。

unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败。

aborted 只有当流水线或者阶段状态为"aborted"运行。例如:手动取消。

代码举例:

(3)stages(阶段)

包含一系列一个或多个 stage 指令,建议 stages 至少包含一个 stage 指令用于连续交付过程的每个离散部分,比如构建,测试,和部署。

复制代码
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }

    }

}
(4)steps(步骤)

step 是每个阶段中要执行的每个步骤。

四、pipeline构建Maven项目

1.设备清单

2.环境设置

(1)生成密钥对并将公钥同步到 web 主机
复制代码
[root@jenkins ~]# ssh-keygen
[root@jenkins ~]# ssh-copy-id 192.168.10.101
(2)在 gitlab 中导入 maven 项目

导入项目:https://gitee.com/kgc-wjq/mall.git

(3)修改项目 pom 文件代码

在本案例中,需要让 jenkins 对 maven 项目制作镜像,退推送到 harbor,因此,需要修改 pom 文件,将 docker 主机的地址修改为 jenkins 自己的地址,这样就可以在 jenkins 主机上生成镜像了。需要提前在 jenkins 主机上安装 docker 环境。

(4)复制该项目的 gitlab 仓库 URL

将仓库 URL 复制出来:

http://192.168.10.105/root/mall.git

(5)设置 docker 环境的私有仓库地址

jenkins 主机打包好的镜像需要推送到 Harbor,远程 docker 主机需要拉取此镜像,因此,需要在所有的 Docker 主机上设置好私有经常仓库。

复制代码
vim /etc/docker/daemon.json
{
"registry-mirrors":["http://registry.docker-cn.com"l,
"exec-opts":[native.cgroupdriver=systemd"],
"insecure-registries":["192.168.10.106"]
}

[root@mall ~]# systemctl daemon-reload
[root@mall ~]# systemctl restart docker

3.生成 pipline 代码

(1)在jenkins 中创建一个 pipline 项目,名称为"mall"
(2)生成拉取代码

在片段生成器中选择示例步骤为"git:Git"并填写仓库 URL

将生成的代码填写到 steps 区域,如下所示:

复制代码
  stage('拉取代码'){
    steps {
      git 'http://192.168.10.105/root/mall.git'
    }
}
(3)编辑maven 构建代码
(4)生成项目部署代码

设置参数如下:

在片段生成器中的示例步骤中选择"sshPublisher:Send build artifacts over SSH"

SSH Server 部分的Name:mall

Transfer Set 部分的"Source files"填写"tartget/dist/*.tar.gz其他为空

点击"生成流水脚本",生成项目部署部分的代码,代码如下:

复制代码
stage('项目部署'){
steps {
sshPublisher(publishers:sshPublisherDesc(configName:'mal1transfers:sshTransfer(cleanRemote:false,excludes:execCommand :execTimeout:120000flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator:,+',remoteDirectory:'',remoteDirectorySDF:false,removePrefix:'',sourceFiles:tartget/dist/*.tar.gz')],false,usePromotionTimestamp:useWorkspaceInPromotion:false,verbose:false)])
echo'项目部署结束'
}
}
(5)编写推送镜像代码

此部分代码的作用是利用 jenkins 登录 harbor,并将生成的镜像 push 到 harbor 上,注意需要提前在 harbor 主机上创建一个名称为"kubernetes"的项目,用于接收镜像。

(6)编写脚本同步与执行代码

利用 jenkins 将容器的启动脚本推送到远程 docker 主机,注意需要在 jenkins 和 docker 主机设置ssh 免密环境。

4.编辑容器启动脚本

在 jenkins 主机的 root 家目录下创建一个目录"mall-sh-harbor"将编写的容器启动脚本放置在此目录中。

(1)编辑mall-admin 启动脚本
复制代码
vim /root/mall-sh-harbor/mall-admin.sh
#!/usr/bin/env bash
image name='192.168.10.106/kubernetes/mal1-admin:1.0-SNAPSHOT
docker push ${image name}
app_name='mall-admin
docker stop ${app_name}
echo'----stop container----'
docker rm ${app name}
echo'----rm container----'
docker rmi`docker imagesgrep noneawk '{print $3}
echo'----rm none images---'
docker run -p8080:8080--name ${app_name}
--link mysql:db
-e TZ="Asia/Shanghai"
-v /etc/localtime:/etc/localtime
-v /mydata/app/${app_name}/logs:/var/logs
-d ${image name}
echo '----start container----'
(2)编辑mall-search.sh 启动脚本
(3)编辑mall-portal 启动脚本

5.运行pipeline

(1)将编辑好的pipeline 代码填写到流水线中
(2)保存后点击构建并查看阶段视图
(3)查看 docker 主机的容器运行状态
(4)查看mall 商城后台管理系统

http://192.168.10.101:8080/swagger-ui/

相关推荐
Wnq100724 小时前
智能巡检机器人在化工企业的应用研究
运维·计算机视觉·机器人·智能硬件·deepseek
tf的测试笔记6 小时前
测试团队UI自动化实施方案
运维·自动化
TDD_06287 小时前
【运维】Centos硬盘满导致开机时处于加载状态无法开机解决办法
linux·运维·经验分享·centos
头孢头孢7 小时前
k8s常用总结
运维·后端·k8s
遇码7 小时前
单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler
大数据·运维·分布式·开源·定时任务·dolphin·scheduler
爱编程的王小美7 小时前
Docker基础详解
运维·docker·容器
学习至死qaq8 小时前
windows字体在linux访问异常
linux·运维·服务器
IEVEl8 小时前
Centos7 安装 TDengine
运维·centos·时序数据库·tdengine
在野靡生.9 小时前
Ansible(4)—— Playbook
linux·运维·ansible
烨鹰9 小时前
戴尔电脑安装Ubuntu双系统
linux·运维·ubuntu