云计算百科
云计算领域专业知识百科平台

Linux离线集成Jenkins实现自动拉取代码并部署到服务器且发送构建结果到邮箱

一、准备工作

        开始前服务器需安装JDK、git、maven、node以及项目启动所需的mysql、redis等。插件是Jenkins使用的,需要先安装Kenkins。以下是本文所使用的各个组件版本,使用其他版本可能会有兼容问题续特别注意。【安装过程中遇到问题可先查看目录十二有没有解决办法,大部分问题我都蹚过来了😭😭😭】

工具

版本

JDK

17

jenkins

2.479.3

git

2.47.1

maven

3.9.12

node 16.20.2

gitee插件

1190.v317d91b_3a_4e2

Publish Over SSH插件

390.vb_f56e7405751

nodejs插件

1.6.5

Generic Webhook Trigger插件

2.3.1

Email Extension插件

1876.v28d8d38315b_d

二、下载

War Jenkins Packageshttps://get.jenkins.io/war-stable/Linux下载war包部署。

三、启动

        war包传入系统后使用java -jar 命令启动

nohup java -jar jenkins2.479.3.war –httpPort=18080 > /opt/jenkins/logs/jenkins.log 2>&1 &

        有防火墙则关闭或开放相应端口

# 开放18080端口
firewall-cmd –permanent –add-port=18080/tcp
firewall-cmd –reload

        浏览器输入IP:端口号登录

http://IP:18080

        首次登录需输入密码解锁,可输入以下命令查看

cat /root/.jenkins/secrets/initialAdminPassword

四、新手入门

        点击选择插件安装

        点击无再点击安装即可跳过初始插件安装,后续可离线安装所需插件。

        创建一个管理员账户

        实例配置默认即可

        保存即可完成新手入门

五、配置镜像

        如需联网安装插件则需要配置更新中心为国内镜像源,找到Jenkins配置文件

vi /root/.jenkins/hudson.model.UpdateCenter.xml

        替换镜像源为国内镜像源

<?xml version='1.0' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<!– 阿里镜像 –>
<url>https://mirrors.aliyun.com/jenkins/</url>
<!– <url>https://mirrors.cloud.tencent.com/jenkins/updates/update-center.json</url> –>
</site>
</sites>

        重启Jenkins

# 查进程
ps -ef | grep jenkins
# 杀进程
kill -9 [进程ID]
# 重启
nohup java -jar jenkins2.479.3.war –httpPort=18080 > /opt/jenkins/logs/jenkins.log 2>&1 &

        另外也可以在管理界面修改镜像源

六、安装插件

这里以gitee插件为例,实现离线安装Jenkins插件、下载离线安装包Jenkins Plugins

        去Jenkins管理后台安装

        选中安装后重启

七、配置Gitee插件

        链接名可自定义,域名固定、令牌根据提示从私人令牌 – Gitee.com获取

        点击添加令牌

        把刚才生成的令牌填进来

        选择刚添加的令牌并测试连接

八、创建项目-后端

        项目创建完成后需进行下一步配置,先选中之前创建好的Gitee的连接,然后选Git。

        输入Git的相关配置

