mirror of
https://github.com/ershisan99/coolify.git
synced 2025-12-17 20:49:32 +00:00
feat: add deployments as activity
fix: tests refactor: remoteProcess
This commit is contained in:
@@ -10,10 +10,23 @@ class DispatchRemoteProcess
|
||||
{
|
||||
protected Activity $activity;
|
||||
|
||||
public function __construct(RemoteProcessArgs $remoteProcessArgs){
|
||||
$this->activity = activity()
|
||||
->withProperties($remoteProcessArgs->toArray())
|
||||
->log("");
|
||||
public function __construct(RemoteProcessArgs $remoteProcessArgs)
|
||||
{
|
||||
if ($remoteProcessArgs->model) {
|
||||
$properties = $remoteProcessArgs->toArray();
|
||||
unset($properties['model']);
|
||||
|
||||
$this->activity = activity()
|
||||
->withProperties($properties)
|
||||
->performedOn($remoteProcessArgs->model)
|
||||
->event('deployment')
|
||||
->log("");
|
||||
} else {
|
||||
$this->activity = activity()
|
||||
->withProperties($remoteProcessArgs->toArray())
|
||||
->event('remote_process')
|
||||
->log("");
|
||||
}
|
||||
}
|
||||
|
||||
public function __invoke(): Activity
|
||||
|
||||
@@ -31,7 +31,7 @@ class RunRemoteProcess
|
||||
*/
|
||||
public function __construct(Activity $activity)
|
||||
{
|
||||
if ($activity->getExtraProperty('type') !== ActivityTypes::COOLIFY_PROCESS->value) {
|
||||
if ($activity->getExtraProperty('type') !== ActivityTypes::REMOTE_PROCESS->value) {
|
||||
throw new \RuntimeException('Incompatible Activity to run a remote command.');
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ class RunRemoteProcess
|
||||
protected function getCommand(): string
|
||||
{
|
||||
$user = $this->activity->getExtraProperty('user');
|
||||
$destination = $this->activity->getExtraProperty('destination');
|
||||
$server_ip = $this->activity->getExtraProperty('server_ip');
|
||||
$private_key_location = $this->activity->getExtraProperty('private_key_location');
|
||||
$port = $this->activity->getExtraProperty('port');
|
||||
$command = $this->activity->getExtraProperty('command');
|
||||
@@ -80,7 +80,7 @@ class RunRemoteProcess
|
||||
. '-o LogLevel=ERROR '
|
||||
. '-o ControlMaster=auto -o ControlPersist=yes -o ControlPersist=1m -o ControlPath=/var/www/html/storage/app/.ssh/ssh_mux_%h_%p_%r '
|
||||
. "-p {$port} "
|
||||
. "{$user}@{$destination} "
|
||||
. "{$user}@{$server_ip} "
|
||||
. " 'bash -se' << \\$delimiter" . PHP_EOL
|
||||
. $command . PHP_EOL
|
||||
. $delimiter;
|
||||
|
||||
@@ -4,17 +4,21 @@ namespace App\Data;
|
||||
|
||||
use App\Enums\ActivityTypes;
|
||||
use App\Enums\ProcessStatus;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Spatie\LaravelData\Data;
|
||||
|
||||
class RemoteProcessArgs extends Data
|
||||
{
|
||||
public function __construct(
|
||||
public string $destination,
|
||||
public string $private_key_location,
|
||||
public string $command,
|
||||
public int $port,
|
||||
public string $user,
|
||||
public string $type = ActivityTypes::COOLIFY_PROCESS->value,
|
||||
public string $status = ProcessStatus::HOLDING->value,
|
||||
){}
|
||||
public Model|null $model,
|
||||
public string $server_ip,
|
||||
public string $private_key_location,
|
||||
public string|null $deployment_uuid,
|
||||
public string $command,
|
||||
public int $port,
|
||||
public string $user,
|
||||
public string $type = ActivityTypes::REMOTE_PROCESS->value,
|
||||
public string $status = ProcessStatus::HOLDING->value,
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,5 +4,5 @@ namespace App\Enums;
|
||||
|
||||
enum ActivityTypes: string
|
||||
{
|
||||
case COOLIFY_PROCESS = 'coolify_process';
|
||||
case REMOTE_PROCESS = 'remote_process';
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ProjectController extends Controller
|
||||
{
|
||||
@@ -103,7 +104,7 @@ class ProjectController extends Controller
|
||||
if (!$application) {
|
||||
return redirect()->route('home');
|
||||
}
|
||||
$deployment = $application->deployments->where('uuid', $deployment_uuid)->first();
|
||||
return view('project.deployment', ['project' => $project, 'deployment' => $deployment]);
|
||||
$activity = $application->get_deployment($deployment_uuid);
|
||||
return view('project.deployment', ['project' => $project, 'activity' => $activity]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ class DeployApplication extends Component
|
||||
}
|
||||
private function start_builder_container()
|
||||
{
|
||||
$this->command[] = "docker run --pull=always -d --name {$this->deployment_uuid} --rm -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/coollabsio/coolify-builder >/dev/null";
|
||||
$this->command[] = "docker run --pull=always -d --name {$this->deployment_uuid} --rm -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/coollabsio/coolify-builder >/dev/null 2>&1";
|
||||
}
|
||||
public function deploy()
|
||||
{
|
||||
@@ -36,18 +36,17 @@ class DeployApplication extends Component
|
||||
$wildcard_domain = $project_wildcard_domain ?? $global_wildcard_domain ?? null;
|
||||
|
||||
// Create Deployment ID
|
||||
$this->deployment_uuid = new Cuid2(10);
|
||||
$this->deployment_uuid = new Cuid2(12);
|
||||
$workdir = "/artifacts/{$this->deployment_uuid}";
|
||||
|
||||
// Start build process
|
||||
$this->command[] = "echo 'Starting deployment of {$application->name} ({$application->uuid})'";
|
||||
$this->start_builder_container();
|
||||
$this->execute_in_builder('hostname');
|
||||
// $this->execute_in_builder('hostname');
|
||||
$this->execute_in_builder("git clone -b {$application->git_branch} {$source->html_url}/{$application->git_repository}.git {$workdir}");
|
||||
$this->execute_in_builder("ls -l {$workdir}");
|
||||
$this->command[] = "docker stop -t 0 {$this->deployment_uuid} >/dev/null";
|
||||
|
||||
$this->activity = remoteProcess(implode("\n", $this->command), $destination->server->name);
|
||||
$this->activity = remoteProcess($this->command, $destination->server, $this->deployment_uuid, $application);
|
||||
|
||||
// Create Deployment
|
||||
Deployment::create([
|
||||
|
||||
@@ -3,16 +3,12 @@
|
||||
namespace App\Http\Livewire;
|
||||
|
||||
use Livewire\Component;
|
||||
use Spatie\Activitylog\Models\Activity;
|
||||
|
||||
class PollActivity extends Component
|
||||
{
|
||||
public $activity;
|
||||
public $activity_log_id;
|
||||
public $isKeepAliveOn = true;
|
||||
public function mount() {
|
||||
$this->activity = Activity::find($this->activity_log_id);
|
||||
}
|
||||
|
||||
public function polling()
|
||||
{
|
||||
$this->activity?->refresh();
|
||||
|
||||
@@ -19,11 +19,13 @@ class RunCommand extends Component
|
||||
|
||||
public $servers = [];
|
||||
|
||||
protected $rules = [
|
||||
'server' => 'required',
|
||||
];
|
||||
public function mount()
|
||||
{
|
||||
$this->servers = Server::all()->pluck('name')->toArray();
|
||||
$this->server = $this->servers[0];
|
||||
|
||||
$this->servers = Server::all();
|
||||
$this->server = $this->servers[0]->uuid;
|
||||
}
|
||||
public function render()
|
||||
{
|
||||
@@ -33,25 +35,19 @@ class RunCommand extends Component
|
||||
public function runCommand()
|
||||
{
|
||||
$this->isKeepAliveOn = true;
|
||||
|
||||
$this->activity = remoteProcess($this->command, $this->server);
|
||||
$this->activity = remoteProcess([$this->command], Server::where('uuid', $this->server)->first());
|
||||
}
|
||||
|
||||
public function runSleepingBeauty()
|
||||
{
|
||||
$this->isKeepAliveOn = true;
|
||||
|
||||
$this->activity = remoteProcess('x=1; while [ $x -le 40 ]; do sleep 0.1 && echo "Welcome $x times" $(( x++ )); done', $this->server);
|
||||
$this->activity = remoteProcess(['x=1; while [ $x -le 40 ]; do sleep 0.1 && echo "Welcome $x times" $(( x++ )); done'], Server::where('uuid', $this->server)->first());
|
||||
}
|
||||
|
||||
public function runDummyProjectBuild()
|
||||
{
|
||||
$this->isKeepAliveOn = true;
|
||||
|
||||
$this->activity = remoteProcess(<<<EOT
|
||||
cd projects/dummy-project
|
||||
~/.docker/cli-plugins/docker-compose build --no-cache
|
||||
EOT, $this->server);
|
||||
$this->activity = remoteProcess([' cd projects/dummy-project', 'docker-compose build --no-cache'], Server::where('uuid', $this->server)->first());
|
||||
}
|
||||
|
||||
public function polling()
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Spatie\Activitylog\Models\Activity;
|
||||
|
||||
class Application extends BaseModel
|
||||
{
|
||||
public function environment()
|
||||
@@ -20,8 +22,9 @@ class Application extends BaseModel
|
||||
{
|
||||
return $this->morphTo();
|
||||
}
|
||||
public function deployments()
|
||||
|
||||
public function get_deployment(string $deployment_uuid)
|
||||
{
|
||||
return $this->morphMany(Deployment::class, 'type');
|
||||
return Activity::where('subject_id', $this->id)->where('properties->deployment_uuid', '=', $deployment_uuid)->first();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user