fix: trigger hwlab v02 ci manually
This commit is contained in:
+1
-1
@@ -57,7 +57,7 @@ export function rootHelp(): unknown {
|
||||
{ command: "auth-broker contract|health --dry-run|credential-request --dry-run|pr-preflight --dry-run", description: "Inspect the P0 Rust auth broker and CLI adapter contract without reading token values, writing GitHub, or starting services." },
|
||||
{ command: "gh preflight|auth|issue|pr", description: "Run safe GitHub issue and PR CRUD/lifecycle operations through REST with body-file update replace/append, comment delete, token diagnostics, PR closeout preflight, hard delete unsupported, and guarded PR merge." },
|
||||
{ command: "commander contract|plan --dry-run|smoke --dry-run|approval request --dry-run|prompt-lint --kind gpt55-pr", description: "Host Codex commander skeleton contract, no-daemon smoke plan, dry-run approval preview, and advisory GPT-5.5 PR prompt boundary lint without live bridges, message sends, or submit gating." },
|
||||
{ command: "hwlab g14 monitor-prs | hwlab g14 control-plane status|apply|rerun-current|runtime-migration|cleanup-runs|cleanup-released-pvs | hwlab g14 tools-image status|build", description: "Start the G14 PR monitor, run bounded v0.2 Tekton/Argo control-plane, runtime migration, and CI workspace retention actions, or build/status fixed HWLAB CI tools images through UniDesk G14 routes." },
|
||||
{ command: "hwlab g14 monitor-prs | hwlab g14 control-plane status|apply|trigger-current|runtime-migration|cleanup-runs|cleanup-released-pvs | hwlab g14 tools-image status|build", description: "Start the G14 PR monitor, run bounded v0.2 Tekton/Argo control-plane, manual PipelineRun trigger, runtime migration, and CI workspace retention actions, or build/status fixed HWLAB CI tools images through UniDesk G14 routes." },
|
||||
{ command: "hwlab cd audit --env dev | hwlab cd status --env dev | hwlab cd apply --env dev --dry-run", description: "Legacy D601 HWLAB DEV CD wrapper kept for explicit old-path diagnostics; current HWLAB rollout uses G14 GitOps." },
|
||||
{ command: "code-agent-sandbox", description: "Independent Code Agent Sandbox service skeleton for adapter, mode, and credential-boundary diagnostics." },
|
||||
{ command: "schedule list|get|runs|run|retry-run|delete", description: "Manage backend-core scheduled tasks and run history; schedule run <id> supports --wait-ms N and retry-run reuses the failed run's schedule." },
|
||||
|
||||
+134
-62
@@ -20,6 +20,24 @@ const V02_POLLER = "hwlab-v02-branch-poller";
|
||||
const V02_RECONCILER = "hwlab-v02-control-plane-reconciler";
|
||||
const V02_PIPELINERUN_PREFIX = "hwlab-v02-ci-poll";
|
||||
const V02_CONTROL_PLANE_FIELD_MANAGER = "unidesk-hwlab-v02-control-plane";
|
||||
const V02_GIT_URL = "git@github.com:pikasTech/HWLAB.git";
|
||||
const V02_GIT_READ_URL = "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git";
|
||||
const V02_GITOPS_BRANCH = "v0.2-gitops";
|
||||
const V02_CATALOG_PATH = "deploy/artifact-catalog.v02.json";
|
||||
const V02_RUNTIME_PATH = "deploy/gitops/g14/runtime-v02";
|
||||
const V02_REGISTRY_PREFIX = "127.0.0.1:5000/hwlab";
|
||||
const V02_BASE_IMAGE = "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim";
|
||||
const V02_SERVICE_IDS = [
|
||||
"hwlab-cloud-api",
|
||||
"hwlab-cloud-web",
|
||||
"hwlab-agent-mgr",
|
||||
"hwlab-agent-worker",
|
||||
"hwlab-device-pod",
|
||||
"hwlab-gateway",
|
||||
"hwlab-edge-proxy",
|
||||
"hwlab-cli",
|
||||
"hwlab-agent-skills",
|
||||
];
|
||||
const G14_CI_TOOLS_IMAGE_REPO = "127.0.0.1:5000/hwlab/hwlab-ci-node-tools";
|
||||
const G14_CI_TOOLS_BASE_TAG = "node22-alpine-v1";
|
||||
const DEFAULT_INTERVAL_SECONDS = 600;
|
||||
@@ -49,7 +67,7 @@ interface G14RecordRolloutOptions {
|
||||
}
|
||||
|
||||
interface G14ControlPlaneOptions {
|
||||
action: "status" | "apply" | "rerun-current" | "cleanup-runs" | "cleanup-released-pvs" | "runtime-migration";
|
||||
action: "status" | "apply" | "trigger-current" | "cleanup-runs" | "cleanup-released-pvs" | "runtime-migration";
|
||||
lane: "v02" | "g14" | "all";
|
||||
dryRun: boolean;
|
||||
confirm: boolean;
|
||||
@@ -163,16 +181,17 @@ function parseRecordRolloutOptions(args: string[]): G14RecordRolloutOptions {
|
||||
}
|
||||
|
||||
function parseControlPlaneOptions(args: string[]): G14ControlPlaneOptions {
|
||||
const [actionRaw] = args;
|
||||
const [rawAction] = args;
|
||||
const actionRaw = rawAction === "rerun-current" ? "trigger-current" : rawAction;
|
||||
if (
|
||||
actionRaw !== "status" &&
|
||||
actionRaw !== "apply" &&
|
||||
actionRaw !== "rerun-current" &&
|
||||
actionRaw !== "trigger-current" &&
|
||||
actionRaw !== "cleanup-runs" &&
|
||||
actionRaw !== "cleanup-released-pvs" &&
|
||||
actionRaw !== "runtime-migration"
|
||||
) {
|
||||
throw new Error("control-plane usage: status|apply|rerun-current|runtime-migration --lane v02 | cleanup-runs --lane v02|g14|all | cleanup-released-pvs --lane all [--dry-run|--confirm]");
|
||||
throw new Error("control-plane usage: status|apply|trigger-current|runtime-migration --lane v02 | cleanup-runs --lane v02|g14|all | cleanup-released-pvs --lane all [--dry-run|--confirm]");
|
||||
}
|
||||
const lane = optionValue(args, "--lane") ?? (actionRaw === "cleanup-released-pvs" ? "all" : "v02");
|
||||
if (actionRaw === "cleanup-runs") {
|
||||
@@ -180,7 +199,7 @@ function parseControlPlaneOptions(args: string[]): G14ControlPlaneOptions {
|
||||
} else if (actionRaw === "cleanup-released-pvs") {
|
||||
if (lane !== "all") throw new Error("control-plane cleanup-released-pvs requires --lane all because released PVs no longer preserve the v02/g14 PipelineRun lane");
|
||||
} else if (lane !== "v02") {
|
||||
throw new Error("control-plane status/apply/rerun-current/runtime-migration currently requires --lane v02");
|
||||
throw new Error("control-plane status/apply/trigger-current/runtime-migration currently requires --lane v02");
|
||||
}
|
||||
const confirm = args.includes("--confirm");
|
||||
const explicitDryRun = args.includes("--dry-run");
|
||||
@@ -351,10 +370,6 @@ function v02PipelineRunName(sourceCommit: string): string {
|
||||
return `${V02_PIPELINERUN_PREFIX}-${shortSha(sourceCommit)}`;
|
||||
}
|
||||
|
||||
function v02ManualPollerJobName(sourceCommit: string): string {
|
||||
return `hwlab-v02-branch-poller-manual-${shortSha(sourceCommit)}`;
|
||||
}
|
||||
|
||||
function getPipelineRunCompact(name: string): Record<string, unknown> {
|
||||
const result = g14K3s([
|
||||
"kubectl",
|
||||
@@ -607,7 +622,7 @@ function runV02RuntimeMigration(options: G14ControlPlaneOptions, sourceCommit: s
|
||||
}
|
||||
: {
|
||||
health: "curl -fsS --max-time 20 http://74.48.78.17:19667/health/live",
|
||||
rerunCurrent: "bun scripts/cli.ts hwlab g14 control-plane rerun-current --lane v02 --confirm",
|
||||
triggerCurrent: "bun scripts/cli.ts hwlab g14 control-plane trigger-current --lane v02 --confirm",
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -685,17 +700,13 @@ function applyV02ControlPlaneFiles(sourceCommit: string, dryRun: boolean, timeou
|
||||
"-f",
|
||||
`${renderDir}/tekton-v02/pipeline.yaml`,
|
||||
"-f",
|
||||
`${renderDir}/tekton-v02/poller.yaml`,
|
||||
"-f",
|
||||
`${renderDir}/tekton-v02/control-plane-reconciler.yaml`,
|
||||
"-f",
|
||||
`${renderDir}/argocd/project.yaml`,
|
||||
"-f",
|
||||
`${renderDir}/argocd/application-v02.yaml`,
|
||||
], timeoutSeconds * 1000);
|
||||
}
|
||||
|
||||
function getV02PollerCronJob(): CommandJsonResult {
|
||||
function getV02ObsoleteCronJobs(): CommandJsonResult {
|
||||
return g14K3s([
|
||||
"kubectl",
|
||||
"get",
|
||||
@@ -703,42 +714,104 @@ function getV02PollerCronJob(): CommandJsonResult {
|
||||
"-n",
|
||||
CI_NAMESPACE,
|
||||
V02_POLLER,
|
||||
V02_RECONCILER,
|
||||
"--ignore-not-found",
|
||||
"-o",
|
||||
"jsonpath={.metadata.name}{\"\\n\"}{.spec.schedule}{\"\\n\"}",
|
||||
"name",
|
||||
], 60_000);
|
||||
}
|
||||
|
||||
function deleteV02ObsoleteCronJobs(dryRun: boolean): CommandJsonResult {
|
||||
return g14K3s([
|
||||
"kubectl",
|
||||
"delete",
|
||||
"cronjob",
|
||||
"-n",
|
||||
CI_NAMESPACE,
|
||||
V02_POLLER,
|
||||
V02_RECONCILER,
|
||||
"--ignore-not-found=true",
|
||||
...(dryRun ? ["--dry-run=server", "-o", "name"] : []),
|
||||
], 60_000);
|
||||
}
|
||||
|
||||
function v02PipelineRunManifest(sourceCommit: string): Record<string, unknown> {
|
||||
const pipelineRun = v02PipelineRunName(sourceCommit);
|
||||
return {
|
||||
apiVersion: "tekton.dev/v1",
|
||||
kind: "PipelineRun",
|
||||
metadata: {
|
||||
name: pipelineRun,
|
||||
namespace: CI_NAMESPACE,
|
||||
labels: {
|
||||
"app.kubernetes.io/part-of": "hwlab",
|
||||
"hwlab.pikastech.local/gitops-target": "v02",
|
||||
"hwlab.pikastech.local/source-commit": sourceCommit,
|
||||
"hwlab.pikastech.local/trigger": "manual-cli",
|
||||
},
|
||||
annotations: {
|
||||
"hwlab.pikastech.local/source-branch": V02_SOURCE_BRANCH,
|
||||
"hwlab.pikastech.local/gitops-branch": V02_GITOPS_BRANCH,
|
||||
"hwlab.pikastech.local/triggered-by": "unidesk-cli",
|
||||
},
|
||||
},
|
||||
spec: {
|
||||
pipelineRef: { name: V02_PIPELINE },
|
||||
taskRunTemplate: {
|
||||
serviceAccountName: "hwlab-v02-tekton-runner",
|
||||
podTemplate: {
|
||||
hostNetwork: true,
|
||||
dnsPolicy: "ClusterFirstWithHostNet",
|
||||
securityContext: { fsGroup: 1000 },
|
||||
},
|
||||
},
|
||||
params: [
|
||||
{ name: "git-url", value: V02_GIT_URL },
|
||||
{ name: "git-read-url", value: V02_GIT_READ_URL },
|
||||
{ name: "source-branch", value: V02_SOURCE_BRANCH },
|
||||
{ name: "gitops-branch", value: V02_GITOPS_BRANCH },
|
||||
{ name: "lane", value: "v02" },
|
||||
{ name: "catalog-path", value: V02_CATALOG_PATH },
|
||||
{ name: "image-tag-mode", value: "full" },
|
||||
{ name: "runtime-path", value: V02_RUNTIME_PATH },
|
||||
{ name: "revision", value: sourceCommit },
|
||||
{ name: "registry-prefix", value: V02_REGISTRY_PREFIX },
|
||||
{ name: "services", value: V02_SERVICE_IDS.join(",") },
|
||||
{ name: "base-image", value: V02_BASE_IMAGE },
|
||||
],
|
||||
workspaces: [
|
||||
{ name: "source", volumeClaimTemplate: { spec: { accessModes: ["ReadWriteOnce"], resources: { requests: { storage: "8Gi" } } } } },
|
||||
{ name: "git-ssh", secret: { secretName: "hwlab-git-ssh" } },
|
||||
],
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function createV02PipelineRun(sourceCommit: string, timeoutSeconds: number): CommandJsonResult {
|
||||
const manifest = JSON.stringify(v02PipelineRunManifest(sourceCommit));
|
||||
const manifestB64 = Buffer.from(manifest, "utf8").toString("base64");
|
||||
const pipelineRun = v02PipelineRunName(sourceCommit);
|
||||
const script = [
|
||||
"set -eu",
|
||||
`manifest_b64=${shellQuote(manifestB64)}`,
|
||||
`manifest_path=/tmp/${pipelineRun}.json`,
|
||||
"printf '%s' \"$manifest_b64\" | base64 -d > \"$manifest_path\"",
|
||||
"kubectl create -f \"$manifest_path\"",
|
||||
`kubectl get pipelinerun -n ${shellQuote(CI_NAMESPACE)} ${shellQuote(pipelineRun)} -o jsonpath='{.metadata.name}{\"\\n\"}{.metadata.labels.hwlab\\.pikastech\\.local/source-commit}{\"\\n\"}{.status.conditions[0].status}{\"\\n\"}{.status.conditions[0].reason}{\"\\n\"}'`,
|
||||
].join("\n");
|
||||
return g14K3s(["script", "--", script], timeoutSeconds * 1000);
|
||||
}
|
||||
|
||||
function deleteV02PipelineRun(pipelineRun: string): CommandJsonResult {
|
||||
return g14K3s(["kubectl", "delete", "pipelinerun", "-n", CI_NAMESPACE, pipelineRun, "--ignore-not-found=true"], 60_000);
|
||||
}
|
||||
|
||||
function deleteV02ManualPollerJob(jobName: string): CommandJsonResult {
|
||||
return g14K3s(["kubectl", "delete", "job", "-n", CI_NAMESPACE, jobName, "--ignore-not-found=true"], 60_000);
|
||||
}
|
||||
|
||||
function createV02ManualPollerJob(jobName: string): CommandJsonResult {
|
||||
return g14K3s(["kubectl", "create", "job", "-n", CI_NAMESPACE, `--from=cronjob/${V02_POLLER}`, jobName], 60_000);
|
||||
}
|
||||
|
||||
function getV02ManualPollerJob(jobName: string): CommandJsonResult {
|
||||
return g14K3s([
|
||||
"kubectl",
|
||||
"get",
|
||||
"job",
|
||||
"-n",
|
||||
CI_NAMESPACE,
|
||||
jobName,
|
||||
"-o",
|
||||
"jsonpath={.metadata.name}{\"\\n\"}{.status.conditions[0].type}{\"\\n\"}{.status.conditions[0].status}{\"\\n\"}",
|
||||
], 60_000);
|
||||
}
|
||||
|
||||
function v02ControlPlaneStatus(sourceCommit: string | null = getV02Head()): Record<string, unknown> {
|
||||
const pipelineRun = sourceCommit === null ? null : v02PipelineRunName(sourceCommit);
|
||||
const controlPlane = g14K3s([
|
||||
"kubectl",
|
||||
"get",
|
||||
"cronjob,pipeline,role,rolebinding,serviceaccount",
|
||||
"pipeline,role,rolebinding,serviceaccount",
|
||||
"-n",
|
||||
CI_NAMESPACE,
|
||||
"-l",
|
||||
@@ -746,6 +819,7 @@ function v02ControlPlaneStatus(sourceCommit: string | null = getV02Head()): Reco
|
||||
"-o",
|
||||
"name",
|
||||
], 60_000);
|
||||
const obsoleteCronJobs = getV02ObsoleteCronJobs();
|
||||
const argo = g14K3s([
|
||||
"kubectl",
|
||||
"get",
|
||||
@@ -768,8 +842,7 @@ function v02ControlPlaneStatus(sourceCommit: string | null = getV02Head()): Reco
|
||||
namespace: CI_NAMESPACE,
|
||||
runtimeNamespace: "hwlab-v02",
|
||||
pipeline: V02_PIPELINE,
|
||||
poller: V02_POLLER,
|
||||
reconciler: V02_RECONCILER,
|
||||
trigger: "manual UniDesk CLI PipelineRun creation",
|
||||
argoApplication: V02_APP,
|
||||
},
|
||||
controlPlane: {
|
||||
@@ -777,6 +850,11 @@ function v02ControlPlaneStatus(sourceCommit: string | null = getV02Head()): Reco
|
||||
names: statusText(controlPlane).split(/\r?\n/u).map((line) => line.trim()).filter(Boolean),
|
||||
stderr: controlPlane.stderr.trim().slice(0, 2000),
|
||||
},
|
||||
obsoleteCronJobs: {
|
||||
ok: isCommandSuccess(obsoleteCronJobs),
|
||||
names: statusText(obsoleteCronJobs).split(/\r?\n/u).map((line) => line.trim()).filter(Boolean),
|
||||
cleanupCommand: "bun scripts/cli.ts hwlab g14 control-plane apply --lane v02 --confirm",
|
||||
},
|
||||
argo: {
|
||||
ok: isCommandSuccess(argo),
|
||||
raw: statusText(argo),
|
||||
@@ -817,34 +895,33 @@ function runV02ControlPlane(options: G14ControlPlaneOptions): Record<string, unk
|
||||
renderDir: v02RenderDir(sourceCommit),
|
||||
renderCheck: commandData(renderCheck),
|
||||
apply,
|
||||
cleanupObsoleteCronJobs: options.dryRun ? deleteV02ObsoleteCronJobs(true) : deleteV02ObsoleteCronJobs(false),
|
||||
status: v02ControlPlaneStatus(sourceCommit),
|
||||
next: options.dryRun
|
||||
? { apply: "bun scripts/cli.ts hwlab g14 control-plane apply --lane v02 --confirm" }
|
||||
: { rerunCurrent: "bun scripts/cli.ts hwlab g14 control-plane rerun-current --lane v02 --confirm" },
|
||||
: { triggerCurrent: "bun scripts/cli.ts hwlab g14 control-plane trigger-current --lane v02 --confirm" },
|
||||
};
|
||||
}
|
||||
const before = getPipelineRunCompact(v02PipelineRunName(sourceCommit));
|
||||
if (options.dryRun) {
|
||||
const poller = getV02PollerCronJob();
|
||||
return {
|
||||
ok: isCommandSuccess(poller),
|
||||
command: "hwlab g14 control-plane rerun-current --lane v02",
|
||||
ok: true,
|
||||
command: "hwlab g14 control-plane trigger-current --lane v02",
|
||||
lane: "v02",
|
||||
mode: "dry-run",
|
||||
sourceCommit,
|
||||
pipelineRun: v02PipelineRunName(sourceCommit),
|
||||
manualJob: v02ManualPollerJobName(sourceCommit),
|
||||
before,
|
||||
poller,
|
||||
next: { rerunCurrent: "bun scripts/cli.ts hwlab g14 control-plane rerun-current --lane v02 --confirm" },
|
||||
manifest: v02PipelineRunManifest(sourceCommit),
|
||||
next: { triggerCurrent: "bun scripts/cli.ts hwlab g14 control-plane trigger-current --lane v02 --confirm" },
|
||||
};
|
||||
}
|
||||
if (before.status === "True" || before.status === "Unknown") {
|
||||
return {
|
||||
ok: false,
|
||||
command: "hwlab g14 control-plane rerun-current --lane v02",
|
||||
command: "hwlab g14 control-plane trigger-current --lane v02",
|
||||
lane: "v02",
|
||||
mode: "confirmed-rerun",
|
||||
mode: "confirmed-trigger",
|
||||
sourceCommit,
|
||||
pipelineRun: v02PipelineRunName(sourceCommit),
|
||||
before,
|
||||
@@ -852,24 +929,19 @@ function runV02ControlPlane(options: G14ControlPlaneOptions): Record<string, unk
|
||||
};
|
||||
}
|
||||
const deletePipelineRun = deleteV02PipelineRun(v02PipelineRunName(sourceCommit));
|
||||
const deleteJob = deleteV02ManualPollerJob(v02ManualPollerJobName(sourceCommit));
|
||||
const createJob = isCommandSuccess(deletePipelineRun) && isCommandSuccess(deleteJob)
|
||||
? createV02ManualPollerJob(v02ManualPollerJobName(sourceCommit))
|
||||
const createPipelineRun = isCommandSuccess(deletePipelineRun)
|
||||
? createV02PipelineRun(sourceCommit, options.timeoutSeconds)
|
||||
: null;
|
||||
const job = createJob !== null && isCommandSuccess(createJob) ? getV02ManualPollerJob(v02ManualPollerJobName(sourceCommit)) : null;
|
||||
return {
|
||||
ok: isCommandSuccess(deletePipelineRun) && isCommandSuccess(deleteJob) && createJob !== null && isCommandSuccess(createJob),
|
||||
command: "hwlab g14 control-plane rerun-current --lane v02",
|
||||
ok: isCommandSuccess(deletePipelineRun) && createPipelineRun !== null && isCommandSuccess(createPipelineRun),
|
||||
command: "hwlab g14 control-plane trigger-current --lane v02",
|
||||
lane: "v02",
|
||||
mode: "confirmed-rerun",
|
||||
mode: "confirmed-trigger",
|
||||
sourceCommit,
|
||||
pipelineRun: v02PipelineRunName(sourceCommit),
|
||||
manualJob: v02ManualPollerJobName(sourceCommit),
|
||||
before,
|
||||
deletePipelineRun,
|
||||
deleteJob,
|
||||
createJob,
|
||||
job,
|
||||
createPipelineRun,
|
||||
after: getPipelineRunCompact(v02PipelineRunName(sourceCommit)),
|
||||
};
|
||||
}
|
||||
@@ -1724,7 +1796,7 @@ export function hwlabG14Help(): Record<string, unknown> {
|
||||
"bun scripts/cli.ts hwlab g14 control-plane status --lane v02",
|
||||
"bun scripts/cli.ts hwlab g14 control-plane apply --lane v02 --dry-run",
|
||||
"bun scripts/cli.ts hwlab g14 control-plane apply --lane v02 --confirm",
|
||||
"bun scripts/cli.ts hwlab g14 control-plane rerun-current --lane v02 --confirm",
|
||||
"bun scripts/cli.ts hwlab g14 control-plane trigger-current --lane v02 --confirm",
|
||||
"bun scripts/cli.ts hwlab g14 control-plane cleanup-runs --lane v02 --min-age-minutes 30 --limit 20 --dry-run",
|
||||
"bun scripts/cli.ts hwlab g14 control-plane cleanup-runs --lane v02 --min-age-minutes 30 --limit 20 --confirm",
|
||||
"bun scripts/cli.ts hwlab g14 control-plane cleanup-released-pvs --lane all --limit 20 --dry-run",
|
||||
@@ -1736,7 +1808,7 @@ export function hwlabG14Help(): Record<string, unknown> {
|
||||
"bun scripts/cli.ts hwlab g14 tools-image build --name ci-node-tools --tag node22-alpine-bun-v1 --confirm",
|
||||
"bun scripts/cli.ts job status <jobId> --tail-bytes 30000",
|
||||
],
|
||||
description: "G14 HWLAB PR monitor, DEV rollout command, bounded v0.2 control-plane bootstrap/cleanup/runtime-migration helper, and controlled CI tools image build/status entry. The public monitor starts a fire-and-forget job; control-plane status/apply/rerun-current/cleanup-runs/cleanup-released-pvs/runtime-migration uses UniDesk G14:k3s routes for v0.2 Tekton/Argo control resources, runtime migration, and completed CI workspace retention only.",
|
||||
description: "G14 HWLAB PR monitor, DEV rollout command, bounded v0.2 control-plane bootstrap/cleanup/runtime-migration helper, and controlled CI tools image build/status entry. The public monitor starts a fire-and-forget job; control-plane status/apply/trigger-current/cleanup-runs/cleanup-released-pvs/runtime-migration uses UniDesk G14:k3s routes for v0.2 Tekton/Argo control resources, manual PipelineRun trigger, runtime migration, and completed CI workspace retention only.",
|
||||
defaults: {
|
||||
repo: HWLAB_REPO,
|
||||
base: G14_SOURCE_BRANCH,
|
||||
|
||||
Reference in New Issue
Block a user