②为仓库地址
③为全局凭证(添加方式见错误解决-8)
④为触发规则Name字段中输入 origin, Refspec 字段输入 +refs/heads/*:refs/remotes/origin/* +refs/pull/*/MERGE:refs/pull/*/MERGE ,注意新版 jenkins 不再接受多条同时包含 * 通配符的 refs 描述,如只对 push 触发可写前半部分,如只对 PR 触发可只写后半段。

        继续往下配置,Branch Specifier的目的相当于监听哪个分支的活动的填写规则要与Refspec对应,现在Refspec配的是单仓库工作流,所以Branch Specifier配origin/dev_smart_energy为仓库中的dev_smart_energy分支。将来只会拉取此分支的代码。Repository browser为显示具体提交记录的配置,默认自动即可。最后的Additional Behaviours是构建前的额外行为例如合并代码等,这里我只是拉取dev_smart_energy分支并构建所以不添加额外的配置。

        继续往下配置触发器。使用webhook实现的效果为Gitee检测到代码提交时会主动推送事件到jenkins,此选项要保证服务器可以连接外网。使用Poll SCM的效果是jenkins定时拉取代码,此选项不需要连接外网。这里我使用Poll SCM每5分钟拉取一次(目录十二已实现Gitee主动推送)。

九、自动部署-后端

        先安装一个publish over ssh插件,此插件可以把jar包发送到指定服务器并进行后续操作。安装后需配置JDK、Maven、publish over ssh。

        配置JDK的目录(地址根据自己的来)

        配maven的目录(地址根据自己的来)

        配置publish over ssh,操作目录即jar包准备放置在服务器的位置。

        以上配置完成后,现在返回项目配置,去配置项目的Build Steps,先添加一个构建mvn项目的步骤,然后配置。

        再添加一个publish over ssh提供的步骤,然后配置,Source files即为Jenkins中各项目的工作目录。

# 1. 切换到jar包所在目录(/opt/apps)
cd /opt/apps || exit 1
# 2. 停止原有同名jar包进程(避免端口冲突)
PID=$(ps -ef | grep app.jar | grep -v grep | awk '{print $2}')
[ -n "${PID}" ] && kill -9 ${PID} >/dev/null 2>&1
# 3. 启动jar包(日志输出到/opt/apps/app.log,而非登录目录)
nohup /usr/local/jdk/jdk-17.0.2/bin/java -jar /opt/apps/app.jar > /opt/apps/app.log 2>&1 &
# 4. 输出启动成功提示
echo "Jar包已启动,日志路径:/opt/apps/app.log"

        执行验证

查看日志,已拉取到最新的提交且后续会打包并部署到远程。

        去服务器查看,自动拉取部署成功。

十、创建项目-前端

        跟后端一样配置好gitee,拉取分支即可。

十一、自动部署-前端

      先在服务器安装node,后在jenkins安装node插件然后配置。

        而后在前端项目配置node构建

        其中npmrc file可以用默认的也可以用自己配的,如下配置了一个镜像源(也可在执行脚本中指定)。

        配置完Node后继续配置下一步,这里选择shell脚本,此脚本执行后会打包vue项目并把dist压缩。

#!/bin/bash
set -x # 打印执行的命令

echo "======= Node/npm 版本 ======="
node -v
npm -v

echo -e "\\n======= 切换 npm 镜像 ======="
npm config set registry https://registry.npmmirror.com
npm config get registry # 验证镜像切换成功

echo -e "\\n======= 开始安装依赖======="
npm install –verbose

echo -e "\\n======= 删除以前的构建 ======="
rm -rf ./dist

echo -e "\\n======= 开始构建项目 ======="
npm run build:prod

echo -e "\\n======= 压缩 ======="
tar -zcvf ./dist.tar.gz ./dist

        继续添加下一步,之前用过publish over ssh插件,所以此处继续使用此插件把dist压缩包传送到服务器指定位置并完后后续操作。由于前后端项目想要存放的文件路径可能不一样,和之前一样先配一个配置publish over ssh。

        配置完之后返回项目配置,继续配置下一步。

        此脚本会执行换包的操作并重启nginx。nginx需提前配置好。

#!/bin/bash
set -ex

#参数
TARGET_DIR="/usr/share/nginx/html"
KEEP_FILE="dist.tar.gz"
TAR_FILE="${TARGET_DIR}/${KEEP_FILE}"

# 强制切换到目标目录(避免执行目录错误)
cd "${TARGET_DIR}" || { echo "切换到目标目录失败!"; exit 1; }

echo -e "\\n======= 步骤1:验证压缩包是否存在 ======="
if [ ! -f "${TAR_FILE}" ]; then
echo "结果:压缩包不存在!路径:${TAR_FILE}"
ls -l "${TARGET_DIR}"
exit 1
fi
echo "结果:压缩包存在 → ${TAR_FILE}"

echo -e "\\n======= 步骤2:清空部署目录 ======="
find "${TARGET_DIR}" -mindepth 1 -maxdepth 1 ! -name "${KEEP_FILE}" -exec sudo rm -rf {} \\;
echo "结果:部署目录清空成功"

echo -e "\\n======= 步骤3:解压压缩包 ======="
# 仅保留基础解压参数,-C确保解压到目标目录
sudo tar -zxvf "${TAR_FILE}" -C "${TARGET_DIR}"
echo "结果:压缩包解压成功(保留dist外层目录)"
# 验证解压结果:列出目录内容
ls -l "${TARGET_DIR}" | head -10

echo -e "\\n======= 步骤4:删除压缩包 ======="
sudo rm -f "${TAR_FILE}"
echo "结果:压缩包删除成功"

echo -e "\\n======= 步骤5:重启Nginx ======="
sudo nginx -t # 加sudo避免权限不足
if [ $? -eq 0 ]; then
sudo systemctl restart nginx
if systemctl is-active –quiet nginx; then
echo "结果:Nginx重启成功"
else
echo "结果:Nginx重启失败!"
exit 1
fi
else
echo "结果:Nginx配置语法错误,取消重启!"
exit 1
fi

echo -e "\\n======= 最终结果:所有操作执行成功 ======="
exit 0

        执行测试,可以看到成功拉取代码,执行install命令,执行build构建,压缩,换包,重启nginx。

十二、改用Gitee主动推送触发构建

        此操作需要服务器连接外网,或者配置路由映射。由于Gitee插件提供的webhook稳定性不高,改用Generic Webhook Trigger插件实现,首先需要安装此插件。之后需要生成token

使用token建立不同webhook连接所以这里最好各个token起一个名字

token之后去项目里触发器

token为刚才生成的

之后GiteewebHook进入代码仓库–>管理–>WebHooks–>添加webHook

刚才配置触发器时token下方提示

u
r
l


需要

G
i
t
e
e

web
h
o
o
k

配置

url

ip

外网
Ip

端口

J
enkins

端口。

之后点击测试、可以看到请求发送成功、Jenkins也被成功触发

现在这个基本够用但是如果实现精准捕获仓库指定分支执行构建还需另外配置

以下Gitee通过webhook发送请求体其中包含分支字段需要配置就是提取分支字段过滤其他分支

{
"ref": "refs/heads/dev", // 分支完整路径
"repository": {
"name": "项目名"
},
"commits": [/* 提交信息 */]
}

