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.
93 lines
3.2 KiB
Ruby
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
|