From 4f3cf5dbff1dd440bd53f8ea0fb2574d49f2f30c Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sat, 23 May 2026 18:36:35 +0530 Subject: [PATCH] Clean up deployment artifact tokens --- app/init/span.php | 4 ++ .../Http/Deployments/Status/Update.php | 10 +++++ .../Modules/Functions/Workers/Builds.php | 39 ++++++++++++++++--- .../Sites/Http/Deployments/Status/Update.php | 10 +++++ 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/app/init/span.php b/app/init/span.php index f6871badfa..26f12e1766 100644 --- a/app/init/span.php +++ b/app/init/span.php @@ -13,6 +13,10 @@ $traceFunctionId = System::getEnv('_APP_TRACE_FUNCTION_ID', ''); $traceEnabled = $traceProjectId !== '' || $traceFunctionId !== ''; Span::addExporter(new Exporter\Pretty(), function (Span $span) use ($traceEnabled, $traceProjectId, $traceFunctionId): bool { + if ($span->getAction() === 'worker.v1-builds' && $span->get('build.type') === BUILD_TYPE_ORCHESTRATOR_EVENT) { + return $span->getError() !== null; + } + if (\str_starts_with($span->getAction(), 'listener.')) { return $span->getError() !== null; } diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Status/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Status/Update.php index 962a89cdb0..ff8aa189d8 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Status/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Status/Update.php @@ -13,6 +13,7 @@ use OpenRuntimes\Orchestrator\Client as OrchestratorClient; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; +use Utopia\Database\Query; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; @@ -112,6 +113,15 @@ class Update extends Action ])); } + try { + $dbForProject->getAuthorization()->skip(fn () => $dbForProject->deleteDocuments('resourceTokens', [ + Query::equal('resourceType', [TOKENS_RESOURCE_TYPE_DEPLOYMENT_ARTIFACTS]), + Query::equal('resourceInternalId', [$function->getSequence() . ':' . $deployment->getSequence()]), + ])); + } catch (\Throwable) { + // Best-effort cleanup; deployment status is already 'canceled'. + } + try { if (System::getEnv('_APP_BUILDS_BACKEND', 'executor') === 'orchestrator') { $client = new OrchestratorClient( diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index bb5213877a..fd1d4dfa15 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -115,8 +115,6 @@ class Builds extends Action Executor $executor, array $plan ): void { - Console::log('Build action started'); - $payload = $message->getPayload(); if (empty($payload)) { @@ -132,6 +130,12 @@ class Builds extends Action $log->addTag('projectId', $project->getId()); $log->addTag('type', $type); + Span::add('project.id', $project->getId()); + Span::add('resource.id', $resource->getId()); + Span::add('resource.type', $resource->getCollection()); + Span::add('deployment.id', $deployment->getId()); + Span::add('build.type', $type); + switch ($type) { case BUILD_TYPE_ORCHESTRATOR_EVENT: $this->applyOrchestratorEvent( @@ -214,10 +218,6 @@ class Builds extends Action array $platform, int $timeout ): void { - Span::add('project.id', $project->getId()); - Span::add('resource.id', $resource->getId()); - Span::add('resource.type', $resource->getCollection()); - Span::add('deployment.id', $deployment->getId()); Span::add('build.timeout', $timeout); Console::info('Deployment action started'); @@ -1628,6 +1628,15 @@ class Builds extends Action 'buildLogs' => $logs, ])); + try { + $dbForProject->getAuthorization()->skip(fn () => $dbForProject->deleteDocuments('resourceTokens', [ + Query::equal('resourceType', [TOKENS_RESOURCE_TYPE_DEPLOYMENT_ARTIFACTS]), + Query::equal('resourceInternalId', [$resource->getSequence() . ':' . $deployment->getSequence()]), + ])); + } catch (\Throwable $error) { + Console::warning('Failed deleting deployment artifact tokens: ' . $error->getMessage()); + } + if ($deployment->getSequence() === $resource->getAttribute('latestDeploymentInternalId', '')) { $resource = $dbForProject->updateDocument($resource->getCollection(), $resource->getId(), new Document(['latestDeploymentStatus' => $deployment->getAttribute('status', '')])); } @@ -1760,6 +1769,15 @@ class Builds extends Action $resource = $dbForProject->updateDocument($resource->getCollection(), $resource->getId(), new Document(['latestDeploymentStatus' => $deployment->getAttribute('status', '')])); } + try { + $dbForProject->getAuthorization()->skip(fn () => $dbForProject->deleteDocuments('resourceTokens', [ + Query::equal('resourceType', [TOKENS_RESOURCE_TYPE_DEPLOYMENT_ARTIFACTS]), + Query::equal('resourceInternalId', [$resource->getSequence() . ':' . $deployment->getSequence()]), + ])); + } catch (\Throwable $error) { + Console::warning('Failed deleting deployment artifact tokens: ' . $error->getMessage()); + } + $queueForRealtime ->setPayload($deployment->getArrayCopy()) ->trigger(); @@ -1921,6 +1939,15 @@ class Builds extends Action 'buildDuration' => $buildDuration, ])); + try { + $dbForProject->getAuthorization()->skip(fn () => $dbForProject->deleteDocuments('resourceTokens', [ + Query::equal('resourceType', [TOKENS_RESOURCE_TYPE_DEPLOYMENT_ARTIFACTS]), + Query::equal('resourceInternalId', [$resource->getSequence() . ':' . $deployment->getSequence()]), + ])); + } catch (\Throwable $error) { + Console::warning('Failed deleting deployment artifact tokens: ' . $error->getMessage()); + } + $queueForRealtime ->setPayload($deployment->getArrayCopy()) ->trigger(); diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Status/Update.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Status/Update.php index 1a35da8da3..c8f8596a06 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Status/Update.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Status/Update.php @@ -13,6 +13,7 @@ use OpenRuntimes\Orchestrator\Client as OrchestratorClient; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; +use Utopia\Database\Query; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; @@ -110,6 +111,15 @@ class Update extends Action ])); } + try { + $dbForProject->getAuthorization()->skip(fn () => $dbForProject->deleteDocuments('resourceTokens', [ + Query::equal('resourceType', [TOKENS_RESOURCE_TYPE_DEPLOYMENT_ARTIFACTS]), + Query::equal('resourceInternalId', [$site->getSequence() . ':' . $deployment->getSequence()]), + ])); + } catch (\Throwable) { + // Best-effort cleanup; deployment status is already 'canceled'. + } + try { if (System::getEnv('_APP_BUILDS_BACKEND', 'executor') === 'orchestrator') { $client = new OrchestratorClient(