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

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也重新启动了

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

相关文章:

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

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

NNDL:作业3

在Softmax回归的风险函数(公式(3.39))中如果加上正则化项会有什么影响? (1) 在 Softmax 回归的风险函数中加入正则化项会对模型的训练产生影响。正则化项的作用是对模型的复杂度进行惩罚&#xff0c;防止过拟合的发生。 (2) 原书公式为&#xff1a; 在加入正则化后损失函数…...

dockers --cap-add 哪些值可以设置

--cap-add 参数可以用于向 Docker 容器添加不同的权限。除了 NET_ADMIN&#xff0c;还有一些其他常用的权限值&#xff0c;包括&#xff1a; SYS_ADMIN&#xff1a;添加系统管理员权限&#xff0c;允许容器内的进程执行系统级别的管理操作&#xff0c;如挂载文件系统、设置时间…...

golang常用库之-HTTP客户端请求库 grequests

文章目录 golang常用库之-HTTP客户端请求库 grequests什么是grequests使用 golang常用库之-HTTP客户端请求库 grequests 什么是grequests 官网&#xff1a;github.com/levigross/grequests A Go “clone” of the great and famous Requests library Go语言的grequests库是一…...

17基于matlab卡尔曼滤波的行人跟踪算法,并给出算法估计误差结果,判断算法的跟踪精确性,程序已调通,可直接运行,基于MATLAB平台,可直接拍下。

17基于matlab卡尔曼滤波的行人跟踪算法&#xff0c;并给出算法估计误差结果&#xff0c;判断算法的跟踪精确性&#xff0c;程序已调通&#xff0c;可直接运行&#xff0c;基于MATLAB平台&#xff0c;可直接拍下。 17matlab卡尔曼滤波行人跟踪 (xiaohongshu.com)...

SpringCloud之Stream框架集成RocketMQ消息中间件

Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于 Spring Boot 来创建独立的、可用于生产的 Spring 应用程序。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现&#xff0c;并引入了发布-订阅、消费组、分区这三…...

与创新者同行!Apache Doris 首届线下峰会即将开启,最新议程公开!|即刻预约

点击此处 即刻报名 Doris Summit Asia 2023 回顾人类的发展史&#xff0c;地球起源于 46 亿年前的原始星云、地球生命最初出现于 35 亿年前的原始海洋、人类物种诞生于数百万年前&#xff0c;而人类生产力的真正提升源于十八世纪六十年代的工业革命&#xff0c;自此以后&#…...

vue解决:Parsing error: No Babel config file detected for ....

报错信息 Parsing error: No Babel config file detected for C:\Users\Admin\Desktop\shabi\work\src\App.vue. Either disable config file checking with requireConfigFile: false, or configure Babel so that it can find the config files. 分析错误&#xff1a;没有检测…...

算法题:K 次取反后最大化的数组和(典型的贪心算法问题)

这道题没有看题解&#xff0c;直接提交&#xff0c;成绩超越99.5%&#xff0c;说明思路是优的。就是考虑的情况里面弯弯绕比较多&#xff0c;需要考虑全面一点。&#xff08;本题完整题目附在了最后面&#xff09; 具体思路如下&#xff1a; 1、首先排序&#xff0c;然后从最…...

Go语言中向[]byte数组中增加一个元素

要向http.Request的body中添加一个键值对&#xff0c;可以先将其转换为一个map&#xff0c;然后对其进行修改&#xff0c;最后再将其转回为byte数组。 以下是一个示例代码&#xff1a; import ("net/http""io/ioutil""encoding/json" )type Re…...

CSS 布局案例: 2行、多行每行格数不定,最后一列对齐

布局期望的效果如下&#xff1a; 第二行最后一格与第一行最后一格对齐。每行格数不定。自动拉伸填充整个宽度 实现&#xff1a; 一开始打算用display:flex&#xff0c; 自动分散&#xff0c;但是第二行对齐第一行最后一格控制不了。 使用grid fr均分单位控制。 <!DOCTYPE…...

数据结构--算法、数据结构的基本概念

&#x1f4d5;参考&#xff1a;王道 一、算法的基本概念 1.程序数据结构算法 2.算法的特性 &#xff08;1&#xff09;有穷性 执行有穷步之后结束&#xff0c;且每一步都可在有穷时间内完成。 &#xff08;2&#xff09;确定性 &#xff08;3&#xff09;可行性 可通过已经实…...

Edge浏览器下载文件被保存为 .crdownload 文件的问题小记

问题 近期使用Edge浏览器下载文件时&#xff0c;文件都被保存为 .crdownload 格式的文件了&#xff0c;不确定从哪个版本开始的。除非下载未完成导致文件不完整&#xff0c;否则不会被保存为 .crdownload 格式的文件&#xff1b;实际上文件已完成了下载&#xff0c;且手工修改…...

6-10 单链表分段逆转 分数 15

