写了两个自动化脚本,从下载-构建-打包-提取-备份-更新-重启
##!/bin/bash
# 定义颜色用于日志输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 检查参数
if [ -z "$1" ]; then
    echo -e "${RED}错误: 未传入分支号!${NC}"
    echo "用法: $0 <分支号>"
    exit 1
fi
# 读取分支号
BRANCH="$1"
IMAGE_NAME="lcs2:${BRANCH}"   # 镜像名称
CONTAINER_NAME="lcs2_build_temp"  # 临时容器名称
OUTPUT_FILE="projects/container.tar.gz"  # 文件在容器中的路径
# 获取当前日期并格式化
DATE=$(date +"%Y%m%d-%H%M%S")
LOCAL_OUTPUT="container.tar.gz"  # 保持原文件名
# 创建临时 Dockerfile,动态传递 BRANCH
echo -e "${YELLOW}创建动态 Dockerfile...${NC}"
cat > Dockerfile.temp <<EOF
FROM git.libsaas.repo/dbase/java8build:latest
ENV LANG=C.UTF-8
ARG BRANCH=$BRANCH
RUN ulimit -n 65536 && \\ 
    wget --no-check-certificate https:/机器/lcs/lcs2-all/raw/branch/\$BRANCH/build/build_lcs2.sh && \\
    chmod +x ./build_lcs2.sh && \\
    ./build_lcs2.sh \$BRANCH
EOF
# 清理临时容器
echo -e "${YELLOW}清理临时容器...${NC}"
if ! nerdctl rm -f "$CONTAINER_NAME"; then
    echo -e "${RED}清理容器失败!${NC}"
    exit 1
fi
# 构建镜像
echo -e "${YELLOW}开始构建镜像: ${IMAGE_NAME}${NC}"
if ! nerdctl build --no-cache -t "$IMAGE_NAME" -f Dockerfile.temp .; then
    echo -e "${RED}镜像构建失败!${NC}"
    rm -f Dockerfile.temp
    exit 1
fi
rm -f Dockerfile.temp
# 创建并启动容器
echo -e "${YELLOW}创建并启动临时容器...${NC}"
if ! nerdctl run --name "$CONTAINER_NAME" -d "$IMAGE_NAME"; then
    echo -e "${RED}容器创建并启动失败!${NC}"
    exit 1
fi
# 提取文件
echo -e "${YELLOW}提取文件 ${OUTPUT_FILE} 到本地...${NC}"
if ! nerdctl cp "${CONTAINER_NAME}:${OUTPUT_FILE}" "./${LOCAL_OUTPUT}"; then
    echo -e "${RED}文件提取失败!请检查路径或容器状态。${NC}"
    exit 1
fi
# 获取当前日期并格式化
DATE=$(date +"%Y%m%d-%H%M%S")
RENAME_FILE="${DATE}-${BRANCH}-container.tar.gz"  # 重命名文件为当前日期时间
# 重命名文件
echo -e "${YELLOW}重命名文件 ${LOCAL_OUTPUT} 为 ${RENAME_FILE}...${NC}"
mv "${LOCAL_OUTPUT}" "${RENAME_FILE}"
# 解压文件
echo -e "${YELLOW}解压文件 ${RENAME_FILE}...${NC}"
if ! tar -zxvf "${RENAME_FILE}"; then
    echo -e "${RED}解压失败!${NC}"
    exit 1
fi
# 上传文件夹到远程服务器
REMOTE_DIR="/home/node/lcs2/container/"  # 目标服务器的目录
HOST="192.168.1.235"
USER="node"
PASSWORD="flyread"
# 备份远程服务器目录 /home/node/lcs2/container/ 排除 logs 文件夹
echo -e "${YELLOW}备份远程目录 /home/node/lcs2/container/ 排除 logs 文件夹...${NC}"
# 在远程服务器上备份 /home/node/lcs2/container/ 并排除 logs 文件夹
BACKUP_FILE="/home/node/node/lcs2-bak/${DATE}-${BRANCH}-container-backup.tar.gz"
echo -e "${YELLOW}在远程服务器上备份目录 /home/node/lcs2/container/...${NC}"
sshpass -p "$PASSWORD" ssh $USER@$HOST "tar --exclude='logs' -czvf ${BACKUP_FILE} -C /home/node/lcs2/container/ ."
if [ $? -eq 0 ]; then
    echo -e "${GREEN}远程目录备份成功,已保存为 ${BACKUP_FILE}${NC}"
