网站建设丿金手指专业,旅游网站建设与规划论文,网站首页弹出图片,网站首页代码模板提到 CI 工具#xff0c;首先想到的就是“CI 界”的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很… 提到 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个里面包含多个 stagestage:代表流水线中的某个阶段可能出现n个。一般分为拉取代码编译构建部署等阶段。steps:代表一个阶段内需要执行的逻辑。steps 里面是 shell脚本git 拉取代码ssh 远程发布等任意内容。
(4)修改模板代码
编写一个简单声明式 Pipeline:
pipeline {agent anystages {stage(拉取代码) {steps {echo 拉取代码}}stage(编译构建) {steps {echo 编译构建}}stage(项目部署) {steps {echo 项目部署}}}
}(5)保存后点击构建
可以看到阶段视图 二、pipeline代码生成器
1.设备清单 2.实验环境设置
(1)在web01 主机上安装 httpd
[rootlocalhost ~]# hostnamectl set-hostname web01
[rootlocalhost ~]# bash
[rootweb01 ~]# yum -y install httpd
[rootweb01 ~]# setenforce 0
[rootweb01 ~]# systemctl stop firewalld
[rootweb01 ~]# 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 { labellabelname }
(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 anystages {stage(Example) {steps {echo Hello World}}}}
(4)steps(步骤)
step 是每个阶段中要执行的每个步骤。 四、pipeline构建Maven项目
1.设备清单 2.环境设置
(1)生成密钥对并将公钥同步到 web 主机
[rootjenkins ~]# ssh-keygen
[rootjenkins ~]# 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.coml,
exec-opts:[native.cgroupdriversystemd],
insecure-registries:[192.168.10.106]
}
[rootmall ~]# systemctl daemon-reload
[rootmall ~]# 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:falseremovePrefix:sourceFiles:tartget/dist/*.tar.gz)],falseusePromotionTimestamp: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 name192.168.10.106/kubernetes/mal1-admin:1.0-SNAPSHOT
docker push ${image name}
app_namemall-admin
docker stop ${app_name}
echo----stop container----
docker rm ${app name}
echo----rm container----
docker rmidocker imagesgrep noneawk {print $3}
echo----rm none images---
docker run -p8080:8080--name ${app_name}
--link mysql:db
-e TZAsia/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/