回到刚才的项目的触发器配置那里,继续配置一些参数

选中这两个会把请求体刚才branch_name打出来

往下继续配置触发规则

这样配置后只有dev_smart_energy分支活动才会触发构建

测试分支test_version没有触发构建分支名dev_smart_energy触发构建

十三、邮件通知构建结果

网易126邮箱为例开启SMTP服务

下滑看到服务地址使用SMTP服务端口可以百度一下465

授权码

现在去Jenkins配置邮箱,Jenkins已经自带了邮件插件,但是功能不多,这里先安装一个Email Extension插件,然后去配置

Jenkins LocationSystem Admin e-mail address下面E-mail Notification用户名保持一致

往下配置E-mail Notification

全局凭证的配置

继续配置一些其他内容

配置插件项目添加构建完成步骤主要配置一个触发规则这里配置总是触发成功失败不稳定都会发邮件

测试成功收到邮件

十四、错误解决

        1、启动jenkins时报错缺少字体

        解决方案:安装字体。

2、启动jenkins时报JDK版本不支持

        解决方案:升级JDK

3、jenkins插件安装不上

        一般是版本不匹配,降低或升高插件版本再次安装,一般插件的发布日期和Jenkins的发布日期在同年即可,安装的时候可以看到发布日期。

4、配置gitee时测试连接请求失败

        原因是 Jenkins 的 Gitee 插件与 Gitee API 的参数命名格式不兼容,插件使用了下划线命名(SNAKE_CASE),但 Gitee API 要求驼峰命名(CamelCase),导致请求参数解析失败。所以需要升级插件。

5、配置gitee仓库时连接不上

        是因为服务器没有安装git的原因,需要在服务器上安装git。

        安装完后配置需要配置git目录,注意是可执行文件的目录(使用which git 查看)

7、配置gitee仓库时https协议不支持

        需要在服务器安装Git的时候就指明附带curl工具安装(./configure –prefix=/usr/local/git –with-curl)

8、配置Gitee仓库时显示鉴权失败

        需要把令牌配置进全局凭证里,注意username是令牌对应的gitee账号的用户名、password是令牌。

        而后配置仓库时选中此凭证

9、配置gitee仓库时显示无法访问

        选中全局凭证后报403,一般是由于凭证的用户名和密码对应不上造成的

        用户名就是Gitee网站标签括号里面的

10、邮件发送报533

发送邮件的地址和 SMTP 认证的账号地址不一致造成需要一下Jenkins 的发件人邮箱地址。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Linux离线集成Jenkins实现自动拉取代码并部署到服务器且发送构建结果到邮箱
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!