Gitlab+Jenkins自动化部署,解放双手

项目打包

​ 在部署项目前需要对源码进行打包,一个简单的SpringBoot项目默认是打包为jar包,也就是在pom.xml中的<packaging>jar</packaging>方式,当然也会有一些打包成war包方式,使用外置的Tomcat应用服务器部署war包,那么就是<packaging>war</packaging>

在父子类聚合项目中,父工程的pom.xml文件中的打包方式就需要改为pom,如下:

<packaging>pom</packaging>

那么所有的子工程pom.xml中,就需要改为jar方式,或者war

jar包是默认的打包方式,子工程如果是打包成jar包那么不需要改任何配置,war包时如下配置

<packaging>war</packaging>

并且所有的子工程中需要,导入maven插件配置

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable><layout>JAR</layout></configuration><executions><execution><goals><goal>repackage</goal></goals><configuration><attach>false</attach></configuration></execution></executions></plugin></plugins>
</build>

执行打包

在具有maven环境的情况下,到父工程pom.xml文件所在目录下执行

mvn clean package

即可将此父工程下所有子工程进行打包,假如这里得到了三个jar包为consumer.jarprovider1.jarprovider2.jar

那么就可以手动执行部署了。

命令行部署

使用命令行方式去部署3个jar包,可以说非常简单,但还要考虑项目中需要的一些环境:

  • 服务器需要由java的jdk环境,能使用java命令
  • 假如项目中用到了nacos,那么还需要做好nacos环境的配置及服务的启动
nohup java -jar consumer.jar > consumer.logs.log 2 >&1 &
nohup java -jar provider1.jar > provider1.logs.log 2 >&1 &
nohup java -jar provider2.jar > provider2.logs.log 2 >&1 &

nohup:不挂断运行

> xxx.logs.log 2 > &1 &:将程序日志输出到某个位置并且后台运行。

那么这些都是手动运行,目前而言大多都采用了自动化部署。

Jenkins

手动运行需要每次都去上传jar包,然后更新jar重启服务。若服务数量较少还比较好,一旦遇到微服务多jar包情况下,手动就会显得很繁琐而无助。或者说可以采用shell脚本的方式去部署,但这都不是最优秀的解决方案。可以使用Jenkins部署运行服务。

介绍

Jenkins的前身是Hudson。Jenkins是一款较为流行的开源持续集成工具,地位几乎可以说是CI&CD软件领导者,已经超过了Hudson,它拥有超过1000个插件来支持项目的构建和部署。几乎可以适用于所有的项目,没有项目编程语言的限制。

CI&CD:

  • 持续集成(Continuous Integration,CI):指的是团队成员每天一次或多次把代码集成到主干。每次集成会自动构建,尽快尽早发现错误。持续集成是为了让产品快速迭代,同时保证高质量。
  • 持续交付(Continuous Delivery):指的是持续将新的功能部署到类生产环境(可理解为测试环境qa、uat),交给质量团队或用户,交给它们评审
  • 持续部署(Continuous Deployment):指的是通过评审后,自动部署到生产环境中

Jenkins的特性:

  • 系统平台无关性:Jenkins本身是由Java语言编写,理论上只要由java的运行环境,就能使用Jenkins
  • 编程语言无关性:支持多种编程语言的项目持续集成、持续部署,而非只有java一种
  • 安装和配置简单:可以通过yum安装或war包、Docker方式等,由简洁易用的web界面完成配置
  • 插件丰富:拥有超过1000个插件,几乎可以满足任何项目的需要
  • 容易扩展:Jenkins可以通过其插件架构进行扩展,为用户提供无限可能
  • 分布式构建:Jenkins能使多台服务器一起构建
  • 消息通知:构建完成后发送email通知结果

下载和安装

Jenkins的官网地址是https://www.jenkins.io/,下载软件包的地址https://www.jenkins.io/download/。推荐下载LTS(长期支持)版本。笔者这里选择Generic Java package(.war),只需要java环境即可。

