build-client-package.sh 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/usr/bin/env bash
  2. #
  3. # Packs client-package/ into a single ZIP for handover.
  4. #
  5. # The result contains the client code AND its documentation, so a project can be
  6. # integrated without access to this repository.
  7. #
  8. # ./scripts/build-client-package.sh
  9. # ./scripts/build-client-package.sh --server-url https://manage.example.org
  10. #
  11. # With --server-url the placeholder in the shipped config.sample.php is replaced,
  12. # so the recipient only has to fill in instance and token.
  13. set -euo pipefail
  14. SERVER_URL=""
  15. VERSION="$(date +%Y%m%d)"
  16. while [[ $# -gt 0 ]]; do
  17. case "$1" in
  18. --server-url)
  19. SERVER_URL="${2:-}"
  20. shift 2
  21. ;;
  22. --version)
  23. VERSION="${2:-}"
  24. shift 2
  25. ;;
  26. -h|--help)
  27. cat <<USAGE
  28. Usage: $(basename "$0") [--server-url URL] [--version LABEL]
  29. Builds build/manage-client-<version>.zip from client-package/.
  30. --server-url URL Prefill MANAGE_SERVER_URL in the shipped config.sample.php
  31. --version LABEL Label for the file name (default: today's date)
  32. USAGE
  33. exit 0
  34. ;;
  35. *)
  36. echo "Error: unknown option: $1" >&2
  37. exit 1
  38. ;;
  39. esac
  40. done
  41. if ! command -v zip >/dev/null 2>&1; then
  42. echo "Error: zip is required." >&2
  43. exit 1
  44. fi
  45. REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
  46. SOURCE_DIR="${REPO_ROOT}/client-package"
  47. BUILD_DIR="${REPO_ROOT}/build"
  48. if [[ ! -d "$SOURCE_DIR" ]]; then
  49. echo "Error: client-package/ not found at ${SOURCE_DIR}" >&2
  50. exit 1
  51. fi
  52. STAGE="$(mktemp -d)"
  53. trap 'rm -rf "$STAGE"' EXIT
  54. cp -r "$SOURCE_DIR" "${STAGE}/manage-client-package"
  55. # A config.php from local testing must never be handed out: it holds a token.
  56. # Scoped to manage-client/ on purpose - examples/ ships config.php files that are
  57. # documentation and must survive.
  58. rm -f "${STAGE}/manage-client-package/manage-client/config.php"
  59. find "${STAGE}/manage-client-package" -name "*.log" -delete
  60. find "${STAGE}/manage-client-package" -name ".DS_Store" -delete
  61. if [[ -n "$SERVER_URL" ]]; then
  62. SERVER_URL="${SERVER_URL%/}"
  63. SAMPLE="${STAGE}/manage-client-package/manage-client/config.sample.php"
  64. sed -i.bak -E \
  65. "s|(define\\(\"MANAGE_SERVER_URL\", \")[^\"]*(\"\\);)|\\1${SERVER_URL}\\2|" \
  66. "$SAMPLE"
  67. rm -f "${SAMPLE}.bak"
  68. echo "MANAGE_SERVER_URL prefilled: ${SERVER_URL}"
  69. fi
  70. # Stamp the build so a recipient can tell versions apart.
  71. cat > "${STAGE}/manage-client-package/BUILD.txt" <<INFO
  72. Manage client package
  73. Built: $(date -Iseconds)
  74. Label: ${VERSION}
  75. Server: ${SERVER_URL:-not prefilled}
  76. Start with README.md, then docs/01_QUICKSTART.md.
  77. Browse the docs with: php -S localhost:8080 -t docs
  78. INFO
  79. mkdir -p "$BUILD_DIR"
  80. ARCHIVE="${BUILD_DIR}/manage-client-${VERSION}.zip"
  81. rm -f "$ARCHIVE"
  82. (cd "$STAGE" && zip -qr "$ARCHIVE" "manage-client-package")
  83. if command -v sha256sum >/dev/null 2>&1; then
  84. SHA="$(sha256sum "$ARCHIVE" | awk '{print $1}')"
  85. else
  86. SHA="$(shasum -a 256 "$ARCHIVE" | awk '{print $1}')"
  87. fi
  88. cat <<SUMMARY
  89. Package: ${ARCHIVE}
  90. Size: $(wc -c < "$ARCHIVE" | tr -d '[:space:]') bytes
  91. SHA-256: ${SHA}
  92. Hand this file to whoever integrates the project. It is self-contained:
  93. code, documentation and examples.
  94. SUMMARY