Skip to content

自动化部署流水线的搭建

自动化流水线原理:

  1. 提交代码
  2. 根据条件触发钩子
  3. Jenkins获取到更新信息、进行拉取
  4. Jenkins触发构建
  5. Jenkins将打包好的文件发送到指定服务器

Jenkins的部署

使用docker部署 docker pull jenkins/jenkins

镜像名:jenkins/jenkins:2.462.1-lts

大小(不含插件):448MB

运行环境:2核4G以上

部署完成后 解锁,解锁密码会显示在控制台,然后设置管理员信息

image-20250809091535229

参考博客: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 插件

环境相关:nodemavengit

流水线相关:Send build artifacts over SSHGeneric Webhook Trigger Plugin Gitea Plugin

不使用组织单独给某仓库配置

需要的身份验证:

Gitea的应用token、Generic Webhook Trigger的token、目标服务器SSH Servers配置

下载设置相关环境

可以自己指定,可以进行自动配置

建议:对环境要求严格的根据不同的进行配置,要不不严格能够上下兼容的自己配置环境

在Jenkins的系统管理/全局工具配置(地址/manage/configureTools/)进行配置环境,如图

image-20250811110942723

自定义配置

自定义配置

自动安装

自动安装

流水线配置

生成Gitea的Token

流水线这里对于Jenkins + gitea 结合首先需要一个 gitea的令牌,操作流程如下

image-20250811112132294

点击生成后,复制token

image-20250811112217725

配置Jenkins

现在换到Jenkins环境

进入到凭据管理

image-20250811112450258

配置Gitea的凭证Token

image-20250811112805029

image-20250811113327568

流水线构建

新建任务

image-20250812175935709

设置仓库

image-20250812180107904

如果是私有仓库会出现上面这种情况,这时候就要用到我们之前配置的凭证了

选择对应的凭证

image-20250812180201664

指定分支

这里可能有一点坑,也需是插件冲突了,指定并没什么效果

image-20250812180244714

选择触发器种类

这是使用的插件的,上述问题就是有可能和这个插件冲突了,插件为Generic Webhook Trigger Plugin没有的需要下载一下

image-20250812180356595

Generic Webhook Trigger Plugin 配置

目前只需要填写一个Token,这里建议随机生成:https://onetools.online/zh/token-generator,然后记下来,之后要用到Gitea里

image-20250812180847855

配置钩子

现在进入Gitea配置钩子

编写构建脚本前置步骤

现在进入Jenkins

这里存在两个坑

  1. 由于 Docker 容器的 “临时性” 特性环境变量的作用域限制 导致环境变量不起作用,解决比较麻烦。so:我们使用临时变量
    1. 通过Dockerfile构建镜像时固化环境变量
    2. 启动容器时通过-e参数注入环境变量
  2. 使用了Jenkins的自动安装(这里在Jenkins 插件介绍过)node项目需要勾选下面(如图),maven项目需要选择使用maven创建任务(极坑)

image-20250812182540456

编辑脚本

这里比较重要单独写一节,提供几个模版,但是都要根据自己的实际情况来配置

基于node环境的
shell
#!/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环境的
shell
#!/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环境的(无实测)
shell
#!/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配置

image-20250813174001322

服务器配置

进入到需要部署的服务器

给用户加目标目录的权限,比如给lihui加权限/www/wwwroot/java/helloWorld

sh
chown -R lihui:lihui /www/wwwroot/java/helloWorld
chmod -R 755 /www/wwwroot/java/helloWorld

Jenkins + Gitlab流水线

Gitlab死占内存,没有用的日志贼多,但是配置很简单(so 不用了)

Released under the MIT License.