当前位置: 首页 > news >正文

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布

**什么叫平滑:**在发布的过程中不影响用户的使用,系统不会因发布而暂停对外服务,不会造成用户短暂性无法访问;
**什么叫灰度:**发布后让部分用户使用新版本,其它用户使用旧版本,逐步扩大影响范围,最终达到全部更新的发布方式 ;

灰度发布与平滑发布其实是关联的。当服务器的数量只有一台的时候,不存在灰度发布,一旦发布了就是所有用户都更新了,
所以这个时候只有平滑发布。当服务器数量大于一台的时候,只要每台服务器都能达到平滑发布的方式,然后设定好需要
发布的服务器占比数量,就可以实现灰度发布了。

单台服务器的平滑发布模式:
单机状态下,应用的持续服务主要依靠Nginx的负载均衡及自动切换功能;
为了能够切换应用,需要在服务器中创建两个相同的独立应用,分配两个不同的端口,
例如:app1,端口801; app2,端口802;
在Nginx中,将app1,app2作为负载均衡加载:

    upstream myapp{server 127.0.0.1:801; //app1server 127.0.0.1:802; //app2}然后设置代理超时为1秒,以便在某个应用停止时及时切换到另一个应用:
server {listen 80;server_name localhost;location /{proxy_pass http://myapp;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout       1;proxy_read_timeout          1;proxy_send_timeout          1;}
}以上内容写在单独的配置文件中:/vhost/pub/pub_app.conf在nginx.conf里包含进去:include /vhost/*.conf;

现在系统会均衡地分配用户访问app1与app2。
接下来我们进行平滑发布,我们先把app1停止,然后将新版本发布到app1中:

    步骤1: 准备发布app1配置文件新做一个配置文件 pub_app1_down.conf,内容中把app1停止掉:upstream myapp{server 127.0.0.1:801 down; //app1server 127.0.0.1:802; //app2}将这个文件内容覆盖掉在原有的pub_app.confcp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf步骤2:停止app1应用平滑重新加载一下nginx: service nginx reload或者:/usr/local/nginx/sbin/nginx -s reload此时所有的请求都转到了app2了;步骤3:更新app1现在可以通过各种方式来更新应用了,例如:压缩包方式:wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tarunzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar其中:-o:不提示的情况下覆盖文件;-d:指定解压目录步骤3.5 内部测试如果需要的话,可以在这一步对app1进行内部测试,以确保应用的正确性;步骤4:准备发布app2配置文件;此时app1已经是最新版本的文件了,可以切换到app1来对外,创建一个新的nginx配置文件:pub_app2_down.conf,设置为app1对外,app2停止即可:upstream myapp{server 127.0.0.1:801; //app1server 127.0.0.1:802 down; //app2}将这个文件内容覆盖掉在原有的pub_app.confcp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf步骤5:切换到app1新版本应用 平滑重新一下nginx: service nginx reload或者:/usr/local/nginx/sbin/nginx -s reload此时所有的请求都转到了app1了,新版本开始运行;步骤6:更新app2与第3步一样,解压就可以了,这里可以省去下载过程unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar步骤7:恢复app1,app2同时对外:cp -f /vhost/pub/pub_app.conf /vhost/pub_app.conf平滑重新一下nginx: service nginx reload或者:/usr/local/nginx/sbin/nginx -s reload至此,整个应用都已经更新。将各步骤中的脚本汇总一下:[pub.sh]#============ 平滑发布 v1.0 ===============#step 1cp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf#step 2service nginx reload#step 3wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tarunzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar#step 4cp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf#step 5service nginx reload#step 6unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar#step 7cp -f /vhost/pub/pub_app.conf /vhost/pub_app.confservice nginx reload#============ 平滑发布 v1.0  ===============    备注:也可以充分利用nginx的宕机检测,省去步骤1,2,4,5,7;简化后的脚本如下:[pub_mini.sh]#======== 简化版脚本 =============wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tarunzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tarunzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar#========= over ===========

多台服务器平滑发布模式:
有了单台平滑发布模式的基础,多台服务器就简单了。
每台服务器当作应用进行发布就可以了,由于nginx有宕机自动检测功能,
只需要在每台服务器上先停止发布,然后更新文件,再启动就可以了;
如果选择部分的服务器进行更新,那就是灰度了。

二、介绍 CI / CD

在本文档中,我们将概述持续集成,持续交付和持续部署的概念,以及GitLab CI / CD的介绍。

1、为什么要 CI / CD 方法简介

软件开发的连续方法基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预。

它涉及在每次小迭代中不断构建,测试和部署代码更改,从而减少基于有缺陷或失败的先前版本开发新代码的机会。

这种方法有三种主要方法,每种方法都根据最适合您的策略进行应用。 Devops

持续集成(Continuous Integration, CI): 代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈。

持续部署(Continuous Deployment, CD): 部署到测试环境、预生产环境、生成环境。

持续发布(Continuous Delivery, CD): 将最终产品发布到生成环境、给用户使用。

img

1、持续集成

考虑一个应用程序,其代码存储在GitLab中的Git存储库中。开发人员每天多次推送代码更改。对于每次推送到存储库,您都可以创建一组脚本来自动构建和测试应用程序,从而减少向应用程序引入错误的可能性。

这种做法被称为持续整合 ; 对于提交给应用程序的每个更改 - 甚至是开发分支 - 它都是自动且连续地构建和测试的,确保所引入的更改通过您为应用程序建立的所有测试,指南和代码合规性标准。

GitLab本身就是使用持续集成作为软件开发方法的一个例子。对于项目的每次推送,都会有一组脚本来检查代码。

2、持续交付

持续交付是持续集成的一个步骤。您的应用程序不仅在推送到代码库的每个代码更改时都构建和测试,而且,作为一个额外的步骤,它也会连续部署,尽管部署是手动触发的。

此方法可确保自动检查代码,但需要人工干预才能手动并策略性地触发更改的部署。

3、持续部署

持续部署 也是持续集成的又一步,类似于持续交付。不同之处在于,您不必手动部署应用程序,而是将其设置为自动部署。完全不需要人工干预就可以部署您的应用程序。

2、GitLab CI / CD简介

GitLab CI / CD是GitLab内置的强大工具,允许您将所有连续方法(持续集成,交付和部署)应用于您的软件,而无需第三方应用程序或集成。

3、GitLab CI / CD 的工作原理

要使用GitLab CI / CD,您只需要一个托管在Git存储库中的应用程序代码库,并在一个名为的文件中指定构建,测试和部署脚本,该文件[这里是代码003]位于存储库的根路径中。

在此文件中,您可以定义要运行的脚本,定义包含和缓存依赖项,选择要按顺序运行的命令以及要并行运行的命令,定义要部署应用程序的位置,以及指定是否将要自动运行脚本或手动触发任何脚本。熟悉GitLab CI / CD后,您可以在配置文件中添加更多高级步骤。

要向该文件添加脚本,您需要按照适合您的应用程序的顺序组织它们,并且这些脚本符合您希望执行的测试。要想象可视化过程,请假设您添加到配置文件中的所有脚本与您在计算机终端上运行的命令相同。

.gitlab-ci.yml配置文件添加到存储库后,GitLab将检测到它并使用名为GitLab Runner的工具运行脚本,该工具与终端类似。

脚本被分组到作业中,它们一起组成一个管道.gitlab-ci.yml文件的极简主义示例可以包含:

before_script:- apt-get install rubygems ruby-dev -yrun-test:script:- ruby --version

before_script属性将在运行任何内容之前为您的应用程序安装依赖项,并且调用 的 作业run-test将打印当前系统的Ruby版本。它们都构成了在每次推送到存储库的任何分支时触发的管道

GitLab CI / CD不仅可以执行您设置的作业,还可以显示执行过程中发生的情况,如您在终端中看到的那样:

工作运行

您可以为应用创建策略,GitLab会根据您定义的内容为您运行管道。您的管道状态也由GitLab显示:

管道状态

最后,如果出现任何问题,您可以轻松 回滚所有更改:

回滚按钮

4、基本CI / CD工作流程

这是GitLab CI / CD如何适用于通用开发工作流程的一个非常简单的示例。

假设您已在一个问题中讨论过代码实现,并在本地处理您提出的更改。将提交推送到GitLab中远程存储库中的功能分支后,将触发为项目设置的CI / CD管道。通过这样做,GitLab CI / CD:

  • 运行自动脚本(顺序或并行)到:
    • 构建并测试您的应用。
    • 使用“评论应用”预览每个合并请求的更改,如您所见localhost

一旦您对实施感到满意:

  • 让您的代码经过审核和批准。
  • 将功能分支合并到默认分支。
    • GitLab CI / CD会自动将更改部署到生产环境中。
  • 最后,如果出现问题,您和您的团队可以轻松地将其回滚。

GitLab工作流程示例

GitLab CI / CD能够做得更多,但这个工作流程体现了GitLab跟踪整个过程的能力,而无需任何外部工具来交付您的软件。而且,最有用的是,您可以通过GitLab UI可视化所有步骤。

5、首次设置 GitLab CI / CD

要开始使用GitLab CI / CD,您需要熟悉[这里是代码010]配置文件语法及其属性。

本文档介绍了GitLab CI / CD在GitLab页面范围内的概念,用于部署静态网站。虽然它适用于想要从头开始编写自己的Pages脚本的用户,但它也可以作为GitLab CI / CD设置过程的介绍。它涵盖了编写CI / CD配置文件的第一个常规步骤,因此我们建议您通读它以了解GitLab的CI / CD逻辑,并了解如何为任何应用程序编写自己的脚本(或调整现有脚本)。

有关GitLab的CI / CD配置选项的深入视图,请查看 [这里是代码011]完整参考。

6、GitLab CI / CD功能集
  • 使用Auto DevOps轻松设置应用程序的整个生命周期。

  • 使用GitLab Pages部署静态网站。

  • 将您的应用程序部署到不同的环境。

  • 使用Review Apps预览每个合并请求的更改。

  • 使用Container Registry开发安全的私有Docker镜像。

  • 安装自己的GitLab Runner。

  • 安排管道。

  • 使用安全测试报告检查应用程序漏洞。

    具体实施参考:
    https://segmentfault.com/a/1190000016069906
    

三、Jenkins CI/CD

1、 Jenkins CI/CD 流程图

img

说明:这张图稍微更形象一点,上线之前先把代码git到版本仓库,然后通过Jenkins 如Java项目通过maven去构建,这是在非容器之前,典型的自动化的一个版本上线流程。那它有哪些问题呢?

如:它的测试环境,预生产环境,测试环境。会存在一定的兼容性问题 (环境之间会有一定的差异)

img

说明:它这里有一个docker harbor 的镜像仓库,通常会把你的环境打包为一个镜像,通过镜像的方式来部署。

Jenkins持续集成01—Jenkins服务搭建和部署

2、介绍 Jenkins
1、Jenkins概念

Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台。这是一个免费的源代码,可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允许持续集成。

2、Jenkins目的

① 持续、自动地构建/测试软件项目。

② 监控软件开放流程,快速问题定位及处理,提示开放效率。

3、特性

① 开源的java语言开发持续集成工具,支持CI,CD。

② 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理。

③ 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告。

④ 分布式构建:支持Jenkins能够让多台计算机一起构建/测试。

⑤ 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。

⑥ 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。

4、产品发布流程

产品设计成型 -> 开发人员开发代码 -> 测试人员测试功能 -> 运维人员发布上线

持续集成(Continuous integration,简称CI)

持续交付(Continuous delivery)

持续部署(continuous deployment)

3、安装Jenkins
1、安装JDK

Jenkins是Java编写的,所以需要先安装JDK,这里采用yum安装,如果对版本有需求,可以直接在Oracle官网下载JDK;也可自己编译安装。

2、安装Jenkins
1、上传 jdk11 tomcat jenkins.war
2、解压jdk
[root@jenkins ~]# yum -y install fontconfig 
[root@jenkins ~]# tar xf jdk-11.0.18_linux-x64_bin.tar.gz
3、解压tomcat
[root@jenkins ~]# tar xf apache-tomcat-8.5.50.tar.gz
4、拷贝并修改名称
[root@jenkins ~]# mv jdk-11.0.18/ /usr/local/java && mv apache-tomcat-8.5.50 /usr/local/tomcat
5、处理环境变量
[root@jenkins ~]# vim /etc/profile.d/java.sh
TOMCAT_HOME=/usr/local/tomcat
JAVA_HOME=/usr/local/java
PATH=$TOMCAT_HOME/bin:$JAVA_HOME/bin:$PATH
export TOMCAT_HOME JAVA_HOME PATH
[root@jenkins ~]# source /etc/profile.d/java.sh
6、上传jenkins
[root@jenkins ~]# rm -rf /usr/local/tomcat/webapps/*
[root@jenkins ~]# cp jenkins.war /usr/local/tomcat/webapps/
7、启动tomcat,并页面访问
[root@jenkins ~]# startup.sh访问 ip:8080

image-20240516094452422

为了安全考虑,首先需要解锁Jenkins,请在/var/lib/jenkins/secrets/initialAdminPassword中查看文件。

img

在Jenkins服务器上查询管理员密码

[root@centos7-1 ~]# cat /data/jenkins/secrets/initialAdminPassword

250d0360e2a149dbb7402f96a26945e2

② 选择需要安装的插件

选择默认推荐即可,会安装通用的社区插件,剩下的可以在使用的时候再进行安装。

img

开始安装,由于网络原因,有一些插件会安装失败。

img

③ 设置Admin用户和密码

img

④ 安装完成

img

⑤ 登录Jenkins

img

image-20201113145605132

安装插件:
gitlab
gitlab webhook
blue ocean
maven
Pipeline Maven

4、安装完后,简单的配置
1、系统配置

① 系统消息:Welcome to Jenkins~

② 全局属性—>环境变量,可根据自己的项目添加;如:gitlab:

img

③ 扩展邮件通知(用于之后项目构建后发送邮件)

img

④ 邮件配置

管理监控配置—>系统管理员邮件地址:along@163.com,要和下面的用户名一致;

邮件通知,配置如下:可以点击测试,是否配置成功

img

2、全局工具配置

如果你持续集成需要用的哪些工具,就需要在这里添加配置;后边持续集成中,将会详细讲解;

这里只举例:添加JDK工具

点击新增—> 取消自动安装 ---->然后查询Jenkins服务器上JDK的路径,填写JAVA_HOME —> 保存即可

img

3、插件管理

这里有可更新、可选未安装插件、已安装插件;可以通过过滤快速查找

img

5、添加节点

node 节点的作用

  1. 分布式构建:通过添加多个节点,可以在多台计算机上并行执行构建任务,从而加快构建速度和提高效率。节点可以是物理计算机、虚拟机、云实例或容器等。
  2. 扩展计算能力:通过添加更多的节点,可以扩展Jenkins的计算能力,使其能够处理更多的并发构建任务,从而适应不断增长的工作负载。
  3. 平台兼容性:使用Node节点可以在不同的操作系统、不同的硬件平台上执行构建任务,以满足项目的特定需求。您可以配置节点以适应特定的操作系统、软件环境和工具链。
  4. 隔离和安全性:将构建任务分配给独立的节点可以提供更好的隔离和安全性。节点之间相互独立,一个节点的故障或问题不会影响其他节点的工作。
  5. 负载平衡:Jenkins可以根据节点的负载情况自动分配任务,从而实现负载平衡。这样可以更好地利用可用资源,并确保每个节点都能以最佳状态运行。
1、准备节点
1、准备一台新的服务器并配置java环境
2、主节点添加凭据,并推送公钥
3、在node节点配置需要的工具
2、系统配置

image-20230611193513253

3、添加节点

image-20230611193601845

image-20230611194016152

image-20230611194029326

4、检查节点

image-20230611194101116

6、开始一个简单的项目
1、新建任务

输入一个项目名称,构建一个自由风格的软件项目

img

2、配置项目

(1)General

描述:test 自己随意添加;

显示名称:along 是Jenkins看到的项目名称;

其他更多的用法,后续再讲;

img

(2)源码管理(就是拉取代码的地方,可以选择git或SVN)

① 选择git,输入gitlab项目地址

img

② 点击Add添加凭据

选择SSH Username with pricate key,秘钥认证,输入私钥即可;

注:Jenkins服务器需在gitlab项目上有key

img

因为只是简单的示范,所以就只有这些简单的配置;

3、构建项目

(1)点击项目damo,立即构建

img

(2)可以点击#1,查询详细的控制台输出信息;

img

(3)在Jenkins服务器上认证

在这个目录下能找到自己拉取git的项目;证明项目成功完成

[root@jenkins ~]# ls /data/jenkins/workspace/

damo damo@tmp

四、Jenkins+Maven+Gitlab+Tomcat 自动化构建打包、部署

1、环境需求

本帖针对的是Linux环境,Windows或其他系统也可借鉴。具体只讲述Jenkins配置以及整个流程的实现。

  • 1.JDK(或JRE)及Java环境变量配置,我用的是JDK1.8.0_144,网上帖子也很多,不赘述。
  • 2.Jenkins 持续集成和持续交付项目。
  • 3.现有项目及gitlab(SVN或本地路径也行)地址。
  • 4.maven工具及环境变量配置,用于构建和管理任何基于Java的项目。
  • 5.下载解压Tomcat,我用的是Tomcat8。
2、环境准备
1、安装服务

(1)安装JDK、Jenkins和gitlab

JDK yum安装和编译安装都可以;

gitlab 安装详见:gitlab 部署;

tomcat 安装详见:tomcat 服务部署

(2)mave安装

1、下载 maven 包

http://mirrors.cnnic.cn/apache/maven 选择自己需要的maven版本

wget https://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
tar -zxvf apache-maven-3.5.4-bin.tar.gz
2、配置环境变量

(1)配置全局环境变量

vim /etc/profile.d/jenkins_tools.sh

#JDK
export JAVA_HOME=/usr/java/jdk1.8.0_144
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export TIME_STYLE='+%Y/%m/%d %H:%M:%S'#maven
export MAVEN_HOME=/data/jenkins_tools/maven-3.5.4
export PATH=${MAVEN_HOME}/bin:$PATH 

使环境变量生效

source /etc/profile.d/jenkins_tools.sh 

(2)测试

java -versionjava version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)$ mvn -version
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: /data/jenkins_tools/maven-3.5.4
Java version: 1.8.0_144, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_144/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.26.2.el7.x86_64", arch: "amd64", family: "unix"
3、Jenkins工具、环境、插件配置
1、全局工具配置

系统管理—>全局工具配置

修改maven默认settings.xml文件,配置git、jdk、maven工具后保存(不要勾选自动安装)。

img

img

2、配置全局变量

系统管理—>系统设置—>全局属性

img

3、安装3个插件

系统管理—>插件管理

(1)Maven Integration plugin 安装此插件才能构建maven项目

img

(2)Deploy to container Plugin 安装此插件,才能将打好的包部署到tomcat上

img

(3) mvn配置国内源

4、创建一个Maven工程
1、构建maven项目

img

2、源码管理

填写git地址信息,添加认证凭据,详见Jenkins持续集成01—Jenkins服务搭建和部署

img

3、构建触发器,可以根据自己的业务需求定制

① Build whenever a SNAPSHOT dependency is built:检测到gitlab项目代码被重新构建后就触发;

② 轮询 SCM:*/2 * * * * ,每隔2分钟检查一次

img

img

4、打包前步骤,根据自己需求可以添加一些操作:如一些shell命令

img

5、build打包构建

① Root POM:指定pom.xml的文件路径(这里是相对路径)

② Goals and options:mvn的选项,构件参数

img

6、构建后操作

(1)选择deploy war to a container,部署到tomcat

img

(2)配置tomcat信息

img

  • WAR/EAR files:输入war包的相对路径,如我的war包在新建目录的target下

  • context path:输入部署tomcat的名称,就部署在webapps下的目录名

  • add container:增加容器,一般选tomcat 8X就可以。这里的username与password需要到tomcat的conf文件夹中的tomcat-users.xml修改。tomcat URL就是你希望把war包部署到的tomcat所在IP地址,最后面不需要再加斜杠/。

  • tomcat-users.xml中的用户名及密码默认是注释掉的,所以需要修改,也可以直接复制以下代码到之前。

  • 然后到tomcat下面webapps/manager/META-INF/context.xml 注销掉红色部分。因为默认tomcat不可以通过外部ip访问管理界面。一定要启动Tomcat,不然等构建等时候会报拒绝连接

(3)添加tomcat的凭据

img

7、配置邮件通知

增加构建后操作—>Editable Email Notification

使用邮件同事前,需要再系统配置中进行邮箱配置

(1)配置邮件信息

img

(2)设置邮件触发器triggers

默认触发器:Failure - Any 无论何时失败触发;加一个success作为测试;

修改收件人为:recipient list

img

到这里就配置完成了,点击构建从控制台查看输出信息即可

5、构建项目
1、立即构建

img

2、查看控制台输出

点击#1—>控制台输出;就能看到执行的整个过程

img

3、验证项目是否构建成功

(1)成功向上蓝色;失败即为红色

img

(2)在tomcat上查看项目

img

(3)收到项目构建成功的邮件

img

五、jenkins + gitlab + nginx 自动部署(webhook)

构建新的项目

构建自由风格项目

源码管理

git 如何添加认证

构建触发器 gitlab-plugin gitlab-hook

要记录下上边的URL和认证密钥

切换到gitlab,找到对应的git库 点击setting --> Integrations ,填写以下内容,然后下拉点击 Add webhook

可能会报下列错误,这是新版本gitlab 的保护功能,禁止内网跳转,解决方法如下:

点击setting --> network 找到 Outbound requests

重复上列步骤添加 webhook。即可成功。

测试:

六、Jenkins与Docker的自动化CI/CD流水线实践

Pipeline 有诸多优点,例如:

  • 项目发布可视化,明确阶段,方便处理问题
  • 一个Jenkins File文件管理整个项目生命周期
  • Jenkins File可以放到项目代码中版本管理

Jenkins管理界面

img

操作实例:Pipeline的简单使用

img

img

img

这里是比较重要的核心,构建流程

img

点击保存之后,立即构建

img

映像中普通Jenkins构建方式步骤:

img

而pipeline 的构建流程:

img

pipeline有诸多优点:

  • 项目发布可视化,明确阶段,方便处理问题
  • 一个Jenkins File 文件管理整个项目生命周期
  • Jenkins File 可以放到项目代码中版本管理

img

一个Jenkins file 维护一个生命周期,就像写代码一样,只维护这个file文件就可以了。

img

img

img

小结:

Jenkins与kubernetes搭建CI/CD流水线有诸多好处:

  • Jenkins高可用
  • 自动伸缩
  • 环境隔离
  • 易维护

Maven插件:

Maven Integration plugin

Deploy to container Plugin

webhook插件:

gitlab-plugin

gitlab-hook

jenkins 插件安装缓慢问题

vim ~/.jenkins/hudson.model.UpdateCenter.xml
http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.jsonvim ~/.jenkins/updates/default.json
% s/www.google.com/www.baidu.com/g
% s/updates.jenkins.io/download/mirrors.tuna.tsinghua.edu.cn/jenkins/g旧版: http://updates.jenkins-ci.org/download 替换成 https://mirrors.tuna.tsinghua.edu.cn/jenkins 
新版:https://updates.jenkins.io/download 替换成 https://mirrors.tuna.tsinghua.edu.cn/jenkins 修改完以后,重启Jenkins服务再输入密码,继续安装,速度贼快。

代码中版本管理

[外链图片转存中…(img-FD9Gvysk-1716297681339)]

一个Jenkins file 维护一个生命周期,就像写代码一样,只维护这个file文件就可以了。

[外链图片转存中…(img-Y27e0Ib5-1716297681339)]

[外链图片转存中…(img-Aj0FTZuk-1716297681340)]

[外链图片转存中…(img-FvZ5XOk7-1716297681340)]

小结:

Jenkins与kubernetes搭建CI/CD流水线有诸多好处:

  • Jenkins高可用
  • 自动伸缩
  • 环境隔离
  • 易维护

Maven插件:

Maven Integration plugin

Deploy to container Plugin

webhook插件:

gitlab-plugin

gitlab-hook

jenkins 插件安装缓慢问题

vim ~/.jenkins/hudson.model.UpdateCenter.xml
http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.jsonvim ~/.jenkins/updates/default.json
% s/www.google.com/www.baidu.com/g
% s/updates.jenkins.io/download/mirrors.tuna.tsinghua.edu.cn/jenkins/g旧版: http://updates.jenkins-ci.org/download 替换成 https://mirrors.tuna.tsinghua.edu.cn/jenkins 
新版:https://updates.jenkins.io/download 替换成 https://mirrors.tuna.tsinghua.edu.cn/jenkins 修改完以后,重启Jenkins服务再输入密码,继续安装,速度贼快。

总结笔记

http下载gitee直接下载

ssh的话需要在个人设置里面添加要拉去代码的服务器的公钥才可以

上传的话就要登录才可以

image-20240515091905876

有新的项目之后,分支

image-20240515095945452

添加课件 1.7.1

gitlab 配置:两核四G

xiaowang 前端

xiaoli 后端

牛马 管理

xiaohei 维护

jenkins安装及插件

配置从节点的时候,高级里面的java路径不需要输入

image-20240519124608731

邮件发送失败? 在全局里面少了个点

https://gitee.com/hyunze/easy-springmvc-maven gitee的项目克隆

gitlab root Qq111111

jenkins admin 123456

gitee私人令牌:55ef1dd1aa15751956581e184907c995

自己下载的gitee的项目上传到gitlab之后需要更改pom文件的java版本号

当我修改了gitlab里面的java文件,文件名直接改了,我都不知道发生了什么,然后我去jenkins的服务器里面找到那个文件并改了名字才好了/root/.jenkins/workspace/maven-test1/src/main/java/spring/demo/service/D…

参数化构建

模版1 3 4 jenkins gitlab tomcat-java 没做完 先快照 2是node01

相关文章:

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑:**在发布的过程中不影响用户的使用,系统不会因发布而暂停对外服务,不会造成用户短暂性无法访问; **什么叫灰度:**发布后让部分用户使用新版本,其它用户使用旧版本&am…...

Android源码阅读笔记(二)—— 启动模式

Android源码阅读笔记(二)—— 启动模式初章 1、为什么学习启动模式 Activity的启动模式其实是一个在面试中经常会被关注的问题,那么它的重要性体现在哪里? A:在多数的开发场景中,我们似乎也没有怎么关注过…...

AndroidCompose Navigation导航精通2-过渡动画与路由切换

目录 前言路由切换NavControllerBackStackEntry过渡动画过渡原理缩放动画渐隐动画滑动动画动画过渡实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更…...

PCL ——LevenbergMarquardt非线性最小二乘法拟合圆柱(C++详细过程版)

目录 一、算法概述1、圆柱方程2、LM算法流程二、代码实现三、结果展示一、算法概述 目前求解非线性最小二乘问题常用算法有高斯-牛顿方法(Gauss-Newton algorithm,GN 算法)、列文伯格-马夸尔特方法(Levenberg-Marquardt algorithm,LM 算法)。本文采用 LM 算法进行圆柱拟合。 …...

GD32的GD库开发

所有的Cortex-M处理器都有相同的SysTick定时器,因为CMSIS-Core头文件中定义了一个名为SysTick的结构体。 这个定时器可以用作延时函数,不管是STM32的芯片还是GD32,AT32的芯片,delay函数都可以这么写,只要它是cortex-M…...

DeepSeek R1:推理模型新纪元与价格战

标题:DeepSeek R1:推理模型新纪元与价格战 文章信息摘要: DeepSeek R1的发布标志着推理模型研究的重要转折点,其采用四阶段强化学习训练方法,结合监督微调和拒绝采样,显著提升了模型的推理能力。这一进展不…...

一文简单回顾Java中的String、StringBuilder、StringBuffer

简单说下String、StringBuilder、StringBuffer的区别 String、StringBuffer、StringBuilder在Java中都是用于处理字符串的,它们之间的区别是String是不可变的,平常开发用的最多,当遇到大量字符串连接的时候,就用StringBuilder&am…...

机器学习:支持向量机

支持向量机(Support Vector Machine)是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的广义线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。 假设两类数据可以被 H x : w T x…...

简单的停车场管理系统的C语言实现示例

以下是一个简单的停车场管理系统的C语言实现示例。该示例使用结构体来管理停车场的车位信息&#xff0c;并提供基本车辆进入、离开以及显示停车场状态功能。 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_SLOTS 10 // 最大车位数…...

网络工程师 (3)指令系统基础

一、寻址方式 &#xff08;一&#xff09;指令寻址 顺序寻址&#xff1a;通过程序计数器&#xff08;PC&#xff09;加1&#xff0c;自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址&#xff1a;通过转移类指令直接或间接给出下一条指令的地址。跳…...

基于Python的智慧物业管理系统

【Python】基于Python的智慧物业管理系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目背景二、研究目的三、项目意义四、项目功能五、项目创新点六、开发技术介绍七、项目界面展示&#xff08;部分展示&#xff0c;详细看视频&#xff09;八、项…...

使用 Vue 3 的 watchEffect 和 watch 进行响应式监视

Vue 3 的 Composition API 引入了 <script setup> 语法&#xff0c;这是一种更简洁、更直观的方式来编写组件逻辑。结合 watchEffect 和 watch&#xff0c;我们可以轻松地监视响应式数据的变化。本文将介绍如何使用 <script setup> 语法结合 watchEffect 和 watch&…...

环境变量

目录 一.概念介绍 1.1命令行参数 二.一个例子&#xff0c;一个环境变量 2.1查看环境变量 2.2如何理解环境变量呢&#xff1f;存储的角度 2.3环境变量最开始从哪里来的呢&#xff1f; 概括&#xff1a; 1. 环境变量的存储 2. 命令查找过程 3. 环境变量表和命令行参数…...

Scale AI 创始人兼 CEO采访

Scale AI 创始人兼 CEO 亚历山大王&#xff08;Alexander Wang&#xff09;首次亮相节目接受采访。他的公司专注于为人工智能工具提供准确标注的数据。早在 2022 年&#xff0c;王成为世界上最年轻的白手起家亿万富翁。 美国在全球人工智能竞赛中的地位&#xff0c;以及它与中…...

MongoDB中常用的几种高可用技术方案及优缺点

MongoDB 的高可用性方案主要依赖于其内置的 副本集 (Replica Set) 和 Sharding 机制。下面是一些常见的高可用性技术方案&#xff1a; 1. 副本集 (Replica Set) 副本集是 MongoDB 提供的主要高可用性解决方案&#xff0c;确保数据在多个节点之间的冗余存储和自动故障恢复。副…...

【Erdas实验教程】001:Erdas2022下载及安装教程

文章目录 一、Erdas2022安装教程1. 安装主程序2. 拷贝补丁3. 安装LicenseServer4. 运行软件 二、Erdas2022下载地址 一、Erdas2022安装教程 Erdas2022全新界面如下&#xff1a; 1. 安装主程序 下载安装包并解压&#xff0c;以管理员身份运行 “setup.exe” 或 “setup.vbs”&…...

Python3 【函数】水平考试:精选试题和答案

Python3 【函数】水平考试&#xff1a;精选试题和答案 Python 函数考试试卷及答案。共计30题&#xff0c;其中选择题15题、填空题10题、编程题5题&#xff0c;试卷满分为100分。 一、选择题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 以下哪个关键字用于定义函数…...

stm8s单片机(三)时钟系统与时钟切换

一个单片机系统要正常运行应包括四个部分: 电源&#xff0c;晶振&#xff0c;复位电路&#xff0c;下载电路。 晶振就是时钟。 stm8有四种时钟源 HSE (High Speed External clock signal)HSE user-ext (High Speed External clock signal user external)HSI (High Speed Inter…...

ChatGPT高效处理图片技巧使用详解

ChatGPT&#xff0c;作为OpenAI开发的预训练语言模型&#xff0c;主要用于生成自然语言文本的任务。然而&#xff0c;通过一些技巧和策略&#xff0c;我们可以将ChatGPT与图像处理模型结合&#xff0c;实现一定程度上的图像优化和处理。本文将详细介绍如何使用ChatGPT高效处理图…...

图漾Halcon版本SDK使用教程【V1.1.0新版本】

文章目录 1.下载并安装 Halcon1.1 下载Halcon软件1.2 安装Halcon 2.下载Camport_Halcon_gentl SDK2.1 下载Camport_Halcon_gentl SDK2.2 Camport Halcon SDK介绍2.3 Halcon SDK环境配置与运行2.3.1 SDK环境配置2.3.2 获取相机支持的参数2.3.3 配置相机参数并运行相机 2.4 遍历H…...

C语言二级

//请编写函数fun()&#xff0c;该函数的功能是&#xff1a;计算并输出给定整数n的所有因 //子&#xff08;不包括1和自身&#xff09;之和。规定n的值不大于1000。例如&#xff0c;在主函数 //中从键盘给n输入的值为856&#xff0c;则输出为&#xff1a;sum 763。 //注意&…...

软工_软件工程

2025.01.24&#xff1a;软件工程导论学习笔记 第2节 软件工程 2.1 软件发展 - 四个阶段2.1.1 程序设计2.1.2 程序系统2.1.3 软件工程2.1.4 第四阶段 2.2 软件危机2.2.1 软件危机 - 定义2.2.2 软件危机 - 主要表现 2.1 软件发展 - 四个阶段 2.1.1 程序设计 软件生产个体化&…...

【creo】CREO配置快捷键方式和默认单位

了解CREO工作目录设置 设置快捷方式启动目录&#xff0c;就能自动加载其中的配置。 一、通过键盘快捷方式 保存配置 creo_parametric_customization.ui 文件&#xff1a; 二、通过映射键录制 通过这种方式可以监听鼠标的点击事件。使用键盘快捷方式无法找到需要的动作时候可…...

go理论知识——Go Channel 笔记 [特殊字符]

go理论知识——Go Channel 笔记 &#x1f4dd; 1. 基本概念 &#x1f9e0; 1.1 Channel 是什么&#xff1f; Channel 是 Go 语言中用于在不同 Goroutine 之间进行通信的机制。Channel 是类型安全的&#xff0c;意味着你只能发送和接收特定类型的数据。 1.2 Channel 的创建 …...

微信小程序压缩图片

由于wx.compressImage(Object object) iOS 仅支持压缩 JPG 格式图片。所以我们需要做一下特殊的处理&#xff1a; 1.获取文件&#xff0c;判断文件是否大于设定的大小 2.如果大于则使用canvas进行绘制&#xff0c;并生成新的图片路径 3.上传图片 async chooseImage() {let …...

第05章 11 动量剖面可视化代码一则

在计算流体力学&#xff08;CFD&#xff09;中&#xff0c;动量剖面&#xff08;Momentum Profiles&#xff09;通常用于描述流体在流动方向上的动量分布。在 VTK 中&#xff0c;可以通过读取速度场数据&#xff0c;并计算和展示动量剖面来可视化呈现速度场信息。 示例代码 以…...

Android Studio 新版本24.2.2 运行后自动切到 LogCat

最近更新了 Android studio 版本&#xff0c;发现有个问题&#xff1a; 每次 Run app 之后。都会自动切换到 run 标签。这让我非常不习惯。我个人习惯在app 运行后查看Logcat 最后靠 deepSeek 找到一种解决方案&#xff1a; Android Studio 中截图如下&#xff1a;...

使用EVE-NG-锐捷实现OSPF

一、OSPF基础知识 Open shortest Path First(OSPF)开放式最短路径优先协议 1.OSPF的关系状态 (1)邻居关系(TWO-WAY) 只发送hello包不发送LSA包(链路状态通告包) (2)邻接关系(FULL) OSPF设备与设备之间相互建立OSPF关系&#xff0c;初始为邻居关系(TWO-WAY)状态&#xff0…...

解决使用Selenium时ChromeDriver版本不匹配问题

在学习Python爬虫过程中如果使用Selenium的时候遇到报错如下session not created: This version of ChromeDriver only supports Chrome version 99… 这说明当前你的chrome驱动版本和浏览器版本不匹配。 例如 SessionNotCreatedException: Message: session not created: This…...

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日&#xff0c;中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;数据委员会数据标注分委会&#xff08;以下简称“分委会”&#xff09;正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…...

IoTDB结合Mybatis使用示例(增删查改自定义sql等)

IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库&#xff0c;针对IoTDB的内容不做过多介绍&#xff0c;在使用该时序库时&#xff0c;往往有一定入门门槛&#xff0c;不同于关系型数据库或文档型数据库那般方便维护和接入开发&#xff0c;…...

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>解数独

题目&#xff1a; 解析&#xff1a; 部分决策树&#xff1a; 代码设计&剪枝&回溯&#xff1a; 代码&#xff1a; class Solution {private boolean[][] row, col;private boolean[][][] gird; public void solveSudoku(char[][] board) {//下标->数字&#xff…...

C#@符号在string.Format方法中作用

本文详解@符号在string.Format方法中作用。...

mysql 学习2 MYSQL数据模型,mysql内部可以创建多个数据库,一个数据库中有多个表;表是真正放数据的地方,关系型数据库 。

在第一章中安装 &#xff0c;启动mysql80 服务后&#xff0c;连接上了mysql&#xff0c;那么就要 使用 SQL语句来 操作mysql数据库了。那么在学习 SQL语言操作 mysql 数据库 之前&#xff0c;要对于 mysql数据模型有一个了解。 MYSQL数据模型 在下图中 客户端 将 SQL语言&…...

JVM栈溢出线上环境排查

#查看当前Linux系统进程ID、线程ID、CPU占用率&#xff08;-eo后面跟想要展示的列&#xff09; ps H -eo pid,tid,%cpups H -eo pid,tid,%cpu |grep tid #使用java jstack 查看进程id下所有线程id的情况 jstack pid 案例2 通过jstack 排查死锁问题 #启动java代码 jstack 进…...

【vue3组件】【大文件上传】【断点续传】支持文件分块上传,能够在上传过程中暂停、继续上传的组件

一、概述 本示例实现了一个基于 Vue3 和 TypeScript 的断点上传功能。该功能支持文件分块上传&#xff0c;能够在上传过程中暂停、继续上传&#xff0c;并且支持检测已经上传的分块&#xff0c;避免重复上传&#xff0c;提升上传效率。以下是关键的技术点与实现流程&#xff1…...

Kafka运维宝典 (三)- Kafka 最大连接数超出限制问题、连接超时问题、消费者消费时间超过限制问题详细介绍

Kafka运维宝典 &#xff08;三&#xff09; 文章目录 Kafka运维宝典 &#xff08;三&#xff09;一、Kafka Broker 配置中的最大连接数超出限制问题1. 错误原因2. 相关 Kafka 配置参数2.1 connections.max2.2 max.connections.per.ip2.3 num.network.threads2.4 connections.ma…...

【135. 分发糖果 困难】

题目&#xff1a; n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计…...

AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs

论文标题 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning 跨同构异构图的小样本提示学习 论文链接 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning论文下载 论文作者 Xingtong Yu, Yuan…...

算法题(49):反转链表II

审题&#xff1a; 需要我们对指定范围的链表进行反转&#xff0c;并返回反转后链表的头结点 思路&#xff1a; 方法一&#xff1a;vector法 我们先遍历一次链表&#xff0c;并把数据对应的存在数组中&#xff0c;然后利用数组的reverse方法进行反转数据&#xff0c;最后再遍历一…...

代码随想录day20

235. 利用二叉搜索树的特性即可 /** lc appleetcode.cn id235 langcpp** [235] 二叉搜索树的最近公共祖先*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) :…...

文档智能扫描,提升无纸化办公效率

随着无纸化办公的推广和移动设备的普及&#xff0c;用户迫切需要将纸质文档快速、准确地转换成电子格式&#xff0c;以提高工作效率和信息管理的便捷性。同时&#xff0c;用户将文档扫描成电子版后&#xff0c;可以自行通过加密和访问控制提高电子文档的安全性&#xff0c;以满…...

差分等长的原理

差分等长是指在设计差分信号传输线路时&#xff0c;保证两条差分线的长度尽量一致&#xff0c;长度之差在一个合理的范围内。这是为了确保两个差分信号时刻保持相反极性&#xff0c;减少共模分量&#xff0c;从而提高信号传输的质量。 在差分信号传输中&#xff0c;两条差分线…...

“““【运用 R 语言里的“predict”函数针对 Cox 模型展开新数据的预测以及推理。】“““

主题与背景 本文主要介绍了如何在R语言中使用predict函数对已拟合的Cox比例风险模型进行新数据的预测和推理。Cox模型是一种常用的生存分析方法&#xff0c;用于评估多个因素对事件发生时间的影响。文章通过具体的代码示例展示了如何使用predict函数的不同参数来获取生存概率和…...

真正理解std::move

std::move的作用只有一个&#xff0c;那就是把一个左值强制转换为右值&#xff0c;有了这个右值&#xff0c;右值允许的任何操作就可以实施了。比如&#xff1a;1. 这个右值可以赋给一个左值变量&#xff0c;2. 这个右值可以被一个右值引用来引用。 class A {public:A(int n):…...

Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )

本章主要是关于整体页面布局及样式处理&#xff0c;在进行这一章代码前&#xff0c;先将前两章中的示例代码部分删除&#xff08;如Home.vue、About.vue、counter.ts、App.vue中引用等&#xff09; 1 整体页面布局 页面整体布局构成了产品的框架基础&#xff0c;通常涵盖主导…...

Python3 【函数】项目实战:5 个新颖的学习案例

Python3 【函数】项目实战&#xff1a;5 个新颖的学习案例 本文包含5编程学习案例&#xff0c;具体项目如下&#xff1a; 简易聊天机器人待办事项提醒器密码生成器简易文本分析工具简易文件加密解密工具 项目 1&#xff1a;简易聊天机器人 功能描述&#xff1a; 实现一个简易…...

17.Word:李楠-学术期刊❗【29】

目录 题目​ NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片&#xff0c;对应位置填入对应文字 (手动调整即可&#xff09;复制样式&#xff1a;开始→样式对话框→管理…...

基于GS(Gaussian Splatting)的机器人Sim2Real2Sim仿真平台

项目地址&#xff1a;RoboGSim 背景简介 已有的数据采集方法中&#xff0c;遥操作&#xff08;下左&#xff09;是数据质量高&#xff0c;但采集成本高、效率低下&#xff1b;传统仿真流程成本低&#xff08;下右&#xff09;&#xff0c;但真实度&#xff08;如纹理、物理&…...

基于Django的豆瓣影视剧推荐系统的设计与实现

【Django】基于Django的豆瓣影视剧推荐系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用了Python作为后端开发语言&#xff0c;采用Django作为后端架构&#xff0c;结…...