Jenkins-小记

531 阅读2分钟

Jenkins - 项目配置(前端)

构建 - Execute shell

yarn config set registry https://registry.npm.taobao.org -g
source /etc/profile
case $Project in
   PC)
   echo "Project:$Project"
   path="${WORKSPACE}/pc"
   cd $path
   yarn install
   yarn run build
   \cp -rf dist /usr/Web/xxxx/pc
   tar -zcvf ./html.tar.gz ./dist/*
   \cp html.tar.gz ${WORKSPACE}/new
   cd ${WORKSPACE}
   tar -zcvf ./new.tar.gz ./new/*
   ;;
  H5)
    echo "Project:$Project"
    path="${WORKSPACE}/h5"	
    cd $path
    yarn install
    yarn run build
    \cp -rf dist /usr/Web/xxxx/h5
    tar -zcvf ./h5.tar.gz ./dist/*
    \cp h5.tar.gz ${WORKSPACE}/new
    cd ${WORKSPACE}
    tar -zcvf ./new.tar.gz ./new/*
    exit
  ;;
esac

构建后操作 - Send build artifacts over SSH

Exec command

cd /usr/XXXX/Web/bak
mkdir "$(date +%Y-%m-%d-%H-%M)" && mv -f ../html "$(date +%Y-%m-%d-%H-%M)"
cd /usr/XXXX/Web
tar -zxvf new.tar.gz
cd /usr/XXXX/Web/new
tar -zxvf h5.tar.gz
mv dist h5
tar -zxvf html.tar.gz
mv dist html
mv -f h5 html
mv -f html /usr/XXXX/Web
#保留5个备份
ReservedNum=5  
FileDir=/usr/XXXX/Web/bak
date=$(date "+%Y-%m-%d-%H-%M")
cd $FileDir   
FileNum=$(ls -l | grep '^d' | wc -l)   
while(( $FileNum > $ReservedNum))
do
    OldFile=$(ls -rt | head -1)         
    echo  $date "Delete File:"$OldFile
    rm -rf $FileDir/$OldFile
    let "FileNum--"
done

# 第二套构建后部署脚本

#!/bin/bash

# ================= 新增:日志记录配置 =================

# 定义日志文件路径 (建议在 WebRoot 同级或 tmp 目录,确保有写权限)

LOG_FILE="/usr/ICPS/WebTest/logs/h5/deploy_$(date +%Y%m%d_%H%M%S).log"

  


exec > >(tee -a "$LOG_FILE") 2>&1

# =====================================================

  


echo "=========================================="

echo ">>> DEBUG: 脚本已启动 <<<"

echo ">>> DEBUG: 日志文件位置: ${LOG_FILE} <<<"

echo ">>> DEBUG: 当前时间: $(date) <<<"

echo ">>> DEBUG: 当前用户: $(whoami) <<<"

echo ">>> DEBUG: 当前目录: $(pwd) <<<"

echo "=========================================="

  


# ================= 配置区域 =================

# Web根目录

WEB_ROOT="/usr/ICPS/WebTest"

# 静态资源部署目录

HTML_DIR="${WEB_ROOT}/html/h5"

# 备份根目录

BAK_BASE_DIR="${WEB_ROOT}/bak/h5"

# 保留备份的数量

RESERVED_NUM=5

# 【新增】日志目录

LOG_DIR="${WEB_ROOT}/logs/h5"

# 【修改】基于 LOG_DIR 拼接

LOG_FILE="${LOG_DIR}/deploy_$(date +%Y%m%d_%H%M%S).log"

# 【新增】日志保留数量

LOG_RESERVED_NUM=5

  


# 【新增】部署包配置

PACKAGE_NAME="icps_h5" # 安装包的基础名称 (不含 .tar.gz)

SOURCE_DIR="dist" # 解压后包含前端文件的源目录名称 (通常是 dist, build, 或 package_name 本身)

# ===========================================

  


echo "=========================================="

echo "开始执行部署流程"

echo "=========================================="

  


# --- Step 1: 备份旧版本 (排除 h5 文件夹) ---

echo "[步骤 1] 正在备份旧文件 (来自 ${HTML_DIR},排除 'h5' 文件夹)..."

  


# 1. 确保备份根目录存在

mkdir -p "${BAK_BASE_DIR}"

  


# 2. 生成时间戳 (格式: YYYY-MM-DD-HH-MM)

TIMESTAMP=$(date +%Y-%m-%d-%H-%M)

BACKUP_TARGET="${BAK_BASE_DIR}/${TIMESTAMP}"

  


# 3. 创建本次备份的具体文件夹

mkdir -p "${BACKUP_TARGET}"

  


# 4. 进入 html 目录进行文件操作

cd "${HTML_DIR}"

  


# 5. 移动文件和目录

TARGET_PACKAGE="${PACKAGE_NAME}.tar.gz"

find . -mindepth 1 -maxdepth 1 ! -name ${TARGET_PACKAGE} -exec cp -a {} "${BACKUP_TARGET}/" \;

  


echo "备份完成,保存至: ${BACKUP_TARGET}"

  


# --- Step 2: 部署新版本 ---

echo "[步骤 2] 正在部署新版本..."

  


# 1. 检查安装包是否存在

# 【修改】使用变量拼接文件名

  


if [ ! -f "${TARGET_PACKAGE}" ]; then

echo "错误: 在 ${HTML_DIR} 中未找到 ${TARGET_PACKAGE}"

exit 1

fi

  


# 2. 解压新版本包

# 【修改】使用变量

tar -xvf "${TARGET_PACKAGE}" --overwrite

  


# 3. 将源目录内容移动到 html 根目录 (即当前目录)

# 【修改】使用 SOURCE_DIR 变量

if [ -d "${SOURCE_DIR}" ]; then

echo "正在将 ${SOURCE_DIR}/ 中的文件复制到当前目录..."

# 方法 A: 使用 cp -a 保留属性并递归复制 (推荐,比 mv 更安全,避免跨文件系统问题)

# shopt -s dotglob 允许 * 匹配隐藏文件

shopt -s dotglob

# 【修改】使用变量

cp -a "${SOURCE_DIR}"/* .

shopt -u dotglob

# 检查复制是否成功 (简单检查:目标目录是否有文件)

if [ $? -eq 0 ]; then

echo "文件复制完成,正在删除 ${SOURCE_DIR} 目录..."

rm -rf "${SOURCE_DIR}"

echo "${SOURCE_DIR} 目录已删除。"

else

echo "错误: 文件复制失败。"

exit 1

fi

else

echo "警告: 解压后未找到 ${SOURCE_DIR} 目录。跳过移动步骤。"

# 如果业务强依赖源目录存在,建议此处 exit 1

fi

  


# 4. 清理安装包

# 【修改】使用变量

rm -f "${TARGET_PACKAGE}"

echo "安装包 ${TARGET_PACKAGE} 已清理。"

  


# --- Step 3: 清理旧备份 (保留最近 N 个) ---

echo "[步骤 3] 正在清理旧备份 (保留最新的 ${RESERVED_NUM} 个)..."

  


cd "${BAK_BASE_DIR}"

  


# 获取当前备份目录数量

FileNum=$(ls -1d */ 2>/dev/null | wc -l)

  


