ci / api (push) Successful in 50s
ci / recommender (push) Successful in 37s
ci / docker (образы собираются — их сервер собирает сам при обновлении) (apps/web/Dockerfile, web, ) (push) Successful in 44s
release / android + release (push) Failing after 53s
ci / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 45s
ci / ts (packages + web) (push) Successful in 37s
ci / docker (образы собираются — их сервер собирает сам при обновлении) (services/api/Dockerfile, api, api) (push) Successful in 1m30s
ci / docker (образы собираются — их сервер собирает сам при обновлении) (services/api/Dockerfile, storage-agent, storage-agent) (push) Successful in 52s
ci / docker (образы собираются — их сервер собирает сам при обновлении) (services/recommender/Dockerfile, recommender, ) (push) Successful in 28s
ci / mobile (Metro-бандл Android) (push) Successful in 49s
release / verify (push) Successful in 1m14s
- deploy/compose.yaml: every app service has `build:` (repo root context), local tags pipu-music-<service>:<version> - deploy/update.sh: git fetch → checkout tag (latest release by default, or vX.Y.Z / main) → docker compose build --pull → up -d → prune → /readyz; re-executes from a temp copy because checkout may replace the script - install.sh / .env.example: no REGISTRY, PIPU_VERSION set by update.sh, .env owned by the invoking user - release.yml: drop image publishing; release ships APK + sha256 only - ci.yml: new `docker` job builds all images without push - docs: install guide uses git clone, deployment/ci-cd updated, ADR-013 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
56 lines
2.2 KiB
Bash
56 lines
2.2 KiB
Bash
#!/usr/bin/env bash
|
|
# Установка / обновление / откат из клонированного репозитория: образы собираются локально.
|
|
# ./update.sh — последний релизный тег (без -rc)
|
|
# ./update.sh v0.2.0 — конкретная версия (можно без «v»)
|
|
# ./update.sh main — текущая ветка main (для тестов, не для продакшена)
|
|
set -euo pipefail
|
|
|
|
# git checkout может заменить этот файл прямо во время работы — выполняемся из временной копии.
|
|
if [ -z "${PIPU_UPDATE_REEXEC:-}" ]; then
|
|
tmp="$(mktemp)"
|
|
cp "$0" "$tmp"
|
|
PIPU_UPDATE_REEXEC=1 PIPU_DEPLOY_DIR="$(cd "$(dirname "$0")" && pwd)" exec bash "$tmp" "$@"
|
|
fi
|
|
trap 'rm -f "$0"' EXIT
|
|
cd "$PIPU_DEPLOY_DIR"
|
|
|
|
[ -f .env ] || { echo "нет .env — сначала sudo ./install.sh" >&2; exit 1; }
|
|
|
|
REF="${1:-}"
|
|
git fetch --tags --prune --quiet origin
|
|
|
|
if [ -z "$REF" ]; then
|
|
REF="$(git tag -l 'v*' --sort=-v:refname | grep -v -- '-rc' | head -1)"
|
|
[ -n "$REF" ] || { echo "в репозитории нет релизных тегов; укажите версию или main" >&2; exit 1; }
|
|
elif [[ "$REF" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
|
|
REF="v$REF"
|
|
fi
|
|
|
|
echo "→ переключаемся на $REF"
|
|
if git show-ref --verify --quiet "refs/remotes/origin/$REF"; then
|
|
git checkout --quiet "$REF"
|
|
git merge --ff-only --quiet "origin/$REF"
|
|
else
|
|
git checkout --quiet --detach "$REF"
|
|
fi
|
|
|
|
VERSION="$(git describe --tags --always --dirty)"
|
|
VERSION="${VERSION#v}"
|
|
sed -i "s|^PIPU_VERSION=.*|PIPU_VERSION=$VERSION|" .env
|
|
echo "→ версия $VERSION, сборка образов (первая сборка — 5–15 минут)"
|
|
|
|
docker compose build --pull
|
|
docker compose up -d --remove-orphans
|
|
docker image prune -f >/dev/null
|
|
|
|
echo "→ ждём готовности api"
|
|
for _ in $(seq 1 60); do
|
|
if docker compose exec -T nginx wget -qO- http://localhost/readyz >/dev/null 2>&1; then
|
|
echo "pipu $VERSION запущен"
|
|
exit 0
|
|
fi
|
|
sleep 2
|
|
done
|
|
echo "api не стал готов за 2 минуты: docker compose logs api" >&2
|
|
exit 1
|