feat(version): единый файл версий и отображение client/server в настройках

This commit is contained in:
AidarKC 2026-04-23 15:37:39 +03:00
parent e9f58ca004
commit ecb018b32c
6 changed files with 67 additions and 1 deletions

View File

@ -7,3 +7,10 @@
## Примечание ## Примечание
- Если внешний инструмент/интеграция требует английский формат, допускается английский, но рядом желательно дать краткое пояснение на русском. - Если внешний инструмент/интеграция требует английский формат, допускается английский, но рядом желательно дать краткое пояснение на русском.
## Версионирование
- Единый файл версий проекта: `VERSION.properties` (в корне репозитория).
- Перед каждым новым коммитом обязательно увеличивать версии в `VERSION.properties`:
- `client.version` — версия клиентского UI.
- `server.version` — версия серверной части.
- Базовое правило инкремента: `+1` по последнему числовому сегменту (patch), если не оговорено иное.

2
VERSION.properties Normal file
View File

@ -0,0 +1,2 @@
client.version=1.2.0
server.version=1.2.0

View File

@ -4,6 +4,13 @@ plugins {
id 'com.github.johnrengelman.shadow' version '8.1.1' id 'com.github.johnrengelman.shadow' version '8.1.1'
} }
def appVersionProps = new Properties()
def appVersionFile = file('VERSION.properties')
if (appVersionFile.exists()) {
appVersionFile.withInputStream { appVersionProps.load(it) }
}
def serverVersionFromFile = String.valueOf(appVersionProps.getProperty('server.version', '1.1_codex')).trim()
allprojects { allprojects {
tasks.withType(JavaCompile).configureEach { tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
@ -11,7 +18,7 @@ allprojects {
} }
group = 'shine' group = 'shine'
version = '1.1_codex' version = serverVersionFromFile
tasks.jar { tasks.jar {
enabled = false // это что бы не создавала обычный джар, а будет только толстый джар enabled = false // это что бы не создавала обычный джар, а будет только толстый джар

View File

@ -5,9 +5,19 @@ SRC_DIR="shine-UI"
REMOTE_HOST="root@194.87.0.247" REMOTE_HOST="root@194.87.0.247"
REMOTE_DIR="/home/user/docker/caddyFile/sites/shine-UI" REMOTE_DIR="/home/user/docker/caddyFile/sites/shine-UI"
BUILD_VERSION="$(date -u +%Y%m%d%H%M%S)" BUILD_VERSION="$(date -u +%Y%m%d%H%M%S)"
VERSION_FILE="VERSION.properties"
export BUILD_VERSION export BUILD_VERSION
TMP_DIR="$(mktemp -d)" TMP_DIR="$(mktemp -d)"
CLIENT_VERSION="dev"
if [[ -f "$VERSION_FILE" ]]; then
CLIENT_VERSION="$(sed -n "s/^client\\.version[[:space:]]*=[[:space:]]*//p" "$VERSION_FILE" | head -n 1 | tr -d '\r' | xargs)"
if [[ -z "$CLIENT_VERSION" ]]; then
CLIENT_VERSION="dev"
fi
fi
export CLIENT_VERSION
cleanup() { cleanup() {
rm -rf "$TMP_DIR" rm -rf "$TMP_DIR"
} }
@ -28,6 +38,7 @@ if [[ ! -f "$INDEX_FILE" ]]; then
fi fi
perl -0pi -e 's/window\.__SHINE_BUILD_HASH__\s*=\s*'\''[^'\'']*'\'';/window.__SHINE_BUILD_HASH__ = '\''$ENV{BUILD_VERSION}'\'';/' "$INDEX_FILE" perl -0pi -e 's/window\.__SHINE_BUILD_HASH__\s*=\s*'\''[^'\'']*'\'';/window.__SHINE_BUILD_HASH__ = '\''$ENV{BUILD_VERSION}'\'';/' "$INDEX_FILE"
perl -0pi -e 's/window\.__SHINE_CLIENT_VERSION__\s*=\s*'\''[^'\'']*'\'';/window.__SHINE_CLIENT_VERSION__ = '\''$ENV{CLIENT_VERSION}'\'';/' "$INDEX_FILE"
echo "==> Checking SSH connectivity to $REMOTE_HOST" echo "==> Checking SSH connectivity to $REMOTE_HOST"
ssh -o BatchMode=yes -o ConnectTimeout=10 "$REMOTE_HOST" "echo SSH OK" >/dev/null ssh -o BatchMode=yes -o ConnectTimeout=10 "$REMOTE_HOST" "echo SSH OK" >/dev/null

View File

@ -7,6 +7,7 @@
<title>Shine UI Demo</title> <title>Shine UI Demo</title>
<script> <script>
window.__SHINE_BUILD_HASH__ = '20260413151200'; window.__SHINE_BUILD_HASH__ = '20260413151200';
window.__SHINE_CLIENT_VERSION__ = '1.2.0';
</script> </script>
<script> <script>
(function attachStylesWithBuildHash() { (function attachStylesWithBuildHash() {

View File

@ -13,6 +13,7 @@ export const pageMeta = { id: 'settings-view', title: 'Настройки' };
export function render({ navigate }) { export function render({ navigate }) {
const screen = document.createElement('section'); const screen = document.createElement('section');
screen.className = 'stack'; screen.className = 'stack';
let isDisposed = false;
screen.append( screen.append(
renderHeader({ renderHeader({
@ -119,9 +120,46 @@ export function render({ navigate }) {
} }
}); });
const versionCard = document.createElement('div');
versionCard.className = 'card stack';
const title = document.createElement('p');
title.className = 'field-label';
title.textContent = 'Версии';
const clientVersion = document.createElement('p');
clientVersion.className = 'meta-muted';
clientVersion.textContent = `Клиент: ${String(window.__SHINE_CLIENT_VERSION__ || 'n/a').trim() || 'n/a'}`;
const uiBuild = document.createElement('p');
uiBuild.className = 'meta-muted';
uiBuild.textContent = `Сборка UI: ${String(window.__SHINE_BUILD_HASH__ || 'n/a').trim() || 'n/a'}`;
const serverVersion = document.createElement('p');
serverVersion.className = 'meta-muted';
serverVersion.textContent = 'Сервер: загружается...';
versionCard.append(title, clientVersion, uiBuild, serverVersion);
void (async () => {
try {
const resp = await authService.ws.request('GetServerInfo', {});
const value = String(resp?.payload?.version || '').trim() || 'n/a';
if (!isDisposed) {
serverVersion.textContent = `Сервер: ${value}`;
}
} catch {
if (!isDisposed) {
serverVersion.textContent = 'Сервер: недоступно';
}
}
})();
screen.append(card); screen.append(card);
screen.cleanup = () => { screen.cleanup = () => {
isDisposed = true;
unsubscribeInstallAvailability(); unsubscribeInstallAvailability();
}; };
screen.append(versionCard);
return screen; return screen;
} }