Files
ubicloud/routes/project/github.rb
Enes Cakir 39e93c87b5 Add a runner force terminate button to the UI
We destroy the runner when GitHub sends the workflow job completed
webhook event.

Recently, the runner script has gotten stuck a few times due to zombie
processes.

This might be related to GitHub incidents, but we don't have enough
information to confirm it.

https://github.com/actions/runner/issues/3737

Since GitHub servers think the script is still running, they don't stop
it.

Customers can force terminate the runner by clicking the button. This
destroys the underlying virtual machine, causing GitHub servers to lose
connection to the runner and mark the job as failed.
2025-03-19 16:36:47 +03:00

93 lines
3.2 KiB
Ruby

# frozen_string_literal: true
class Clover
hash_branch(:project_prefix, "github") do |r|
r.web do
unless Config.github_app_name
response.status = 501
response["content-type"] = "text/plain"
next "GitHub Action Runner integration is not enabled. Set GITHUB_APP_NAME to enable it."
end
authorize("Project:github", @project.id)
r.get true do
if @project.github_installations.empty?
r.redirect "#{@project.path}/github/setting"
end
r.redirect "#{@project.path}/github/runner"
end
r.on "runner" do
r.get true do
@runners = Serializers::GithubRunner.serialize(@project.github_runners_dataset.eager(:vm, :strand).reverse(:created_at).all)
view "github/runner"
end
r.is String do |runner_ubid|
next unless (runner = GithubRunner.from_ubid(runner_ubid)) && runner.installation.project_id == @project.id
r.delete true do
runner.incr_skip_deregistration
runner.incr_destroy
flash["notice"] = "Runner '#{runner.ubid}' forcibly terminated"
204
end
end
end
r.get "setting" do
@installations = Serializers::GithubInstallation.serialize(@project.github_installations)
view "github/setting"
end
r.on "installation" do
r.get "create" do
unless @project.has_valid_payment_method?
flash["error"] = "Project doesn't have valid billing information"
r.redirect "#{@project.path}/github"
end
session[:github_installation_project_id] = @project.id
r.redirect "https://github.com/apps/#{Config.github_app_name}/installations/new", 302
end
r.on String do |installation_id|
next unless (installation = GithubInstallation.from_ubid(installation_id)) && installation.project_id == @project.id
r.post true do
cache_enabled = r.params["cache_enabled"] == "true"
installation.update(cache_enabled: cache_enabled)
flash["notice"] = "Ubicloud cache is #{cache_enabled ? "enabled" : "disabled"} for the installation #{installation.name}."
r.redirect "#{@project.path}/github/setting"
end
end
end
r.on "cache" do
r.get true do
repository_id_q = @project.github_installations_dataset.join(:github_repository, installation_id: :id).select(Sequel[:github_repository][:id])
entries = GithubCacheEntry.where(repository_id: repository_id_q).exclude(committed_at: nil).eager(:repository).reverse(:created_at).all
@entries_by_repo = Serializers::GithubCacheEntry.serialize(entries).group_by { _1[:repository][:id] }
@quota_per_repo = "#{@project.effective_quota_value("GithubRunnerCacheStorage")} GB"
view "github/cache"
end
r.is String do |entry_ubid|
next unless (entry = GithubCacheEntry.from_ubid(entry_ubid)) && entry.repository.installation.project_id == @project.id
r.delete true do
entry.destroy
flash["notice"] = "Cache '#{entry.key}' deleted."
204
end
end
end
end
end
end