5f7e6a9b1a
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Release configuration (push) Successful in 3s
Generic: Repo Health / Scripts governance (push) Successful in 3s
Generic: Repo Health / Repository health (push) Successful in 11s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: PR Check / Branch Policy (pull_request) Successful in 2s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 5s
Universal: PR Check / Validate PR (pull_request) Successful in 5s
Universal: PR Check / Build RC Package (pull_request) Successful in 1s
Generic: Repo Health / Release configuration (pull_request) Successful in 5s
Platform: moko-platform CI / Gate 1: Code Quality (push) Successful in 50s
Generic: Repo Health / Scripts governance (pull_request) Successful in 5s
Generic: Repo Health / Repository health (pull_request) Successful in 14s
Platform: moko-platform CI / Gate 1: Code Quality (pull_request) Successful in 54s
Platform: moko-platform CI / Gate 5: Template Integrity (pull_request) Failing after 4s
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (pull_request) Failing after 45s
Platform: moko-platform CI / Gate 3: Self-Health Check (pull_request) Failing after 47s
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (pull_request) Failing after 49s
Platform: moko-platform CI / Gate 4: Governance (pull_request) Successful in 53s
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (pull_request) Failing after 55s
Platform: moko-platform CI / Gate 5: Template Integrity (push) Failing after 6s
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Failing after 53s
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Failing after 54s
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Failing after 55s
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Failing after 1m12s
Platform: moko-platform CI / Gate 4: Governance (push) Successful in 46s
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Platform: moko-platform CI / CI Summary (pull_request) Has been cancelled
- client_dashboard.php: generates self-contained HTML dashboard showing all client-waas repos with uptime, SSL expiry, release status, and infrastructure config status. Addresses #3. - release_cascade.php: accept "release-candidate" as stability value. Previously only "rc" was mapped, so cascade silently skipped when the pre-release workflow passed "release-candidate". Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
118 lines
3.4 KiB
PHP
118 lines
3.4 KiB
PHP
#!/usr/bin/env php
|
|
<?php
|
|
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
*
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*
|
|
* FILE INFORMATION
|
|
* DEFGROUP: moko-platform.CLI
|
|
* INGROUP: moko-platform
|
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform
|
|
* PATH: /cli/release_cascade.php
|
|
* BRIEF: Delete lesser pre-release channels from Gitea when promoting stability
|
|
*
|
|
* Usage:
|
|
* php release_cascade.php --stability stable --token TOKEN --api-base URL
|
|
* php release_cascade.php --stability rc --token TOKEN --api-base URL
|
|
*
|
|
* Cascade rules:
|
|
* stable -> deletes development, alpha, beta, release-candidate
|
|
* rc -> deletes development, alpha, beta
|
|
* beta -> deletes development, alpha
|
|
* alpha -> deletes development
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
$stability = null;
|
|
$token = null;
|
|
$apiBase = null;
|
|
|
|
foreach ($argv as $i => $arg) {
|
|
if ($arg === '--stability' && isset($argv[$i + 1])) $stability = $argv[$i + 1];
|
|
if ($arg === '--token' && isset($argv[$i + 1])) $token = $argv[$i + 1];
|
|
if ($arg === '--api-base' && isset($argv[$i + 1])) $apiBase = $argv[$i + 1];
|
|
}
|
|
|
|
// Allow token from environment
|
|
if ($token === null) {
|
|
$token = getenv('GA_TOKEN') ?: getenv('GITEA_TOKEN') ?: null;
|
|
}
|
|
|
|
if ($stability === null || $token === null || $apiBase === null) {
|
|
fwrite(STDERR, "Usage: release_cascade.php --stability [stable|rc|beta|alpha] --token TOKEN --api-base URL\n");
|
|
fwrite(STDERR, " --api-base: e.g. https://git.mokoconsulting.tech/api/v1/repos/Org/Repo\n");
|
|
fwrite(STDERR, " Token can also be set via GA_TOKEN or GITEA_TOKEN env var\n");
|
|
exit(1);
|
|
}
|
|
|
|
// Define cascade hierarchy
|
|
$cascadeMap = [
|
|
'stable' => ['development', 'alpha', 'beta', 'release-candidate'],
|
|
'release-candidate' => ['development', 'alpha', 'beta'],
|
|
'rc' => ['development', 'alpha', 'beta'],
|
|
'beta' => ['development', 'alpha'],
|
|
'alpha' => ['development'],
|
|
];
|
|
|
|
if (!isset($cascadeMap[$stability])) {
|
|
fwrite(STDERR, "Unknown stability level: {$stability}\n");
|
|
fwrite(STDERR, "Valid options: stable, rc, beta, alpha\n");
|
|
exit(1);
|
|
}
|
|
|
|
$tagsToDelete = $cascadeMap[$stability];
|
|
$deleted = 0;
|
|
|
|
foreach ($tagsToDelete as $tag) {
|
|
// Get release by tag
|
|
$ch = curl_init("{$apiBase}/releases/tags/{$tag}");
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_HTTPHEADER => ["Authorization: token {$token}"],
|
|
CURLOPT_TIMEOUT => 30,
|
|
]);
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
curl_close($ch);
|
|
|
|
if ($httpCode !== 200 || empty($response)) {
|
|
continue;
|
|
}
|
|
|
|
$data = json_decode($response, true);
|
|
$releaseId = $data['id'] ?? null;
|
|
|
|
if ($releaseId === null) {
|
|
continue;
|
|
}
|
|
|
|
// Delete release
|
|
$ch = curl_init("{$apiBase}/releases/{$releaseId}");
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_CUSTOMREQUEST => 'DELETE',
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_HTTPHEADER => ["Authorization: token {$token}"],
|
|
CURLOPT_TIMEOUT => 30,
|
|
]);
|
|
curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
// Delete tag
|
|
$ch = curl_init("{$apiBase}/tags/{$tag}");
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_CUSTOMREQUEST => 'DELETE',
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_HTTPHEADER => ["Authorization: token {$token}"],
|
|
CURLOPT_TIMEOUT => 30,
|
|
]);
|
|
curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
echo "Deleted: {$tag} (release id: {$releaseId})\n";
|
|
$deleted++;
|
|
}
|
|
|
|
echo "Cleaned up {$deleted} pre-release channel(s)\n";
|
|
exit(0);
|