echo "当前备份数量: ${FileNum}"

  


while (( FileNum > RESERVED_NUM ))

do

# 找到最旧的目录

OldFile=$(ls -1rt | head -1)

if [ -z "$OldFile" ]; then

break

fi

  


echo "正在删除旧备份: ${OldFile}"

rm -rf "${BAK_BASE_DIR}/${OldFile}"

let "FileNum--"

done

  


# --- Step 4: 清理旧日志 (保留最近 N 个) ---

echo "[步骤 4] 正在清理旧日志 (保留最新的 ${LOG_RESERVED_NUM} 个)..."

  


if [ -d "${LOG_DIR}" ]; then

cd "${LOG_DIR}"

# 获取当前 log 文件数量 (只匹配 deploy_*.log)

LogNum=$(ls -1t deploy_*.log 2>/dev/null | wc -l)

echo "当前日志数量: ${LogNum}"

while (( LogNum > LOG_RESERVED_NUM ))

do

# ls -1t 按时间排序(最新的在前),tail -1 获取最旧的一个

# 注意:这里用 tail -1 因为 ls -t 是降序,最后一个是最旧的

OldLogFile=$(ls -1t deploy_*.log 2>/dev/null | tail -1)

if [ -z "$OldLogFile" ]; then

break

fi

echo "正在删除旧日志: ${OldLogFile}"