当然要注意你选择版本要和你本地的jdk环境的兼容关系:

在这里插入图片描述

笔者是java8的环境,选择一款适用的jenkins版本即可。笔者选择2.346.3版本。

提供下下载地址:https://get.jenkins.io/war-stable/2.346.3/jenkins.war

运行

  • war包下载完毕后,不需要额外的步骤(前提是有java环境),是可以直接运行的
java -jar jenkins.war --httpPort=8085
  • –httpPort是设置程序端口号,若要使程序不挂断后台运行,可以这样执行
nohup java -jar jenkins.war --httpPort=8085 > jenkins-logs.log 2 >&1 &

服务运行后,成功访问UI页面,记得需要打开防火墙的端口哦

firewall-cmd --permanent --zone=public --add-port=8085/tcp
firewall-cmd --reload
  • 打开jenkins的UI地址(笔者这里是http://192.168.1.41:8085)

在这里插入图片描述

我们需要去上面的相应文件中去找到密码,然后填写,确定即可。

注意:第一次启动Jenkins会初始化去下载一些元(metadata)数据,打开界面时提示等待大概4分钟,等待期间,使用F12调试时,看到报错503是正常现象。等待日志打印Jenkins is fully up adn running 即可

  • 下一步会让用户安装插件,若是新手可以选择Jenkins推荐的插件,可以减少很多的步骤。笔者这里也选择推荐的插件了,唯一的缺点是下载的东西多,稍微会慢点。

  • 完成后创建一个管理员用户

在这里插入图片描述

Jenkins配置

Jenkins初始化完成后,还需要配置一些全局工具,如jdk,maven,git。在Jenkins后台页面点击Manage Jenkins,再点击Global Tool Configuration配置全局工具JDK、maven、git

配置maven

在这里插入图片描述

找好你的settings.xml文件的路径,配置到这里即可。然后再去配置maven的路径

在这里插入图片描述

注意:如果你的maven的bin目录没有可执行的权限,要记得增加可执行权限,否则执行命令时会报错:Permission denied,可以在maven的根目录下使用命令赋权:chmod +x -R bin

配置jdk

直接输入JAVA_HOME的安装地址即可

在这里插入图片描述

最后配置git的目录,记得先安装git

yum install -y git

使用yum安装的git,目录是/usr/bin/git

在这里插入图片描述

GitLab简介&安装

持续集成一般有3个组成的要素:

  • 一个自动构建的过程,代码检出、编译构建等过程都是自动完成,无需人工
  • 一个代码存储库(SVN或git)
  • 一个持续集成服务器(如Jenkins)

现在还缺少一个代码存储库。在企业中为了掌握代码的所有权,一般都会自动搭建代码存储库。可以使用Gitlab。

GitLab使用git作为代码管理工具,并且在此基础上开发了Web管理页面来进行项目管理。

与github最大的不同是,gitlab部署在自己的服务器上,所有权都是掌握在自己手中。

采用yum方式安装GitLab

  • 安装需要的依赖和设置ssh开机自启动,开启ssh及配置防火墙
yum install -y curl policycoreutils-python openssh-server
systemctl enable sshd
systemctl start sshd
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
systemctl reload firewalld
  • 安装Postfix并设置开机自启动、开启Postfix,便于邮件通知
yum install -y postfix
systemctl enable postfix
systemctl start postfix
  • 添加Gitlab软件包存储库并安装软件包
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | bash
  • 配置Gitlab访问地址并安装Gitlab(http://192.168.1.41是gitlab访问地址)
EXTERNAL_URL="http://192.168.1.41" yum install -y gitlab-ee
  • 打开防火墙端口(或关闭防火墙)
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload
  • 完成后,打开http://192.168.1.41,第一次进入时需要去/etc/gitlab/initial_root_password找下初始化密码,然后登录即可

在这里插入图片描述

Docker方式安装Gitlab

使用Docker方式安装Gitlab是比较快捷的方式,如下命令即可:

mkdir -p /data/gitlab # 先创建gitlab存储数据、配置、日志的目录docker run -d --hostname 192.168.1.41:80 --publish 443:443 --publish 80:80 --publish 23:22 --name gitlab --restart always --volume /data/gitlab/config:/etc/gitlab --volume /data/gitlab/logs:/var/log/gitlab --volume /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ee:latest

-d : 后台运行

–hostname:gitlab服务地址

–publish或-p:宿主机和容器的端口映射

–name 设置容器名称

–volume或-v:宿主机和容器的目录映射

–restart always: 开机自启

Gitlab常用命令

  • gitlab-ctl start:启动
  • gitlab-ctl stop:停止
  • gitlab-ctl status:查看
  • gitlab-ctl restart:重启

Jenkins+Gitlab部署运行

现在已经有了存储库,然后创建git仓库把项目上传到Gitlab上面。

git init 
git remote add origin http://192.168.1.41/root/jenkins-demo.git
git add .
git commit -m "Initial commit"
git push -u origin main

这些就比较简单了,笔者这里不再赘述了。直接展示下项目的目录

在这里插入图片描述

需要注意的是:如果普通用户push代码,可能会没有权限,管理员设置下即可。

Jenkins页面创建任务

  • 在Jenkins页面点击新建项目(New Item),输入项目名称(名称随便取,别重复)。选择自由风格项目。

在这里插入图片描述

  • 在General一栏输入描述,可以任意填写,重要的是源代码管理,仓库地址就填写gitlab的项目地址,然后添加你的gitlab账号的凭证(账号密码)。
  • 完成后,下面有一个分支选择,选择你要部署的分支即可。

在这里插入图片描述

  • 来到构建这一栏,点击添加构建步骤,选择Invoke toplevel maven targets(调用顶层 Maven 目标)项,maven版本选择配置好的,目标Goals填写clean package

在这里插入图片描述

这里的maven命令不需要添加mvn,请注意!!

  • 打包完成后,就可以运行jar包了,再增加一个构建步骤,选择Excecute shell,执行shell命令,在Command输入以下命令,考虑到可能出现第二次部署时,需要把上一次的jar停止,那么命令如下
#!/bin/bash
# 先停止进程
ps -ef |grep consumer |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
ps -ef |grep provider-8001 |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
ps -ef |grep provider-8002 |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
sleep 5s	# 5s后再启动
BUILD_ID=dontKillMe	# 表示别干掉启动的程序
cd consumer/target/
nohup java -jar consumer-1.0-SNAPSHOT.jar > consumer.logs.log 2 >&1 &
cd ../../provider-8001/target/
nohup java -jar provider-8001-1.0-SNAPSHOT.jar > provider1.logs.log 2 >&1 &
cd ../../provider-8002/target/
nohup java -jar provider-8002-1.0-SNAPSHOT.jar > provider2.logs.log 2 >&1 &

完事后,保存即可。

在这里插入图片描述

  • 点击立即构建,即可

在这里插入图片描述

同时还可以去看日志信息:

在这里插入图片描述

我们可以到服务器上看下程序有没有启动成功

ps -ef |grep java

在这里插入图片描述

成功部署了三个jar包。

Webhook网络钩子

当我们需要每次提交合并代码时,自动进行项目部署时,可以使用网络钩子Webhook完成我们的需求。

大致流程就是:Jenkins提供一个地址,当代码有更新时代码存储库(gitlab)主动调用一次这个地址,触发Jenkins构建即可。

需要在Jenkins上面安装Generic Webhook Trigger插件

在这里插入图片描述

到项目主界面,点击配置,到构建触发器那里,选择Generic Webhook Trigger一项,然后添加一个Token(随便写,但不要重复了)

在这里插入图片描述

那么,构建的URL格式如下:

http://JENKINS_URL/generic-webhook-trigger/invoke/invoke?token=刚刚自定义的Token

JENKINS_URL:是JENKINS的访问地址。

此项目中就是如下

http://192.168.1.41:8085/generic-webhook-trigger/invoke/invoke?token=nihaowoshichufaqi

回到gitlab

因为Gitlab10.6版本后,为了安全,默认不允许向本地网络发送Webhook请求,这里因为笔者是把gitlab和jenkins安装到一台服务器了,所以这里先允许发送本地网络webhook。

在这里插入图片描述

到gitlab项目中,设置webhook即可。这里暂时写所有分支push时触发了,实际可以按照项目情况执行。

在这里插入图片描述

配置完成

完成后,即可提交任意分支的代码,看到jenkins已经自动触发构建了,并且jar也重新启动了

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【Redis】基础数据结构-quicklist

Redis List 在Redis3.2版之前&#xff0c;Redis使用压缩列表和双向链表作为List的底层实现。当元素个数比较少并且元素长度比较小时&#xff0c;Redis使用压缩列表实现&#xff0c;否则Redis使用双向链表实现。 ziplist存在问题 不能保存过多的元素&#xff0c;否则查找复杂度…

ArcGIS Engine:报错无法嵌入互操作类型“ESRI.ArcGIS.Geometry.EnvelopeClass”。请改用适用的接口。

此错误是由于尝试直接实例化ArcGIS COM组件的某些互操作类引起的。这在.NET Framework 4及更高版本中是不被推荐的。 为了解决此问题&#xff0c;你需要确保在工程的引用中将ArcGIS的互操作类型设置为“不嵌入”。 按照以下步骤操作&#xff1a; 在解决方案资源管理器中找到…

Python实现JavaScript中AES加密有关填充问题

1. 先展示一下JS端的格式&#xff08;没找到没混淆的。。。&#xff0c;将就看吧&#xff09; 2. 在python加密中是没有选择填充模式的&#xff0c;需要自己来填充 3. 对加密不懂的朋友可能跟我一样刚开始很懵逼&#xff0c;因为遇到的基本都是pksc7填充模式&#xff0c;但是网…

独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”

各位CSDN的uu们你们好呀&#xff0c;今天依旧是小雅兰的51单片机的内容&#xff0c;内容主要是&#xff1a;独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位&#xff0c;下面&#xff0c;让我们进入51单片机的世界吧&#xff01;&a…

大数据技术标准推进委员会发布《地球大数据白皮书(2023年)》

导读 地球大数据的应用领域范围广阔&#xff0c;包括生态保护、自然资源管理、气象服务、城市规划、应急容灾等方面&#xff0c;但目前仍处于发展初期&#xff0c;面临着数据来源、结构多样&#xff0c;数据管理门槛高&#xff0c;数据应用场景复杂、落地方法论较少等痛点。如…

使用postman 调用 Webservice 接口

1. 先在浏览器地址栏 访问你的webService地址 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv?wsdl 2. post man POST 访问wwebService接口 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv <soapenv:Envelope xmlns:soapenv…

PCB放置过孔技巧

合理的放置过孔能有效的节约面积。 我们根据嘉立创的pcb工艺能力中写出单双面板最小过孔为0.3mm(内径)/0.5mm(外径) 设置过孔尺寸外直径为24mil&#xff08;0.61mm&#xff09;&#xff09;内直径为12mil&#xff08;0.305mm&#xff09; 嘉立创PCB工艺加工能力范围说明-嘉立…

Java常见设计模式

单例模式&#xff1a;程序自始至终只创建一个对象。 应用场景&#xff1a;1.整个程序运行中只允许一个类的实例时 2.需要频繁实例化然后销毁的对象 3.创建对象时耗时过多但又经常用到的对象 4.方便资源相互通信的环境 懒汉式线程不安全问题解决方案&#xff1a; 双重检查加锁机…

Spring AOP 中被代理的对象一定是单例吗?

今天我们来思考这样一个问题&#xff1a;在 Spring AOP 中&#xff0c;被代理的对象是单例的吗&#xff1f;当我们每次获取到代理对象的时候&#xff0c;都会重新获取一个新的被代理对象吗&#xff1f;还是被代理的对象始终是同一个&#xff1f; 为什么要思考这个问题&#xf…

1200*C. Challenging Cliffs(模拟构造贪心)

Problem - 1537C - Codeforces Challenging Cliffs - 洛谷 解析&#xff1a; 排序数组&#xff0c;然后找出间隔最短的两个相邻的数 a&#xff0c;b&#xff0c;c&#xff0c;d&#xff0c;e&#xff0c;f &#xff08;假设b&#xff0c;c为差最小的两个数&#xff09;。 然后…

BUGKU-simple_SSTI_1漏洞注入

SSTI漏洞注入 SSTI全称Server side template injection.服务端模板注入这节课主要讲flask的模板注入.flask会把类似于 的变量当做参数来渲染并填充到web页面,如果该参数可控并被后台解析则有可能被注入恶意代码导致注入漏洞请注意 模板注入只会存在于二次渲染中,无二次渲染不会…

FPGA 芯片点亮标准?

芯片设计完成&#xff0c;给到工厂制造&#xff0c;封装后回来&#xff0c;要经过最重要的一个点亮的环节&#xff0c;你知道什么叫做点亮吗&#xff1f; 其实&#xff0c;什么样叫做点亮&#xff0c;每家公司有每家的标准&#xff0c;本着自已不为难自已的原则&#xff0c;一…

详解TCP三次握手(建立连接)和四次握手(释放连接)

TCP是是一个面向连接的协议&#xff0c;无论哪一方发送数据之前&#xff0c;都必须在双方之间建立一条连接。 一、建立连接 建立TCP连接时&#xff0c;要经历这样的流程&#xff1a; ① 请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口&#xff0c;以及初始…

《软件方法(下)》第8章2023版连载(05)关于实体类

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.2 建模步骤C-1 识别类和属性 8.2.2 三种分析类 8.2.2.2 关于边界类 边界类的责任是接受输入、提供输出以及做简单的过滤。 图8-20中提到边界类的映射方法——每个有接口的外系统…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验

课程1_第1周_测验题 目录&#xff1a;目录 第一题 1.“人工智能是新电力” 这个比喻指的是什么&#xff1f; A. 【  】人工智能为我们的家庭和办公室的个人设备供电&#xff0c;类似于电力。 B. 【  】通过“智能电网”&#xff0c;人工智能正在传递新一波的电力。 C. …

报考浙江工商大学2024年工商管理硕士(MBA)联考指南

1. 预报名时间&#xff1a;2023年9月24日-27日每天09&#xff1a;00-22&#xff1a;00 2. 正式报名时间&#xff1a;2023年10月8日-25日每天09&#xff1a;00-22&#xff1a;00 3. 浙江省网上确认&#xff08;现场确认&#xff09;时间&#xff1a;2023年10月31日-11月4日17&…

cvpr24写作模板pdfLaTex编译器注意点小结

文章目录 1 更改作者显示 Anonymous CVPR submission2 \label标签3 换行符// 与换列符&4 \medskip5 首行缩进6 插入图片6.1 单幅图片6.2 并排显示\hfill Reference https://cvpr.thecvf.com/Conferences/2024 1 更改作者显示 Anonymous CVPR submission 这一行开头加上% …

超全整理,Jmeter接口性能测试-Beanshell调用jar包加密(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、添加beanshell…

【2023集创赛】平头哥杯一等奖作品:基于无剑100开源SoC平台构建双核TEE安全系统

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;平头哥杯一等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电子礼品…

辅助寄存器是干什么用的

目录 请问CPU 的 MREQ 引脚和 IORQ 引脚分别是干什么用的 那这里的引脚是什么含义呢&#xff1f; 程序是指令和数据的集合 辅助寄存器是干什么用的 寄存器的用途取决于它的类型 PC 寄存器也叫作“程序指针”&#xff0c;存储着指向 CPU 接下来 要执行的指令的地址。PC 寄存…