Jenkins Pipline流水线

news2024/10/6 22:52:33

        提到 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/

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

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

相关文章

常见的src漏洞挖掘之信息收集打点篇

💗想加内部圈子,请联系我! 💗文章交流,请联系我!🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 一个想当文人的黑客 ,很高兴认识大家~ ✨主…

Java IO流全面教程

此笔记来自于B站黑马程序员 File 创建对象 public class FileTest1 {public static void main(String[] args) {// 1.创建一个 File 对象,指代某个具体的文件// 路径分隔符// File f1 new File("D:/resource/ab.txt");// File f1 new FIle("D:\\…

子比主题美化 – 添加天气教程

前言 经常看到很多的网站顶部或者侧边有显示天气状态的小条幅,看着也美观,寻思着也在自己的小站上显示天气。大体的思路是能识别用的ip地址来确认位置然后以代码形式在前台显示出。 经过在百度上搜索一番,发现一个很不错的天气api&#xff…

VMware ESXi Centos7网卡名称 ens192 变更eth0

1.在 /etc/sysconfig/network-scirpts/ 文件夹下 创建一个ifcfg-eth0的文件, 最简单的方式是 mv ifcfg-ens192 ifcfg-eth0 然后 vi ifcfg-eth0 把DEVICE改成 DEVICEeth0 wq! 保存 2. vi /etc/sysconfig/grub # 在位置添加 net.ifnames0 biosdevname0 参数 完…

数据结构之红黑树实现(全)

一、红黑树 红黑树是一种自平衡的二叉搜索树,它通过约束节点的颜色和结构来保持平衡。红黑树是由 Rudolf Bayer 在1972年发明的,被认为是一种优秀的平衡树结构,广泛应用于各种数据结构和算法中。 1.红黑树的性质 1. 每个结点是红的或者黑的…

detectron2/data/catalog.py源码笔记

公开接口是DatasetCatalog对象,MetadataCatalog对象和Metadata类 DatasetCatalog.register(name, func) #用于注册函数 DatasetCatalog.get(name) #返回函数调用结果return func() DatasetCatalog.list() #return list(self.keys()) Datase…

Windows系统编程(三)进程与线程二

进程与线程 进程:直观的说就是任务管理器中各种正在运行的程序。对于操作系统来说,进程仅仅是一个数据结构,并不会真实的执行代码 线程:通常被称作但并不真的是轻量级进程或实际工作中的进程,它会真实的执行代码。每…

强制删除了windows自带的edge浏览器,重装不了怎么办【已解决】

#最近我的edge浏览器出了点问题,点击打不开但是能在下面的任务栏看到他开启了,就是不能够显示在桌面,小窗口叫我配置设置。 我不懂,感觉很烦,就把他强制卸载了。但是windows是不允许将他卸载的,使用window…

LeetCode讲解篇之695. 岛屿的最大面积

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历二维矩阵,如果当前格子的元素为1进行深度优先搜索,将搜索过的格子置为0,防止重复访问,然后对继续深度优先搜索上下左右中为1的格子 题解代码 func maxAr…

sublime配置(竞赛向)

我也想要有jiangly一样的sublime 先决条件 首先,到官网上下载最新的sublime4,然后在mingw官网上下载最新的mingw64 mingw64官网:左边菜单栏点击dowloads,然后选择MinGW-W64-builds(可能会有点慢)——然后有时候会变成选LLVM-minGW,接着选择…

Vue入门-指令学习-v-show和v-if

v-show: 作用:控制元素的显示隐藏 语法:v-show"表达式" 表达式值true显示,false隐藏 v-if 作用:控制元素的显示隐藏(条件渲染) 语法: vif"表达式" 表达式tr…

【Mybatis篇】Mybatis的注解开发

🧸安清h:个人主页 🎥个人专栏:【计算机网络】,【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 文章目录 🎯 Select注解 …

Nuxt.js 应用中的 app:suspense:resolve 钩子详解

title: Nuxt.js 应用中的 app:suspense:resolve 钩子详解 date: 2024/10/6 updated: 2024/10/6 author: cmdragon excerpt: app:suspense:resolve 是一个强大的钩子,允许开发者在异步数据解析完成后的最后一步执行必要的处理。通过合理使用该钩子,我们可以优化组件的渲染…

AI赋能,旅游新纪元,看旅游大厂携程的AI实践

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 国庆假期马上过去了,2024年国庆…

智能制造的人机料法环的内涵

在生产和管理领域,有个很重要的概念叫 “人、机、料、法、环”。 “人” 就是参与其中的人员,他们的技能、态度、责任心等对事情的结果影响很大; “机” 指的是机器设备和工具等,就像干活要用的家伙事儿,好不好用、正不正常直接关系到工作的效率和质量; “料” 呢,就…

【动态规划-最长公共子序列(LCS)】【hard】【科大讯飞笔试最后一题】力扣115. 不同的子序列

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10^9 7 取模。 示例 1: 输入:s “rabbbit”, t “rabbit” 输出:3 解释: 如下所示, 有 3 种可以从 s 中得到 “rabbit”…

手撕正弦-余弦位置编码(Sinusoidal Positional Encoding)

改写后的代码: import torch import math import torch.nn as nnclass PositionalEncoder(nn.Module):def __init__(self, d_model, max_seq_len80):super().__init__()self.d_model d_model# 根据 pos 和 i 创建一个常量 PE 矩阵pe torch.zeros(max_seq_len, d_…

【unity游戏开发】彻底理解AnimatorStateInfo,获取真实动画长度

前言 前置知识:设置参数后,下一个循环才会切换对应动画,所以在下一个循环获取真实的动画长度 AnimatorStateInfo是结构体!值类型,要不断重复获取才是最新的 主要是自动设置trigger切换的动画自动切回上一个动画&#x…

Linux命令:用于管理 Linux 系统中用户组的命令行工具gpasswd详解

目录 一、概述 二、使用方法 1、 基本语法 2、 常用选项 (1)无选项(仅组名) (2)-a 用户 (3)-d 用户 (4)-M 用户列表 (5)-A 管…

系统架构设计师-下午案例题(2021年下半年)

1.试题一(共25分) 阅读以下关于软件架构设计与评估的叙述在答题纸上回答问题1和问题2。 【说明】某公司拟开发一套机器学习应用开发平台支持用户使用浏览器在线进行基于机器学习的智能应用开发活动。该平台的核心应用场景是用户通过拖拽算法组件灵活定义机器学习流程&#xf…