51 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Console\Commands;
 | 
						|
 | 
						|
use App\Enums\ApplicationDeploymentStatus;
 | 
						|
use App\Models\ApplicationDeploymentQueue;
 | 
						|
use Illuminate\Console\Command;
 | 
						|
 | 
						|
class CheckApplicationDeploymentQueue extends Command
 | 
						|
{
 | 
						|
    protected $signature = 'check:deployment-queue {--force} {--seconds=3600}';
 | 
						|
 | 
						|
    protected $description = 'Check application deployment queue.';
 | 
						|
 | 
						|
    public function handle()
 | 
						|
    {
 | 
						|
        $seconds = $this->option('seconds');
 | 
						|
        $deployments = ApplicationDeploymentQueue::whereIn('status', [
 | 
						|
            ApplicationDeploymentStatus::IN_PROGRESS,
 | 
						|
            ApplicationDeploymentStatus::QUEUED,
 | 
						|
        ])->where('created_at', '<=', now()->subSeconds($seconds))->get();
 | 
						|
        if ($deployments->isEmpty()) {
 | 
						|
            $this->info('No deployments found in the last '.$seconds.' seconds.');
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        $this->info('Found '.$deployments->count().' deployments created in the last '.$seconds.' seconds.');
 | 
						|
 | 
						|
        foreach ($deployments as $deployment) {
 | 
						|
            if ($this->option('force')) {
 | 
						|
                $this->info('Deployment '.$deployment->id.' created at '.$deployment->created_at.' is older than '.$seconds.' seconds. Setting status to failed.');
 | 
						|
                $this->cancelDeployment($deployment);
 | 
						|
            } else {
 | 
						|
                $this->info('Deployment '.$deployment->id.' created at '.$deployment->created_at.' is older than '.$seconds.' seconds. Setting status to failed.');
 | 
						|
                if ($this->confirm('Do you want to cancel this deployment?', true)) {
 | 
						|
                    $this->cancelDeployment($deployment);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    private function cancelDeployment(ApplicationDeploymentQueue $deployment)
 | 
						|
    {
 | 
						|
        $deployment->update(['status' => ApplicationDeploymentStatus::FAILED]);
 | 
						|
        if ($deployment->server?->isFunctional()) {
 | 
						|
            remote_process(['docker rm -f '.$deployment->deployment_uuid], $deployment->server, false);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |