feat: add PostgreSQL web installation wizard
Signed Release / release (push) Failing after 5m1s

This commit is contained in:
Qiufeng
2026-08-04 07:42:20 +08:00
parent b714f9851e
commit 1affcd9a5e
61 changed files with 1992 additions and 431 deletions
+26 -36
View File
@@ -30,8 +30,9 @@ test_erp_run_preserves_java_option_arguments() (
local tmp
tmp="$(mktemp -d "${TMPDIR:-/tmp}/erp-run-test.XXXXXX")" || return 1
trap 'rm -rf "$tmp"' EXIT
mkdir -p "$tmp/current/app" "$tmp/run"
mkdir -p "$tmp/current/app" "$tmp/run" "$tmp/state"
: > "$tmp/current/app/kaidi-erp.jar"
: > "$tmp/state/install.lock"
: > "$tmp/-Dpattern=expanded"
printf '%s\n' \
'#!/usr/bin/env bash' \
@@ -63,7 +64,8 @@ prepare_signed_archive() {
ln -s /etc/passwd "$tmp/package/kaidi-erp-1.2.3/unsafe-link"
fi
tar -czf "$tmp/kaidi-erp-1.2.3.tar.gz" -C "$tmp/package" kaidi-erp-1.2.3
(cd "$tmp" && checksum_file kaidi-erp-1.2.3.tar.gz) > "$tmp/SHA256SUMS"
printf 'installer jar\n' > "$tmp/kaidi-erp-installer-1.2.3.jar"
(cd "$tmp" && checksum_file kaidi-erp-1.2.3.tar.gz && checksum_file kaidi-erp-installer-1.2.3.jar) > "$tmp/SHA256SUMS"
openssl pkeyutl -sign -rawin -inkey "$tmp/private.pem" \
-in "$tmp/SHA256SUMS" -out "$tmp/SHA256SUMS.sig"
}
@@ -82,6 +84,8 @@ test_installer_verifies_signed_safe_archive() (
PUBLIC_KEY="$(<"$tmp/public.pem")"
ARCHIVE_NAME=kaidi-erp-1.2.3.tar.gz
ARCHIVE_PATH="$tmp/$ARCHIVE_NAME"
INSTALLER_NAME=kaidi-erp-installer-1.2.3.jar
INSTALLER_PATH="$tmp/$INSTALLER_NAME"
verify_release
)
@@ -99,6 +103,8 @@ test_installer_rejects_archive_symlinks() (
PUBLIC_KEY="$(<"$tmp/public.pem")"
ARCHIVE_NAME=kaidi-erp-1.2.3.tar.gz
ARCHIVE_PATH="$tmp/$ARCHIVE_NAME"
INSTALLER_NAME=kaidi-erp-installer-1.2.3.jar
INSTALLER_PATH="$tmp/$INSTALLER_NAME"
! (verify_release) >/dev/null 2>&1
)
@@ -130,10 +136,11 @@ prepare_update_release_archive() {
printf '%s\n' "$version" > "$root/VERSION"
printf '{"version":"%s","database":"postgresql","rollbackCompatible":true}\n' \
"$version" > "$root/manifest.json"
printf 'installer jar %s\n' "$version" > "$tmp/assets/kaidi-erp-installer-$version.jar"
local archive="kaidi-erp-$version.tar.gz"
tar -czf "$tmp/assets/$archive" -C "$tmp/package" "kaidi-erp-$version"
(cd "$tmp/assets" && checksum_file "$archive") > "$tmp/assets/SHA256SUMS"
(cd "$tmp/assets" && checksum_file "$archive" && checksum_file "kaidi-erp-installer-$version.jar") > "$tmp/assets/SHA256SUMS"
: > "$tmp/assets/SHA256SUMS.sig"
}
@@ -180,6 +187,7 @@ class Handler(BaseHTTPRequestHandler):
"prerelease": False,
"assets": [
{"name": archive, "browser_download_url": base + "/" + archive},
{"name": f"kaidi-erp-installer-{version}.jar", "browser_download_url": base + f"/assets/kaidi-erp-installer-{version}.jar"},
{"name": "SHA256SUMS", "browser_download_url": base + "/SHA256SUMS"},
{"name": "SHA256SUMS.sig", "browser_download_url": base + "/SHA256SUMS.sig"},
],
@@ -188,7 +196,7 @@ class Handler(BaseHTTPRequestHandler):
return
if self.path.startswith("/assets/"):
name = self.path.removeprefix("/assets/")
if name not in {archive, "SHA256SUMS", "SHA256SUMS.sig"}:
if name not in {archive, f"kaidi-erp-installer-{version}.jar", "SHA256SUMS", "SHA256SUMS.sig"}:
self.send_bytes(404, b"not found", "text/plain")
return
with open(os.path.join(assets, name), "rb") as handle:
@@ -224,23 +232,13 @@ PY
ERP_CONFIG_ROOT="$tmp/config"
ERP_STATE_ROOT="$tmp/state"
ERP_LOG_ROOT="$tmp/log"
DB_MODE=existing
NO_SERVICE=0
PUBLIC_KEY="$(<"$tmp/public.pem")"
detect_platform() { PLATFORM=darwin; }
install_dependencies() { return 0; }
configure_existing_postgres() {
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=kaidi_erp
DB_USER=kaidi_erp
DB_PASSWORD=test-password
DB_SSLMODE=require
}
validate_postgres() { return 0; }
install_service() { return 0; }
wait_for_health() { return 0; }
check_and_install_dependencies() { JAVA_BIN="$(command -v java)"; return 0; }
start_service() { return 0; }
wait_for_installer() { return 0; }
main > "$tmp/install.log" 2>&1 || return 1
@@ -251,8 +249,8 @@ PY
[[ "$SPRING_PROFILES_ACTIVE" == "postgres" ]]
[[ "$OA_UPDATE_ENABLED" == "true" ]]
[[ "$OA_UPDATE_GITEA_BASE_URL" == "http://127.0.0.1:$port" ]]
[[ "$OA_DB_URL" == "jdbc:postgresql://127.0.0.1:5432/kaidi_erp?sslmode=require" ]]
[[ "$ERP_PGSSLMODE" == "require" ]]
[[ "$ERP_SETUP_TOKEN" =~ ^[0-9a-f]{64}$ ]]
[[ -z "${OA_DB_URL:-}" ]]
)
)
@@ -440,16 +438,10 @@ test_update_lock_rejects_concurrent_process() (
[[ "$rejected" == "1" ]]
)
test_noninteractive_installer_reports_missing_password() (
test_installer_moves_database_setup_to_web_wizard() (
local output status=0
output="$(ERP_INSTALL_NON_INTERACTIVE=1 bash -c '
root="$1"
set --
source "$root/install.sh"
unset ERP_DB_PASSWORD DB_PASSWORD
configure_existing_postgres
' _ "$PROJECT_ROOT" 2>&1)" || status=$?
[[ "$status" -ne 0 && "$output" == *'database password is required'* ]]
output="$(bash "$PROJECT_ROOT/install.sh" --db-mode existing 2>&1)" || status=$?
[[ "$status" -ne 0 && "$output" == *'unknown option: --db-mode'* ]]
)
test_installer_requires_explicit_gitea_url() (
@@ -475,15 +467,13 @@ test_no_service_install_disables_online_update() (
INSTALL_ROOT="$tmp/install"
PLATFORM=darwin
NO_SERVICE=1
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=kaidi_erp
DB_USER=kaidi_erp
DB_PASSWORD=test-password
DB_SSLMODE=require
VERSION=1.0.0
JAVA_BIN="$(command -v java)"
GITEA_BASE_URL=https://example.test
REPOSITORY=awaioi/ERP
mkdir -p "$CONFIG_ROOT" "$STATE_ROOT" "$INSTALL_ROOT"
write_configuration || return 1
write_bootstrap_configuration || return 1
grep -Fqx 'OA_UPDATE_ENABLED=false' "$CONFIG_ROOT/erp.env"
)
@@ -514,7 +504,7 @@ run_test 'installer downloads and installs a signed release end to end' test_ins
run_test 'update helper installs a healthy release end to end' test_update_helper_installs_healthy_release
run_test 'update helper rolls back an unhealthy release end to end' test_update_helper_rolls_back_unhealthy_release
run_test 'update helper rejects a concurrent process' test_update_lock_rejects_concurrent_process
run_test 'noninteractive install reports a missing database password' test_noninteractive_installer_reports_missing_password
run_test 'installer moves database setup to the web wizard' test_installer_moves_database_setup_to_web_wizard
run_test 'installer requires an explicit Gitea URL' test_installer_requires_explicit_gitea_url
run_test 'no-service install disables online update' test_no_service_install_disables_online_update
run_test 'release workflow uses the scoped Gitea job token' test_release_workflow_uses_scoped_job_token