chore: скрипты сборки всех сервисов + gitignore артефактов

- buildAll.sh: ./gradlew bootJar всех Spring-сервисов (--clean опц.).
- serviceAllBuild.sh: раскладка bootJar + config-repo + run-хелпер в serviceAllBuild/.
- .gitignore: serviceAllBuild/ (артефакты ~1.7G) и локальный .npmrc фронта.
This commit is contained in:
Дмитрий Соловьев
2026-06-17 09:06:43 +03:00
parent 7c10f9a10d
commit 8faaa03af3
3 changed files with 287 additions and 0 deletions
+5
View File
@@ -72,3 +72,8 @@ out/
/services/pcp-tgu-ops-ui/yarn-error.log* /services/pcp-tgu-ops-ui/yarn-error.log*
/services/pcp-tgu-ops-ui/pnpm-debug.log* /services/pcp-tgu-ops-ui/pnpm-debug.log*
.gstack/ .gstack/
# Локальная раскладка собранных bootJar всех сервисов (артефакты, ~1.7G) — не версионируем.
/serviceAllBuild/
# Машинно-зависимый npm prefix фронта (локальный путь разработчика).
/services/pcp-tgu-ui-service/.npmrc
Executable
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env bash
#
# Сборка bootJar всех Spring-сервисов.
#
# ./buildAll.sh # собрать все jar (без тестов; bootJar тесты не гоняет)
# ./buildAll.sh --clean # clean + сборка с нуля
#
# Фронт pcp-tgu-ui-service здесь не собирается (это npm-проект, не gradle).
# Чтобы после сборки разложить jar в serviceAllBuild/ — запусти ./serviceAllBuild.sh
# (или сразу ./serviceAllBuild.sh --build, который делает сборку и раскладку вместе).
#
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ARGS=()
[[ "${1:-}" == "--clean" ]] && ARGS+=(clean)
ARGS+=(bootJar)
echo "==> ./gradlew ${ARGS[*]}"
"$ROOT/gradlew" "${ARGS[@]}"
echo
echo "Готово. Разложить в одну папку: ./serviceAllBuild.sh"
+258
View File
@@ -0,0 +1,258 @@
#!/usr/bin/env bash
#
# Собирает (опционально) и складывает bootJar всех Spring-сервисов в одну папку
# serviceAllBuild/ в корне проекта, рядом кладёт config-repo и хелпер запуска run.sh.
#
# Использование:
# ./serviceAllBuild.sh # только собрать jar-ы в одно место (сервисы уже собраны)
# ./serviceAllBuild.sh --build # сначала ./gradlew bootJar, потом собрать в одно место
#
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
OUT="$ROOT/serviceAllBuild"
SERVICES_DIR="$ROOT/services"
DO_BUILD=0
[[ "${1:-}" == "--build" ]] && DO_BUILD=1
if [[ $DO_BUILD -eq 1 ]]; then
echo "==> Сборка bootJar всех сервисов (./gradlew bootJar)..."
"$ROOT/gradlew" bootJar
fi
mkdir -p "$OUT"
echo "==> Сбор jar-ов в $OUT"
count=0
for dir in "$SERVICES_DIR"/*/; do
name="$(basename "$dir")"
libs="$dir/build/libs"
[[ -d "$libs" ]] || { echo " - $name: нет build/libs (не Spring-сервис или не собран), пропуск"; continue; }
# bootJar = единственный *.jar без суффикса -plain.jar; берём самый свежий по имени
jar="$(find "$libs" -maxdepth 1 -name '*.jar' ! -name '*-plain.jar' | sort | tail -n1)"
[[ -n "$jar" ]] || { echo " - $name: bootJar не найден, пропуск"; continue; }
cp -f "$jar" "$OUT/$name.jar"
echo " + $name.jar <- $(basename "$jar")"
count=$((count + 1))
done
echo "==> Копирую config-repo в $OUT/config-repo (самодостаточная папка)"
rm -rf "$OUT/config-repo"
cp -r "$ROOT/config-repo" "$OUT/config-repo"
echo "==> Генерирую $OUT/run.sh"
cat > "$OUT/run.sh" <<'RUNEOF'
#!/usr/bin/env bash
#
# Запуск одного сервиса из собранной папки через java -jar.
#
# ./run.sh # список доступных сервисов
# ./run.sh spring-cloud-config-server # ПЕРВЫМ всегда поднимаем config server
# ./run.sh pcp-tgu-service # затем нужные сервисы (в отдельных терминалах)
#
# Память не ограничена. Задать лимит при необходимости:
# JAVA_OPTS="-Xmx384m" ./run.sh pcp-tgu-service
#
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_REPO="$HERE/config-repo"
JAVA_OPTS="${JAVA_OPTS:-}"
name="${1:-}"
if [[ -z "$name" ]]; then
echo "Использование: ./run.sh <имя-сервиса>"
echo
echo "Сначала запусти config server: ./run.sh spring-cloud-config-server"
echo
echo "Доступные сервисы:"
for j in "$HERE"/*.jar; do basename "$j" .jar; done | sed 's/^/ /'
exit 1
fi
jar="$HERE/$name.jar"
[[ -f "$jar" ]] || { echo "Нет файла: $jar"; exit 1; }
if [[ "$name" == "spring-cloud-config-server" ]]; then
# config server в профиле local работает в native-режиме и читает yaml отсюда
export SPRING_PROFILES_ACTIVE="${SPRING_PROFILES_ACTIVE:-local}"
export CONFIG_NATIVE_SEARCH_LOCATIONS="${CONFIG_NATIVE_SEARCH_LOCATIONS:-optional:file:$CONFIG_REPO}"
echo "==> config-repo: $CONFIG_REPO"
fi
echo "==> java $JAVA_OPTS -jar $name.jar"
exec java $JAVA_OPTS -jar "$jar"
RUNEOF
chmod +x "$OUT/run.sh"
echo "==> Генерирую $OUT/up.sh"
cat > "$OUT/up.sh" <<'UPEOF'
#!/usr/bin/env bash
#
# Поднять сразу несколько сервисов в фоне (config server — всегда первым).
#
# ./up.sh # запустить ВСЕ сервисы
# ./up.sh pcp-tgu-service slots-service # config server + перечисленные
#
# Имя сервиса = имя jar-файла без .jar. Логи: logs/<name>.log, pid: logs/<name>.pid.
# Погасить всё: ./down.sh
#
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_REPO="$HERE/config-repo"
LOGS="$HERE/logs"
mkdir -p "$LOGS"
JAVA_OPTS="${JAVA_OPTS:-}"
CFG="spring-cloud-config-server"
running() { local p="$LOGS/$1.pid"; [[ -f "$p" ]] && kill -0 "$(cat "$p")" 2>/dev/null; }
start_one() {
local name="$1" jar="$HERE/$1.jar"
[[ -f "$jar" ]] || { echo " ! нет $name.jar, пропуск"; return; }
if running "$name"; then echo " = $name уже запущен (pid $(cat "$LOGS/$name.pid"))"; return; fi
if [[ "$name" == "$CFG" ]]; then
SPRING_PROFILES_ACTIVE="${SPRING_PROFILES_ACTIVE:-local}" \
CONFIG_NATIVE_SEARCH_LOCATIONS="${CONFIG_NATIVE_SEARCH_LOCATIONS:-optional:file:$CONFIG_REPO}" \
nohup java $JAVA_OPTS -jar "$jar" > "$LOGS/$name.log" 2>&1 &
else
nohup java $JAVA_OPTS -jar "$jar" > "$LOGS/$name.log" 2>&1 &
fi
echo $! > "$LOGS/$name.pid"
echo " + $name (pid $!) -> logs/$name.log"
}
wait_config_server() {
printf "==> жду config server на :8888"
for _ in $(seq 1 60); do
if curl -sf http://localhost:8888/actuator/health >/dev/null 2>&1; then echo " — UP"; return 0; fi
printf "."; sleep 2
done
echo " — не дождался; смотри logs/$CFG.log"; exit 1
}
targets=("$@")
if [[ ${#targets[@]} -eq 0 ]]; then
for j in "$HERE"/*.jar; do targets+=("$(basename "$j" .jar)"); done
fi
echo "==> config server"
start_one "$CFG"
running "$CFG" && wait_config_server
echo "==> остальные сервисы"
for name in "${targets[@]}"; do
[[ "$name" == "$CFG" ]] && continue
start_one "$name"
done
echo "Готово. Логи: tail -f logs/<name>.log Стоп: ./down.sh"
UPEOF
chmod +x "$OUT/up.sh"
echo "==> Генерирую $OUT/down.sh"
cat > "$OUT/down.sh" <<'DOWNEOF'
#!/usr/bin/env bash
#
# Погасить сервисы, запущенные через up.sh.
# ./down.sh # погасить все
# ./down.sh pcp-tgu-service ... # погасить только перечисленные
#
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOGS="$HERE/logs"
names=("$@")
if [[ ${#names[@]} -eq 0 ]]; then
shopt -s nullglob
for p in "$LOGS"/*.pid; do names+=("$(basename "$p" .pid)"); done
fi
for name in "${names[@]}"; do
p="$LOGS/$name.pid"
[[ -f "$p" ]] || { echo " - $name: pid-файла нет"; continue; }
pid="$(cat "$p")"
if kill -0 "$pid" 2>/dev/null; then kill "$pid"; echo " x $name (pid $pid) остановлен"; else echo " - $name (pid $pid) уже не жив"; fi
rm -f "$p"
done
DOWNEOF
chmod +x "$OUT/down.sh"
echo "==> Генерирую $OUT/README.md"
cat > "$OUT/README.md" <<'MDEOF'
# serviceAllBuild — локальный запуск сервисов через `java -jar`
Папку формирует скрипт `../serviceAllBuild.sh`. Здесь лежат bootJar всех
Spring-сервисов, копия `config-repo` и хелпер `run.sh`.
## Куда класть config-repo
`spring-cloud-config-server` в профиле `local` работает в **native**-режиме и
читает yaml-файлы из локальной папки (а не из git). Папка `config-repo`
**уже скопирована сюда** скриптом сборки, и `run.sh` сам передаёт в config server
абсолютный путь к ней через `CONFIG_NATIVE_SEARCH_LOCATIONS`.
То есть ничего вручную раскладывать не нужно — достаточно запускать config server
через `./run.sh spring-cloud-config-server`. Если правишь конфиги — правь
`serviceAllBuild/config-repo/*.yaml` (или пересобери скриптом, чтобы подтянуть
изменения из корневого `config-repo`).
## Перед запуском: инфраструктура
Сервисам нужны (см. `config-repo/application-local.yaml`):
- PostgreSQL на `localhost:5432`
- Kafka на `localhost:29092`
Подними их (например, через docker-compose проекта) и создай БД скриптами из корня
(`create-service-dbs.sh` / `create_pcp_databases.sh`).
## Порядок запуска
Config server слушает порт **8888** — остальные сервисы ходят за конфигом именно
туда, поэтому он всегда первый. Имя сервиса = имя jar-файла без `.jar`.
### Несколько сервисов сразу (в фоне)
```bash
./up.sh # ВСЕ сервисы
./up.sh pcp-tgu-service slots-service # config server + перечисленные
```
`up.sh` сам поднимает config server первым, ждёт его готовности на :8888, затем
запускает остальные в фоне. Логи — в `logs/<name>.log`, pid — в `logs/<name>.pid`.
```bash
tail -f logs/pcp-tgu-service.log # смотреть лог
./down.sh # погасить все
./down.sh slots-service # погасить один
```
### По одному (на переднем плане, каждый в своём терминале)
```bash
# терминал 1
./run.sh spring-cloud-config-server
# терминал 2 (после того как config server поднялся)
./run.sh pcp-tgu-service
```
Порты сервисов заданы в `config-repo/application-local.yaml` (`pcp.ports.*`):
tgu=7011, slots=7006, ui=7008, gateway=7080, request=7005, mission=7010 и т.д.
## Память
Лимит heap не задан — JVM сама возьмёт до 25% физической RAM на каждый процесс.
Запускай только то, что нужно прямо сейчас. При нехватке памяти можно ограничить
конкретный сервис:
```bash
JAVA_OPTS="-Xmx384m" ./run.sh pcp-mission-planing-service
```
MDEOF
echo
echo "Готово: $count сервисов в $OUT"
echo "Запуск: cd serviceAllBuild && ./run.sh spring-cloud-config-server"