diff --git a/app/Http/Livewire/Project/Application/Previews.php b/app/Http/Livewire/Project/Application/Previews.php index a5459a7bb..1c9674011 100644 --- a/app/Http/Livewire/Project/Application/Previews.php +++ b/app/Http/Livewire/Project/Application/Previews.php @@ -25,7 +25,7 @@ public function mount() public function load_prs() { try { - ['rate_limit_remaining' => $rate_limit_remaining, 'data' => $data] = git_api(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/pulls"); + ['rate_limit_remaining' => $rate_limit_remaining, 'data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/pulls"); $this->rate_limit_remaining = $rate_limit_remaining; $this->pull_requests = $data->sortBy('number')->values(); } catch (\Throwable $e) { diff --git a/app/Http/Livewire/Project/New/PublicGitRepository.php b/app/Http/Livewire/Project/New/PublicGitRepository.php index 837c32abe..b725e231d 100644 --- a/app/Http/Livewire/Project/New/PublicGitRepository.php +++ b/app/Http/Livewire/Project/New/PublicGitRepository.php @@ -27,9 +27,10 @@ class PublicGitRepository extends Component public int $rate_limit_remaining = 0; public $rate_limit_reset = 0; private object $repository_url_parsed; - public GithubApp|GitlabApp|null $git_source = null; + public GithubApp|GitlabApp|string $git_source = 'other'; public string $git_host; public string $git_repository; + protected $rules = [ 'repository_url' => 'required|url', 'port' => 'required|numeric', @@ -64,7 +65,10 @@ public function instantSave() } $this->emit('success', 'Application settings updated!'); } - + public function load_any_git() + { + $this->branch_found = true; + } public function load_branch() { try { @@ -99,21 +103,22 @@ private function get_git_source() if ($this->git_host == 'github.com') { $this->git_source = GithubApp::where('name', 'Public GitHub')->first(); - } elseif ($this->git_host == 'gitlab.com') { - $this->git_source = GitlabApp::where('name', 'Public GitLab')->first(); - } elseif ($this->git_host == 'bitbucket.org') { - // Not supported yet - } - if (is_null($this->git_source)) { - throw new \Exception('Git source not found. What?!'); } + $this->git_repository = $this->repository_url; + $this->git_source = 'other'; } private function get_branch() { - ['rate_limit_remaining' => $this->rate_limit_remaining, 'rate_limit_reset' => $this->rate_limit_reset] = git_api(source: $this->git_source, endpoint: "/repos/{$this->git_repository}/branches/{$this->git_branch}"); - $this->rate_limit_reset = Carbon::parse((int)$this->rate_limit_reset)->format('Y-M-d H:i:s'); - $this->branch_found = true; + if ($this->git_source === 'other') { + $this->branch_found = true; + return; + } + if ($this->git_source->getMorphClass() === 'App\Models\GithubApp') { + ['rate_limit_remaining' => $this->rate_limit_remaining, 'rate_limit_reset' => $this->rate_limit_reset] = githubApi(source: $this->git_source, endpoint: "/repos/{$this->git_repository}/branches/{$this->git_branch}"); + $this->rate_limit_reset = Carbon::parse((int)$this->rate_limit_reset)->format('Y-M-d H:i:s'); + $this->branch_found = true; + } } public function submit() @@ -136,19 +141,34 @@ public function submit() $project = Project::where('uuid', $project_uuid)->first(); $environment = $project->load(['environments'])->environments->where('name', $environment_name)->first(); - $application_init = [ - 'name' => generate_application_name($this->git_repository, $this->git_branch), - 'git_repository' => $this->git_repository, - 'git_branch' => $this->git_branch, - 'build_pack' => 'nixpacks', - 'ports_exposes' => $this->port, - 'publish_directory' => $this->publish_directory, - 'environment_id' => $environment->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - 'source_id' => $this->git_source->id, - 'source_type' => $this->git_source->getMorphClass() - ]; + if ($this->git_source === 'other') { + $application_init = [ + 'name' => generate_application_name($this->git_repository, $this->git_branch), + 'git_repository' => $this->git_repository, + 'git_branch' => $this->git_branch, + 'build_pack' => 'nixpacks', + 'ports_exposes' => $this->port, + 'publish_directory' => $this->publish_directory, + 'environment_id' => $environment->id, + 'destination_id' => $destination->id, + 'destination_type' => $destination_class, + ]; + } else { + $application_init = [ + 'name' => generate_application_name($this->git_repository, $this->git_branch), + 'git_repository' => $this->git_repository, + 'git_branch' => $this->git_branch, + 'build_pack' => 'nixpacks', + 'ports_exposes' => $this->port, + 'publish_directory' => $this->publish_directory, + 'environment_id' => $environment->id, + 'destination_id' => $destination->id, + 'destination_type' => $destination_class, + 'source_id' => $this->git_source->id, + 'source_type' => $this->git_source->getMorphClass() + ]; + } + $application = Application::create($application_init); diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index f05739379..9988c9728 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -45,7 +45,7 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted private string $commit; private bool $force_rebuild; - private GithubApp|GitlabApp $source; + private GithubApp|GitlabApp|string $source = 'other'; private StandaloneDocker|SwarmDocker $destination; private Server $server; private ApplicationPreview|null $preview = null; @@ -80,7 +80,10 @@ public function __construct(int $application_deployment_queue_id) $this->commit = $this->application_deployment_queue->commit; $this->force_rebuild = $this->application_deployment_queue->force_rebuild; - $this->source = $this->application->source->getMorphClass()::where('id', $this->application->source->id)->first(); + $source = data_get($this->application, 'source'); + if ($source) { + $this->source = $source->getMorphClass()::where('id', $this->application->source->id)->first(); + } $this->destination = $this->application->destination->getMorphClass()::where('id', $this->application->destination->id)->first(); $this->server = $this->destination->server; @@ -89,7 +92,7 @@ public function __construct(int $application_deployment_queue_id) $this->configuration_dir = application_configuration_dir() . "/{$this->application->uuid}"; $this->is_debug_enabled = $this->application->settings->is_debug_enabled; - ray($this->basedir,$this->workdir); + ray($this->basedir, $this->workdir); $this->container_name = generateApplicationContainerName($this->application, $this->pull_request_id); savePrivateKeyToFs($this->server); $this->saved_outputs = collect(); @@ -425,6 +428,7 @@ private function importing_git_repository() $pr_branch_name = "pr-{$this->pull_request_id}-coolify"; } + if ($this->application->deploymentType() === 'source') { $source_html_url = data_get($this->application, 'source.html_url'); $url = parse_url(filter_var($source_html_url, FILTER_SANITIZE_URL)); @@ -459,6 +463,13 @@ private function importing_git_repository() ]); return $commands->implode(' && '); } + if ($this->application->deploymentType() === 'other') { + $git_clone_command = "{$git_clone_command} {$this->application->git_repository} {$this->basedir}"; + $git_clone_command = $this->set_git_import_settings($git_clone_command); + $commands->push(executeInDocker($this->deployment_uuid, $git_clone_command)); + ray($commands); + return $commands->implode(' && '); + } } private function set_git_import_settings($git_clone_command) diff --git a/app/Jobs/ApplicationPullRequestUpdateJob.php b/app/Jobs/ApplicationPullRequestUpdateJob.php index 851c04169..dbe0ff81c 100755 --- a/app/Jobs/ApplicationPullRequestUpdateJob.php +++ b/app/Jobs/ApplicationPullRequestUpdateJob.php @@ -66,7 +66,7 @@ public function handle() private function update_comment() { - ['data' => $data] = git_api(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/comments/{$this->preview->pull_request_issue_comment_id}", method: 'patch', data: [ + ['data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/comments/{$this->preview->pull_request_issue_comment_id}", method: 'patch', data: [ 'body' => $this->body, ], throwError: false); if (data_get($data, 'message') === 'Not Found') { @@ -77,7 +77,7 @@ private function update_comment() private function create_comment() { - ['data' => $data] = git_api(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/{$this->pull_request_id}/comments", method: 'post', data: [ + ['data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/{$this->pull_request_id}/comments", method: 'post', data: [ 'body' => $this->body, ]); $this->preview->pull_request_issue_comment_id = $data['id']; diff --git a/app/Models/Application.php b/app/Models/Application.php index af2db98ee..3d23a5709 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -68,6 +68,7 @@ public function gitBranchLocation(): Attribute if (!is_null($this->source?->html_url) && !is_null($this->git_repository) && !is_null($this->git_branch)) { return "{$this->source->html_url}/{$this->git_repository}/tree/{$this->git_branch}"; } + return $this->git_repository; } ); @@ -80,6 +81,7 @@ public function gitCommits(): Attribute if (!is_null($this->source?->html_url) && !is_null($this->git_repository) && !is_null($this->git_branch)) { return "{$this->source->html_url}/{$this->git_repository}/commits/{$this->git_branch}"; } + return $this->git_repository; } ); } @@ -224,6 +226,8 @@ public function deploymentType() return 'deploy_key'; } else if (data_get($this, 'source')) { return 'source'; + } else { + return 'other'; } throw new \Exception('No deployment type found'); } @@ -239,6 +243,9 @@ public function git_based(): bool if ($this->dockerfile) { return false; } + if (is_null($this->source)) { + return false; + } return true; } public function isHealthcheckDisabled(): bool diff --git a/bootstrap/helpers/github.php b/bootstrap/helpers/github.php index 5c36f091d..16ac3671a 100644 --- a/bootstrap/helpers/github.php +++ b/bootstrap/helpers/github.php @@ -50,7 +50,7 @@ function generate_github_jwt_token(GithubApp $source) return $issuedToken; } -function git_api(GithubApp|GitlabApp $source, string $endpoint, string $method = 'get', array|null $data = null, bool $throwError = true) +function githubApi(GithubApp|GitlabApp $source, string $endpoint, string $method = 'get', array|null $data = null, bool $throwError = true) { if ($source->getMorphClass() == 'App\Models\GithubApp') { if ($source->is_public) { diff --git a/docker/coolify-helper/Dockerfile b/docker/coolify-helper/Dockerfile index 5ff46888b..020299189 100644 --- a/docker/coolify-helper/Dockerfile +++ b/docker/coolify-helper/Dockerfile @@ -8,9 +8,9 @@ ARG DOCKER_COMPOSE_VERSION=2.21.0 # https://github.com/docker/buildx/releases ARG DOCKER_BUILDX_VERSION=0.11.2 # https://github.com/buildpacks/pack/releases -ARG PACK_VERSION=0.30.0 +ARG PACK_VERSION=0.31.0 # https://github.com/railwayapp/nixpacks/releases -ARG NIXPACKS_VERSION=1.16.0 +ARG NIXPACKS_VERSION=1.17.0 USER root WORKDIR /artifacts diff --git a/resources/views/livewire/project/application/general.blade.php b/resources/views/livewire/project/application/general.blade.php index b6fda01ab..112021dac 100644 --- a/resources/views/livewire/project/application/general.blade.php +++ b/resources/views/livewire/project/application/general.blade.php @@ -19,19 +19,28 @@ @if (!$application->dockerfile) -