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和端口,检查网络配置和防火墙设置;

相关推荐
Elastic 中国社区官方博客14 小时前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
Good_Starry1 天前
Git介绍--github/gitee/gitlab使用
git·gitee·gitlab·github
南种北李1 天前
Linux自动化构建工具Make/Makefile
linux·运维·自动化
IG工程师1 天前
关于 S7 - 1200 通过存储卡进行程序更新
经验分享·笔记·自动化
henan程序媛1 天前
Jenkins Pipline流水线
运维·pipeline·jenkins
怒放的生命.2 天前
电器自动化入门08:隔离变压器、行程开关介绍及选型
运维·自动化·电气自动化·电工基础
我爱学Python!2 天前
基于 LangChain 的自动化测试用例的生成与执行
人工智能·自然语言处理·langchain·自动化·llm·测试用例·大语言模型
陌殇殇殇2 天前
使用GitLab CI构建持续集成案例
运维·ci/cd·云原生·容器·kubernetes·gitlab
吕玉生2 天前
基于GitLab 的持续集成环境
ci/cd·gitlab
wudinaniya2 天前
使用rsync+jenkins实现服务自动部署全流程
运维·jenkins·自动化部署