Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

passing github base url everywhere #355

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions run/config.commentbot.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ app_id = 12345 # The app ID for your GitHub app. This can be found in

priv_pem = "private-key.pem" # The private key file of your GitHub app

api_url = "https://api.github.com" # This is the base url of the GitHub API.
# Needs to be changed in case of on-premise instances.

[commentbot.targets.qux] # You can define additional targets as [targets.baz], [targets.foo] etc.
repo = "https://github.com/your_github_id/QuxRegistry"
base_branch = "master"
Expand Down
48 changes: 25 additions & 23 deletions src/commentbot/CommentBot.jl
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ get_trigger_id(rp::RequestParams{CommitCommentTrigger}) = get_comment_commit_id(

tag_name(version, subdir) = subdir == "" ? "v$version" : splitdir(subdir)[end] * "-v$version"

function make_pull_request(pp::ProcessedParams, rp::RequestParams, rbrn::RegBranch, target_registry::Dict{String,Any})
function make_pull_request(api::GitHub.GitHubAPI, pp::ProcessedParams, rp::RequestParams, rbrn::RegBranch, target_registry::Dict{String,Any})
name = rbrn.name
ver = rbrn.version
brn = rbrn.branch
Expand Down Expand Up @@ -92,7 +92,7 @@ function make_pull_request(pp::ProcessedParams, rp::RequestParams, rbrn::RegBran
)

repo = join(split(target_registry["repo"], "/")[end-1:end], "/")
pr, msg = create_or_find_pull_request(repo, params, rbrn)
pr, msg = create_or_find_pull_request(api, repo, params, rbrn)
tag = tag_name(ver, subdir)

cbody = """
Expand All @@ -115,31 +115,31 @@ function make_pull_request(pp::ProcessedParams, rp::RequestParams, rbrn::RegBran
end

@debug(cbody)
make_comment(rp.evt, cbody)
make_comment(api, rp.evt, cbody)
return pr
end

string(::RequestParams{PullRequestTrigger}) = "pull_request"
string(::RequestParams{CommitCommentTrigger}) = "commit_comment"
string(::RequestParams{IssueTrigger}) = "issue"

function action(rp::RequestParams{T}, zsock::RequestSocket) where T <: RegisterTrigger
function action(api::GitHub.GitHubAPI, rp::RequestParams{T}, zsock::RequestSocket) where T <: RegisterTrigger
if rp.target === nothing
target_registry_name, target_registry = first(CONFIG["targets"])
else
filteredtargets = filter(x->(x[1]==rp.target), CONFIG["targets"])
if length(filteredtargets) == 0
msg = "Error: target $(rp.target) not found"
@debug(msg)
make_comment(rp.evt, msg)
set_error_status(rp)
make_comment(api, rp.evt, msg)
set_error_status(api, rp)
return
else
target_registry_name, target_registry = filteredtargets[1]
end
end

pp = ProcessedParams(rp)
pp = ProcessedParams(api, rp)
@info("Processing register event", reponame=rp.reponame, target_registry_name)
try
if pp.cparams.isvalid
Expand All @@ -161,53 +161,53 @@ function action(rp::RequestParams{T}, zsock::RequestSocket) where T <: RegisterT
msg = "Error while trying to register: $(rbrn.metadata["error"])"
end
@debug(msg)
make_comment(rp.evt, msg)
set_error_status(rp)
make_comment(api, rp.evt, msg)
set_error_status(api, rp)
else
make_pull_request(pp, rp, rbrn, target_registry)
set_success_status(rp)
make_pull_request(api, pp, rp, rbrn, target_registry)
set_success_status(api, rp)
end
else
@info("Error while processing event: $(repr(pp.cparams.error))")
if pp.cparams.report_error
msg = "Error while trying to register: $(repr(pp.cparams.error))"
@debug(msg)
make_comment(rp.evt, msg)
make_comment(api, rp.evt, msg)
end
set_error_status(rp)
set_error_status(api, rp)
end
catch ex
bt = get_backtrace(ex)
@info("Unexpected error: $bt")
raise_issue(rp.evt, rp.phrase, bt)
raise_issue(api, rp.evt, rp.phrase, bt)
end
@info("Done processing register event", reponame=rp.reponame, target_registry_name)
nothing
end

function comment_handler(event::WebhookEvent, phrase::RegexMatch)
function comment_handler(api::GitHub.GitHubAPI, event::WebhookEvent, phrase::RegexMatch)
@debug("Received event for $(event.repository.full_name), phrase: $phrase")
try
rp = RequestParams(event, phrase)
rp = RequestParams(api, event, phrase)
isa(rp.trigger_src, EmptyTrigger) && rp.cparams.error === nothing && return

if rp.cparams.isvalid && rp.cparams.error === nothing
print_entry_log(rp)
put!(event_queue, rp)
set_pending_status(rp)
set_pending_status(api, rp)
elseif rp.cparams.error !== nothing
@info("Error while processing event: $(rp.cparams.error)")
if rp.cparams.report_error
msg = "Error while trying to register: $(rp.cparams.error)"
@debug(msg)
make_comment(event, msg)
make_comment(api, event, msg)
end
set_error_status(rp)
set_error_status(api, rp)
end
catch ex
bt = get_backtrace(ex)
@info("Unexpected error: $bt")
raise_issue(event, phrase, bt)
raise_issue(api, event, phrase, bt)
end

return HTTP.Messages.Response(200)
Expand All @@ -229,22 +229,24 @@ function github_webhook(http_ip=CONFIG["http_ip"],
recover("github_webhook", keep_running, do_action, handle_exception)
end

function request_processor(zsock::RequestSocket)
do_action() = action(take!(event_queue), zsock)
function request_processor(api::GitHub.GitHubAPI, zsock::RequestSocket)
do_action() = action(api, take!(event_queue), zsock)
handle_exception(ex) = (isa(ex, InvalidStateException) && (ex.state == :closed)) ? :exit : :continue
keep_running() = isopen(httpsock[])
recover("request_processor", keep_running, do_action, handle_exception)
end

function main(config::AbstractString=isempty(ARGS) ? "config.toml" : first(ARGS); kwargs...)
# todo: here make api
merge!(CONFIG, Pkg.TOML.parsefile(config)["commentbot"])
if get(CONFIG, "enable_logging", true)
global_logger(SimpleLogger(stdout, get_log_level(CONFIG["log_level"])))
end
zsock = RequestSocket(get(CONFIG, "backend_port", 5555))

@info("Starting server...")
t1 = @async request_processor(zsock)
api = GitHubWebAPI(HTTP.URI(get(CONFIG, "api_url", "https://api.github.com")))
t1 = @async request_processor(api, zsock)
t2 = @async status_monitor(CONFIG["stop_file"], event_queue, httpsock)
github_webhook(; kwargs...)
wait(t1)
Expand Down
32 changes: 16 additions & 16 deletions src/commentbot/approval.jl
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
function tag_package(rname, ver::VersionNumber, mcs, auth; tag_name = "v$ver")
function tag_package(api::GitHub.GitHubAPI, rname, ver::VersionNumber, mcs, auth; tag_name = "v$ver")
tagger = Dict("name" => CONFIG["github"]["user"],
"email" => CONFIG["github"]["email"],
"date" => Dates.format(now(), dateformat"YYYY-mm-ddTHH:MM:SSZ"))
create_tag(rname; auth=auth,
create_tag(api, rname; auth=auth,
params=Dict("tag" => tag_name,
"message" => "Release: $tag_name",
"object" => mcs,
"type" => "commit",
"tagger" => tagger))
end

function get_metadata_from_pr_body(rp::RequestParams, auth)
function get_metadata_from_pr_body(api::GitHub.GitHubAPI, rp::RequestParams, auth)
reg_name = rp.reponame
reg_prid = rp.trigger_src.prid

pr = pull_request(reg_name, reg_prid; auth=auth)
pr = pull_request(api, reg_name, reg_prid; auth=auth)

mstart = match(r"<!--", pr.body)
mend = match(r"-->", pr.body)
Expand All @@ -31,9 +31,9 @@ function get_metadata_from_pr_body(rp::RequestParams, auth)
nothing
end

function handle_approval(rp::RequestParams{ApprovalTrigger})
auth = get_access_token(rp.evt)
d = get_metadata_from_pr_body(rp, auth)
function handle_approval(api::GitHub.GitHubAPI, rp::RequestParams{ApprovalTrigger})
auth = get_access_token(api, rp.evt)
d = get_metadata_from_pr_body(api, rp, auth)

if d === nothing
return "Unable to get registration metdata for this PR"
Expand All @@ -49,11 +49,11 @@ function handle_approval(rp::RequestParams{ApprovalTrigger})
subdir = d["subdir"]

if request_type == "pull_request"
pr = pull_request(reponame, trigger_id; auth=auth)
pr = pull_request(api, reponame, trigger_id; auth=auth)
tree_sha = pr.merge_commit_sha
if pr.state == "open"
@debug("Merging pull request on package repo", reponame, trigger_id)
merge_pull_request(reponame, trigger_id; auth=auth,
merge_pull_request(api, reponame, trigger_id; auth=auth,
params=Dict("merge_method" => "squash"))
else
@debug("Pull request already merged", reponame, trigger_id)
Expand Down Expand Up @@ -85,7 +85,7 @@ function handle_approval(rp::RequestParams{ApprovalTrigger})

if !tag_exists
@debug("Creating new tag", reponame, ver, tree_sha)
tag_package(reponame, ver, tree_sha, auth; tag_name = tag)
tag_package(api, reponame, ver, tree_sha, auth; tag_name = tag)
end

release_exists = false
Expand Down Expand Up @@ -117,10 +117,10 @@ function handle_approval(rp::RequestParams{ApprovalTrigger})
end
end

reg_pr = pull_request(reg_name, reg_prid; auth=auth)
reg_pr = pull_request(api, reg_name, reg_prid; auth=auth)
if reg_pr.state == "open"
@debug("Merging pull request on registry", reg_name, reg_prid)
merge_pull_request(reg_name, reg_prid; auth=auth)
merge_pull_request(api, reg_name, reg_prid; auth=auth)
else
@debug("Pull request on registry already merged", reg_name, reg_prid)
end
Expand All @@ -131,18 +131,18 @@ function print_entry_log(rp::RequestParams{ApprovalTrigger})
@info "Approving Pull request" reponame=rp.reponame prid=rp.trigger_src.prid
end

function action(rp::RequestParams{ApprovalTrigger}, zsock)
function action(api::GitHub.GitHubAPI, rp::RequestParams{ApprovalTrigger}, zsock)
@info("Processing approval event", reponame=rp.reponame, rp.trigger_src.prid)
try
err = handle_approval(rp)
err = handle_approval(api, rp)
if err !== nothing
@debug(err)
make_comment(rp.evt, "Error in approval process: $err")
make_comment(api, rp.evt, "Error in approval process: $err")
end
catch ex
bt = get_backtrace(ex)
@info("Unexpected error: $bt")
raise_issue(rp.evt, rp.phrase, bt)
raise_issue(api, rp.evt, rp.phrase, bt)
end
@info("Done processing approval event", reponame=rp.reponame, rp.trigger_src.prid)
end
Expand Down
Loading