sync_release.sh 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. for file in requirements.txt gunicorn_config.py __init__.py; do
  35. copy_file "${ROOT_DIR}/${file}" "${DEPLOY_DIR}/${file}"
  36. done
  37. if [[ ! -f "${DEPLOY_DIR}/wsgi.py" ]]; then
  38. cat >"${DEPLOY_DIR}/wsgi.py" <<'EOF'
  39. """WSGI entry point for production deployment."""
  40. from app import create_app
  41. application = create_app()
  42. app = application
  43. EOF
  44. echo "[sync] 已生成 ${DEPLOY_DIR}/wsgi.py"
  45. fi
  46. mkdir -p "${DEPLOY_DIR}/scripts"
  47. for script in dataops-common.sh deploy_dataops.sh run_dataops.sh start_dataops.sh stop_dataops.sh restart_dataops.sh; do
  48. copy_file "${ROOT_DIR}/scripts/${script}" "${DEPLOY_DIR}/scripts/${script}"
  49. done
  50. # 统一 LF,避免 Windows 编辑导致 bash 报错
  51. if command -v sed >/dev/null 2>&1; then
  52. find "${DEPLOY_DIR}" -type f \( -name '*.sh' -o -name 'dataops.env' -o -name '.env.production.example' \) \
  53. -exec sed -i 's/\r$//' {} + 2>/dev/null || true
  54. fi
  55. chmod +x "${DEPLOY_DIR}/deploy_dataops.sh" "${DEPLOY_DIR}/sync_release.sh" 2>/dev/null || true
  56. chmod +x "${DEPLOY_DIR}/scripts/"*.sh 2>/dev/null || true
  57. echo "[sync] 完成。下一步: cd deployment && bash package_release.sh"