dsh 0.2.0-rc.2: in-container update (experimental channel), path-agnostic compose, upstream patches adapted to 0.1.x/0.2.x
This commit is contained in:
commit
e6dcef9bf5
302 files changed
+75178
No files matched your search
@@ -0,0 +1,41 @@
|
||||
#!/bin/sh
|
||||
# ════════════════════════════════════════════════════════════════════════════
|
||||
# Сборка образа dsh из вендоренного исходника (upstream/) в локальный Docker.
|
||||
# Пин сообщества (latestSupportedDsh) в dev-режиме сборки не действует — версию
|
||||
# задаём явно. Результат тегируется в реестр archeon.
|
||||
#
|
||||
# Использование:
|
||||
# scripts/build-image.sh # версия = npm dist-tag latest
|
||||
# scripts/build-image.sh 0.2.0-rc.2 # конкретная версия
|
||||
# scripts/build-image.sh 0.2.0-rc.2 --push # + docker push в реестр
|
||||
# ════════════════════════════════════════════════════════════════════════════
|
||||
set -eu
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
VERSION=${1:-}
|
||||
PUSH=0
|
||||
[ "${2:-}" = --push ] && PUSH=1
|
||||
if [ -z "$VERSION" ] || [ "$VERSION" = latest ]; then
|
||||
VERSION=$(curl -fsS https://registry.npmjs.org/-/package/@deepseek-ai%2Fdsh/dist-tags | sed -n 's/.*"latest":"\([^"]*\)".*/\1/p')
|
||||
[ -n "$VERSION" ] || { echo "не удалось определить npm latest" >&2; exit 1; }
|
||||
fi
|
||||
|
||||
IMAGE=${DSH_IMAGE:-gitea.archeon.io/archeon/dsh}
|
||||
REPO=${IMAGE%%:*}
|
||||
echo "=== Сборка $REPO:$VERSION (DSH_VERSION=$VERSION)"
|
||||
DOCKER_BUILDKIT=1 docker build \
|
||||
--build-arg DSH_VERSION="$VERSION" \
|
||||
-t "$REPO:$VERSION" \
|
||||
-t "$REPO:latest" \
|
||||
upstream/
|
||||
|
||||
echo "=== Проверка: версия внутри образа"
|
||||
docker run --rm --entrypoint /bin/sh "$REPO:$VERSION" \
|
||||
-c "grep -o '\"version\":\"[^\"]*\"' /opt/dsh-platform/seed/pristine/*/package.json | head -1"
|
||||
|
||||
if [ "$PUSH" = 1 ]; then
|
||||
echo "=== Push в реестр"
|
||||
docker push "$REPO:$VERSION"
|
||||
docker push "$REPO:latest"
|
||||
fi
|
||||
echo "Готово: $REPO:$VERSION (+ latest). Обновить стенд: docker compose -p dsh pull && docker compose -p dsh up -d"
|
||||
@@ -0,0 +1,77 @@
|
||||
#!/bin/sh
|
||||
# ════════════════════════════════════════════════════════════════════════════
|
||||
# Обновление dsh внутри работающего контейнера — «как плагины», без пересборки.
|
||||
#
|
||||
# Механизм: management console платформы, канал experimental — ставит npm-версию
|
||||
# @deepseek-ai/dsh в /data/platform ( персистентный volume), с пробацией и
|
||||
# автоматическим откатом при неудаче. Код dsh переживает пересоздание контейнера.
|
||||
#
|
||||
# Использование:
|
||||
# scripts/update-dsh.sh # до npm dist-tag latest
|
||||
# scripts/update-dsh.sh check # только показать текущую/доступную версии
|
||||
# scripts/update-dsh.sh --container X # другое имя контейнера (по умолчанию dsh)
|
||||
#
|
||||
# Примечания:
|
||||
# - experimental ставит ТОЛЬКО npm dist-tag latest (вверх). Конкретная версия —
|
||||
# scripts/build-image.sh <версия> + смена DSH_IMAGE в .env.
|
||||
# - Плагины профиля web (/data/dsh) не трогаются и переживают обновление.
|
||||
# ════════════════════════════════════════════════════════════════════════════
|
||||
set -eu
|
||||
|
||||
CONTAINER=dsh
|
||||
ACTION=update
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--container) CONTAINER="$2"; shift 2 ;;
|
||||
check) ACTION=check; shift ;;
|
||||
*) echo "unknown arg: $1" >&2; exit 64 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
say() { printf '\n=== %s\n' "$*"; }
|
||||
|
||||
docker inspect -f '{{.State.Running}}' "$CONTAINER" >/dev/null 2>&1 || {
|
||||
echo "Контейнер '$CONTAINER' не запущен. Сначала: docker compose -p dsh up -d" >&2; exit 1; }
|
||||
|
||||
say "Текущая версия"
|
||||
CURRENT=$(docker exec "$CONTAINER" dsh --version)
|
||||
echo "installed: $CURRENT"
|
||||
|
||||
say "Доступно на npm"
|
||||
TARGET=$(docker exec "$CONTAINER" node -e "fetch('https://registry.npmjs.org/-/package/@deepseek-ai%2Fdsh/dist-tags').then(r=>r.json()).then(d=>console.log(d.latest)).catch(e=>{console.error(e.message);process.exit(1)})")
|
||||
echo "npm latest: $TARGET"
|
||||
|
||||
[ "$ACTION" = check ] && exit 0
|
||||
|
||||
if [ "$CURRENT" = "$TARGET" ]; then
|
||||
echo "Уже актуально ($CURRENT). Выход."; exit 0
|
||||
fi
|
||||
|
||||
say "Переключаю канал на experimental"
|
||||
docker exec "$CONTAINER" dsh-platform channel experimental
|
||||
|
||||
say "Запускаю обновление (скачивание+установка+рестарт рантайма; это минуты)"
|
||||
if ! docker exec "$CONTAINER" dsh-platform update --wait; then
|
||||
echo "ОШИБКА: обновление не прошло. Диагностика:" >&2
|
||||
docker exec "$CONTAINER" dsh-platform status || true
|
||||
docker exec "$CONTAINER" dsh-platform logs --source updater --limit 50 || true
|
||||
echo "Платформа обычно сама откатилась к $CURRENT. Повтор: scripts/update-dsh.sh" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PROBATION=$(docker exec "$CONTAINER" printenv DSH_EXPERIMENTAL_PROBATION_SECONDS || echo 120)
|
||||
say "Пробация ${PROBATION}s — жду автоподтверждение"
|
||||
WAIT=$((PROBATION + 180)); I=0
|
||||
while [ "$I" -lt "$WAIT" ]; do
|
||||
NEW=$(docker exec "$CONTAINER" dsh --version 2>/dev/null || echo '?')
|
||||
if [ "$NEW" = "$TARGET" ]; then
|
||||
say "Готово: dsh $NEW (было $CURRENT)"
|
||||
docker exec "$CONTAINER" dsh-platform status || true
|
||||
exit 0
|
||||
fi
|
||||
sleep 15; I=$((I + 15))
|
||||
done
|
||||
|
||||
echo "Таймаут ожидания. Текущая версия: $(docker exec "$CONTAINER" dsh --version 2>/dev/null || echo '?')." >&2
|
||||
echo "Проверьте вручную: docker exec $CONTAINER dsh-platform status" >&2
|
||||
exit 1
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/bin/sh
|
||||
# ════════════════════════════════════════════════════════════════════════════
|
||||
# Обновление плагинов профиля web (и фикс bind-адреса code-server после этого).
|
||||
# CLI-апдейт dsh НЕ трогает плагины — они обновляются отдельно.
|
||||
#
|
||||
# Использование:
|
||||
# scripts/update-plugins.sh [--add github:<owner>/<repo>] [--no-restart]
|
||||
# ════════════════════════════════════════════════════════════════════════════
|
||||
set -eu
|
||||
CONTAINER=${DSH_CONTAINER_NAME:-dsh}
|
||||
ADD=""
|
||||
RESTART=1
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--add) ADD="$2"; shift 2 ;;
|
||||
--no-restart) RESTART=0; shift ;;
|
||||
*) echo "unknown arg: $1" >&2; exit 64 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
docker inspect -f '{{.State.Running}}' "$CONTAINER" >/dev/null 2>&1 || {
|
||||
echo "Контейнер '$CONTAINER' не запущен" >&2; exit 1; }
|
||||
|
||||
# Внутренний редирект: без него docker exec может виснуть на фоновом потомке pnpm.
|
||||
if [ -n "$ADD" ]; then
|
||||
echo "=== Установка плагина: $ADD"
|
||||
docker exec "$CONTAINER" sh -c "dsh plugin --profile web add '$ADD' >/tmp/dsh-plugin.log 2>&1; tail -5 /tmp/dsh-plugin.log"
|
||||
fi
|
||||
|
||||
echo "=== Обновление всех плагинов профиля web"
|
||||
docker exec "$CONTAINER" sh -c "dsh plugin --profile web update >/tmp/dsh-plugin.log 2>&1; tail -20 /tmp/dsh-plugin.log"
|
||||
|
||||
echo "=== Фикс bind-адреса code-server (127.0.0.1 -> 0.0.0.0), иначе порт 18500 снаружи refused"
|
||||
docker exec "$CONTAINER" sh -c \
|
||||
"sed -i \"s/'--bind-addr', '127.0.0.1:' + port/'--bind-addr', '0.0.0.0:' + port/\" /data/dsh/profiles/web/node_modules/dsh-vsceditor/lib/host.js 2>/dev/null || echo '(dsh-vsceditor не установлен — пропуск)'"
|
||||
|
||||
if [ "$RESTART" = 1 ]; then
|
||||
echo "=== Рестарт контейнера (pnpm пересобрал граф node_modules под живой процесс)"
|
||||
docker restart "$CONTAINER"
|
||||
echo "ОК. Дождитесь healthy: docker inspect -f '{{.State.Health.Status}}' $CONTAINER"
|
||||
fi
|
||||
Reference in new issue
Block a user