rm -f "${LOG_DIR}/${OldLogFile}"

let "LogNum--"

done

else

echo "警告: 日志目录 ${LOG_DIR} 不存在,跳过日志清理。"

fi

  


echo "=========================================="

echo "部署成功完成!"

Jenkins - 项目配置(后端-java)

1.General-描述

xxx系统后端发版

2.源码管理

Repository URL:
http://127.0.0.1:8080/xxxx/java-service/xxx-system.git  
Credentials
Branches to build

指定分支

3.构建触发器

不设置

4.构建环境

选择Add timestamps to the Console Output

4.1 Pre Steps

不设置

4.2 Build
4.2.1 Root POM

pom.xml

4.2.2 Goals and options
clean package -Dmaven.test.skip=true
4.2.3 Post Steps

选择 Run only if build succeeds

5. 构建后操作

5.1Send build artifacts over SSH

SSH Server 下拉选择服务

Transfers Transfer Set Source files

xxxx-system-starter/target/xxxx-system-starter-1.0.0-SNAPSHOT.jar

Remote directory

/usr/XXXX/java

Exec command


cd /usr/xxxx/java/bak
mkdir "$(date +%Y-%m-%d-%H-%M)" && mv -f /usr/xxxx/java/xxxx-system-starter-1.0.0-SNAPSHOT.jar "$(date +%Y-%m-%d-%H-%M)"
cd /usr/xxxx/java/
cp -r xxxx-system-starter/target/xxxx-system-starter-1.0.0-SNAPSHOT.jar /usr/xxxx/java
rm -rf xxxx-system-starter
/usr/xxxx/script/xxxx-system.sh
#保留5个备份
ReservedNum=5  
FileDir=/usr/xxxx/java/bak
date=$(date "+%Y%m%d-%H%M%S")
cd $FileDir   
FileNum=$(ls -l | grep '^d' | wc -l)   
while(( $FileNum > $ReservedNum))
do
    OldFile=$(ls -rt | head -1)         
    echo  $date "Delete File:"$OldFile
    rm -rf $FileDir/$OldFile
    let "FileNum--"
done

Jenkins - Maven Settings


<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
	<localRepository>/usr/repository</localRepository>
	<interactiveMode>true</interactiveMode>
    <offline>false</offline>
    <pluginGroups>
        <pluginGroup>org.mortbay.jetty</pluginGroup>
        <pluginGroup>org.jenkins-ci.tools</pluginGroup>
    </pluginGroups>
	
	<!--配置权限,使用默认用户-->
	<servers>
		<server>
			<id>nexus-releases</id>
			<username>deployment</username>
			<password>deployment123</password>
		</server>
		<server> 
			<id>nexus-snapshots</id>
			<username>deployment</username>
			<password>deployment123</password>
		</server>
	</servers>

  <mirrors>
 	 <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>

	<profiles>
		<profile>
		   <id>XXXX</id>
			    <activation>
                    <activeByDefault>false</activeByDefault>
                    <jdk>1.8</jdk>
                </activation>
			    <repositories>
					<!-- 私有库地址-->
				    <repository>
						<id>nexus</id>
						
						<releases>
							<enabled>true</enabled>
						</releases>
						<snapshots>
							<enabled>true</enabled>
						</snapshots>
					</repository>
				</repositories>      
				<pluginRepositories>
					<!--插件库地址-->
					<pluginRepository>
						<id>nexus</id>
						
						<releases>
							<enabled>true</enabled>
						</releases>
						<snapshots>
							<enabled>true</enabled>
					   </snapshots>
					</pluginRepository>
				</pluginRepositories>
			</profile>
	</profiles>
	
	<!--激活profile-->
	<activeProfiles>
		<activeProfile>XXXX</activeProfile>
	</activeProfiles>
	
</settings>