else
    echo -e "${RED}远程备份失败!${NC}"
    exit 1
fi
echo -e "${YELLOW}上传文件夹 container/workspace 和 Version-build* 到远程服务器...${NC}"
# 使用 sshpass 上传 `container/workspace` 和 `Version-build*`
if ! sshpass -p "$PASSWORD" scp -r container/modules "$USER@$HOST:$REMOTE_DIR"; then
    echo -e "${RED}上传 container/modules 失败!${NC}"
    exit 1
fi
if ! sshpass -p "$PASSWORD" scp -r container/lib "$USER@$HOST:$REMOTE_DIR"; then
    echo -e "${RED}上传 container/lib 失败!${NC}"
    exit 1
fi
if ! sshpass -p "$PASSWORD" scp -r container/Version-build* "$USER@$HOST:$REMOTE_DIR"; then
    echo -e "${RED}上传 Version-build* 文件失败!${NC}"
    exit 1
fi
# 成功提示
echo -e "${GREEN}文件上传成功!${NC}"
# 执行远程命令
echo -e "${YELLOW}执行远程命令: node.sh -i container -s...${NC}"
if ! sshpass -p 'flyread' ssh node@192.168.1.235 'cd /home/node/lcs2/container/ && ./stop.sh'; then
    echo -e "${RED}执行/home/node/lcs2/container/stop.sh 失败!${NC}"
    exit 1
fi
echo -e "${YELLOW}执行远程命令: node.sh -i container start...${NC}"
if ! sshpass -p 'flyread' ssh node@192.168.1.235 'cd /home/node/lcs2/container/ && ./start.sh'; then
    echo -e "${RED}执行 /home/node/lcs2/container/start.sh 失败!${NC}"
    exit 1
fi
# 清理临时容器
#nerdctl rm -f "$CONTAINER_NAME"
#!/bin/bash
# 定义颜色用于日志输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 检查参数
if [ -z "$1" ]; then
    echo -e "${RED}错误: 未传入分支号!${NC}"
    echo "用法: $0 <分支号>"
    exit 1
fi
# 读取分支号
BRANCH="$1"
IMAGE_NAME="lcs1:${BRANCH}"   # 镜像名称
CONTAINER_NAME="lcs1_build_temp"  # 临时容器名称
OUTPUT_FILE="projects/template.tar.gz"  # 文件在容器中的路径
# 获取当前日期并格式化
DATE=$(date +"%Y%m%d-%H%M%S")
LOCAL_OUTPUT="template.tar.gz"  # 保持原文件名
# 创建临时 Dockerfile,动态传递 BRANCH
echo -e "${YELLOW}创建动态 Dockerfile...${NC}"
cat > Dockerfile.temp <<EOF
FROM git.libsaas.repo/dbase/java8build:latest
ENV LANG=C.UTF-8
ARG BRANCH=$BRANCH
RUN ulimit -n 65536 && \\ 
    wget --no-check-certificate https://机器/lcs/lcs1-all/raw/branch/\$BRANCH/build/build_lcs1.sh && \\
    chmod +x ./build_lcs1.sh && \\
    ./build_lcs1.sh \$BRANCH
EOF
# 清理临时容器
echo -e "${YELLOW}清理临时容器...${NC}"
if ! nerdctl rm -f "$CONTAINER_NAME"; then
    echo -e "${RED}清理容器失败!${NC}"
    exit 1
fi
# 构建镜像
echo -e "${YELLOW}开始构建镜像: ${IMAGE_NAME}${NC}"
if ! nerdctl build --no-cache -t "$IMAGE_NAME" -f Dockerfile.temp .; then
    echo -e "${RED}镜像构建失败!${NC}"
    rm -f Dockerfile.temp
    exit 1
