package-docker.sh 5.51 KB
#!/bin/bash
# 统一打包脚本
echo "开始打包,当前目录:"
pwd

PROJECT_NAME=$(grep -m 1 "<artifactId>" pom.xml | sed -n 's:.*<artifactId>\(.*\)</artifactId>.*:\1:p')

# 制品库路径前缀配置
REPOSITORY_PACKAGES="VVAS-DataCenter/Store"
FINAL_NAME="${PROJECT_NAME}"

# 获取版本号
TIMESTAMP=$(date +%Y%m%d%H%M%S)

if [ -z "${SPUG_GIT_BRANCH}" ]; then
    SPUG_GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")
fi
if [ -z "${SPUG_GIT_COMMIT_ID}" ]; then
    SPUG_GIT_COMMIT_ID=$(git rev-parse HEAD 2>/dev/null | cut -c1-8 || echo "unknown")
fi

##### 环境变量替换 ####################
echo "[debug]所有可用变量列表:"
env | grep SPUG
# 简化一些变量的写法
SERVICE_RUN_DIR_KEY=_SPUG_GLOBAL_CONFIG_${SPUG_APP_KEY^^}_RUN_DIR
SERVICE_RUN_DIR=${!SERVICE_RUN_DIR_KEY}

SERVICE_JAR_FILE_NAME_KEY=_SPUG_GLOBAL_CONFIG_${SPUG_APP_KEY^^}_JAR_FILE_NAME
SERVICE_JAR_FILE_NAME=${!SERVICE_JAR_FILE_NAME_KEY}

SERVICE_SERVER_PORT_KEY=_SPUG_GLOBAL_CONFIG_${SPUG_APP_KEY^^}_SERVER_PORT
SERVICE_SERVER_PORT=${!SERVICE_SERVER_PORT_KEY}

SERVICE_JAR_RUN_PARAMS_KEY=_SPUG_GLOBAL_CONFIG_${SPUG_APP_KEY^^}_JAR_RUN_PARAMS
SERVICE_JAR_RUN_PARAMS=${!SERVICE_JAR_RUN_PARAMS_KEY}

BASE_IMAGES_NAME_KEY=_SPUG_GLOBAL_CONFIG_${SPUG_APP_KEY^^}_BASE_IMAGES_NAME
BASE_IMAGES_NAME=${!BASE_IMAGES_NAME_KEY}
replace_vars_in_file() {
    local template_file="$1"
    local output_file="$2"
    local var_pattern='\$\{([a-zA-Z_][a-zA-Z0-9_]*)\}'

    local temp_file
    if [[ "$template_file" == "$output_file" ]]; then
        temp_file="$(mktemp)"
        trap 'rm -f "$temp_file"' EXIT
        output_file="$temp_file"
    fi

    # 确保模板文件存在
    if [[ ! -f "$template_file" ]]; then
        echo "Error: Template file '$template_file' not found" >&2
        return 1
    fi

    # read -r读不到最后一行,需要手动增加一个空行
    printf '\n' >>"$template_file"

     # 逐行处理模板文件
        while IFS= read -r line; do
            search_line="$line"
            while [[ "$search_line" =~ $var_pattern ]]; do
                var_spec="${BASH_REMATCH[1]}"
                if [[ "$var_spec" =~ ^(.*):(.*)$ ]]; then
                    var_name="${BASH_REMATCH[1]}"
                    default_val="${BASH_REMATCH[2]}"
                    value="${!var_name:-$default_val}"
                else
                    var_name="$var_spec"
                    value="${!var_name:-""}"
                fi
                line="${line//\$\{$var_spec\}/$value}"
                search_line="${search_line//\$\{$var_spec\}/PLACEHOLDER}"
            done
            echo "$line"
        done <"$template_file" >"$output_file"

    sed -i 's/\r$//' $output_file
    # 如果是临时文件情况,移动回原位置
    if [[ "$template_file" == "$1" && "$output_file" == "$temp_file" ]]; then
        mv "$temp_file" "$template_file"
    elif [[ "$template_file" != "$2" ]]; then
        rm -f "$template_file"
    fi
}
##### 环境变量替换 ####################

VERSION="${SPUG_GIT_BRANCH}-${SPUG_GIT_COMMIT_ID:0:6}"

echo "开始打包: ${FINAL_NAME}, 版本号:${VERSION}"

# 清理并创建临时目录
TEMP_DIR="target/temp-packaging"
rm -rf ${TEMP_DIR}
mkdir -p ${TEMP_DIR}

# 1. 执行Maven打包
echo "步骤1: 检查是否已打jar包: target/*.jar "
if ls target/*.jar 1> /dev/null 2>&1; then
    echo "已存在JAR包,继续"
else
    echo "[error]未找到JAR包,请先手动执行mvn package打包..."
    ls -ltr target/
    exit 1
fi

# 2. 复制build目录内容到临时目录
echo "步骤2: 复制dockerfile及配置项..."
cp -r build/bin/Dockerfile ${TEMP_DIR}/
cp -r build/config/* ${TEMP_DIR}/

# 3. 复制新生成的jar包到临时目录,并重命名为app.jar
echo "步骤3: 复制JAR文件..."
cp target/*.jar ${TEMP_DIR}/

echo "步骤3.1: 替换变量: Dockerfile 和 application.properties文件 "
#(理论上应该是cd阶段替换的,ci阶段仅保留模板变量,先这样处理)
replace_vars_in_file  ${TEMP_DIR}/Dockerfile ${TEMP_DIR}/Dockerfile
replace_vars_in_file  ${TEMP_DIR}/application-pro.properties.template ${TEMP_DIR}/application-pro.properties
cat ${TEMP_DIR}/Dockerfile
cat ${TEMP_DIR}/application-pro.properties

# 4. 创建最终的tar.gz包
echo "步骤4: 创建docker容器..."
## docker的tag名字只能小写字符
docker build -t ${FINAL_NAME,,}:${VERSION,,} ${TEMP_DIR}/
docker save -o ${TEMP_DIR}/${FINAL_NAME}.tar ${FINAL_NAME,,}:${VERSION,,}

# 最终的包只留docker镜像+配置文件
rm -fr ${TEMP_DIR}/*.jar
rm -fr ${TEMP_DIR}/Dockerfile

tar -czf target/${FINAL_NAME}-docker.tar.gz -C ${TEMP_DIR} .


# 5. 清理临时文件
rm -rf ${TEMP_DIR}

echo "打包完成: target/${FINAL_NAME}-docker.tar.gz"

# 6. 上传到阿里云OSS
echo "步骤5: 上传到阿里云OSS..."

# 构建OSS路径
OSS_BUCKET="oss://spug-software/vion/$REPOSITORY_PACKAGES/${PROJECT_NAME}-docker/$VERSION.tar.gz"

# 使用ossutil上传文件
echo "正在上传到: $OSS_BUCKET"
if ossutil cp -f target/${FINAL_NAME}-docker.tar.gz $OSS_BUCKET; then
    echo "上传成功,可访问地址进行部署发布: xx"
    echo "部署版本号:${VERSION}"
else
    echo "上传失败,请检查阿里的云存储工具ossUtil是否存在且正常配置."
    echo "ossutil安装: https://help.aliyun.com/zh/oss/developer-reference/install-ossutil2?spm=a2c4g.11186623.help-menu-31815.d_1_2_1_0.1108bca1ocMOlp"
    echo "ossutil配置:[default]
                    accessKeyId=LTAI5tNySTQ71SuojBPaem2H
                    accessKeySecret=U6katIF9LTPS7emIO2pVDNeJLN6MeX
                    region=cn-beijing"
    exit 1
fi