weex run android 后报错:Environment variable $ANDROID_HOME not found !

本文介绍了解决weexrunandroid命令执行时报错的方法。针对不同操作系统,提供了配置环境变量的具体步骤,包括类Unix系统下的.bash_profile配置及Windows系统的环境变量设置。

weex run android 后报错:Environment variable $ANDROID_HOME not found !
解决方案:

(1)类unix下开发:

vi ~/.bash_profile
# step.2
ANDROID_HOME={你SDK的目录地址,比如/Users/Android/sdk}
export ANDROID_HOME
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
# step.3 保存 ~/.bash_profile 文件中的修改
# step.4 验证,adb是否起作用,如果不起作用就执行如下命令
source ~/.bash_profile

(2)windows下开发:

  • 右击计算机,选择属性,选择高级系统设置,选择环境变量
  • 在下面的系统变量中新建,变量名:ANDROID_HOME,变量值:D:\sdk(你android SDK的所在目录)
  • 在上面的用户变量中修改 Path 变量的后面,新增两个值,%ANDROID_HOME%\platform-tools%ANDROID_HOME%\tools,(注:两个值之间用;隔开)
  • 点击确定,重启命令行窗口,运行 weex run android
#!/usr/bin/env bash # # Copyright (c) 2023, TP-Link Corporation Limited. All rights reserved. # set -o errexit -o nounset -o pipefail DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)" HAWKFIRE_CONFIG="${DIR}/.hawkfire.yaml" PROJECT_NAME=$(yq r "${HAWKFIRE_CONFIG}" metadata.name) MAVEN_PROJECT_VERSION="" MICROSERVICE_K8S_VALUES="" PROG="server.sh" USAGE=" Usage: ${PROG} <command> [action] ${PROG} build # build server ${PROG} docker # actions for docker ${PROG} helm-chart # actions for helm-chart ${PROG} deploy [environment] [region] [version_override] # deploy a microservice ${PROG} --help " DOCKER_USAGE=" Usage: ${PROG} docker make # initialize distribution and artifacts directory ${PROG} docker build [version_override] # build docker container ${PROG} docker release [version_override] # release the docker container to AWS ECR ${PROG} docker --help " HELM_CHART_USAGE=" Usage: ${PROG} helm-chart build [environment] [region] [version_override] # build and package helm chart with default values from specified environment and region ${PROG} helm-chart publish [version_override] # publish the current chart to prd-tplink-nbu chart repository ${PROG} helm-chart delete [version] # deletes the version of the chart from the repository ${PROG} helm-chart --help " function error { echo -e "$1" >&2 exit 1 } function usage-help { case $# in 0) error "${USAGE}";; 1) case $1 in docker) error "${DOCKER_USAGE}";; helm-chart) error "${HELM_CHART_USAGE}";; *) usage-help;; esac ;; esac } function get-three-digit-version-number { OLD_VERSION=$1 IFS_OLD=${IFS} IFS="." VERSION_ARR=(${OLD_VERSION}) IFS=${IFS_OLD} if [[ ${#VERSION_ARR[@]} -eq 3 ]]; then echo ${OLD_VERSION} return fi if [[ ${#VERSION_ARR[@]} -gt 4 ]]; then echo ${OLD_VERSION} return fi VERSION_FIRST=${VERSION_ARR[0]} VERSION_SECOND=${VERSION_ARR[1]} VERSION_THIRD=${VERSION_ARR[2]} VERSION_FOURTH_STR=${VERSION_ARR[3]} VERSION_FORTH_NUMBER_LENGTH=${#VERSION_FOURTH_STR} VERSION_FORTH_WORD="" if [ "$VERSION_FORTH_NUMBER_LENGTH" -gt 3 ];then VERSION_FOURTH="${VERSION_FOURTH_STR%-*}" VERSION_FORTH_WORD="-""${VERSION_FOURTH_STR#*-}" else VERSION_FOURTH=${VERSION_FOURTH_STR} fi VERSION_FORTH_NUMBER_LENGTH=${#VERSION_FOURTH} if [ "$VERSION_FORTH_NUMBER_LENGTH" -eq 1 ];then VERSION_FORTH_NUMBER_NEW="00""${VERSION_FOURTH%-*}" elif [ "$VERSION_FORTH_NUMBER_LENGTH" -eq 2 ];then VERSION_FORTH_NUMBER_NEW="0""${VERSION_FOURTH%-*}" else VERSION_FORTH_NUMBER_NEW="${VERSION_FOURTH%-*}" fi local NEW_VERSION="${VERSION_FIRST}"".""${VERSION_SECOND}"".""${VERSION_THIRD}""${VERSION_FORTH_NUMBER_NEW}""${VERSION_FORTH_WORD}" echo ${NEW_VERSION} } function get-maven-project-version { if [[ -z "${MAVEN_PROJECT_VERSION}" ]]; then MAVEN_PROJECT_VERSION=$(mvn -Psmb-nexus -Pcloud-based-build -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec) MAVEN_PROJECT_VERSION_NEW=$(get-three-digit-version-number ${MAVEN_PROJECT_VERSION}) echo "# Maven Project Version NEW: ${MAVEN_PROJECT_VERSION_NEW}" fi } function get-microservice-k8s-values { local K8S_VALUES_REPO=$(printenv SMB_K8S_VALUES_REPO) if [[ -z "${K8S_VALUES_REPO}" ]]; then error "Please configure the environment variable <SMB_K8S_VALUES_REPO>" fi MICROSERVICE_K8S_VALUES="${K8S_VALUES_REPO}/${PROJECT_NAME}" if [[ ! -d "${MICROSERVICE_K8S_VALUES}" ]]; then error "The K8S-Values of Microservice does not exist! <${MICROSERVICE_K8S_VALUES}>" fi } function server-build { echo "# Server Build" mvn -T 64 clean install -Pcloud-based-build -DskipTests=true -e get-maven-project-version docker-make } function docker { local module="docker" local IMAGE_NAME="smb/${PROJECT_NAME}" local DOCKER_REPO="746166756265.dkr.ecr.ap-southeast-1.amazonaws.com/${IMAGE_NAME}" local DOCKER_LOGIN=$(aws ecr get-login --no-include-email --region ap-southeast-1 --profile prd) case $# in 0) usage-help "${module}";; *) get-maven-project-version; case $1 in make) docker-make;; build) shift; docker-build "$@";; release) shift; docker-release "$@";; *) echo "Unknown arguments: $*"; usage-help "${module}";; esac ;; esac } function docker-dev-test { local module="docker" local IMAGE_NAME="smb/${PROJECT_NAME}" local DOCKER_REPO="242777933053.dkr.ecr.ap-southeast-1.amazonaws.com/${IMAGE_NAME}" local DOCKER_LOGIN=$(aws ecr get-login --no-include-email --region ap-southeast-1 --profile dev) local DOCKER_PRD_LOGIN=$(aws ecr get-login --no-include-email --registry-ids 746166756265 --region ap-southeast-1 --profile dev) eval "command ${DOCKER_PRD_LOGIN}" case $# in 0) usage-help "${module}";; *) get-maven-project-version; case $1 in make) docker-make;; build) shift; docker-build "$@";; release) shift; docker-release "$@";; *) echo "Unknown arguments: $*"; usage-help "${module}";; esac ;; esac } function docker-make { local ARTIFACTS_DIR="artifacts" local BUILD_DIR="dist" local PROJECT_VERSION="${MAVEN_PROJECT_VERSION}" echo "# Maven Project Version: ${PROJECT_VERSION}" echo "# Initializing distribution and artifacts directory..." if [[ -d "./${BUILD_DIR}" ]]; then rm -rf "./${BUILD_DIR}" fi if [[ -d "./${ARTIFACTS_DIR}" ]]; then rm -rf "./${ARTIFACTS_DIR}" fi mkdir -p "./${BUILD_DIR}" mkdir -p "./${ARTIFACTS_DIR}" local TARGET_DIR="${BUILD_DIR}" local TARGET_LIB_DIR="${TARGET_DIR}/lib" local DISTRIBUTION_NAME="${PROJECT_NAME}.zip" echo "# Creating distribution ..." if [[ -d "${TARGET_DIR}" ]]; then rm -rf "./${TARGET_DIR}" fi echo "# Copying libraries ..." mkdir -p "${TARGET_LIB_DIR}" cp "./target/${PROJECT_NAME}-${MAVEN_PROJECT_VERSION}.jar" "${TARGET_LIB_DIR}/server.jar" local RUNTIME_SCRIPTS_DIR="./src/main/container/deploy/scripts" if [[ -d "${RUNTIME_SCRIPTS_DIR}" ]]; then echo "# Configuring runtime scripts ..." cp -a "${RUNTIME_SCRIPTS_DIR}" "${TARGET_DIR}" chmod -R +x "./${TARGET_DIR}/scripts" fi echo "# Creating distribution archive" cd "./${BUILD_DIR}" zip -dgqr -X "../${ARTIFACTS_DIR}/${DISTRIBUTION_NAME}" * cd "${DIR}" echo "# Distribution created successfully: ${DISTRIBUTION_NAME}" export DISTRIBUTION_NAME } function docker-build { docker-make local IMAGE_NAME=${IMAGE_NAME} local DOCKER_REPO=${DOCKER_REPO} local DOCKER_LOGIN=${DOCKER_LOGIN} local VERSION_OVERRIDE=false local PROJECT_VERSION=${MAVEN_PROJECT_VERSION_NEW} if [[ "$#" -gt 0 ]] && [[ -n "$1" ]]; then PROJECT_VERSION=$(get-three-digit-version-number $1) VERSION_OVERRIDE=true fi local MULTI_PLATFORM="SINGLE" if [[ "$#" -gt 1 ]] && [[ -n "$2" ]]; then MULTI_PLATFORM=$2 fi echo "# Docker login" eval "command ${DOCKER_LOGIN}" if [[ "${MULTI_PLATFORM}" = "MULTI" ]]; then echo "多平台镜像构建..." # 多平台构建镜像 echo "${IMAGE_NAME}:${PROJECT_VERSION}" command docker buildx build -t="${IMAGE_NAME}:${PROJECT_VERSION}-amd64" -f Dockerfile --platform=linux/amd64 -o type=docker . command docker buildx build -t="${IMAGE_NAME}:${PROJECT_VERSION}-arm64" -f Dockerfile --platform=linux/arm64 -o type=docker . # 给镜像打标签 command docker tag "${IMAGE_NAME}:${PROJECT_VERSION}-amd64" "${DOCKER_REPO}:${PROJECT_VERSION}-amd64" command docker tag "${IMAGE_NAME}:${PROJECT_VERSION}-arm64" "${DOCKER_REPO}:${PROJECT_VERSION}-arm64" else # 单平台构建镜像 echo "${IMAGE_NAME}:${PROJECT_VERSION}" command docker build -t="${IMAGE_NAME}:${PROJECT_VERSION}" . # 给镜像打标签 command docker tag "${IMAGE_NAME}:${PROJECT_VERSION}" "${DOCKER_REPO}:${PROJECT_VERSION}" if [[ "${VERSION_OVERRIDE}" = false ]]; then command docker tag "${IMAGE_NAME}:${PROJECT_VERSION}" "${DOCKER_REPO}:latest" fi fi echo "# Docker Built, Repo: ${DOCKER_REPO}, Version: ${PROJECT_VERSION}" } function docker-release { local DOCKER_REPO=${DOCKER_REPO} local VERSION_OVERRIDE=false local PROJECT_VERSION=${MAVEN_PROJECT_VERSION_NEW} if [[ "$#" -gt 0 ]] && [[ -n "$1" ]]; then PROJECT_VERSION=$(get-three-digit-version-number $1) VERSION_OVERRIDE=true fi local MULTI_PLATFORM="SINGLE" if [[ "$#" -gt 1 ]] && [[ -n "$2" ]]; then MULTI_PLATFORM=$2 fi local LOCAL_IMAGE_EXISTS=$(command docker images | grep "${DOCKER_REPO}.*${PROJECT_VERSION}") if [[ -z "${LOCAL_IMAGE_EXISTS}" ]]; then error "Docker image is not available locally. You may want to build it using > ${PROG} docker build [version_override]" fi if [[ "${MULTI_PLATFORM}" = "MULTI" ]]; then echo "多平台镜像推送..." command docker push "${DOCKER_REPO}:${PROJECT_VERSION}-amd64" command docker push "${DOCKER_REPO}:${PROJECT_VERSION}-arm64" command docker manifest create "${DOCKER_REPO}:${PROJECT_VERSION}" "${DOCKER_REPO}:${PROJECT_VERSION}-amd64" "${DOCKER_REPO}:${PROJECT_VERSION}-arm64" command docker manifest inspect "${DOCKER_REPO}:${PROJECT_VERSION}" command docker manifest push "${DOCKER_REPO}:${PROJECT_VERSION}" else command docker push "${DOCKER_REPO}:${PROJECT_VERSION}" if [[ "${VERSION_OVERRIDE}" = false ]]; then command docker push "${DOCKER_REPO}:latest" fi fi echo "# Docker Released, Repo: ${DOCKER_REPO}, Version: ${PROJECT_VERSION}" } function helm-chart { local module="helm-chart" local AWS_DEFAULT_REGION="ap-southeast-1" local AWS_PROFILE="prd" local CHART_ARCHIVE_DIR="${DIR}/artifacts/helm" local CHART_BUILD_DIR="${DIR}/dist/helm" local CHART_OUTPUT_DIR="${DIR}/dist/generate" case $# in 0) usage-help "${module}";; *) get-maven-project-version; case $1 in build) shift; helm-chart-build "$@";; publish) shift; helm-chart-publish "$@";; delete) shift; helm-chart-delete "$@";; *) echo "Unknown arguments: $*"; usage-help "${module}";; esac ;; esac } function helm-chart-build { local module="${module}" local ENVIRONMENT="local" local REGION="master" local PROJECT_VERSION="${MAVEN_PROJECT_VERSION_NEW}" case $# in 0) ;; 1) PROJECT_VERSION="$1";; 2) ENVIRONMENT="$1"; REGION="$2";; 3) ENVIRONMENT="$1"; REGION="$2"; PROJECT_VERSION="$3";; *) usage-help "${module}";; esac case ${ENVIRONMENT} in local|dev|dev2|pet|uat|uat2|staging|prd) ;; *) error "Unrecognized Environment: ${ENVIRONMENT}"; usage-help "${module}";; esac case ${REGION} in master|us-east-1|eu-west-1|ap-southeast-1) ;; *) error "Unrecognized Region: ${REGION}"; usage-help "${module}";; esac echo "# Environment: ${ENVIRONMENT}, Region: ${REGION}, Version: ${PROJECT_VERSION}" local CHART_ARCHIVE_DIR=${CHART_ARCHIVE_DIR} local CHART_BUILD_DIR=${CHART_BUILD_DIR} local CHART_OUTPUT_DIR=${CHART_OUTPUT_DIR} get-microservice-k8s-values local MICROSERVICE_K8S_VALUES=${MICROSERVICE_K8S_VALUES} echo "# Initializing Helm-Chart distribution and artifacts directory..." if [[ -d "${CHART_ARCHIVE_DIR}" ]]; then rm -rf "${CHART_ARCHIVE_DIR}" fi if [[ -d "${CHART_OUTPUT_DIR}" ]]; then rm -rf "${CHART_OUTPUT_DIR}" fi if [[ -d "${CHART_BUILD_DIR}" ]]; then rm -rf "${CHART_BUILD_DIR}" fi mkdir -p "${CHART_ARCHIVE_DIR}" mkdir -p "${CHART_BUILD_DIR}" mkdir -p "${CHART_OUTPUT_DIR}" echo "# Updating Helm-Chart Version to ${PROJECT_VERSION}" cp -a "${DIR}/helm/." "${CHART_BUILD_DIR}" sed -i "s/\${version}/${PROJECT_VERSION}/g" "${CHART_BUILD_DIR}/${PROJECT_NAME}/values.yaml" sed -i "s/\${version}/${PROJECT_VERSION}/g" "${CHART_BUILD_DIR}/${PROJECT_NAME}/Chart.yaml" if [[ -d "${MICROSERVICE_K8S_VALUES}" ]]; then echo "# Rendering ${ENVIRONMENT} configs to values.yaml..." RENDER_FILE_ARG="" if [[ -d "${MICROSERVICE_K8S_VALUES}/global" ]]; then RENDER_FILE_ARG+="--from-file=${MICROSERVICE_K8S_VALUES}/global " fi if [[ -d "${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/common" ]]; then RENDER_FILE_ARG+="--from-file=${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/common " fi if [[ -d "${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/config" ]]; then RENDER_FILE_ARG+="--from-file=${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/config " fi kubectl create configmap "${PROJECT_NAME}-config" \ ${RENDER_FILE_ARG} \ --dry-run -o=yaml \ | yq read - data \ | yq prefix - configMap.data \ > "${CHART_BUILD_DIR}/config-map-data.yaml" yq merge -i -x "${CHART_BUILD_DIR}/${PROJECT_NAME}/values.yaml" "${CHART_BUILD_DIR}/config-map-data.yaml" if [[ -f "${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/values.yaml" ]]; then yq merge -i -x "${CHART_BUILD_DIR}/${PROJECT_NAME}/values.yaml" "${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/values.yaml" fi else echo "# Container configs do not exist. Skip rendering..." fi echo "# Packaging Helm-Chart ${PROJECT_NAME} ..." helm package "${CHART_BUILD_DIR}/${PROJECT_NAME}" -d "${CHART_ARCHIVE_DIR}" --version "${PROJECT_VERSION}" helm template "${CHART_BUILD_DIR}/${PROJECT_NAME}" --output-dir "${CHART_OUTPUT_DIR}" } function helm-chart-publish { local CHART_ARCHIVE_DIR=${CHART_ARCHIVE_DIR} local AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} local AWS_PROFILE=${AWS_PROFILE} local NBUCLOUD_REPO=$(helm repo list | grep 'prd-tplink-nbu.*s3://prd-tplinknbu-helm-charts-repository-aps1/charts') echo ${NBUCLOUD_REPO} if [[ -z ${NBUCLOUD_REPO} ]]; then echo "Could not publish chart. 'prd-tplink-nbu' helm repository not found." exit 0 else echo "Found chart repository: ${NBUCLOUD_REPO}" fi helm-chart-build "$@" local LATEST=$(ls -t "${CHART_ARCHIVE_DIR}" | awk '{printf("%s",$0);exit}') echo "# Publishing package ${LATEST} to Chart Repository: prd-tplink-nbu" AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} AWS_PROFILE=${AWS_PROFILE} helm s3 push "${CHART_ARCHIVE_DIR}/${LATEST}" prd-tplink-nbu echo "# Chart Published." } function helm-chart-delete { local AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} local AWS_PROFILE=${AWS_PROFILE} local CHART_VERSION=${MAVEN_PROJECT_VERSION_NEW} if [[ "$#" -gt 0 ]] && [[ -n "$1" ]]; then CHART_VERSION=$1 fi echo "# Deleting Chart ${CHART_VERSION} from repository ..." AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} AWS_PROFILE=${AWS_PROFILE} helm s3 delete "${PROJECT_NAME}" --version "${CHART_VERSION}" prd-tplink-nbu echo "# Chart Deleted." } function deploy { case $# in 2|3) get-maven-project-version;; *) usage-help;; esac local ENVIRONMENT=$1 if [[ -z "${ENVIRONMENT}" ]]; then echo "[environment] is required" exit 0 fi local REGION=$2 if [[ -z "${REGION}" ]]; then echo "[region] is required" exit 0 fi local PROJECT_VERSION=${MAVEN_PROJECT_VERSION_NEW} if [[ "$#" -gt 2 ]] && [[ -n "$3" ]]; then PROJECT_VERSION=$3 fi local KUBECONTEXT="" local EXPECTED_KUBECONTEXT="${ENVIRONMENT}.${REGION}" if [[ "${ENVIRONMENT}" = "dev2" ]]; then EXPECTED_KUBECONTEXT="dev.${REGION}"; fi KUBECONTEXT=$(kubectx -c) if [[ "${KUBECONTEXT}" != "${EXPECTED_KUBECONTEXT}" ]]; then echo "Current KubeContext does not match expected Environment and Region. Expected: ${EXPECTED_KUBECONTEXT}, Current: ${KUBECONTEXT}" exit 0 fi if [[ "${ENVIRONMENT}" = "dev" ]] || [[ "${ENVIRONMENT}" = "dev2" ]] && [[ "${PROJECT_VERSION}" != *-SNAPSHOT ]]; then echo "In DEV test, expected Project Version ends with -SNAPSHOT" exit 0 fi echo "# Server Build" mvn -T 64 clean install -Pcloud-based-build -DskipTests=true -e if [[ "${ENVIRONMENT}" = "dev" ]] || [[ "${ENVIRONMENT}" = "dev2" ]] && [[ "${PROJECT_VERSION}" = *-SNAPSHOT ]]; then docker-dev-test build "${PROJECT_VERSION}" docker-dev-test release "${PROJECT_VERSION}" helm-chart build "${ENVIRONMENT}" "${REGION}" "${PROJECT_VERSION}" local DIR=$(pwd) local NEW_RELEASE_NAME="${PROJECT_NAME}-${PROJECT_VERSION,,}" local DEV_NAMESPACE=default if [[ "${ENVIRONMENT}" = "dev2" ]]; then DEV_NAMESPACE=dev2-omada-common-data-manager; fi local NAMESPACE=$(yq read ${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/values.yaml app.namespace) local PREVIOUS_DEPLOYMENT_NAME=$(kubectl get deployment -n ${NAMESPACE} | grep "${PROJECT_NAME}" | cut -d " " -f 1) local PREVIOUS_RELEASE_NAME=$(kubectl get deployment ${PREVIOUS_DEPLOYMENT_NAME} -o yaml -n ${NAMESPACE} | yq read - 'metadata.annotations."meta.helm.sh/release-name"') helm upgrade --install "${NEW_RELEASE_NAME}" "${DIR}/artifacts/helm/${PROJECT_NAME}-${PROJECT_VERSION}.tgz" --reset-values --namespace ${NAMESPACE} \ --set image.repository="242777933053.dkr.ecr.ap-southeast-1.amazonaws.com/smb/${PROJECT_NAME}" else docker build "${PROJECT_VERSION}" docker release "${PROJECT_VERSION}" helm-chart build "${ENVIRONMENT}" "${REGION}" "${PROJECT_VERSION}" local DIR=$(pwd) helm upgrade --install "${PROJECT_NAME}" "${DIR}/artifacts/helm/${PROJECT_NAME}-${PROJECT_VERSION}.tgz" --reset-values fi if [[ -f "${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/networking/service.yaml" ]]; then kubectl apply -f "${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/networking/service.yaml" else echo "[service.yaml] is required" exit 0 fi if [[ -f "${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/networking/istio.yaml" ]]; then kubectl apply -f "${MICROSERVICE_K8S_VALUES}/${ENVIRONMENT}/${REGION}/networking/istio.yaml" else echo "[istio.yaml] is required" exit 0 fi if [[ ! -n "${PREVIOUS_RELEASE_NAME}" ]]; then echo "# No release deployed previously in the namespace" elif [[ "${PREVIOUS_RELEASE_NAME}" != "${NEW_RELEASE_NAME}" ]]; then # Wait until the new Deployment is ready by checking the MinimumReplicasAvailable condition. local READY=$(kubectl get deployment ${NEW_RELEASE_NAME} -o yaml -n ${NAMESPACE} | yq read - 'status.conditions.(reason==MinimumReplicasAvailable).status') while [[ "$READY" != "True" ]]; do READY=$(kubectl get deployment ${NEW_RELEASE_NAME} -o yaml -n ${NAMESPACE} | yq read - 'status.conditions.(reason==MinimumReplicasAvailable).status') sleep 10 done helm uninstall "${PREVIOUS_RELEASE_NAME}" --namespace ${NAMESPACE} echo "# Uninstall previous release: ${PREVIOUS_RELEASE_NAME} successfully" exit 0 fi } case $# in 0) usage-help;; 1) case $1 in build) server-build;; docker | helm-chart | deploy) usage-help "$1";; -h | --help) echo -e "${USAGE}"; exit 0;; *) usage-help;; esac ;; *) case $1 in deploy) shift; deploy "$@";; docker) shift; docker "$@";; helm-chart) shift; helm-chart "$@";; get-version) shift; get-three-digit-version-number "$@";; *) echo "Unknown arguments: $*"; usage-help;; esac ;; esac 这个文件,我执行bash ./server.sh docker build ${SERVER_VERSION} ${MultiPlatform} 的过程是怎么样的
最新发布
10-25
你执行的命令是: ```bash bash ./server.sh docker build ${SERVER_VERSION} ${MultiPlatform} ``` 我们来详细分析这个命令在你的 `server.sh` 脚本中是如何一步步执行的,包括每个阶段的作用、变量变化和实际行为。 --- ## 🧩 前提说明 - 你在项目根目录下运行该脚本; - `${SERVER_VERSION}` 是一个外部传入的版本号(如:`1.2.3-SNAPSHOT` 或 `1.2.4`); - `${MultiPlatform}` 可能是: - 空(默认单平台构建) - `"SINGLE"` → 单平台 - `"MULTI"` → 多平台(amd64 + arm64) --- ## ✅ 执行流程详解 ### 🔹 第一步:解析参数并进入主逻辑 ```bash case $# in *) case $1 in docker) shift; docker "$@";; # 匹配到 docker,移除第一个参数后调用 docker 函数 esac ;; esac ``` → `$# >= 2`(至少两个参数),所以进入多参数分支 → `$1 = "docker"`,匹配成功,执行:`shift; docker "$@"` 此时剩余参数为:`${SERVER_VERSION} ${MultiPlatform}` --- ### 🔹 第二步:进入 `docker()` 函数 ```bash function docker { local module="docker" local IMAGE_NAME="smb/${PROJECT_NAME}" local DOCKER_REPO="746166756265.dkr.ecr.ap-southeast-1.amazonaws.com/${IMAGE_NAME}" local DOCKER_LOGIN=$(aws ecr get-login --no-include-email --region ap-southeast-1 --profile prd) case $# in 0) usage-help "${module}";; *) get-maven-project-version; case $1 in make) docker-make;; build) shift; docker-build "$@";; release) shift; docker-release "$@";; *) echo "Unknown arguments: $*"; usage-help "${module}";; esac ;; esac } ``` - 先调用 `get-maven-project-version` 获取当前 Maven 项目的版本(用于后续比对或默认值); - 然后根据 `$1 = "build"` 进入 `build` 分支; - 执行:`shift; docker-build "$@"` 现在传递给 `docker-build` 的参数是:`${SERVER_VERSION} ${MultiPlatform}` --- ### 🔹 第三步:进入 `docker-build` 函数 #### 📌 完整函数节选: ```bash function docker-build { docker-make local IMAGE_NAME=${IMAGE_NAME} local DOCKER_REPO=${DOCKER_REPO} local DOCKER_LOGIN=${DOCKER_LOGIN} local VERSION_OVERRIDE=false local PROJECT_VERSION=${MAVEN_PROJECT_VERSION_NEW} if [[ "$#" -gt 0 ]] && [[ -n "$1" ]]; then PROJECT_VERSION=$(get-three-digit-version-number $1) VERSION_OVERRIDE=true fi local MULTI_PLATFORM="SINGLE" if [[ "$#" -gt 1 ]] && [[ -n "$2" ]]; then MULTI_PLATFORM=$2 fi echo "# Docker login" eval "command ${DOCKER_LOGIN}" if [[ "${MULTI_PLATFORM}" = "MULTI" ]]; then ... else command docker build -t="${IMAGE_NAME}:${PROJECT_VERSION}" . command docker tag "${IMAGE_NAME}:${PROJECT_VERSION}" "${DOCKER_REPO}:${PROJECT_VERSION}" if [[ "${VERSION_OVERRIDE}" = false ]]; then command docker tag "${IMAGE_NAME}:${PROJECT_VERSION}" "${DOCKER_REPO}:latest" fi fi echo "# Docker Built, Repo: ${DOCKER_REPO}, Version: ${PROJECT_VERSION}" } ``` 下面我们逐步拆解: --- ### 🔹 步骤 1:先执行 `docker-make` ```bash docker-make ``` 这是打包 Java 应用的核心步骤: #### 功能: - 创建 `dist/` 和 `artifacts/` 目录; - 将 `target/*.jar` 拷贝到 `dist/lib/server.jar`; - 如果有容器启动脚本(`src/main/container/deploy/scripts`),也复制进去; - 打包成 zip 存放于 `artifacts/${PROJECT_NAME}.zip` —— 这个 zip 是用来做分发的。 > ⚠️ 注意:虽然叫 `make`,但它其实是在准备镜像构建所需的文件结构。 --- ### 🔹 步骤 2:设置版本号与平台模式 ```bash local VERSION_OVERRIDE=false local PROJECT_VERSION=${MAVEN_PROJECT_VERSION_NEW} if [[ "$#" -gt 0 ]] && [[ -n "$1" ]]; then PROJECT_VERSION=$(get-three-digit-version-number $1) VERSION_OVERRIDE=true fi ``` 👉 使用 `${SERVER_VERSION}` 作为版本号,并通过 `get-three-digit-version-number` 标准化格式。 #### 示例: 输入:`1.2.3-SNAPSHOT` → 输出仍为 `1.2.3-SNAPSHOT` 输入:`1.2.4.5` → 自动转为 `1.2.4005`(补零三位数)或处理 `-beta` 后缀等 > 💡 这是为了避免 Helm Chart / ECR 中出现非法版本字符或排序错误。 ```bash local MULTI_PLATFORM="SINGLE" if [[ "$#" -gt 1 ]] && [[ -n "$2" ]]; then MULTI_PLATFORM=$2 fi ``` 👉 设置是否启用多平台构建。只有当第二个参数为 `"MULTI"` 时才会走多架构流程。 --- ### 🔹 步骤 3:登录 AWS ECR ```bash eval "command ${DOCKER_LOGIN}" ``` 其中: ```bash local DOCKER_LOGIN=$(aws ecr get-login --no-include-email --region ap-southeast-1 --profile prd) ``` 这会生成类似: ```bash docker login -u AWS -p password https://746166756265.dkr.ecr.ap-southeast-1.amazonaws.com ``` 目的:允许后续 `docker push` 推送到生产环境的 ECR 镜像仓库。 --- ### 🔹 步骤 4:构建 Docker 镜像(根据 `MULTI_PLATFORM` 决定方式) #### ❖ 情况一:单平台构建(默认) ```bash command docker build -t="${IMAGE_NAME}:${PROJECT_VERSION}" . command docker tag "${IMAGE_NAME}:${PROJECT_VERSION}" "${DOCKER_REPO}:${PROJECT_VERSION}" if [[ "${VERSION_OVERRIDE}" = false ]]; then command docker tag "${IMAGE_NAME}:${PROJECT_VERSION}" "${DOCKER_REPO}:latest" fi ``` - 构建本地镜像标签:`smb/myproject:1.2.3-SNAPSHOT` - 打上远程仓库标签:`746...amazonaws.com/smb/myproject:1.2.3-SNAPSHOT` - 如果没有覆盖版本(即使用 Maven 默认版本),还会打一个 `:latest` 标签 📌 构建使用的是当前目录下的 `Dockerfile` #### ❖ 情况二:多平台构建(需开启 Buildx) ```bash command docker buildx build -t="${IMAGE_NAME}:${PROJECT_VERSION}-amd64" -f Dockerfile --platform=linux/amd64 -o type=docker . command docker buildx build -t="${IMAGE_NAME}:${PROJECT_VERSION}-arm64" -f Dockerfile --platform=linux/arm64 -o type=docker . # 再打远程标签 command docker tag ...:${PROJECT_VERSION}-amd64 ${DOCKER_REPO}:${PROJECT_VERSION}-amd64 command docker tag ...:${PROJECT_VERSION}-arm64 ${DOCKER_REPO}:${PROJECT_VERSION}-arm64 ``` > ⚠️ 要求系统支持 Docker Buildx,且已配置 builder 实例。 --- ### 🔹 最终输出 ```text # Docker Built, Repo: 746166756265.dkr.ecr.ap-southeast-1.amazonaws.com/smb/myproject, Version: 1.2.3-SNAPSHOT ``` ✅ 此时本地已经有可用的 Docker 镜像,但尚未上传! > ⚠️ `docker build` 只是构建并打标签,**不会自动推送**!要上传必须运行: > > ```bash > bash ./server.sh docker release ${SERVER_VERSION} ${MultiPlatform} > ``` --- ## 📊 总结:完整执行过程图示 ```bash bash ./server.sh docker build ${SERVER_VERSION} ${MultiPlatform} │ ├── 1. 解析命令 → 调用 docker() 函数 │ ├── 2. 获取 Maven 版本(get-maven-project-version) │ ├── 3. 调用 docker-make │ ├── 创建 dist/artifacts 目录 │ ├── 拷贝 JAR 到 lib/server.jar │ └── 打包成 ZIP(用于发布或部署) │ ├── 4. 设置版本号和平台类型 │ ├── PROJECT_VERSION = ${SERVER_VERSION}(标准化后) │ └── MULTI_PLATFORM = ${MultiPlatform} │ ├── 5. 登录 AWS ECR(prd 账户) │ ├── 6. 构建镜像 │ ├── 单平台:docker build + tag │ └── 多平台:docker buildx 分别构建 amd64/arm64 │ └── ✅ 完成:本地镜像已准备好,等待 release 推送 ``` --- ## ✅ 成功的关键条件 | 条件 | 是否必需 | 说明 | |------|---------|------| | `mvn` 可用 | ✅ | 用于获取版本号 | | `aws cli` 已配置 `--profile prd` | ✅ | 否则无法登录 ECR | | `Dockerfile` 存在 | ✅ | 构建镜像需要 | | `~/.m2/settings.xml` 配置了 `-Psmb-nexus` 所需凭证 | ✅ | 否则 `mvn` 命令失败 | | `yq`, `kubectl`, `helm` 工具存在 | ⚠️ | 若只 build 不 deploy 可不用 | | Docker daemon 正常运行 | ✅ | 否则 build 失败 | --- ## 🛠️ 常见问题排查建议 | 问题 | 可能原因 | 解决方案 | |------|--------|----------| | `aws ecr get-login: command not found` | AWS CLI 未安装 | 安装 AWS CLI v1(v2 已弃用 `get-login`) | | `Cannot connect to the Docker daemon` | Docker 服务未启动 | 启动 Docker Desktop 或 Linux 上的 `systemctl start docker` | | `get-three-digit-version-number: bad substitution` | Bash 版本太低 | 使用 Bash 4+(macOS 用户建议 brew install bash) | | `No such file or directory: Dockerfile` | 缺少 Dockerfile | 检查当前目录是否有 `Dockerfile` | | `mvn: command not found` | Maven 未安装 | 安装 Maven 并加入 PATH | --- ## ✅ 补充:推荐完整 CI 流程 ```bash # 1. 构建应用 & 构建镜像 bash ./server.sh docker build ${SERVER_VERSION} SINGLE # 2. 推送镜像到 ECR bash ./server.sh docker release ${SERVER_VERSION} SINGLE # 3. 构建 Helm Chart bash ./server.sh helm-chart build dev master ${SERVER_VERSION} # 4. 发布 Chart bash ./server.sh helm-chart publish ${SERVER_VERSION} # 5. 部署到集群 bash ./server.sh deploy dev master ${SERVER_VERSION} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值