fi
rm -f Dockerfile.temp
# 创建并启动容器
echo -e "${YELLOW}创建并启动临时容器...${NC}"
if ! nerdctl create --name "$CONTAINER_NAME" "$IMAGE_NAME" /bin/bash; then
    echo -e "${RED}容器创建失败!${NC}"
    exit 1
fi
if ! nerdctl start "$CONTAINER_NAME"; then
    echo -e "${RED}容器启动失败!${NC}"
    nerdctl rm -f "$CONTAINER_NAME"
    exit 1
fi
# 提取文件
echo -e "${YELLOW}提取文件 ${OUTPUT_FILE} 到本地...${NC}"
if ! nerdctl cp "${CONTAINER_NAME}:${OUTPUT_FILE}" "./${LOCAL_OUTPUT}"; then
    echo -e "${RED}文件提取失败!请检查路径或容器状态。${NC}"
    nerdctl rm -f "$CONTAINER_NAME"
    exit 1
fi
# 获取当前日期并格式化
DATE=$(date +"%Y%m%d-%H%M%S")
RENAME_FILE="${DATE}-${BRANCH}-template.tar.gz"  # 重命名文件为当前日期时间
# 重命名文件
echo -e "${YELLOW}重命名文件 ${LOCAL_OUTPUT} 为 ${RENAME_FILE}...${NC}"
mv "${LOCAL_OUTPUT}" "${RENAME_FILE}"
# 解压文件
echo -e "${YELLOW}解压文件 ${RENAME_FILE}...${NC}"
if ! tar -zxvf "${RENAME_FILE}"; then
    echo -e "${RED}解压失败!${NC}"
    exit 1
fi
# 上传文件夹到远程服务器
REMOTE_DIR="/home/node/node/template/"  # 目标服务器的目录
HOST="192.168.1.235"
USER="node"
PASSWORD="flyread"
# 如果第二个参数为 bak,则执行备份
if [ "$2" == "bak" ]; then
    echo -e "${YELLOW}备份远程目录 /home/node/node/template/ 排除 log 文件夹...${NC}"
    # 在远程服务器上备份 /home/node/node/template/ 并排除 log 文件夹
    BACKUP_FILE="/home/node/node/lcs1-bak/${DATE}-${BRANCH}-template-backup.tar.gz"
    echo -e "${YELLOW}在远程服务器上备份目录 /home/node/node/template/...${NC}"
    sshpass -p "$PASSWORD" ssh $USER@$HOST "tar --exclude='log' -czvf ${BACKUP_FILE} -C /home/node/node/template ."
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}远程目录备份成功,已保存为 ${BACKUP_FILE}${NC}"
    else
        echo -e "${RED}远程备份失败!${NC}"
    fi
else
    echo -e "${YELLOW}没有提供 'bak' 参数,跳过备份操作。${NC}"
fi
echo -e "${YELLOW}上传文件夹 template/workspace 和 Version-build* 到远程服务器...${NC}"
# 使用 sshpass 上传 `template/workspace` 和 `Version-build*`
if ! sshpass -p "$PASSWORD" scp -r template/workspace "$USER@$HOST:$REMOTE_DIR"; then
    echo -e "${RED}上传 template/workspace 失败!${NC}"
    exit 1
fi
if ! sshpass -p "$PASSWORD" scp -r template/Version-build* "$USER@$HOST:$REMOTE_DIR"; then
    echo -e "${RED}上传 Version-build* 文件失败!${NC}"
    exit 1
fi
# 成功提示
echo -e "${GREEN}文件上传成功!${NC}"
# 执行远程命令
echo -e "${YELLOW}执行远程命令: node.sh -i template -s...${NC}"
if ! sshpass -p 'flyread' ssh node@192.168.1.235 'node.sh -i template -s'; then
    echo -e "${RED}执行 node.sh -i template -s 失败!${NC}"
    exit 1
fi
echo -e "${YELLOW}执行远程命令: node.sh -i template start...${NC}"
if ! sshpass -p 'flyread' ssh node@192.168.1.235 'node.sh -i template start'; then
    echo -e "${RED}执行 node.sh -i template start 失败!${NC}"
    exit 1
fi
# 清理临时容器
nerdctl rm -f "$CONTAINER_NAME"
效果图

 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号