ci: release mai-bot without external image pulls
This commit is contained in:
@@ -3,6 +3,7 @@ set -euo pipefail
|
||||
|
||||
release_dir="${1:?usage: activate-release.sh <release-dir>}"
|
||||
runtime_root="${MAIBOT_RUNTIME_ROOT:-/root/maibot-offline}"
|
||||
base_image="${MAIBOT_BASE_IMAGE:-maibot-offline:latest}"
|
||||
|
||||
case "$runtime_root" in
|
||||
/root/maibot-offline|/root/maibot-offline/*) ;;
|
||||
@@ -17,6 +18,23 @@ if [ ! -d "$release_dir" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! docker image inspect "$base_image" >/dev/null 2>&1; then
|
||||
echo "base image not found locally: $base_image" >&2
|
||||
echo "bootstrap it once with deploy/server-maibot/Dockerfile.offline before using the release pipeline" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for dep_file in pyproject.toml uv.lock; do
|
||||
if [ -f "$runtime_root/$dep_file" ] && ! cmp -s "$release_dir/$dep_file" "$runtime_root/$dep_file"; then
|
||||
echo "dependency metadata changed: $dep_file" >&2
|
||||
echo "refresh the local base image with deploy/server-maibot/Dockerfile.offline before using the release pipeline" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
release_id="$(basename "$release_dir")"
|
||||
release_image="maibot-offline:${release_id}"
|
||||
|
||||
mkdir -p \
|
||||
"$runtime_root" \
|
||||
"$runtime_root/data/MaiMBot" \
|
||||
@@ -28,7 +46,7 @@ mkdir -p \
|
||||
"$runtime_root/docker-config/mmc" \
|
||||
"$runtime_root/docker-config/napcat"
|
||||
|
||||
python3 - "$release_dir" "$runtime_root" <<'PY'
|
||||
python3 - "$release_dir/deploy/server-maibot" "$runtime_root/deploy/server-maibot" <<'PY'
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import sys
|
||||
@@ -36,44 +54,23 @@ import sys
|
||||
src = Path(sys.argv[1]).resolve()
|
||||
dst = Path(sys.argv[2]).resolve()
|
||||
|
||||
skip_names = {
|
||||
".git",
|
||||
".gitea",
|
||||
".github",
|
||||
".venv",
|
||||
"data",
|
||||
"docker-config",
|
||||
"depends-data",
|
||||
"logs",
|
||||
"plugins",
|
||||
"acme",
|
||||
"backups",
|
||||
"bin",
|
||||
"_staging",
|
||||
}
|
||||
skip_suffixes = {".pem", ".key", ".tar", ".tgz", ".zip"}
|
||||
if dst.exists():
|
||||
shutil.rmtree(dst)
|
||||
|
||||
for item in src.iterdir():
|
||||
if item.name in skip_names or item.suffix in skip_suffixes:
|
||||
continue
|
||||
|
||||
target = dst / item.name
|
||||
if target.exists():
|
||||
if target.is_dir() and not target.is_symlink():
|
||||
shutil.rmtree(target)
|
||||
else:
|
||||
target.unlink()
|
||||
|
||||
if item.is_dir():
|
||||
shutil.copytree(
|
||||
item,
|
||||
target,
|
||||
ignore=shutil.ignore_patterns("__pycache__", "*.pyc", "*.pyo"),
|
||||
)
|
||||
else:
|
||||
shutil.copy2(item, target)
|
||||
shutil.copytree(
|
||||
src,
|
||||
dst,
|
||||
ignore=shutil.ignore_patterns("__pycache__", "*.pyc", "*.pyo"),
|
||||
)
|
||||
PY
|
||||
|
||||
docker build \
|
||||
--build-arg "MAIBOT_BASE_IMAGE=${base_image}" \
|
||||
-f "$release_dir/deploy/server-maibot/Dockerfile.release" \
|
||||
-t "$release_image" \
|
||||
"$release_dir"
|
||||
|
||||
docker tag "$release_image" maibot-offline:latest
|
||||
|
||||
cd "$runtime_root"
|
||||
docker build -f deploy/server-maibot/Dockerfile.offline -t maibot-offline:latest .
|
||||
docker compose -f deploy/server-maibot/docker-compose.server.yml up -d
|
||||
MAIBOT_CORE_IMAGE="$release_image" docker compose -f deploy/server-maibot/docker-compose.server.yml up -d
|
||||
|
||||
Reference in New Issue
Block a user