自动化部署流水线的搭建
自动化流水线原理:
- 提交代码
- 根据条件触发钩子
- Jenkins获取到更新信息、进行拉取
- Jenkins触发构建
- Jenkins将打包好的文件发送到指定服务器
Jenkins的部署
使用docker部署 docker pull jenkins/jenkins
镜像名:jenkins/jenkins:2.462.1-lts
大小(不含插件):448MB
运行环境:2核4G以上
部署完成后 解锁,解锁密码会显示在控制台,然后设置管理员信息
参考博客:https://blog.ifback.com/article/docker-deploy-jenkins/
Gitea的部署
docker 官方文档(有点垃坤)但是还要配置一堆数据库
https://docs.gitea.com/zh-cn/installation/install-with-docker
使用宝塔:一键docker部署,部署完成后配置数据库
Gitlab的部署
参考:https://blog.csdn.net/BThinker/article/details/124097795
直接的话:使用宝塔
Jenkins + Gitea流水线
Jenkins 插件
环境相关:node
、maven
、 git
流水线相关:Send build artifacts over SSH
、Generic Webhook Trigger Plugin
Gitea Plugin
不使用组织单独给某仓库配置
需要的身份验证:
Gitea的应用token、
Generic Webhook Trigger
的token、目标服务器SSH Servers配置
下载设置相关环境
可以自己指定,可以进行自动配置
建议:对环境要求严格的根据不同的进行配置,要不不严格能够上下兼容的自己配置环境
在Jenkins的系统管理/全局工具配置(地址/manage/configureTools/
)进行配置环境,如图
自定义配置
自动安装
流水线配置
生成Gitea的Token
流水线这里对于Jenkins + gitea 结合首先需要一个 gitea的令牌,操作流程如下
点击生成后,复制token
配置Jenkins
现在换到Jenkins环境
进入到凭据管理
配置Gitea的凭证Token
流水线构建
新建任务
设置仓库
如果是私有仓库会出现上面这种情况,这时候就要用到我们之前配置的凭证了
选择对应的凭证
指定分支
这里可能有一点坑,也需是插件冲突了,指定并没什么效果
选择触发器种类
这是使用的插件的,上述问题就是有可能和这个插件冲突了,插件为Generic Webhook Trigger Plugin
没有的需要下载一下
Generic Webhook Trigger Plugin 配置
目前只需要填写一个Token,这里建议随机生成:https://onetools.online/zh/token-generator,然后记下来,之后要用到Gitea里
配置钩子
现在进入Gitea配置钩子
编写构建脚本前置步骤
现在进入Jenkins
这里存在两个坑
- 由于 Docker 容器的 “临时性” 特性和环境变量的作用域限制 导致环境变量不起作用,解决比较麻烦。so:我们使用临时变量
- 通过Dockerfile构建镜像时固化环境变量
- 启动容器时通过-e参数注入环境变量
- 使用了Jenkins的自动安装(这里在Jenkins 插件介绍过)node项目需要勾选下面(如图),maven项目需要选择使用maven创建任务(极坑)
编辑脚本
这里比较重要单独写一节,提供几个模版,但是都要根据自己的实际情况来配置
基于node环境的
#!/bin/bash
# 显示脚本开始执行
echo "====== 开始执行项目环境配置与构建脚本 ======"
# 检查 Node.js 和 npm 版本
echo -e "\n[1/7] 检查 Node.js 和 npm 版本..."
node -v
npm -v
if [ $? -eq 0 ]; then
echo "✅ 版本检查完成"
else
echo "❌ 版本检查失败,请确保已正确安装 Node.js 和 npm"
exit 1
fi
# 设置并验证 npm 镜像源
echo -e "\n[2/7] 配置 npm 镜像源为淘宝镜像..."
npm config set registry https://registry.npmmirror.com
echo "已设置镜像源为:https://registry.npmmirror.com"
echo "验证当前镜像源:"
npm config get registry
if [ $? -eq 0 ]; then
echo "✅ 镜像源配置完成"
else
echo "❌ 镜像源配置失败"
exit 1
fi
# 安装核心依赖包
echo -e "\n[3/7] 开始安装核心依赖(vue, vue-router, pinia)..."
npm install vue@latest vue-router@latest pinia@latest
if [ $? -eq 0 ]; then
echo "✅ 核心依赖安装完成"
else
echo "❌ 核心依赖安装失败"
exit 1
fi
# 安装开发依赖类型定义
echo -e "\n[4/7] 开始安装开发依赖类型定义..."
npm install -D @types/vue @types/vue-router
if [ $? -eq 0 ]; then
echo "✅ 开发依赖类型定义安装完成"
else
echo "❌ 开发依赖类型定义安装失败"
exit 1
fi
# 安装项目依赖
echo -e "\n[5/7] 安装项目其他依赖..."
npm i
if [ $? -eq 0 ]; then
echo "✅ 所有依赖安装完成"
else
echo "❌ 依赖安装失败"
exit 1
fi
# 显示当前工作目录
echo -e "\n[6/7] 当前工作目录:"
pwd
echo "✅ 工作目录显示完成"
# 构建项目
echo -e "\n[7/7] 开始构建项目..."
npm run build
if [ $? -eq 0 ]; then
echo -e "\n🎉 构建完成!项目已成功打包"
else
echo -e "\n❌ 构建失败,请检查错误信息并修复后重试"
exit 1
fi
echo -e "\n====== 所有操作执行完毕 ======"
基于Java环境的
#!/bin/bash
echo "====== 开始配置临时环境变量并执行Maven构建 ======"
# 配置Java环境变量
echo -e "\n[1/6] 配置临时JAVA_HOME环境变量..."
export JAVA_HOME=/opt/java/openjdk
if [ -d "$JAVA_HOME" ]; then
echo "✅ JAVA_HOME已设置为: $JAVA_HOME"
else
echo "❌ 错误: 目录 $JAVA_HOME 不存在"
exit 1
fi
# 配置Maven到PATH
echo -e "\n[2/6] 配置Maven到系统PATH..."
export PATH=/opt/maven/apache-maven-3.9.11/bin:$PATH
echo "✅ PATH已更新,包含Maven路径"
# 验证Java版本
echo -e "\n[3/6] 验证Java版本..."
java -version
if [ $? -eq 0 ]; then
echo "✅ Java版本验证成功"
else
echo "❌ Java版本验证失败"
exit 1
fi
# 验证Maven版本
echo -e "\n[4/6] 验证Maven版本..."
mvn --version
if [ $? -eq 0 ]; then
echo "✅ Maven版本验证成功"
else
echo "❌ Maven版本验证失败"
exit 1
fi
# 执行Maven清理
echo -e "\n[5/6] 执行Maven清理操作..."
mvn clean
if [ $? -eq 0 ]; then
echo "✅ Maven清理完成"
else
echo "❌ Maven清理失败"
exit 1
fi
# 执行Maven打包
echo -e "\n[6/6] 执行Maven打包操作..."
mvn package
if [ $? -eq 0 ]; then
echo -e "\n🎉 Maven打包成功!构建产物已生成"
else
echo -e "\n❌ Maven打包失败,请检查错误信息"
exit 1
fi
echo -e "\n====== 所有操作执行完毕 ======"
基于go环境的(无实测)
#!/bin/bash
echo "====== 开始Go环境配置与操作 ======"
# 配置临时GOROOT(Go安装目录)
echo -e "\n[1/5] 配置临时GOROOT环境变量..."
export GOROOT=/usr/local/go
if [ -d "$GOROOT" ]; then
echo "✅ GOROOT已设置为: $GOROOT"
else
echo "❌ 错误: Go安装目录 $GOROOT 不存在"
exit 1
fi
# 配置临时GOPATH(工作目录)
echo -e "\n[2/5] 配置临时GOPATH环境变量..."
export GOPATH=$HOME/go
mkdir -p "$GOPATH"
if [ -d "$GOPATH" ]; then
echo "✅ GOPATH已设置为: $GOPATH"
else
echo "❌ 错误: 无法创建GOPATH目录 $GOPATH"
exit 1
fi
# 将Go二进制目录添加到PATH
echo -e "\n[3/5] 配置Go到系统PATH..."
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
echo "✅ PATH已更新,包含Go相关路径"
# 验证Go版本
echo -e "\n[4/5] 验证Go版本..."
go version
if [ $? -eq 0 ]; then
echo "✅ Go版本验证成功"
else
echo "❌ Go版本验证失败"
exit 1
fi
# 执行Go相关操作(根据实际需求修改)
echo -e "\n[5/5] 执行Go项目操作..."
echo "🔍 检查代码..."
go vet ./...
if [ $? -eq 0 ]; then
echo "✅ 代码检查完成"
echo -e "\n🔨 构建项目..."
go build -o app ./cmd/main.go
if [ $? -eq 0 ]; then
echo "🎉 Go项目构建成功!可执行文件: $(pwd)/app"
else
echo "❌ Go项目构建失败"
exit 1
fi
else
echo "❌ 代码检查失败"
exit 1
fi
echo -e "\n====== 所有Go环境操作执行完毕 ======"
发布到服务器
需要插件Send build artifacts over SSH
Jenkins配置
服务器配置
进入到需要部署的服务器
给用户加目标目录的权限,比如给lihui
加权限/www/wwwroot/java/helloWorld
chown -R lihui:lihui /www/wwwroot/java/helloWorld
chmod -R 755 /www/wwwroot/java/helloWorld
Jenkins + Gitlab流水线
Gitlab死占内存,没有用的日志贼多,但是配置很简单(so 不用了)