Explorar el Código

build(publish): 重写发布脚本,git release 拉取 + rsync 分发全节点

原脚本依赖的 bin/common/functions.sh、/etc/.bash_profile、re-all、sync2all-hosts
均已不存在,且 set -e 被注释导致失败仍打印"发布完毕"。改为中枢 git pull release
后 rsync 到 worker,datasource 单独分发,全节点清 dw_base.zip(该文件在发布环境
存在即复用,不删会让 Spark 作业继续跑旧代码)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
tianyu.chu hace 3 semanas
padre
commit
717e7299c4
Se han modificado 1 ficheros con 111 adiciones y 34 borrados
  1. 111 34
      publish.sh

+ 111 - 34
publish.sh

@@ -1,38 +1,115 @@
 #!/bin/bash
-#set -e
-project_root_dir=$(
-  cd "$(dirname "$(realpath "$0")")" || exit
-  pwd
-)
-function log() {
-  echo -e "${NORM_CYN}$(date '+%Y-%m-%d %H:%M:%S') ${DO_RESET}${1}${DO_RESET}"
+# 集群发布脚本:发布中枢从 git 拉 release,再分发到各 worker。
+# 前提:代码已 push 到 origin/release;发布中枢的部署目录是 git 仓库(首次初始化见下方检测提示)。
+#
+# 挂 DS 手动触发,任务体(在 DS worker 上执行):
+#   ssh bigdata@cdhmaster02 "bash /home/bigdata/release/poyee-data-warehouse/publish.sh"
+#
+# 五个动作,缺一不可:
+#   1. 发布中枢 git 更新到 release(checkout . 丢弃开发期 rsync 推进来的脏改动)
+#   2. rsync 项目到各 worker(worker 不建 git 仓库,只做镜像)
+#   3. rsync datasource 到各 worker(不入 git,git pull 拿不到)
+#   4. 删所有节点的 dw_base.zip —— 发布环境下该文件存在就复用,不删则 Spark 作业继续跑旧代码
+#      (见 dw_base/spark/spark_sql.py 的 IS_RUN_IN_RELEASE_DIR 分支)
+#   5. chmod bin/ 保证入口可执行
+#
+# 与 workspace/bin/sync-all.sh 的关系:那个从开发机 rsync 推、绕过 git,用于开发期快速迭代;
+# 本脚本以 git release 分支为唯一发布源。两者可共存——第 1 步的 checkout . 会把
+# 开发期推进来的改动还原成 release 版本。
+
+set -euo pipefail
+
+BRANCH='release'
+# 节点硬编码(与 workspace/bin/sync-all.sh 保持一致);增删节点改这两行
+RELEASE_HOST='cdhmaster02'
+WORKER_HOSTS=(cdhnode01 cdhnode02 cdhnode03)
+
+log() {
+  echo "$(date '+%Y-%m-%d %H:%M:%S') $*"
 }
-if [ "root" = "$(whoami)" ]; then
-  log "${NORM_RED}禁止使用 ${NORM_GRN}root${NORM_MGT} 用户进行发布"
-  exit 18
-fi
-. "${project_root_dir}/bin/common/functions.sh"
-source /etc/.bash_profile
-. "${project_root_dir}/conf/env.sh"
-project_name=$(basename "${project_root_dir}")
-function display() {
-  du -d 0 "${RELEASE_ROOT_DIR}/${project_name}"
-  re-all du -d 0 "${RELEASE_ROOT_DIR}/${project_name}"
+
+die() {
+  echo "$(date '+%Y-%m-%d %H:%M:%S') [失败] $*" >&2
+  exit 1
 }
-#异常处理机制 用于切换到指定的目录,如果失败则退出脚本。
-cd "${RELEASE_ROOT_DIR}/${project_name}" || exit
-git branch
-git checkout release
-git checkout .
+
+# root 发布会把文件属主改成 root,之后 bigdata 写不动
+[ "root" = "$(whoami)" ] && die '禁止用 root 发布'
+
+PROJECT_ROOT=$(cd "$(dirname "$(realpath "$0")")" && pwd)
+PROJECT_NAME=$(basename "${PROJECT_ROOT}")
+# shellcheck source=conf/env.sh
+. "${PROJECT_ROOT}/conf/env.sh"
+
+CURRENT_HOST=$(hostname -s)
+[ "${CURRENT_HOST}" = "${RELEASE_HOST}" ] || die \
+  "本脚本只能在发布中枢 ${RELEASE_HOST} 上执行,当前在 ${CURRENT_HOST};
+   DS 任务请用:ssh ${RELEASE_USER}@${RELEASE_HOST} \"bash ${PROJECT_ROOT}/publish.sh\""
+
+DEPLOY_DIR="${RELEASE_ROOT_DIR}/${PROJECT_NAME}"
+DATASOURCE_DIR="${RELEASE_ROOT_DIR}/datasource"
+
+log "发布中枢 ${RELEASE_HOST},目标节点:${WORKER_HOSTS[*]}"
+log "部署目录 ${DEPLOY_DIR}"
+
+# ---------- 1. 中枢 git 更新到 release ----------
+[ -d "${DEPLOY_DIR}/.git" ] || die \
+  "部署目录不是 git 仓库:${DEPLOY_DIR}
+   首次需手工初始化(会丢弃现有目录内 gitignore 的内容,如 workspace/):
+     cd ${RELEASE_ROOT_DIR}
+     mv ${PROJECT_NAME} ${PROJECT_NAME}.bak
+     git clone -b ${BRANCH} <仓库地址> ${PROJECT_NAME}"
+
+cd "${DEPLOY_DIR}"
+log "[1/5] git 更新到 ${BRANCH}"
+git checkout .                       # 丢弃开发期 rsync 推进来的脏改动
 git fetch --prune
-git pull
-re-all "cd ${RELEASE_ROOT_DIR}/${project_name} && git checkout . && git fetch --prune && git pull"
-rm -f dw_base.zip
-re-all "cd ${RELEASE_ROOT_DIR}/${project_name} && rm -f dw_base.zip"
-display
-chmod 775 "${RELEASE_ROOT_DIR}/${project_name}/publish.sh"
-chmod 775 -R "${RELEASE_ROOT_DIR}/${project_name}/bin"
-re-all chmod 775 -R "${RELEASE_ROOT_DIR}/${project_name}/bin"
-sync2all-hosts "${RELEASE_ROOT_DIR:?}/datasource"
-#sync2all-hosts "${RELEASE_ROOT_DIR:?}/mongo2es-customs"
-echo "发布完毕"
+git checkout "${BRANCH}"
+git pull --ff-only
+log "      当前版本 $(git rev-parse --short HEAD) $(git log -1 --format='%s')"
+
+# ---------- 2. 项目分发到各 worker ----------
+log "[2/5] 分发项目到各 worker"
+for host in "${WORKER_HOSTS[@]}"; do
+  log "      -> ${host}"
+  sudo rsync -az --delete \
+    --exclude='.git/' \
+    --exclude='__pycache__/' \
+    --exclude='*.pyc' \
+    --exclude='workspace/' \
+    --exclude='sessions/' \
+    --exclude='conf/datax/generated/' \
+    --exclude='conf/bak/' \
+    --exclude='launch-pad/' \
+    "${DEPLOY_DIR}/" "root@${host}:${DEPLOY_DIR}/"
+done
+
+# ---------- 3. datasource 分发(不入 git,只能靠 rsync) ----------
+log "[3/5] 分发 datasource"
+[ -d "${DATASOURCE_DIR}" ] || die "datasource 目录不存在:${DATASOURCE_DIR}"
+for host in "${WORKER_HOSTS[@]}"; do
+  log "      -> ${host}"
+  sudo rsync -az --delete "${DATASOURCE_DIR}/" "root@${host}:${DATASOURCE_DIR}/"
+done
+
+# ---------- 4. 清 dw_base.zip 缓存 ----------
+log "[4/5] 清 dw_base.zip 缓存"
+rm -f "${DEPLOY_DIR}/dw_base.zip"
+for host in "${WORKER_HOSTS[@]}"; do
+  sudo ssh "root@${host}" "rm -f ${DEPLOY_DIR}/dw_base.zip"
+done
+
+# ---------- 5. 权限 + 校验 ----------
+log "[5/5] 修权限并校验各节点目录大小"
+chmod 775 "${DEPLOY_DIR}/publish.sh"
+chmod -R 775 "${DEPLOY_DIR}/bin"
+for host in "${WORKER_HOSTS[@]}"; do
+  sudo ssh "root@${host}" "chmod -R 775 ${DEPLOY_DIR}/bin"
+done
+
+printf '%-16s %s\n' "${RELEASE_HOST}" "$(du -sh "${DEPLOY_DIR}" | cut -f1)"
+for host in "${WORKER_HOSTS[@]}"; do
+  printf '%-16s %s\n' "${host}" "$(sudo ssh "root@${host}" "du -sh ${DEPLOY_DIR} | cut -f1")"
+done
+
+log "发布完毕:${BRANCH} @ $(git rev-parse --short HEAD)"