Jenkins+gitlab实现自动化部署

目录

一、关于Jenkins

Jenkins介绍

Jenkins 是一个用 Java 编写的开源自动化工具,带有用于持续集成的插件。用于持续构建和测试您的软件项目,从而使开发人员更容易将更改集成到项目中,并使用户更容易获得新的构建。它还允许您通过与大量测试和部署技术集成来持续交付软件。

Jenkins 集成了各种开发生命周期过程,包括构建、文档、测试、打包、模拟、部署、静态分析等等。

Jenkins 借助插件实现了持续集成。插件允许集成各种 DevOps 阶段。如果要集成特定工具,则需要安装该工具的插件。例如 Git、Maven、Node 项目等。

Jenkins工作流程

  1. 开发者在本地开发,然后提交到 Source Respository 中,
  2. 触发 GitHub 或者 GitLab 配置的钩子函数程序,继而通知 Jenkins
  3. Jenkins 收到通知,会通过 Git/SVN 插件,重新从项目配置中的代码仓库中拉取最新代码,放置于 Workspace (Jenkins 存放任务的目录)
  4. 之后重新触发构建任务,Jenkins 有很多的构建的插件,Java 常用的 Maven 、Gradle,前端的 Node 等
  5. 如果有安装发送邮件的插件并且进行了配置,那么可以在项目中进行配置,构建失败或者成功都可以选择是否给开发者发送邮件
  6. 构建成功后,Jenkins 会通过一个 SSH 插件,来远程执行 Shell 命令,发布项目,在项目中可以配置多台服务器,也就可以一次性部署到多台服务器上去。
  7. 当然很多时候,构建成功后,并不会直接部署到服务器上,而是打包到另外一台服务器上存储(应用服务器)或者存储为软件仓库中的一个新版本。

关于持续集成和持续部署

持续集成 :CI 是一种开发实践,其中开发人员一天几次将代码集成到共享存储库中。当有人将新代码推送到共享存储库中时,测试会在非开发人员(测试人员)的计算机上自动运行。这种纯手动的构建测试,效率非常的低,开发人员必须等待测试人员的反馈后才知道结果,如果错了,还要修改 bug , 这个过程一方面需要沟通成本,另外一方面效率是非常低的.
持续部署 :我们都知道,项目最终是会部署到服务器上去,在没用 Jenkins 之前,大都是我们或专业的运维将项目进行部署。如果项目非常多或者部署完后出现 bug,需要人手动的一个个部署或者能力强些的大佬,就是用脚本文件部署,但是看起来还是非常麻烦.

二、Docker部署Jenkins

1.拉取镜像

这里注意,需要拉取 jenkins/jenkins 不能直接拉取 jenkins 会存在插件包找不到的问题;

shell 复制代码
docker pull jenkins/jenkins:lts

2.启动容器

创建本地映射文件夹

shell 复制代码
mkdir -p /opt/jenkins/workspace

这里默认把容器内8080端口映射到本地9001端口,8069是我们开发代码的端口,因此我这里也映射出来,不需要可以不用映射

shell 复制代码
 docker run -uroot -d --restart=always -p 9001:8080 -p 8069:8069\
 -v /opt/jenkins/workspace/:/var/jenkins_home/workspace \
 -v /var/run/docker.sock:/var/run/docker.sock \
 --name jenkins jenkins/jenkins:lts

查看是否启动成功

shell 复制代码
docker ps

3.配置Jenkins插件

Jenkins安装成功后通过访问主页即可进行环境配置,如下图所示;

访问主页

地址:http://192.168.1.102:9001/

查看管理员密码

shell 复制代码
# 进入jenkins容器
docker exec -it jenkins /bin/bash
# 获取密码
cat var/jenkins_home/secrets/initialAdminPassword

安装插件

选择安装推荐的插件,也可以自定义选择插件(新手不建议),如果第一步拉取的镜像是jenkins这里就会找不到依赖插件;

等待安装完成:

这里可以不用设置 点击下面的使用admin账号继续 即可

这是Jenkins主界面:

配置Jenkins密钥

这里配置密钥的作用是为了取gitlab或其他代码平台拉取代码;

进入到jenkins容器中,执行

shell 复制代码
# 进入jenkins容器
docker exec -it jenkins  /bin/bash
# 执行生成秘钥,输入后一路回车
ssh-keygen -t rsa -C "root"
# 查看公钥
cat /root/.ssh/id_rsa.pub

拿到公钥后放到gitlab中,并点击添加密钥按钮

测试下拉取项目,显示可以拉取成功即可

shell 复制代码
git clone http://xxxxxx.git

三、配置Jenkins环境(插件安装、添加凭据、系统配置、全局工具配置)

配置jenkins,点击manager jenkins可以查看到配置中心的设置,点击plugins

安装Maven插件

安装SSH插件

等待安装完成;

添加凭据

