Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a2d472b5c | ||
|
|
7cf71ba7c3 | ||
|
|
ec939fa1fd | ||
|
|
36f1a8b00d | ||
|
|
69f738465e |
@@ -10,9 +10,8 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
# The temporary release runner is isolated from stale queued jobs that use
|
# The release runner is an explicitly registered host label. Keeping the
|
||||||
# the old ubuntu-24.04 label. Restore ubuntu-latest after this release when
|
# label stable avoids silently queueing when the server has no ubuntu VM.
|
||||||
# the repository's normal Linux runner is online again.
|
|
||||||
runs-on: kaidi-release
|
runs-on: kaidi-release
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -32,7 +31,9 @@ jobs:
|
|||||||
./scripts/check-semver.sh "$VERSION"
|
./scripts/check-semver.sh "$VERSION"
|
||||||
GITEA_SHA=$(git rev-parse HEAD)
|
GITEA_SHA=$(git rev-parse HEAD)
|
||||||
test "$(git rev-parse "refs/tags/$GITEA_REF_NAME^{commit}")" = "$GITEA_SHA"
|
test "$(git rev-parse "refs/tags/$GITEA_REF_NAME^{commit}")" = "$GITEA_SHA"
|
||||||
test -z "$(git status --porcelain --untracked-files=all)"
|
test -z "$(git ls-files --others --exclude-standard)"
|
||||||
|
git diff --quiet --ignore-space-at-eol --ignore-cr-at-eol \
|
||||||
|
|| { printf 'Release checkout has non-whitespace tracked changes:\n' >&2; git diff --stat >&2; exit 1; }
|
||||||
{
|
{
|
||||||
printf 'version=%s\n' "$VERSION"
|
printf 'version=%s\n' "$VERSION"
|
||||||
printf 'ref=%s\n' "$GITEA_REF_NAME"
|
printf 'ref=%s\n' "$GITEA_REF_NAME"
|
||||||
@@ -124,8 +125,10 @@ jobs:
|
|||||||
- name: Publish Gitea release
|
- name: Publish Gitea release
|
||||||
env:
|
env:
|
||||||
GITEA_TOKEN: ${{ secrets.RELEASE_GITEA_TOKEN }}
|
GITEA_TOKEN: ${{ secrets.RELEASE_GITEA_TOKEN }}
|
||||||
GITEA_SERVER_URL: ${{ github.server_url }}
|
# Gitea's runner leaves github.server_url/repository empty on some
|
||||||
GITEA_REPOSITORY: ${{ github.repository }}
|
# host-mode tag events; keep the release destination explicit.
|
||||||
|
GITEA_SERVER_URL: https://git.awaioi.com
|
||||||
|
GITEA_REPOSITORY: ERP-Team/kaidi
|
||||||
GITEA_REF_NAME: ${{ steps.release_meta.outputs.ref }}
|
GITEA_REF_NAME: ${{ steps.release_meta.outputs.ref }}
|
||||||
GITEA_SHA: ${{ steps.release_meta.outputs.revision }}
|
GITEA_SHA: ${{ steps.release_meta.outputs.revision }}
|
||||||
run: ./scripts/publish-gitea-release.sh
|
run: ./scripts/publish-gitea-release.sh
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ PostgreSQL 18 兼容工作继续冻结。
|
|||||||
先在宝塔面板停止并删除当前错误的 Java 项目,再执行:
|
先在宝塔面板停止并删除当前错误的 Java 项目,再执行:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.34/install.sh | sudo env KAIDI_APP_PORT=18080 bash
|
curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.41/install.sh | sudo env KAIDI_APP_PORT=18080 bash
|
||||||
```
|
```
|
||||||
|
|
||||||
该命令只安装程序运行所需的 systemd 单元,自动创建 `kaidi` 用户并检测现有 Java 17(包括
|
该命令只安装程序运行所需的 systemd 单元,自动创建 `kaidi` 用户并检测现有 Java 17(包括
|
||||||
@@ -88,12 +88,13 @@ curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-previe
|
|||||||
随后执行一键清理:
|
随后执行一键清理:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.34/purge.sh \
|
curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.41/purge.sh \
|
||||||
-o /tmp/kaidi-purge.sh \
|
-o /tmp/kaidi-purge.sh \
|
||||||
&& printf '%s %s\n' 44dbf10a9540aa9235bb8aff2dec603f1febbd45072cd8c4f6c40b25a6127801 /tmp/kaidi-purge.sh \
|
&& curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.41/SHA256SUMS \
|
||||||
| sha256sum -c - \
|
-o /tmp/kaidi-SHA256SUMS \
|
||||||
|
&& (cd /tmp && grep ' purge.sh$' kaidi-SHA256SUMS | sha256sum -c -) \
|
||||||
&& sudo env KAIDI_PURGE_CONFIRM=DELETE_LOCAL_KAIDI_INSTALLATION bash /tmp/kaidi-purge.sh \
|
&& sudo env KAIDI_PURGE_CONFIRM=DELETE_LOCAL_KAIDI_INSTALLATION bash /tmp/kaidi-purge.sh \
|
||||||
&& rm -f /tmp/kaidi-purge.sh
|
&& rm -f /tmp/kaidi-purge.sh /tmp/kaidi-SHA256SUMS
|
||||||
```
|
```
|
||||||
|
|
||||||
清理脚本会先停止 systemd 和遗留 Kaidi 进程,将旧配置、文件存储、安装码以及已有数据库备份归档到
|
清理脚本会先停止 systemd 和遗留 Kaidi 进程,将旧配置、文件存储、安装码以及已有数据库备份归档到
|
||||||
@@ -102,16 +103,16 @@ curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-previe
|
|||||||
`0600`,确认新安装及数据无误后再由 root 删除。脚本不删除外部 MySQL、系统 Java、Nginx 或宝塔站点配置;
|
`0600`,确认新安装及数据无误后再由 root 删除。脚本不删除外部 MySQL、系统 Java、Nginx 或宝塔站点配置;
|
||||||
新安装必须连接一个新的空 MySQL 数据库,旧数据库保留用于回滚。
|
新安装必须连接一个新的空 MySQL 数据库,旧数据库保留用于回滚。
|
||||||
|
|
||||||
### Preview.31 直链与宝塔手动部署
|
### Preview.40 直链与宝塔手动部署
|
||||||
|
|
||||||
本版不使用一键安装脚本。发布物是一个不带顶层目录的压缩包,下载后直接解压到版本目录,再由宝塔面板创建
|
本版不使用一键安装脚本。发布物是一个不带顶层目录的压缩包,下载后直接解压到版本目录,再由宝塔面板创建
|
||||||
Spring Boot 项目。数据库、JDK、Nginx 和宝塔本身都由运维人员准备;程序不会自动安装 MySQL 或任何第三方服务。
|
Spring Boot 项目。数据库、JDK、Nginx 和宝塔本身都由运维人员准备;程序不会自动安装 MySQL 或任何第三方服务。
|
||||||
|
|
||||||
下载地址:
|
下载地址:
|
||||||
|
|
||||||
`https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.34/kaidi-finance-1.0.0-preview.34.tar.gz`
|
`https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.41/kaidi-finance-1.0.0-preview.41.tar.gz`
|
||||||
|
|
||||||
校验文件:`https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.34/SHA256SUMS`
|
校验文件:`https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.41/SHA256SUMS`
|
||||||
|
|
||||||
服务器要求:Linux + systemd、Java 17(宝塔项目选择 JDK 17)、可访问外部 MySQL 8.4.x;32 位 Linux 需要宿主机
|
服务器要求:Linux + systemd、Java 17(宝塔项目选择 JDK 17)、可访问外部 MySQL 8.4.x;32 位 Linux 需要宿主机
|
||||||
已经提供可运行的 32 位 Java 17。程序只连接已有数据库,不安装数据库客户端或数据库服务。初始化只需要
|
已经提供可运行的 32 位 Java 17。程序只连接已有数据库,不安装数据库客户端或数据库服务。初始化只需要
|
||||||
@@ -126,7 +127,7 @@ Spring Boot 项目。数据库、JDK、Nginx 和宝塔本身都由运维人员
|
|||||||
必须直接位于 `RELEASE_ROOT`,不能再嵌套一层目录。
|
必须直接位于 `RELEASE_ROOT`,不能再嵌套一层目录。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
VERSION=1.0.0-preview.34
|
VERSION=1.0.0-preview.41
|
||||||
APP_ROOT=/www/wwwroot/kaidi
|
APP_ROOT=/www/wwwroot/kaidi
|
||||||
RELEASE_ROOT="$APP_ROOT/releases/$VERSION"
|
RELEASE_ROOT="$APP_ROOT/releases/$VERSION"
|
||||||
sudo install -d -m 0755 "$RELEASE_ROOT"
|
sudo install -d -m 0755 "$RELEASE_ROOT"
|
||||||
@@ -150,6 +151,9 @@ sudo "$RELEASE_ROOT/ops/baota-init.sh" 18080
|
|||||||
sudo cat /root/kaidi-first-login.txt
|
sudo cat /root/kaidi-first-login.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
初始化不会安装或启用 `kaidi-update.service`/`kaidi-update.path`,避免宝塔守护进程与
|
||||||
|
systemd 更新器同时管理同一应用;宝塔模式只支持手动替换 Release,后台在线更新请使用 systemd 安装模式。
|
||||||
|
|
||||||
初始化失败会回滚本次写入的配置、unit 和 `current` 链接,可以直接修正原因后重试;已经存在正式安装时不要重复执行,先按“彻底清理旧安装”流程处理。
|
初始化失败会回滚本次写入的配置、unit 和 `current` 链接,可以直接修正原因后重试;已经存在正式安装时不要重复执行,先按“彻底清理旧安装”流程处理。
|
||||||
|
|
||||||
#### 3. 宝塔 Spring Boot 项目字段
|
#### 3. 宝塔 Spring Boot 项目字段
|
||||||
@@ -257,8 +261,8 @@ Actions 页面显示 “No matching online runner”,先启动并注册该标
|
|||||||
Preview 属性由 SemVer 版本名表达。之后推送 tag 即会构建、测试、签名并发布:
|
Preview 属性由 SemVer 版本名表达。之后推送 tag 即会构建、测试、签名并发布:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git tag v1.0.0-preview.34
|
git tag v1.0.0-preview.41
|
||||||
git push origin v1.0.0-preview.34
|
git push origin v1.0.0-preview.41
|
||||||
```
|
```
|
||||||
|
|
||||||
在线更新仍使用独立的 TDesign 页面:系统管理员进入“系统治理 → 系统更新”。更新源由 root 在
|
在线更新仍使用独立的 TDesign 页面:系统管理员进入“系统治理 → 系统更新”。更新源由 root 在
|
||||||
@@ -310,7 +314,7 @@ cat /var/lib/kaidi-update/status.json
|
|||||||
```bash
|
```bash
|
||||||
KAIDI_RELEASE_SIGNING_KEY=/secure/release-signing-private.pem \
|
KAIDI_RELEASE_SIGNING_KEY=/secure/release-signing-private.pem \
|
||||||
KAIDI_TRUSTED_RELEASE_PUBLIC_KEY_SHA256=807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9 \
|
KAIDI_TRUSTED_RELEASE_PUBLIC_KEY_SHA256=807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9 \
|
||||||
./scripts/package-release.sh 1.0.0-preview.34
|
./scripts/package-release.sh 1.0.0-preview.41
|
||||||
KAIDI_TRUSTED_RELEASE_PUBLIC_KEY_SHA256=807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9 \
|
KAIDI_TRUSTED_RELEASE_PUBLIC_KEY_SHA256=807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9 \
|
||||||
./scripts/verify-release.sh dist/release
|
./scripts/verify-release.sh dist/release
|
||||||
```
|
```
|
||||||
|
|||||||
+11
-39
@@ -9,7 +9,6 @@ CONFIG_ROOT=/etc/kaidi
|
|||||||
STATE_ROOT=/var/lib/kaidi
|
STATE_ROOT=/var/lib/kaidi
|
||||||
UPDATE_STATE_ROOT=/var/lib/kaidi-update
|
UPDATE_STATE_ROOT=/var/lib/kaidi-update
|
||||||
LOG_ROOT=/var/log/kaidi
|
LOG_ROOT=/var/log/kaidi
|
||||||
UPDATER_ROOT=/opt/kaidi/bin
|
|
||||||
PUBLIC_KEY_SHA256=807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9
|
PUBLIC_KEY_SHA256=807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9
|
||||||
RELEASE_API_URL=https://git.awaioi.com/api/v1/repos/ERP-Team/kaidi/releases/latest
|
RELEASE_API_URL=https://git.awaioi.com/api/v1/repos/ERP-Team/kaidi/releases/latest
|
||||||
INIT_ARMED=false
|
INIT_ARMED=false
|
||||||
@@ -29,7 +28,7 @@ rollback_initialization() {
|
|||||||
rm -f /etc/systemd/system/kaidi-update.service /etc/systemd/system/kaidi-update.path
|
rm -f /etc/systemd/system/kaidi-update.service /etc/systemd/system/kaidi-update.path
|
||||||
systemctl daemon-reload >/dev/null 2>&1 || true
|
systemctl daemon-reload >/dev/null 2>&1 || true
|
||||||
rm -f "$CONFIG_ROOT/kaidi.env" "$CONFIG_ROOT/update.env" \
|
rm -f "$CONFIG_ROOT/kaidi.env" "$CONFIG_ROOT/update.env" \
|
||||||
"$CONFIG_ROOT/release-public.pem" "$UPDATER_ROOT/update.sh" \
|
"$CONFIG_ROOT/release-public.pem" \
|
||||||
"$UPDATE_STATE_ROOT/status.json" /root/kaidi-first-login.txt
|
"$UPDATE_STATE_ROOT/status.json" /root/kaidi-first-login.txt
|
||||||
rm -f "$INIT_APP_ROOT/current.next"
|
rm -f "$INIT_APP_ROOT/current.next"
|
||||||
if [ -n "$INIT_RELEASE_ROOT" ] \
|
if [ -n "$INIT_RELEASE_ROOT" ] \
|
||||||
@@ -95,7 +94,7 @@ main() {
|
|||||||
[ "$(uname -s)" = Linux ] || die "Baota initialization only supports Linux"
|
[ "$(uname -s)" = Linux ] || die "Baota initialization only supports Linux"
|
||||||
command -v systemctl >/dev/null 2>&1 && [ -d /run/systemd/system ] \
|
command -v systemctl >/dev/null 2>&1 && [ -d /run/systemd/system ] \
|
||||||
|| die "systemd is required for the privileged background updater"
|
|| die "systemd is required for the privileged background updater"
|
||||||
for command in find openssl setsid sha256sum; do
|
for command in find openssl sha256sum; do
|
||||||
command -v "$command" >/dev/null 2>&1 || die "$command is required"
|
command -v "$command" >/dev/null 2>&1 || die "$command is required"
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -137,7 +136,7 @@ main() {
|
|||||||
|
|
||||||
INIT_ARMED=true
|
INIT_ARMED=true
|
||||||
ensure_service_identity
|
ensure_service_identity
|
||||||
install -d -o root -g "$SERVICE_GROUP" -m 0750 "$app_root" "$releases_root" "$UPDATER_ROOT"
|
install -d -o root -g "$SERVICE_GROUP" -m 0750 "$app_root" "$releases_root"
|
||||||
install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0750 \
|
install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0750 \
|
||||||
"$STATE_ROOT" "$STATE_ROOT/files" "$STATE_ROOT/tmp" "$LOG_ROOT"
|
"$STATE_ROOT" "$STATE_ROOT/files" "$STATE_ROOT/tmp" "$LOG_ROOT"
|
||||||
install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0700 "$STATE_ROOT/setup"
|
install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0700 "$STATE_ROOT/setup"
|
||||||
@@ -158,14 +157,16 @@ main() {
|
|||||||
# The Baota process manager does not own a restartable application unit.
|
# The Baota process manager does not own a restartable application unit.
|
||||||
# Keep its updater files for diagnostics, but do not expose online update
|
# Keep its updater files for diagnostics, but do not expose online update
|
||||||
# actions until the panel lifecycle is integrated with the transaction state machine.
|
# actions until the panel lifecycle is integrated with the transaction state machine.
|
||||||
|
# The setup context has no datasource. Empty values avoid Baota treating
|
||||||
|
# a development placeholder as a real local MySQL dependency.
|
||||||
write_env_file "$CONFIG_ROOT/kaidi.env" \
|
write_env_file "$CONFIG_ROOT/kaidi.env" \
|
||||||
SPRING_PROFILES_ACTIVE production \
|
SPRING_PROFILES_ACTIVE production \
|
||||||
SERVER_ADDRESS 127.0.0.1 \
|
SERVER_ADDRESS 127.0.0.1 \
|
||||||
SERVER_PORT "$app_port" \
|
SERVER_PORT "$app_port" \
|
||||||
SESSION_COOKIE_SECURE false \
|
SESSION_COOKIE_SECURE false \
|
||||||
DB_URL 'jdbc:mysql://setup.invalid:3306/kaidi_finance' \
|
DB_URL '' \
|
||||||
DB_USERNAME setup_pending \
|
DB_USERNAME '' \
|
||||||
DB_PASSWORD setup_pending \
|
DB_PASSWORD '' \
|
||||||
FIELD_ENCRYPTION_KEY "$field_key" \
|
FIELD_ENCRYPTION_KEY "$field_key" \
|
||||||
FILE_STORAGE_ROOT "$STATE_ROOT/files" \
|
FILE_STORAGE_ROOT "$STATE_ROOT/files" \
|
||||||
FILE_STORAGE_TEMP "$STATE_ROOT/tmp" \
|
FILE_STORAGE_TEMP "$STATE_ROOT/tmp" \
|
||||||
@@ -187,39 +188,10 @@ main() {
|
|||||||
chown root:"$SERVICE_GROUP" "$CONFIG_ROOT/kaidi.env"
|
chown root:"$SERVICE_GROUP" "$CONFIG_ROOT/kaidi.env"
|
||||||
chmod 0640 "$CONFIG_ROOT/kaidi.env"
|
chmod 0640 "$CONFIG_ROOT/kaidi.env"
|
||||||
|
|
||||||
|
# Baota owns the Java process in this mode. Do not install a second
|
||||||
|
# systemd updater; online update is intentionally systemd-only until the
|
||||||
|
# panel lifecycle can participate in the transaction state machine.
|
||||||
install -m 0644 "$release_root/ops/release-public.pem" "$CONFIG_ROOT/release-public.pem"
|
install -m 0644 "$release_root/ops/release-public.pem" "$CONFIG_ROOT/release-public.pem"
|
||||||
install -m 0755 "$release_root/ops/update.sh" "$UPDATER_ROOT/update.sh"
|
|
||||||
write_env_file "$CONFIG_ROOT/update.env" \
|
|
||||||
UPDATE_RELEASE_BASE_URL '' \
|
|
||||||
UPDATE_RELEASE_API_URL "$RELEASE_API_URL" \
|
|
||||||
UPDATE_RELEASE_TOKEN '' \
|
|
||||||
UPDATE_REQUEST_FILE "$UPDATE_STATE_ROOT/inbox/request.json" \
|
|
||||||
UPDATE_STATUS_FILE "$UPDATE_STATE_ROOT/status.json" \
|
|
||||||
UPDATE_PUBLIC_KEY "$CONFIG_ROOT/release-public.pem" \
|
|
||||||
KAIDI_APP_ROOT "$app_root" \
|
|
||||||
KAIDI_UPDATE_STATE_ROOT "$UPDATE_STATE_ROOT" \
|
|
||||||
KAIDI_PROCESS_MANAGER baota \
|
|
||||||
KAIDI_PID_FILE "$STATE_ROOT/kaidi.pid" \
|
|
||||||
KAIDI_RUNTIME_ENV_FILE "$STATE_ROOT/setup/application.env" \
|
|
||||||
KAIDI_UPDATER_PATH "$UPDATER_ROOT/update.sh" \
|
|
||||||
KAIDI_SERVICE_USER "$SERVICE_USER" \
|
|
||||||
KAIDI_SERVICE_GROUP "$SERVICE_GROUP" \
|
|
||||||
KAIDI_UPDATE_PATH_NAME kaidi-update.path \
|
|
||||||
KAIDI_HEALTH_URL "http://127.0.0.1:$app_port/actuator/health" \
|
|
||||||
KAIDI_APP_INDEX_URL "http://127.0.0.1:$app_port/" \
|
|
||||||
KAIDI_DB_HOST setup.invalid \
|
|
||||||
KAIDI_DB_PORT 3306 \
|
|
||||||
KAIDI_DB_NAME kaidi_finance \
|
|
||||||
KAIDI_DB_USERNAME setup_pending \
|
|
||||||
KAIDI_DB_PASSWORD setup_pending
|
|
||||||
chmod 0600 "$CONFIG_ROOT/update.env"
|
|
||||||
|
|
||||||
install -m 0644 "$release_root/ops/kaidi-update.service" /etc/systemd/system/kaidi-update.service
|
|
||||||
install -m 0644 "$release_root/ops/kaidi-update.path" /etc/systemd/system/kaidi-update.path
|
|
||||||
systemd-analyze verify /etc/systemd/system/kaidi-update.service /etc/systemd/system/kaidi-update.path >/dev/null \
|
|
||||||
|| die "The privileged update units failed validation"
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl enable --now kaidi-update.path
|
|
||||||
|
|
||||||
printf '{"state":"CURRENT","message":"Baota release is prepared","targetVersion":"%s","updatedAt":"%s"}\n' \
|
printf '{"state":"CURRENT","message":"Baota release is prepared","targetVersion":"%s","updatedAt":"%s"}\n' \
|
||||||
"$version" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > "$UPDATE_STATE_ROOT/status.json"
|
"$version" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > "$UPDATE_STATE_ROOT/status.json"
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ FILE_SCANNER_ENABLED=true
|
|||||||
FINANCE_BOOTSTRAP_ENABLED=false
|
FINANCE_BOOTSTRAP_ENABLED=false
|
||||||
FINANCE_BOOTSTRAP_PASSWORD=
|
FINANCE_BOOTSTRAP_PASSWORD=
|
||||||
|
|
||||||
APP_VERSION=1.0.0-preview.34
|
APP_VERSION=1.0.0-preview.41
|
||||||
UPDATE_CURRENT_VERSION_FILE=/opt/kaidi/current/VERSION
|
UPDATE_CURRENT_VERSION_FILE=/opt/kaidi/current/VERSION
|
||||||
FINANCE_UPDATE_ENABLED=true
|
FINANCE_UPDATE_ENABLED=true
|
||||||
# Use either a stable direct asset base URL or the public Gitea latest-release API.
|
# Use either a stable direct asset base URL or the public Gitea latest-release API.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ umask 077
|
|||||||
|
|
||||||
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
||||||
INSTALLER="$ROOT/deploy/install.sh"
|
INSTALLER="$ROOT/deploy/install.sh"
|
||||||
INSTALLER_SHA256=${KAIDI_INSTALLER_SHA256:-6a454aff209e62d7ac75b7f97670d700ec05be710854a02136f41f55e82f9fa9}
|
INSTALLER_SHA256=${KAIDI_INSTALLER_SHA256:-fcc4c132812eaa304e2459f3b0cc176d75552afb6bd6a3be7c347fbf8f01e51b}
|
||||||
RELEASE_API_URL=${KAIDI_RELEASE_API_URL:-https://git.awaioi.com/api/v1/repos/ERP-Team/kaidi/releases/latest}
|
RELEASE_API_URL=${KAIDI_RELEASE_API_URL:-https://git.awaioi.com/api/v1/repos/ERP-Team/kaidi/releases/latest}
|
||||||
PUBLIC_KEY_SHA256=${KAIDI_RELEASE_PUBLIC_KEY_SHA256:-807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9}
|
PUBLIC_KEY_SHA256=${KAIDI_RELEASE_PUBLIC_KEY_SHA256:-807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9}
|
||||||
TOKEN_FILE=${KAIDI_RELEASE_TOKEN_FILE:-}
|
TOKEN_FILE=${KAIDI_RELEASE_TOKEN_FILE:-}
|
||||||
|
|||||||
+8
-3
@@ -586,9 +586,11 @@ configure_database() {
|
|||||||
if [ "$SETUP_WIZARD" = true ]; then
|
if [ "$SETUP_WIZARD" = true ]; then
|
||||||
[ -z "${KAIDI_DB_URL:-}${KAIDI_DB_USERNAME:-}${KAIDI_DB_PASSWORD:-}" ] \
|
[ -z "${KAIDI_DB_URL:-}${KAIDI_DB_USERNAME:-}${KAIDI_DB_PASSWORD:-}" ] \
|
||||||
|| die "Do not pass database credentials when KAIDI_SETUP_WIZARD=true; enter them in the browser wizard"
|
|| die "Do not pass database credentials when KAIDI_SETUP_WIZARD=true; enter them in the browser wizard"
|
||||||
DB_URL='jdbc:mysql://setup.invalid:3306/kaidi_finance'
|
# First-run mode does not create a datasource. Keep database fields empty
|
||||||
DB_USERNAME=setup_pending
|
# so hosting panels cannot mistake a placeholder for a local MySQL service.
|
||||||
DB_PASSWORD=setup_pending
|
DB_URL=
|
||||||
|
DB_USERNAME=
|
||||||
|
DB_PASSWORD=
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
if [ "$REINSTALL" = true ]; then
|
if [ "$REINSTALL" = true ]; then
|
||||||
@@ -613,6 +615,7 @@ configure_database() {
|
|||||||
|
|
||||||
database_host() {
|
database_host() {
|
||||||
local endpoint host_port
|
local endpoint host_port
|
||||||
|
[ -n "$DB_URL" ] || { printf ''; return; }
|
||||||
endpoint=${DB_URL#jdbc:mysql://}
|
endpoint=${DB_URL#jdbc:mysql://}
|
||||||
host_port=${endpoint%%/*}
|
host_port=${endpoint%%/*}
|
||||||
printf '%s' "${KAIDI_DB_HOST:-${host_port%%:*}}"
|
printf '%s' "${KAIDI_DB_HOST:-${host_port%%:*}}"
|
||||||
@@ -620,6 +623,7 @@ database_host() {
|
|||||||
|
|
||||||
database_port() {
|
database_port() {
|
||||||
local endpoint host_port candidate
|
local endpoint host_port candidate
|
||||||
|
[ -n "$DB_URL" ] || { printf ''; return; }
|
||||||
endpoint=${DB_URL#jdbc:mysql://}
|
endpoint=${DB_URL#jdbc:mysql://}
|
||||||
host_port=${endpoint%%/*}
|
host_port=${endpoint%%/*}
|
||||||
candidate=${host_port##*:}
|
candidate=${host_port##*:}
|
||||||
@@ -629,6 +633,7 @@ database_port() {
|
|||||||
|
|
||||||
database_name() {
|
database_name() {
|
||||||
local endpoint name
|
local endpoint name
|
||||||
|
[ -n "$DB_URL" ] || { printf ''; return; }
|
||||||
endpoint=${DB_URL#jdbc:mysql://}
|
endpoint=${DB_URL#jdbc:mysql://}
|
||||||
name=${endpoint#*/}
|
name=${endpoint#*/}
|
||||||
name=${name%%\?*}
|
name=${name%%\?*}
|
||||||
|
|||||||
@@ -46,6 +46,10 @@ chmod 0755 "$FIXTURE/bin/sudo" "$FIXTURE/repo/deploy/install.sh" "$FIXTURE/repo/
|
|||||||
printf '%s' 'fixture-read-token' > "$FIXTURE/token"
|
printf '%s' 'fixture-read-token' > "$FIXTURE/token"
|
||||||
chmod 0600 "$FIXTURE/token"
|
chmod 0600 "$FIXTURE/token"
|
||||||
installer_sha256=$(sha256sum "$FIXTURE/repo/deploy/install.sh" | awk '{print $1}')
|
installer_sha256=$(sha256sum "$FIXTURE/repo/deploy/install.sh" | awk '{print $1}')
|
||||||
|
default_installer_sha256=$(sed -n 's/^INSTALLER_SHA256=.*:-\([0-9A-Fa-f]*\)}$/\1/p' \
|
||||||
|
"$ROOT/deploy/install-from-git.sh")
|
||||||
|
[ "$default_installer_sha256" = "$(sha256sum "$ROOT/deploy/install.sh" | awk '{print $1}')" ] \
|
||||||
|
|| { printf 'Git installer default checksum is stale\n' >&2; exit 1; }
|
||||||
|
|
||||||
PATH="$FIXTURE/bin:$PATH" \
|
PATH="$FIXTURE/bin:$PATH" \
|
||||||
EXPECT_PORT=true \
|
EXPECT_PORT=true \
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ mode_of() {
|
|||||||
sed -n '/^port_is_listening()/,/^}/p' "$ROOT/deploy/install.sh"
|
sed -n '/^port_is_listening()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
sed -n '/^valid_app_port()/,/^}/p' "$ROOT/deploy/install.sh"
|
sed -n '/^valid_app_port()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
sed -n '/^configure_app_port()/,/^}/p' "$ROOT/deploy/install.sh"
|
sed -n '/^configure_app_port()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
|
sed -n '/^configure_database()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
|
sed -n '/^database_host()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
|
sed -n '/^database_port()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
|
sed -n '/^database_name()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
sed -n '/^is_semver()/,/^}/p' "$ROOT/deploy/install.sh"
|
sed -n '/^is_semver()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
sed -n '/^write_env_file_preserving_unknown()/,/^}/p' "$ROOT/deploy/install.sh"
|
sed -n '/^write_env_file_preserving_unknown()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
sed -n '/^normalized_host_arch()/,/^}/p' "$ROOT/deploy/install.sh"
|
sed -n '/^normalized_host_arch()/,/^}/p' "$ROOT/deploy/install.sh"
|
||||||
@@ -47,6 +51,14 @@ source "$WORK/helpers.sh"
|
|||||||
|
|
||||||
export SETUP_WIZARD=true
|
export SETUP_WIZARD=true
|
||||||
preflight_database || fail 'setup wizard database preflight returned a failure status'
|
preflight_database || fail 'setup wizard database preflight returned a failure status'
|
||||||
|
REINSTALL=false
|
||||||
|
# shellcheck disable=SC2034 # Consumed by the extracted configure_database helper.
|
||||||
|
KAIDI_DB_URL='' KAIDI_DB_USERNAME='' KAIDI_DB_PASSWORD=''
|
||||||
|
configure_database
|
||||||
|
[ -z "$DB_URL$DB_USERNAME$DB_PASSWORD" ] \
|
||||||
|
|| fail 'setup wizard retained a fake database configuration'
|
||||||
|
[ -z "$(database_host)$(database_port)$(database_name)" ] \
|
||||||
|
|| fail 'setup wizard exposed placeholder database coordinates to the updater'
|
||||||
|
|
||||||
mkdir -p "$WORK/mysql-bin"
|
mkdir -p "$WORK/mysql-bin"
|
||||||
cat > "$WORK/mysql-bin/mysql" <<'SH'
|
cat > "$WORK/mysql-bin/mysql" <<'SH'
|
||||||
@@ -299,12 +311,24 @@ grep -Fq '[ "$APP_ROOT" = /opt/kaidi ]' "$ROOT/deploy/install.sh" \
|
|||||||
|| fail 'installer no longer rejects unsupported custom roots'
|
|| fail 'installer no longer rejects unsupported custom roots'
|
||||||
grep -Fq '8.4.*) ;;' "$ROOT/deploy/install.sh" \
|
grep -Fq '8.4.*) ;;' "$ROOT/deploy/install.sh" \
|
||||||
|| fail 'installer no longer enforces MySQL 8.4.x'
|
|| fail 'installer no longer enforces MySQL 8.4.x'
|
||||||
|
! grep -Fq 'jdbc:mysql://setup.invalid' "$ROOT/deploy/install.sh" \
|
||||||
|
|| fail 'installer still writes a fake setup database URL'
|
||||||
|
! grep -Fq 'jdbc:mysql://setup.invalid' "$ROOT/deploy/baota-init.sh" \
|
||||||
|
|| fail 'Baota initializer still writes a fake setup database URL'
|
||||||
|
! grep -Fq 'KAIDI_DB_HOST setup.invalid' "$ROOT/deploy/baota-init.sh" \
|
||||||
|
|| fail 'Baota updater still points at a fake setup database host'
|
||||||
|
! grep -Fq 'systemctl enable --now kaidi-update.path' "$ROOT/deploy/baota-init.sh" \
|
||||||
|
|| fail 'Baota initializer still enables the systemd updater'
|
||||||
|
# shellcheck disable=SC2016 # Match literal initializer source.
|
||||||
|
! grep -Fq 'install -m 0644 "$release_root/ops/kaidi-update.service"' "$ROOT/deploy/baota-init.sh" \
|
||||||
|
|| fail 'Baota initializer still installs the systemd updater unit'
|
||||||
grep -Fq '32-bit Linux deployment requires glibc' "$ROOT/deploy/install.sh" \
|
grep -Fq '32-bit Linux deployment requires glibc' "$ROOT/deploy/install.sh" \
|
||||||
|| fail 'installer does not reject unsupported musl 32-bit hosts before downloading Java'
|
|| fail 'installer does not reject unsupported musl 32-bit hosts before downloading Java'
|
||||||
grep -Fq '32-bit Linux deployment requires the glibc loader' "$ROOT/deploy/install.sh" \
|
grep -Fq '32-bit Linux deployment requires the glibc loader' "$ROOT/deploy/install.sh" \
|
||||||
|| fail 'installer does not reject a 32-bit host without the glibc loader'
|
|| fail 'installer does not reject a 32-bit host without the glibc loader'
|
||||||
grep -Fq 'preflight_runtime_commands' "$ROOT/deploy/install.sh" \
|
grep -Fq 'preflight_runtime_commands' "$ROOT/deploy/install.sh" \
|
||||||
|| fail 'installer does not validate required runtime commands'
|
|| fail 'installer does not validate required runtime commands'
|
||||||
|
# shellcheck disable=SC2016 # Match literal installer source.
|
||||||
grep -Fq 'KAIDI_MYSQLDUMP_BIN "${KAIDI_MYSQLDUMP_BIN:-}"' "$ROOT/deploy/install.sh" \
|
grep -Fq 'KAIDI_MYSQLDUMP_BIN "${KAIDI_MYSQLDUMP_BIN:-}"' "$ROOT/deploy/install.sh" \
|
||||||
|| fail 'installer does not preserve a custom mysqldump path for online updates'
|
|| fail 'installer does not preserve a custom mysqldump path for online updates'
|
||||||
# shellcheck disable=SC2016 # Match literal installer source.
|
# shellcheck disable=SC2016 # Match literal installer source.
|
||||||
@@ -423,8 +447,11 @@ grep -Fq 'load_runtime_database_env' "$ROOT/deploy/update.sh" \
|
|||||||
# shellcheck disable=SC2016 # Match literal installer source.
|
# shellcheck disable=SC2016 # Match literal installer source.
|
||||||
grep -Fq 'install -d -o root -g "$SERVICE_GROUP" -m 0750 "$UPDATE_STATE_ROOT"' "$ROOT/deploy/install.sh" \
|
grep -Fq 'install -d -o root -g "$SERVICE_GROUP" -m 0750 "$UPDATE_STATE_ROOT"' "$ROOT/deploy/install.sh" \
|
||||||
|| fail 'update state parent is not group-accessible to the application user'
|
|| fail 'update state parent is not group-accessible to the application user'
|
||||||
grep -Fq 'kaidi-finance-1.0.0-preview.34.tar.gz' "$ROOT/README.md" \
|
manual_version=$(sed -n 's/^VERSION=\(1\.0\.0-preview\.[0-9][0-9]*\)$/\1/p' "$ROOT/README.md" | sed -n '1p')
|
||||||
|| fail 'README does not document the public manual-deployment artifact'
|
[ -n "$manual_version" ] \
|
||||||
|
|| fail 'README does not declare a preview version for the public manual-deployment artifact'
|
||||||
|
grep -Fq "kaidi-finance-$manual_version.tar.gz" "$ROOT/README.md" \
|
||||||
|
|| fail 'README does not document the public manual-deployment artifact for its declared version'
|
||||||
grep -Fq 'ops/baota-init.sh' "$ROOT/README.md" \
|
grep -Fq 'ops/baota-init.sh' "$ROOT/README.md" \
|
||||||
|| fail 'README does not document the local Baota initialization command'
|
|| fail 'README does not document the local Baota initialization command'
|
||||||
grep -Fq 'FINANCE_UPDATE_ENABLED false' "$ROOT/deploy/baota-init.sh" \
|
grep -Fq 'FINANCE_UPDATE_ENABLED false' "$ROOT/deploy/baota-init.sh" \
|
||||||
|
|||||||
Reference in New Issue
Block a user