void K_Reverse( List L, int K ) { //此题已经默认size > K 因为当size < K时 反转后将不再符合链表的定义//求出表中元素个数int size 0;for (List cur L->Next; cur ! NULL; cur cur->Next)size; List prv, cur, next, first, head L;//共需要反转 si…...

【单片机】17-温度传感器DS18B20

1.DS18B20相关背景知识 1.温度传感器 &#xff08;1&#xff09;测温度的方式&#xff1a;物理&#xff08;汞柱&#xff0c;气压&#xff09;&#xff0c;电子&#xff08;金属电性能随温度变化&#xff09; &#xff08;2&#xff09;早期&#xff1a;热敏电阻&#xff08;模…...

力扣 -- 5. 最长回文子串

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:string longestPalindrome(string s) {int ns.size();vector<vector<bool>> dp(n,vector<bool>(n));//最长回文串的起始位置int start0;//最长回文串的长度int len0;for(int in-1;i>…...

SpringCloud源码探析(十)-Web消息推送

1.概述 消息推送在日常使用中的场景比较多&#xff0c;比如有人点赞了我的博客或者关注了我&#xff0c;这时我就会收到一条推送消息&#xff0c;以此来吸引我点击或者打开应用。消息推送的方式主要分为两种&#xff1a;web消息推送和移动端消息推送。它将所要发送的信息&…...

Vue、React和小程序中的组件通信:父传子和子传父

在前端开发中&#xff0c;组件化是一种常见的开发模式&#xff0c;它可以将复杂的用户界面拆分成多个可重用的组件。在Vue、React和小程序中&#xff0c;组件之间的数据和事件传递是非常关键的&#xff0c;其中父传子和子传父是常见的通信方式。本文将介绍在Vue、React和小程序…...

安卓玩机----展讯芯片机型解锁 读写分区工具 操作步骤解析

国内机型大都使用高通和MTK芯片。展讯芯片使用的较少。相对来说高通和mtk机型解锁以及读取分区工具较多。展讯的几乎没有。目前有大佬开发出了一款展讯芯片解锁 与读写分区工具.开源的tools 官方分享说明&#xff1a; 是一款专为 Windows 计算机设计的免费、用户友好的工具&am…...

微软放大招!Bing支持DALL-E3,免费AI绘画等你来体验!

最近 OpenAI 发布了DALL-E3模型&#xff0c;出图效果和Midjourney不相上下&#xff0c;不过要使用它有些门槛&#xff0c;必须是 ChatGPT Plus 账户&#xff0c;而且还要排队&#xff0c;怎么等都等不到&#xff0c;搞得大家都比较焦虑。 不过现在微软在Bing上也支持 DALL-E3 …...

tp5访问的时候必须加index.php,TP5配置隐藏入口index.php文件

PS&#xff1a;这里说的入口文件指的是public/index.php,配置文件就在这个目录下 可以去掉URL地址里面的入口文件index.php&#xff0c;但是需要额外配置WEB服务器的重写规则。 以Apache为例&#xff0c;需要在入口文件的同级添加.htaccess文件(官方默认自带了该文件)&#x…...

16k面试中的10个问题

你好&#xff0c;我是田哥 节前&#xff0c;有位朋友跟我反馈面试中一些问题&#xff0c;这位朋友的基本情况&#xff1a; 坐标&#xff1a;上海&#xff0c;年限&#xff1a;3年不到&#xff0c;期望薪资&#xff1b;16k 下面我们来看看具体问题&#xff1a; 01&#xff1a;请…...

STM32单片机入门学习(六)-光敏传感器控制LED

光敏传感器模块和LED接线 LED负极接B12,正极接VCC 光敏传感模块一DO端接B13,GND接GND&#xff0c;VCC接VCC,AO不接。 如图&#xff1a; 主程序代码&#xff1a;main.c #include "stm32f10x.h" #include "Delay.h" //delay函数所在头文件 #include …...

MFC 鼠标悬停提示框

MFC 鼠标悬停提示框 运行效果 在MFC窗口中添加一个控件 工具栏中拖拽List Box到MFC窗口给List Box添加变量 CListBox m_listbox 增加成员变量 CWnd* m_tip_parent_wnd; CToolTipCtrl m_tip;给m_listbox创建提示框 void create_tip_window(CWnd* tip_wnd, CToolTipCtrl* ti…...

大数据学习,涉及哪些技术?

学习大数据需要涉及多种技术和概念&#xff0c;因为大数据领域非常广泛&#xff0c;涵盖了数据的采集、存储、处理、分析和可视化等多个方面。以下是学习大数据时需要考虑的一些关键技术和概念&#xff1a; 1、数据采集和存储&#xff1a; 数据库管理系统&#xff08;DBMS&am…...

Clion中使用C/C++开发stm32程序

前言 从刚开始学习阶段&#xff0c;一直是用的keil5开发stm32程序&#xff0c;自从看到稚晖君推荐的CLion开发嵌入式程序后&#xff0c;这次尝试在CLion上开发stm32程序。 1、配置CLion用于STM32开发的环境 这里我就不详细写了&#xff0c;没必要重新写&#xff0c;网上教程很多…...

JavaScript Web APIs第五天笔记

Web APIs - 第5天笔记 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&…...

[ICCV-23] Paper List - 3D Generation-related

ICCV-23 paper list 目录 Oral Papers 3D from multi-view and sensors Generative AI Poster Papers 3D Generation (Neural generative models) 3D from a single image and shape-from-x 3D Editing Face and gestures Stylization Dataset Oral Papers 3D from …...

Transformer为什么如此有效 | 通用建模能力,并行

目录 1 更强更通用的建模能力 2 并行计算 3 大规模训练数据 4 多训练技巧的集成 Transformer是一种基于自注意力机制的网络&#xff0c;在最近一两年年可谓是大放异彩&#xff0c;我23年入坑CV的时候&#xff0c;我看到的CV工作似乎还没有一个不用到Transformer里的一些组…...

【初识Jmeter】【接口自动化】

jmeter的使用笔记1 Jmeter介绍与下载安装介绍安装配置配置与扩展组件 jmeter的使用基本功能元素登陆请求与提取cookie其他请求接口关联Cookie-响应成功聚合报告查看 Jmeter介绍与下载安装 介绍 jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&…...