Appearance
Jenkins 使用的版本
shell
#!/bin/bash
# 定义变量
REPO_URL="https://gitee.com/yulin-chen/test_demo.git" # 你的代码仓库URL
PROJECT_NAME="test_demo" # 项目名称
BUILD_DIR="/var/lib/jenkins/workspace/${PROJECT_NAME}" # Jenkins工作空间目录
DEPLOY_DIR="/www/wwwroot/test" # 部署目录,确保这个目录存在且有权限
CACHE_DIR="/var/lib/jenkins/cache/${PROJECT_NAME}" # 项目特定的缓存目录
# 确保缓存目录存在
mkdir -p ${CACHE_DIR}
# 步骤1: 清理工作空间
echo "清理工作空间..."
rm -rf ${BUILD_DIR}/*
if [ $? -ne 0 ]; then
echo "清理工作空间失败"
exit 1
fi
# 步骤2: 拉取代码
echo "正在从 $REPO_URL 拉取代码..."
cd ${BUILD_DIR}
if [ $? -ne 0 ]; then
echo "切换到工作空间目录失败"
exit 1
fi
git init
if [ $? -ne 0 ]; then
echo "Git初始化失败"
exit 1
fi
if ! git remote | grep -q "origin"; then
git remote add origin $REPO_URL
if [ $? -ne 0 ]; then
echo "添加远程仓库失败"
exit 1
fi
fi
git fetch origin
if [ $? -ne 0 ]; then
echo "从远程仓库获取数据失败"
exit 1
fi
git reset --hard origin/master
if [ $? -ne 0 ]; then
echo "重置本地仓库到远程仓库失败"
exit 1
fi
# 步骤3: 检查依赖是否需要更新
echo "正在检查依赖是否需要更新..."
if [ -f "${CACHE_DIR}/package-lock.json" ] && [ -f "${BUILD_DIR}/package-lock.json" ]; then
diff_output=$(diff ${CACHE_DIR}/package-lock.json ${BUILD_DIR}/package-lock.json)
if [ -n "${diff_output}" ]; then
echo "package-lock.json 有差异,需要更新依赖:"
# echo "${diff_output}"
# 更新缓存
cp ${BUILD_DIR}/package-lock.json ${CACHE_DIR}/package-lock.json
cp -R ${BUILD_DIR}/node_modules ${CACHE_DIR}/
npm install
if [ $? -ne 0 ]; then
echo "安装依赖失败"
exit 1
fi
else
echo "package-lock.json 无差异,跳过依赖安装"
# 从缓存中恢复 node_modules
cp -R ${CACHE_DIR}/node_modules ${BUILD_DIR}/
fi
else
echo "缓存中不存在 package-lock.json 或本地 package-lock.json,需要更新依赖"
npm install
if [ $? -ne 0 ]; then
echo "安装依赖失败"
exit 1
fi
cp ${BUILD_DIR}/package-lock.json ${CACHE_DIR}/package-lock.json
cp -R ${BUILD_DIR}/node_modules ${CACHE_DIR}/
fi
# 步骤4: 构建项目
echo "正在构建项目..."
npm run build
if [ $? -ne 0 ]; then
echo "构建项目失败"
exit 1
fi
# 步骤5: 检查部署目录
echo "检查部署目录..."
if [ ! -d "$DEPLOY_DIR" ]; then
echo "部署目录不存在,正在创建..."
mkdir -p $DEPLOY_DIR
if [ $? -ne 0 ]; then
echo "创建部署目录失败"
exit 1
fi
fi
# 步骤6: 部署项目
echo "正在部署项目..."
if [ -d "dist" ]; then
cp -R dist/* $DEPLOY_DIR
if [ $? -ne 0 ]; then
echo "部署项目失败"
exit 1
fi
else
echo "构建输出目录不存在"
exit 1
fi
# 完成
echo "部署完成!"
exit 0但是如果把这个脚本拿到宝塔里面的webhooks插件就会报错各种权限问题, 下面贴一个简单粗暴的,不需要去手动修改文件权限,脚本自己去做,当然这样不是很安全,适合个人新手玩家自己去使用
shell
#!/bin/bash
# 确保文件权限正确
chown -R root:root /www/wwwroot/sc/blog
chmod -R 755 /www/wwwroot/sc/blog
# 将 pnpm 的路径添加到 PATH 环境变量中
export PATH=$PATH:/www/server/nodejs/v20.18.0/bin
# 定义变量
REPO_URL="https://gitee.com/yulin-chen/blog.git" # 你的代码仓库URL
PROJECT_NAME="blog" # 项目名称
BUILD_DIR="/www/wwwroot/sc/${PROJECT_NAME}" # 代码空间
DEPLOY_DIR="/www/wwwroot/${PROJECT_NAME}" # 部署目录,确保这个目录存在且有权限
CACHE_DIR="/www/wwwroot/sc/cache/${PROJECT_NAME}" # 项目特定的缓存目录
# 确保缓存目录存在
mkdir -p ${CACHE_DIR}
# 步骤1: 清理工作空间
echo "清理工作空间..."
rm -rf ${BUILD_DIR}/*
if [ $? -ne 0 ]; then
echo "清理工作空间失败"
exit 1
fi
# 步骤2: 拉取代码
echo "正在从 $REPO_URL 拉取代码..."
cd ${BUILD_DIR}
if [ $? -ne 0 ]; then
echo "切换到工作空间目录失败"
exit 1
fi
set -x
echo "Git全局配置:"
git config --global --list
echo "当前用户:$(whoami)"
echo "当前路径:$(pwd)"
echo "环境变量 PATH:$PATH"
git config --global --add safe.directory /www/wwwroot/sc/blog
git init
if [ $? -ne 0 ]; then
echo "Git初始化失败"
exit 1
fi
git config --add safe.directory /www/wwwroot/sc/blog
echo "当前仓库状态:"
git status
if ! git remote | grep -q "origin"; then
if ! output=$(git remote add origin "$REPO_URL" 2>&1); then
echo "添加远程仓库失败: $output"
exit 1
else
echo "远程仓库添加成功"
fi
else
echo "远程仓库已存在"
fi
set +x
git fetch origin
if [ $? -ne 0 ]; then
echo "从远程仓库获取数据失败"
exit 1
fi
git reset --hard origin/master
if [ $? -ne 0 ]; then
echo "重置本地仓库到远程仓库失败"
exit 1
fi
# 步骤3: 检查依赖是否需要更新
echo "正在检查依赖是否需要更新..."
if [ -f "${CACHE_DIR}/pnpm-lock.yaml" ] && [ -f "${BUILD_DIR}/pnpm-lock.yaml" ]; then
diff_output=$(diff ${CACHE_DIR}/pnpm-lock.yaml ${BUILD_DIR}/pnpm-lock.yaml)
if [ -n "${diff_output}" ]; then
echo "pnpm-lock.yaml 有差异,需要更新依赖:"
# echo "${diff_output}"
# 更新缓存
cp ${BUILD_DIR}/pnpm-lock.yaml ${CACHE_DIR}/pnpm-lock.yaml
cp -R ${BUILD_DIR}/node_modules ${CACHE_DIR}/
echo "正在安装依赖..."
if ! pnpm install 2>&1 | tee install_log.txt; then
echo "安装依赖失败"
cat install_log.txt
exit 1
fi
else
echo "pnpm-lock.yaml 无差异,跳过依赖安装"
# 从缓存中恢复 node_modules
cp -R ${CACHE_DIR}/node_modules ${BUILD_DIR}/
fi
else
echo "缓存中不存在 pnpm-lock.yaml 或本地 pnpm-lock.yaml,需要更新依赖"
echo "正在安装依赖..."
if ! pnpm install 2>&1 | tee install_log.txt; then
echo "安装依赖失败"
cat install_log.txt
exit 1
fi
cp ${BUILD_DIR}/pnpm-lock.yaml ${CACHE_DIR}/pnpm-lock.yaml
cp -R ${BUILD_DIR}/node_modules ${CACHE_DIR}/
fi
# 步骤4: 构建项目
echo "正在构建项目..."
if ! pnpm run build 2>&1 | tee build_log.txt; then
echo "构建项目失败"
cat build_log.txt
exit 1
fi
# 步骤5: 检查部署目录
echo "检查部署目录..."
if [ ! -d "$DEPLOY_DIR" ]; then
echo "部署目录不存在,正在创建..."
mkdir -p $DEPLOY_DIR
if [ $? -ne 0 ]; then
echo "创建部署目录失败"
exit 1
fi
fi
# 步骤6: 部署项目
echo "正在部署项目..."
if [ -d ".vitepress/dist" ]; then
cp -R .vitepress/dist/* $DEPLOY_DIR
if [ $? -ne 0 ]; then
echo "部署项目失败"
exit 1
fi
else
echo "构建输出目录不存在"
exit 1
fi
# 完成
echo "部署完成!"
exit 0ssh版本
shell
#!/bin/bash
# 确保文件权限正确
chown -R root:root /www/wwwroot/sc/blog
chmod -R 755 /www/wwwroot/sc/blog
# 将 pnpm 的路径添加到 PATH 环境变量中
export PATH=$PATH:/www/server/nodejs/v20.18.0/bin
# 定义变量
REPO_URL="git@gitee.com:yulin-chen/blog.git" # 你的代码仓库URL
PROJECT_NAME="blog" # 项目名称
BUILD_DIR="/www/wwwroot/sc/${PROJECT_NAME}" # 代码空间
DEPLOY_DIR="/www/wwwroot/${PROJECT_NAME}" # 部署目录,确保这个目录存在且有权限
CACHE_DIR="/www/wwwroot/sc/cache/${PROJECT_NAME}" # 项目特定的缓存目录
# 确保缓存目录存在
mkdir -p ${CACHE_DIR}
# 步骤1: 清理工作空间
echo "清理工作空间..."
rm -rf ${BUILD_DIR}/*
if [ $? -ne 0 ]; then
echo "清理工作空间失败"
exit 1
fi
# 步骤2: 拉取代码
echo "正在从 $REPO_URL 拉取代码..."
cd ${BUILD_DIR}
if [ $? -ne 0 ]; then
echo "切换到工作空间目录失败"
exit 1
fi
set -x
echo "Git全局配置:"
git config --global --list
echo "当前用户:$(whoami)"
echo "当前路径:$(pwd)"
echo "环境变量 PATH:$PATH"
git config --global --add safe.directory /www/wwwroot/sc/blog
git init
if [ $? -ne 0 ]; then
echo "Git初始化失败"
exit 1
fi
git config --add safe.directory /www/wwwroot/sc/blog
echo "当前仓库状态:"
git status
if ! git remote | grep -q "origin"; then
if ! output=$(git remote add origin "$REPO_URL" 2>&1); then
echo "添加远程仓库失败: $output"
exit 1
else
echo "远程仓库添加成功"
fi
else
echo "远程仓库已存在"
fi
set +x
# 禁用主机密钥验证
export GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no"
# 测试 SSH 连接
echo "测试 SSH 连接..."
ssh -T git@gitee.com
# 获取远程仓库数据
echo "从远程仓库获取数据..."
git fetch origin
if [ $? -ne 0 ]; then
echo "从远程仓库获取数据失败"
exit 1
fi
git reset --hard origin/master
if [ $? -ne 0 ]; then
echo "重置本地仓库到远程仓库失败"
exit 1
fi
# 步骤3: 检查依赖是否需要更新
echo "正在检查依赖是否需要更新..."
if [ -f "${CACHE_DIR}/pnpm-lock.yaml" ] && [ -f "${BUILD_DIR}/pnpm-lock.yaml" ]; then
diff_output=$(diff ${CACHE_DIR}/pnpm-lock.yaml ${BUILD_DIR}/pnpm-lock.yaml)
if [ -n "${diff_output}" ]; then
echo "pnpm-lock.yaml 有差异,需要更新依赖:"
cp ${BUILD_DIR}/pnpm-lock.yaml ${CACHE_DIR}/pnpm-lock.yaml
rm -rf ${BUILD_DIR}/node_modules
echo "正在安装依赖..."
if ! pnpm install 2>&1 | tee install_log.txt; then
echo "安装依赖失败"
cat install_log.txt
exit 1
fi
else
echo "pnpm-lock.yaml 无差异,恢复缓存中的 node_modules"
rm -rf ${BUILD_DIR}/node_modules
cp -R ${CACHE_DIR}/node_modules ${BUILD_DIR}/
# 检查缓存完整性
echo "检查缓存完整性..."
if ! pnpm install --frozen-lockfile 2>&1 | tee install_log.txt; then
echo "安装依赖失败"
cat install_log.txt
exit 1
fi
fi
else
echo "缓存中不存在 pnpm-lock.yaml 或本地 pnpm-lock.yaml,需要更新依赖"
rm -rf ${BUILD_DIR}/node_modules
echo "正在安装依赖..."
if ! pnpm install 2>&1 | tee install_log.txt; then
echo "安装依赖失败"
cat install_log.txt
exit 1
fi
cp ${BUILD_DIR}/pnpm-lock.yaml ${CACHE_DIR}/pnpm-lock.yaml
cp -R ${BUILD_DIR}/node_modules ${CACHE_DIR}/
fi
# 步骤4: 构建项目
echo "正在构建项目..."
if ! pnpm run build 2>&1 | tee build_log.txt; then
echo "构建项目失败"
cat build_log.txt
exit 1
fi
# 步骤5: 检查部署目录
echo "检查部署目录..."
if [ ! -d "$DEPLOY_DIR" ]; then
echo "部署目录不存在,正在创建..."
mkdir -p $DEPLOY_DIR
if [ $? -ne 0 ]; then
echo "创建部署目录失败"
exit 1
fi
fi
# 步骤6: 部署项目
echo "正在部署项目..."
if [ -d ".vitepress/dist" ]; then
cp -R .vitepress/dist/* $DEPLOY_DIR
if [ $? -ne 0 ]; then
echo "部署项目失败"
exit 1
fi
else
echo "构建输出目录不存在"
exit 1
fi
# 完成
echo "部署完成!"
exit 0