凭据就是账号密码,是统一管理账号密码的位置,可以添加gitlab的账号密码,也可以添加服务的用户名密码等;可以根据自己的需要新增和删除;

重复再添加服务器的账号和密码凭据

显示效果如下:

系统配置:

系统配置是为了

找到两个配置:

1、SSH remote hosts

2、SSH Servers

全局工具配置

配置JDK 和MAVEN

docker安装的Jenkins的话JDK使用默认的,Maven在线安装即可

四、Jenkins部署Maven项目

新建项目

项目配置

通用配置

源码管理

这里填写我们仓库的地址,票据那里选择我们上面填写的gitlab凭据,也可以自己在添加凭据,指定分支这里要注意,gitlab的分支是*/main 这个和github不一样

构建触发器

在高级里找到generate按钮获取Secret令牌,这个令牌在gitlab设置webHook时需要用到

Build

这里添加参数的意思是在编译过程中不执行测试类

shell 复制代码
clean package -Dmaven.test.skip=true

Post Steps

这部分的设置是指在jenkins编译打包完成后执行的步骤,我这里执行shell脚本来启动jar包

添加构建完成后执行shell脚本:

shell 复制代码
# 这行代码意思是告诉jenkins不要将这个运行程序自动杀掉
BUILD_ID=dontKillMe
echo "停止已经运行的项目"
# 查找正在运行的程序并kill掉
ps -ef |grep datasimulationsys-0.0.1-SNAPSHOT.jar |grep -v "grep" |grep -v "/bin/sh"|awk '{print $2}'| xargs kill -9
echo "启动新项目"
# 进入到target目录并启动jar包
cd /var/jenkins_home/workspace/fz/target
nohup java -jar datasimulationsys-0.0.1-SNAPSHOT.jar >> aa.txt &
echo "项目启动成功"

五、Gitlab设置webHook

打开gitlab,找到项目-设置-webhook,点击添加webHook,将上面获取到的webHook地址和令牌拿到并粘贴到这里,然后出发来源设置所有分支(这里可以根据实际使用分支来进行设置),如果不是SSL就取消SSL验证,然后点击保存更改,点击测试验证是否通过;

点击测试,如果出现200成功则连接成功,如下图所示,然后去jenkins中查看是否进行了构建,

通过查看Jenkins查看到已经构建成功了:

六、常见问题

An error occurred during installation: No such plugin: cloudbees-folder

提示报错,因为下载的Jenkins.war里没有cloudbees-folder插件

正确解决办法

shell 复制代码
# 拉取这个镜像,不要拉取jenkins镜像就可以了;
docker pull jenkins/jenkins:lts 

其它方法,我使用jenkins镜像后仍然无法解决

下载插件:http://ftp.icm.edu.pl/packages/jenkins/plugins/cloudbees-folder/

选择合适的版本下载并上传到jenkins容器内

将cloudbees-folder.hpi放在/usr/local/tomcatJenkins-8090/webapps/jenkins/WEB-INF/detached-plugins即可,

具体存放的地址可以自行搜索:

shell 复制代码
 find / -name detached-plugins

然后访问以下地址重启jenkins: http://192.168.1.102:9001/restart

重启后仍然报错;

Url is blocked: Requests to the local network are not allowed

如果webHook报如下异常:Url is blocked: Requests to the local network are not allowed

那么在gitlab中添加以下设置即可:

接着左侧菜单栏-settings-network-outbound requests,选中 Allow requests to the local network from web hooks and services并保存即可

Hook execution failed: Failed to open TCP connection to xxxx:9001

gitlab无法访问到指定IP和端口,检查网络配置和防火墙设置;

相关推荐
yz_aiks10 分钟前
chrome-use 使用教程:让 Claude Code 操控已登录的 Chrome(禅道、ONES 实测)
chrome·自动化·大模型·ai agent
虎鲸不是鱼2 小时前
AI 自动化逆向(三十五)假设空间枚举的完备性是假设出来的
人工智能·自动化·大模型·逆向·ai逆向
中屹指纹浏览器svip2 小时前
指纹浏览器RPA自动化靠谱吗?先分清适用边界
运维·自动化·rpa
智能制造爱好者2 小时前
传统绕线机适配不了分块定子?有哪些自动化解法
自动化·电机
zxanz13 小时前
证书运维自动化,守住业务 HTTPS 底线
运维·https·自动化
云飞云共享云桌面3 小时前
智能装备工厂研发部门多设计师共享一台SolidWorks服务器做设备装配建模
运维·服务器·网络·人工智能·3d·自动化·制造
天远数科13 小时前
零信任架构实战:基于天远企业股权变更构建自动化商业银行对公授信存续期股权异动与资产抽逃预警网关
运维·人工智能·架构·自动化
车软学堂13 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
车软学堂14 小时前
CANoe自动化:跑起第一个测试用例
运维·车载系统·自动化·汽车·测试用例