upgrade.sh脚本说明
脚本内容
请使用您环境下的实际参数替换脚本中的参数变量。
#!/bin/bash # 项目id project_id='{项目id}' # 应用id application_id='{应用id}' # 组件id component_id='{组件id}' # 分批信息 rolling_release_batches=1 # 部署类型 deploy_type="package" ### 方法简要说明: ### 1. 查找一个字符串,如下述代码里面的key所示。如果没找到,则直接返回defaultValue。 ### 2. 查找最近的冒号(:),找到后则冒号后的内容即为值的内容。 ### 3. 如果有多个同名key,只打印第一个value。 ### ### 4. params: json, key, defaultValue function getJsonValuesByAwk() { awk -v json="$1" -v key="$2" -v defaultValue="$3" 'BEGIN{ foundKeyCount = 0 pos = match(json, "\""key"\"[ \\t]*?:[ \\t]*"); if (pos == 0) {if (foundKeyCount == 0) {print defaultValue;} exit 0;} ++foundKeyCount; start = 0; stop = 0; layer = 0; for (i = pos + length(key) + 1; i <= length(json); ++i) { lastChar = substr(json, i - 1, 1) currChar = substr(json, i, 1) if (start <= 0) { if (lastChar == ":") { start = currChar == " " ? i + 1: i; if (currChar == "{" || currChar == "[") { layer = 1; } } } else { if (currChar == "{" || currChar == "[") { ++layer; } if (currChar == "}" || currChar == "]") { --layer; } if ((currChar == "," || currChar == "}" || currChar == "]") && layer <= 0) { stop = currChar == "," ? i : i + 1 + layer; break; } } } if (start <= 0 || stop <= 0 || start > length(json) || stop > length(json) || start >= stop) { if (foundKeyCount == 0) {print defaultValue;} exit 0; } else { print substr(json, start, stop-start); } }' } #查询组件信息 function getComponentInfo() { # 查询组件信息 component_detials=`hcloud ServiceStage ShowComponentInfo/v3 --project_id="$project_id" --application_id="$application_id" --component_id="$component_id"` # 打印组件信息 echo "$component_detials" # 获取组件当前的名称 test_name=`getJsonValuesByAwk "$component_detials" "name" "defaultValue"` lenj=${#test_name} component_name=${test_name:1:lenj-2} echo "name : $component_name" data_time=$(date +%Y.%m%d.%H%M) seconds=$(date +%S) component_version="${data_time}${seconds:1:1}" echo "version: $component_version" } # 镜像部署使用场景 function swr_image_upgrade() { # 项目打包后生成的镜像:镜像名称:版本名称 machine_image_name='java-test:v1' # 上传到swr的镜像仓库路径 swr_image_url='{镜像仓库地址}/{组织名称}/{镜像名称}:{版本}' # AK 用于登录swr镜像仓库 AK='BMCKUPO9HZMI6BRDJGBD' #SWR登录密钥,用于登录SWR镜像仓库 SK='{SWR登录密钥}' # SWR镜像仓库地址 swr_url='{SWR镜像仓库地址}' #region名称 region="{region名称}" echo "upload image to swr" docker tag "$machine_image_name" "$swr_image_url" login_secret=`printf "$AK" | openssl dgst -binary -sha256 -hmac "$SK" | od -An -vtx1 | sed 's/[ \n]//g' | sed 'N;s/\n//'` login_result=`docker login -u "$region"@"$AK" -p "$login_secret" "$swr_url"` # 打印登录swr镜像仓库结果 echo "$login_result" push_result=`docker push "$swr_image_url"` # 打印推送镜像结果 #echo "$push_result" logout_result=`docker logout "$swr_url"` # 打印退出登录swr镜像仓库的结果 echo "$logout_result" # 清除所有的历史记录,历史记录中可能会存在swr登录密钥信息,可以使用该命令清理所有的历史记录 #history -c echo "upgrade component" action_result=`hcloud ServiceStage ModifyComponent/v3 --project_id="$project_id" --application_id="$application_id" --component_id="$component_id" --version="$component_version" --runtime_stack.name="Docker" --runtime_stack.type="Docker" --source.kind="image" --source.storage="swr" --source.url="$swr_image_url" --name="$component_name" --deploy_strategy.rolling_release.batches=$rolling_release_batches --deploy_strategy.type="RollingRelease" ` } # jar包部署使用场景 function obs_jar_upgrade() { # obsutil安装的可执行文件绝对路径 obsutil='/root/tools/obsutil/obsutil_linux_amd64_5.4.6/obsutil' # obs桶名 bucket='obs://{obs桶名}' echo "upload jar to obs" # 将项目下构建生成的jar包上传到obs obs_result=`"$obsutil" cp ./target/*.jar "$bucket"` # 打印上传结果 echo "$obs_result" # 上传到obs的jar包链接 obs_jar_url='obs://{obs桶名}/{Jar包名称}' echo "upgrade component" action_result=`hcloud ServiceStage ModifyComponent/v3 --project_id="$project_id" --application_id="$application_id" --component_id="$component_id" --version="$component_version" --runtime_stack.name="OpenJDK8" --runtime_stack.type="Java" --source.kind="package" --source.storage="obs" --source.url="$obs_jar_url" --name="$component_name" --deploy_strategy.rolling_release.batches=$rolling_release_batches --deploy_strategy.type="RollingRelease" ` } # 每隔15秒查询一次job状态,直到job完成 function waitDeployFinish() { sleep 10s id="$1" leni=${#id} id=${id:1:leni-2} echo "job_id= $id" job_status="" while [[ "$job_status" != "SUCCEEDED" ]]; do job_status_result=`hcloud ServiceStage ShowJobDetail/v2 --project_id="$project_id" --job_id="$id"` job_status=`getJsonValuesByAwk "$job_status_result" "EXECUTION_STATUS" "defaultValue"` lenj=${#job_status} job_status=${job_status:1:lenj-2} echo "$job_status" if [[ "$job_status" != "RUNNING" && "$job_status" != "SUCCEEDED" ]]; then echo '部署失败' echo "$job_status_result" return fi sleep 15s done echo '部署成功' } function upgradeTask() { if [[ "$deploy_type" == "package" ]]; then obs_jar_upgrade elif [[ "$deploy_type" == "image" ]]; then swr_image_upgrade else return fi # 打印升级组件的结果 echo "$action_result" # 获取结果中的job_id job_id=`getJsonValuesByAwk "$action_result" "job_id" "defaultValue"` echo "$job_id" # 等待升级完成 waitDeployFinish "$job_id" } function main() { getComponentInfo upgradeTask } main
脚本参数说明
参数 |
是否必须 |
参数类型 |
描述 |
---|---|---|---|
region |
是 |
String |
Region名称。获取方法,请参考参数值获取。 |
project_id |
是 |
String |
项目ID。获取方法,请参考参数值获取。 |
application_id |
是 |
String |
应用ID。获取方法,请参考参数值获取。 |
component_id |
是 |
String |
组件ID。获取方法,请参考参数值获取。 |
rolling_release_batches |
是 |
int |
分批部署批次。 |
deploy_type |
是 |
String |
部署类型。
|
obsutil |
否 |
String |
当使用软件包部署如jar包部署时为必选参数,上传jar包到obs的工具安装的绝对路径。例如:/root/tools/obsutil/obsutil_linux_amd64_5.4.6/obsutil。 |
bucket |
否 |
String |
当使用软件包部署时为必选参数,上传到obs的桶路径,格式为obs://{桶名称},例如:obs://obs-mzc。 |
obs_jar_url |
否 |
String |
当使用软件包部署时为必选参数。软件包上传obs后的链接,格式为obs://{桶名}/{软件包名}。例如,obs://obs-mzc/spring-demo-0.0.1-SNAPSHOT.jar。 |
machine_image_name |
否 |
String |
当使用镜像部署时为必选参数,Jenkins打包构建后生成的镜像,格式为:{镜像名称}:{版本},例如:java-test:v1。 |
swr_image_url |
否 |
String |
当使用镜像部署时为必选参数,上传到SWR镜像仓库的镜像包路径,格式为:{镜像仓库地址}/{组织名称}/{镜像包名称}:{版本},其中SWR镜像仓库地址格式为:swr.{区域所属项目名称}.myhuaweicloud.com。 |
AK |
否 |
String |
当使用镜像部署时为必选参数。访问密钥ID,即AK,用于登录SWR镜像仓库。获取方法,请参考访问密钥。 |
SK |
否 |
String |
当使用镜像部署时为必选参数。与访问密钥ID(AK)结合使用的密钥,即SK,用于登录SWR镜像仓库。获取方法,请参考访问密钥。 |
login_secret |
否 |
String |
当使用镜像部署时为必选参数。SWR镜像仓库的登录密钥,用于登录SWR镜像仓库。执行如下命令,返回的结果就是登录密钥: printf "{AK}" | openssl dgst -binary -sha256 -hmac "{SK}" | od -An -vtx1 | sed 's/[ \n]//g' | sed 'N;s/\n//' {AK}、{SK}请替换为已获取到的AK、SK的值。 |
swr_url |
否 |
String |
当使用镜像部署时为必选参数。SWR镜像仓库地址,格式为:swr.{区域所属项目名称}.myhuaweicloud.com |