feat: automate staging deploy from Windows Gitea runner

Build immutable API and web images in Aliyun ACR after staging validation, then deploy them safely to the staging host.
This commit is contained in:
linmeng
2026-07-27 11:54:45 +08:00
parent d5334ebecb
commit 742f8f48b2
5 changed files with 266 additions and 7 deletions
+12 -4
View File
@@ -5,8 +5,14 @@ import { pathToFileURL } from "node:url";
const shaPattern = /^[0-9a-f]{40}$/;
const digestPattern = /^sha256:[0-9a-f]{64}$/;
const expectedKeys = ["git_sha", "api_digest", "web_digest"];
const defaultRegistry = "ghcr.io/jesse-ux";
const acrRepository = "crpi-d1feco6itet73spp.cn-hongkong.personal.cr.aliyuncs.com/copse/jyotisha";
const registryPattern = /^(?:[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?)(?::[1-9][0-9]{0,4})?(?:\/[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;
export function parseStagingImageManifest(text, expectedSha) {
export function parseStagingImageManifest(text, expectedSha, registry = defaultRegistry) {
if (!registryPattern.test(registry)) {
throw new Error("invalid staging image registry");
}
if (!shaPattern.test(expectedSha)) {
throw new Error("invalid expected staging revision");
}
@@ -37,12 +43,13 @@ export function parseStagingImageManifest(text, expectedSha) {
}
}
const sharedRepository = registry === acrRepository;
return {
gitSha: expectedSha,
apiDigest: values.get("api_digest"),
webDigest: values.get("web_digest"),
apiImage: `ghcr.io/jesse-ux/jyotisha-api@${values.get("api_digest")}`,
webImage: `ghcr.io/jesse-ux/jyotisha-web@${values.get("web_digest")}`,
apiImage: `${sharedRepository ? registry : `${registry}/jyotisha-api`}@${values.get("api_digest")}`,
webImage: `${sharedRepository ? registry : `${registry}/jyotisha-web`}@${values.get("web_digest")}`,
};
}
@@ -52,13 +59,14 @@ const invokedPath = process.argv[1]
if (invokedPath === import.meta.url) {
try {
const [manifestPath, expectedSha] = process.argv.slice(2);
const [manifestPath, expectedSha, registry] = process.argv.slice(2);
if (!manifestPath || !expectedSha) {
throw new Error("manifest path and expected revision are required");
}
const manifest = parseStagingImageManifest(
await readFile(manifestPath, "utf8"),
expectedSha,
registry,
);
process.stdout.write(
[