Files
scheduler-backend/.gitea/scripts/update-config-center-images.sh
Developer 433fb60f0a
All checks were successful
Build scheduler-backend image / build-and-push (push) Successful in 3m36s
Add scheduler backend image workflow
2026-05-28 13:15:30 +07:00

155 lines
5.1 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
: "${CONFIG_CENTER_UPDATES_FILE:?CONFIG_CENTER_UPDATES_FILE is required}"
CONFIG_CENTER_CLUSTERS="${CONFIG_CENTER_CLUSTERS:-ack-dev}"
if [ ! -s "$CONFIG_CENTER_UPDATES_FILE" ]; then
echo "No config-center image updates were recorded."
exit 0
fi
if command -v python3 >/dev/null 2>&1; then
PYTHON=python3
elif command -v python >/dev/null 2>&1; then
PYTHON=python
else
echo "Python is required for direct config-center update."
exit 1
fi
WORKDIR="$(mktemp -d)"
trap 'rm -rf "$WORKDIR"' EXIT
echo "Updating config-center after image build succeeded."
git clone git@git.imall.cloud:im-group/config-center.git "$WORKDIR/config-center"
cd "$WORKDIR/config-center"
"$PYTHON" - "$CONFIG_CENTER_UPDATES_FILE" "$CONFIG_CENTER_CLUSTERS" <<'PY'
from __future__ import annotations
import sys
from pathlib import Path
updates_file = Path(sys.argv[1])
clusters = sys.argv[2].split()
updates = [
tuple(line.split("|"))
for line in updates_file.read_text(encoding="utf-8").splitlines()
if line.strip()
]
def update_file(path: Path, deployment: str, image: str, container: str):
lines = path.read_text(encoding="utf-8").splitlines(keepends=True)
changed = False
matched = False
def indent_of(line: str) -> int:
return len(line) - len(line.lstrip(" "))
doc_starts = [
idx for idx, line in enumerate(lines) if line.lstrip(" ").startswith("- apiVersion:")
]
doc_starts.append(len(lines))
for pos, start in enumerate(doc_starts[:-1]):
end = doc_starts[pos + 1]
block = lines[start:end]
if not any(line.lstrip(" ").strip() == "kind: Deployment" for line in block):
continue
metadata_idx = next(
(idx for idx, line in enumerate(block) if line.lstrip(" ").startswith("metadata:")),
None,
)
if metadata_idx is None:
continue
metadata_indent = indent_of(block[metadata_idx])
next_peer = next(
(
idx
for idx in range(metadata_idx + 1, len(block))
if block[idx].strip() and indent_of(block[idx]) <= metadata_indent
),
len(block),
)
metadata = block[metadata_idx:next_peer]
if not any(
line.lstrip(" ").startswith("name: ")
and line.split(":", 1)[1].strip() == deployment
for line in metadata
):
continue
list_starts = []
for idx, line in enumerate(block):
stripped = line.lstrip(" ")
if stripped.startswith(("- image:", "- command:", "- name:")):
list_starts.append(idx)
list_starts.append(len(block))
for item_pos, item_start in enumerate(list_starts[:-1]):
item_end = list_starts[item_pos + 1]
item = block[item_start:item_end]
if container and not any(
line.lstrip(" ").startswith("name: ")
and line.split(":", 1)[1].strip() == container
for line in item
):
continue
for rel_idx, line in enumerate(item):
stripped = line.lstrip(" ")
if stripped.startswith("image:") or stripped.startswith("- image:"):
matched = True
abs_idx = start + item_start + rel_idx
old_line = lines[abs_idx]
indent = indent_of(old_line)
newline = "\n" if old_line.endswith("\n") else ""
prefix = old_line[:indent]
marker = "- " if old_line.lstrip(" ").startswith("- image:") else ""
lines[abs_idx] = f"{prefix}{marker}image: {image}{newline}"
changed = changed or lines[abs_idx] != old_line
break
if matched:
break
if matched:
break
if changed:
path.write_text("".join(lines), encoding="utf-8")
return matched, changed
matched_any = False
changed_any = False
for cluster in clusters:
file = Path("apps/openim/overlays") / cluster / "deployments.yaml"
if not file.exists():
raise SystemExit(f"{file} does not exist")
for deployment, image, container in updates:
matched, changed = update_file(file, deployment, image, container)
status = "updated" if changed else "already current" if matched else "no matching change"
print(f"{cluster}: {deployment} -> {image}: {status}")
matched_any = matched_any or matched
changed_any = changed_any or changed
if not matched_any:
raise SystemExit("no config-center deployment/container matches were found")
if not changed_any:
print("All matching config-center images are already current.")
PY
if git diff --quiet -- apps/openim/overlays; then
echo "No config-center image changes to commit."
exit 0
fi
git config user.name "gitea-actions"
git config user.email "gitea-actions@git.imall.cloud"
git add apps/openim/overlays/*/deployments.yaml
git commit -m "Deploy scheduler-backend image after successful build"
git push origin main