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

add script to determine PR target branch in GitLab CI #43

Merged
merged 2 commits into from
Aug 28, 2024
Merged
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
2 changes: 2 additions & 0 deletions .ci/integTestGen/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ authors = ["Simeon Ehrig <[email protected]>"]
version = "0.1.0"

[deps]
HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3"
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
PkgDependency = "9eb5382b-762c-48ca-8139-e736883fe800"
YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6"
Expand Down
71 changes: 71 additions & 0 deletions .ci/integTestGen/src/get_target_branch.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
module getTargetBranch

using HTTP
using JSON

"""
get_target_branch()::AbstractString

Returns the name of the target branch of the pull request. The function is required for our special
setup where we mirror a PR from GitHub to GitLab CI. No merge request will be open on GitLab.
Instead, a feature branch will be created and the commit will be pushed. As a result, we lose
information about the original PR. So we need to use the GitHub Rest API to get the information
depending on the repository name and PR number.
"""
function get_target_branch()::AbstractString
# GitLab CI provides the environemnt variable with the following pattern
# # pr-<PR number>/<repo owner of the source branch>/<project name>/<source branch name>
# e.g. pr-41/SimeonEhrig/QED.jl/setDevDepDeps
if !haskey(ENV, "CI_COMMIT_REF_NAME")
error("Environment variable CI_COMMIT_REF_NAME is not set.")
end

splited_commit_ref_name = split(ENV["CI_COMMIT_REF_NAME"], "/")

if (!startswith(splited_commit_ref_name[1], "pr-"))
error("CI_COMMIT_REF_NAME does not start with pr-")
end

# parse to Int only to check if it is a number
pr_number = parse(Int, splited_commit_ref_name[1][(length("pr-") + 1):end])
if (pr_number <= 0)
error(
"a PR number always needs to be a positive integer number bigger than 0: $pr_number",
)
end

repository_name = splited_commit_ref_name[3]

try
headers = (
("Accept", "application/vnd.github+json"),
("X-GitHub-Api-Version", "2022-11-28"),
)
# in all cases, we assume that the PR targets the repositories in QEDjl-project
# there is no environment variable with the information, if the target repository is
# the upstream repository or a fork.
url = "https://api.github.com/repos/QEDjl-project/$repository_name/pulls/$pr_number"
response = HTTP.get(url, headers)
response_text = String(response.body)
repository_data = JSON.parse(response_text)
return repository_data["base"]["ref"]
catch e
# if for unknown reason, the PR does not exist, use fallback the dev branch
if isa(e, HTTP.Exceptions.StatusError) && e.status == 404
return "dev"
else
# Only the HTML code 404, page does not exist is handled. All other error will abort
# the script.
throw(e)
end
end

return "dev"
end

if abspath(PROGRAM_FILE) == @__FILE__
target_branch = get_target_branch()
println(target_branch)
end

end
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"message": "Not Found",
"documentation_url": "https://docs.github.com/rest/pulls/pulls#get-a-pull-request",
"status": "404"
}

Loading
Loading