sync_release.sh 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/usr/bin/env bash
  2. #
  3. # 将仓库最新源码同步到 deployment/ 发布目录(开发机/CI 执行)
  4. # 用法: bash deployment/sync_release.sh
  5. #
  6. set -euo pipefail
  7. ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
  8. DEPLOY_DIR="${ROOT_DIR}/deployment"
  9. echo "[sync] 根目录: ${ROOT_DIR}"
  10. echo "[sync] 发布目录: ${DEPLOY_DIR}"
  11. copy_tree() {
  12. local src="$1"
  13. local dst="$2"
  14. if [[ ! -d "${src}" ]]; then
  15. echo "[sync] 跳过(不存在): ${src}"
  16. return 0
  17. fi
  18. rm -rf "${dst}"
  19. cp -a "${src}" "${dst}"
  20. echo "[sync] ${src} -> ${dst}"
  21. }
  22. copy_file() {
  23. local src="$1"
  24. local dst="$2"
  25. if [[ ! -f "${src}" ]]; then
  26. echo "[sync] 跳过(不存在): ${src}"
  27. return 0
  28. fi
  29. cp -f "${src}" "${dst}"
  30. echo "[sync] ${src} -> ${dst}"
  31. }
  32. copy_tree "${ROOT_DIR}/app" "${DEPLOY_DIR}/app"
  33. copy_tree "${ROOT_DIR}/database" "${DEPLOY_DIR}/database"
  34. copy_tree "${ROOT_DIR}/migrations" "${DEPLOY_DIR}/migrations"
  35. for file in requirements.txt gunicorn_config.py __init__.py; do
  36. copy_file "${ROOT_DIR}/${file}" "${DEPLOY_DIR}/${file}"
  37. done
  38. copy_file "${ROOT_DIR}/alembic.ini" "${DEPLOY_DIR}/alembic.ini"
  39. if [[ ! -f "${DEPLOY_DIR}/wsgi.py" ]]; then
  40. cat >"${DEPLOY_DIR}/wsgi.py" <<'EOF'
  41. """WSGI entry point for production deployment."""
  42. from app import create_app
  43. application = create_app()
  44. app = application
  45. EOF
  46. echo "[sync] 已生成 ${DEPLOY_DIR}/wsgi.py"
  47. fi
  48. mkdir -p "${DEPLOY_DIR}/scripts"
  49. for script in dataops-common.sh deploy_dataops.sh run_dataops.sh start_dataops.sh stop_dataops.sh restart_dataops.sh; do
  50. copy_file "${ROOT_DIR}/scripts/${script}" "${DEPLOY_DIR}/scripts/${script}"
  51. done
  52. # 统一 LF,避免 Windows 编辑导致 bash 报错
  53. if command -v sed >/dev/null 2>&1; then
  54. find "${DEPLOY_DIR}" -type f \( -name '*.sh' -o -name 'dataops.env' -o -name '.env.production.example' \) \
  55. -exec sed -i 's/\r$//' {} + 2>/dev/null || true
  56. fi
  57. chmod +x "${DEPLOY_DIR}/deploy_dataops.sh" "${DEPLOY_DIR}/sync_release.sh" 2>/dev/null || true
  58. chmod +x "${DEPLOY_DIR}/scripts/"*.sh 2>/dev/null || true
  59. echo "[sync] 完成。下一步: cd deployment && bash package_release.sh"