publish.sh 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/bin/bash
  2. # 集群发布脚本:发布中枢从 git 拉 release,再分发到各 worker。
  3. # 前提:代码已 push 到 origin/release;发布中枢的部署目录是 git 仓库(首次初始化见下方检测提示)。
  4. #
  5. # 挂 DS 手动触发,任务体(在 DS worker 上执行):
  6. # ssh bigdata@cdhmaster02 "bash /home/bigdata/release/poyee-data-warehouse/publish.sh"
  7. #
  8. # 五个动作,缺一不可:
  9. # 1. 发布中枢 git 更新到 release(checkout . 丢弃开发期 rsync 推进来的脏改动)
  10. # 2. rsync 项目到各 worker(worker 不建 git 仓库,只做镜像)
  11. # 3. rsync datasource 到各 worker(不入 git,git pull 拿不到)
  12. # 4. 删所有节点的 dw_base.zip —— 发布环境下该文件存在就复用,不删则 Spark 作业继续跑旧代码
  13. # (见 dw_base/spark/spark_sql.py 的 IS_RUN_IN_RELEASE_DIR 分支)
  14. # 5. chmod bin/ 保证入口可执行
  15. #
  16. # 与 workspace/bin/sync-all.sh 的关系:那个从开发机 rsync 推、绕过 git,用于开发期快速迭代;
  17. # 本脚本以 git release 分支为唯一发布源。两者可共存——第 1 步的 checkout . 会把
  18. # 开发期推进来的改动还原成 release 版本。
  19. set -euo pipefail
  20. BRANCH='release'
  21. # 节点硬编码(与 workspace/bin/sync-all.sh 保持一致);增删节点改这两行
  22. RELEASE_HOST='cdhmaster02'
  23. WORKER_HOSTS=(cdhnode01 cdhnode02 cdhnode03)
  24. log() {
  25. echo "$(date '+%Y-%m-%d %H:%M:%S') $*"
  26. }
  27. die() {
  28. echo "$(date '+%Y-%m-%d %H:%M:%S') [失败] $*" >&2
  29. exit 1
  30. }
  31. # root 发布会把文件属主改成 root,之后 bigdata 写不动
  32. [ "root" = "$(whoami)" ] && die '禁止用 root 发布'
  33. PROJECT_ROOT=$(cd "$(dirname "$(realpath "$0")")" && pwd)
  34. PROJECT_NAME=$(basename "${PROJECT_ROOT}")
  35. # shellcheck source=conf/env.sh
  36. . "${PROJECT_ROOT}/conf/env.sh"
  37. CURRENT_HOST=$(hostname -s)
  38. [ "${CURRENT_HOST}" = "${RELEASE_HOST}" ] || die \
  39. "本脚本只能在发布中枢 ${RELEASE_HOST} 上执行,当前在 ${CURRENT_HOST};
  40. DS 任务请用:ssh ${RELEASE_USER}@${RELEASE_HOST} \"bash ${PROJECT_ROOT}/publish.sh\""
  41. DEPLOY_DIR="${RELEASE_ROOT_DIR}/${PROJECT_NAME}"
  42. DATASOURCE_DIR="${RELEASE_ROOT_DIR}/datasource"
  43. log "发布中枢 ${RELEASE_HOST},目标节点:${WORKER_HOSTS[*]}"
  44. log "部署目录 ${DEPLOY_DIR}"
  45. # ---------- 1. 中枢 git 更新到 release ----------
  46. [ -d "${DEPLOY_DIR}/.git" ] || die \
  47. "部署目录不是 git 仓库:${DEPLOY_DIR}
  48. 首次需手工初始化(会丢弃现有目录内 gitignore 的内容,如 workspace/):
  49. cd ${RELEASE_ROOT_DIR}
  50. mv ${PROJECT_NAME} ${PROJECT_NAME}.bak
  51. git clone -b ${BRANCH} <仓库地址> ${PROJECT_NAME}"
  52. cd "${DEPLOY_DIR}"
  53. log "[1/5] git 更新到 ${BRANCH}"
  54. git checkout . # 丢弃开发期 rsync 推进来的脏改动
  55. git fetch --prune
  56. git checkout "${BRANCH}"
  57. git pull --ff-only
  58. log " 当前版本 $(git rev-parse --short HEAD) $(git log -1 --format='%s')"
  59. # ---------- 2. 项目分发到各 worker ----------
  60. log "[2/5] 分发项目到各 worker"
  61. for host in "${WORKER_HOSTS[@]}"; do
  62. log " -> ${host}"
  63. sudo rsync -az --delete \
  64. --exclude='.git/' \
  65. --exclude='__pycache__/' \
  66. --exclude='*.pyc' \
  67. --exclude='workspace/' \
  68. --exclude='sessions/' \
  69. --exclude='conf/datax/generated/' \
  70. --exclude='conf/bak/' \
  71. --exclude='launch-pad/' \
  72. "${DEPLOY_DIR}/" "root@${host}:${DEPLOY_DIR}/"
  73. done
  74. # ---------- 3. datasource 分发(不入 git,只能靠 rsync) ----------
  75. log "[3/5] 分发 datasource"
  76. [ -d "${DATASOURCE_DIR}" ] || die "datasource 目录不存在:${DATASOURCE_DIR}"
  77. for host in "${WORKER_HOSTS[@]}"; do
  78. log " -> ${host}"
  79. sudo rsync -az --delete "${DATASOURCE_DIR}/" "root@${host}:${DATASOURCE_DIR}/"
  80. done
  81. # ---------- 4. 清 dw_base.zip 缓存 ----------
  82. log "[4/5] 清 dw_base.zip 缓存"
  83. rm -f "${DEPLOY_DIR}/dw_base.zip"
  84. for host in "${WORKER_HOSTS[@]}"; do
  85. sudo ssh "root@${host}" "rm -f ${DEPLOY_DIR}/dw_base.zip"
  86. done
  87. # ---------- 5. 权限 + 校验 ----------
  88. log "[5/5] 修权限并校验各节点目录大小"
  89. chmod 775 "${DEPLOY_DIR}/publish.sh"
  90. chmod -R 775 "${DEPLOY_DIR}/bin"
  91. for host in "${WORKER_HOSTS[@]}"; do
  92. sudo ssh "root@${host}" "chmod -R 775 ${DEPLOY_DIR}/bin"
  93. done
  94. printf '%-16s %s\n' "${RELEASE_HOST}" "$(du -sh "${DEPLOY_DIR}" | cut -f1)"
  95. for host in "${WORKER_HOSTS[@]}"; do
  96. printf '%-16s %s\n' "${host}" "$(sudo ssh "root@${host}" "du -sh ${DEPLOY_DIR} | cut -f1")"
  97. done
  98. log "发布完毕:${BRANCH} @ $(git rev-parse --short HEAD)"