package-docker.sh
5.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/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