更新时间:2023-10-30 GMT+08:00

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

部署类型。

  • package表示软件包部署。
  • image表示镜像部署。

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

参数值获取

  • 获取region、project_id
    1. 登录ServiceStage控制台。
    2. 鼠标移动到右上角登录用户名上,在下拉菜单选择“我的凭证”。
    3. 查看所属区域的项目和项目ID,即为对应的region和project_id值。
  • 获取application_id、component_id
    1. 登录ServiceStage控制台。
    2. 单击“组件管理”。
    3. 单击对应的组件名称。
    4. “概览”界面的“配置详情”区域,单击“组件配置”。

      查看CAS_APP_ID、CAS_APPLICATION_ID的值,即为application_id、component_id。