forked from phoedos/pmd
a2a4027976
Obviously, when updating the release to add the release notes, the tag_name gets lost, resulting in github creating a "untagged_xyz" tag and not connecting the release to the correct tag, although the commit matches.
215 lines
6.5 KiB
Bash
215 lines
6.5 KiB
Bash
#
|
|
# The functions here require the following scripts:
|
|
# logger.sh
|
|
#
|
|
# The functions here require the following environment variables:
|
|
# GITHUB_OAUTH_TOKEN
|
|
# GITHUB_BASE_URL
|
|
#
|
|
|
|
#
|
|
# Creates a new release on github with the given tag and target_commit.
|
|
# The release is draft and not published.
|
|
#
|
|
# $RESULT = release json string
|
|
#
|
|
# See: https://developer.github.com/v3/repos/releases/#create-a-release
|
|
#
|
|
function gh_releases_createDraftRelease() {
|
|
local tagName="$1"
|
|
local targetCommitish="$2"
|
|
|
|
log_debug "$FUNCNAME: Creating new draft release for tag=$tagName and commit=$targetCommitish"
|
|
|
|
local request=$(cat <<-EOF
|
|
{
|
|
"tag_name": "${tagName}",
|
|
"target_commitish": "${targetCommitish}",
|
|
"name": "${tagName}",
|
|
"draft": true
|
|
}
|
|
EOF
|
|
)
|
|
|
|
log_debug "POST $GITHUB_BASE_URL/releases"
|
|
log_info "Creating github draft release"
|
|
RESULT=$(curl --fail -s -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
-X POST \
|
|
--data "${request}" \
|
|
"$GITHUB_BASE_URL/releases")
|
|
log_debug " -> response: $RESULT"
|
|
|
|
log_success "Created draft release with id $(echo $RESULT | jq --raw-output ".url")"
|
|
}
|
|
|
|
#
|
|
# Gets the latest release, if it is a draft and returns with 0.
|
|
# Returns with 1, if the latest release is not a draft - meaning, there is no
|
|
# draft release (yet?).
|
|
#
|
|
# RESULT = release json string
|
|
#
|
|
# See: https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository
|
|
#
|
|
function gh_releases_getLatestDraftRelease() {
|
|
log_debug "$FUNCNAME"
|
|
log_debug "GET $GITHUB_BASE_URL/releases?per_page=1"
|
|
RESULT=$(curl --fail -s -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \
|
|
"$GITHUB_BASE_URL/releases?per_page=1" | jq ".[0]")
|
|
log_debug " -> response: $RESULT"
|
|
local draft=$(echo $RESULT | jq ".draft")
|
|
if [ "$draft" != "true" ]; then
|
|
RESULT=""
|
|
log_error "Could not find draft release!"
|
|
return 1
|
|
fi
|
|
log_info "Found draft release: $(echo $RESULT | jq --raw-output ".url")"
|
|
}
|
|
|
|
#
|
|
# Deletes a release.
|
|
#
|
|
# See: https://developer.github.com/v3/repos/releases/#delete-a-release
|
|
#
|
|
function gh_release_deleteRelease() {
|
|
local release="$1"
|
|
|
|
gh_release_getIdFromData "$release"
|
|
local releaseId="$RESULT"
|
|
log_debug "$FUNCNAME id=$releaseId"
|
|
log_debug "DELETE $GITHUB_BASE_URL/releases/$releaseId"
|
|
log_info "Deleting github release $releaseId"
|
|
local response
|
|
response=$(curl --fail -s -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \
|
|
-X DELETE \
|
|
"$GITHUB_BASE_URL/releases/$releaseId")
|
|
log_debug " -> response: $response"
|
|
log_success "Deleted release with id $releaseId"
|
|
}
|
|
|
|
#
|
|
# Determines the release id from the given JSON release data.
|
|
#
|
|
# RESULT = "the release id"
|
|
#
|
|
function gh_release_getIdFromData() {
|
|
local release="$1"
|
|
|
|
RESULT=$(echo $release | jq --raw-output ".id")
|
|
}
|
|
|
|
#
|
|
# Determines the tag_name from the given JSON release data.
|
|
#
|
|
# RESULT = "the tag name"
|
|
#
|
|
function gh_release_getTagNameFromData() {
|
|
local release="$1"
|
|
|
|
RESULT=$(echo $release | jq --raw-output ".tag_name")
|
|
}
|
|
|
|
#
|
|
# Uploads a asset to an existing release.
|
|
#
|
|
# See: https://developer.github.com/v3/repos/releases/#upload-a-release-asset
|
|
#
|
|
function gh_release_uploadAsset() {
|
|
local release="$1"
|
|
local filename="$2"
|
|
local name=$(basename $filename)
|
|
|
|
gh_release_getIdFromData "$release"
|
|
local releaseId="$RESULT"
|
|
log_debug "$FUNCNAME: releaseId=$releaseId file=$filename name=$name"
|
|
|
|
local uploadUrl=$(echo "$release" | jq --raw-output ".upload_url")
|
|
uploadUrl="${uploadUrl%%\{\?name,label\}}"
|
|
uploadUrl="${uploadUrl}?name=${name}"
|
|
log_debug "POST $uploadUrl"
|
|
log_info "Uploading $filename to github release $releaseId"
|
|
local response
|
|
response=$(curl --fail -s -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \
|
|
-H "Content-Type: application/zip" \
|
|
--data-binary "@$filename" \
|
|
-X POST \
|
|
"${uploadUrl}")
|
|
log_debug " -> response: $response"
|
|
log_success "Uploaded release asset $filename for release $releaseId"
|
|
}
|
|
|
|
#
|
|
# Updates the release info: name and body.
|
|
# The body is escaped to fit into JSON, so it is allowed for the body to be
|
|
# a multi-line string.
|
|
#
|
|
# See: https://developer.github.com/v3/repos/releases/#edit-a-release
|
|
#
|
|
function gh_release_updateRelease() {
|
|
local release="$1"
|
|
local name="$2"
|
|
local body="$3"
|
|
|
|
gh_release_getIdFromData "$release"
|
|
local releaseId="$RESULT"
|
|
gh_release_getTagNameFromData "$release"
|
|
local tagName="$RESULT"
|
|
log_debug "$FUNCNAME releaseId=$releaseId name=$name tag_name=$tagName"
|
|
|
|
body="${body//'\'/\\\\}"
|
|
body="${body//$'\r'/}"
|
|
body="${body//$'\n'/\\r\\n}"
|
|
body="${body//'"'/\\\"}"
|
|
|
|
local request=$(cat <<-EOF
|
|
{
|
|
"tag_name": "${tagName}",
|
|
"name": "${name}",
|
|
"body": "${body}"
|
|
}
|
|
EOF
|
|
)
|
|
|
|
log_debug "PATCH $GITHUB_BASE_URL/releases/${releaseId}"
|
|
log_debug " -> request: $request"
|
|
log_info "Updating github release $releaseId"
|
|
local response
|
|
response=$(curl --fail -s -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
--data "${request}" \
|
|
-X PATCH \
|
|
"$GITHUB_BASE_URL/releases/${releaseId}")
|
|
log_debug " -> response: $response"
|
|
log_success "Updated release with id=$releaseId"
|
|
}
|
|
|
|
#
|
|
# Publish a release by setting draft="false".
|
|
# Note: This will send out the notification emails if somebody
|
|
# watched the releases.
|
|
#
|
|
# See: https://developer.github.com/v3/repos/releases/#edit-a-release
|
|
#
|
|
function gh_release_publishRelease() {
|
|
local release="$1"
|
|
|
|
gh_release_getIdFromData "$release"
|
|
local releaseId="$RESULT"
|
|
log_debug "$FUNCNAME releaseId=$releaseId"
|
|
|
|
local request='{"draft":false}'
|
|
log_debug "PATCH $GITHUB_BASE_URL/releases/${releaseId}"
|
|
log_debug " -> request: $request"
|
|
log_info "Publishing github release $releaseId"
|
|
local response
|
|
response=$(curl --fail -s -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
--data "${request}" \
|
|
-X PATCH \
|
|
"$GITHUB_BASE_URL/releases/${releaseId}")
|
|
log_debug " -> response: $response"
|
|
local htmlUrl=$(echo "$response" | jq --raw-output ".html_url")
|
|
log_success "Published release with id=$releaseId at $htmlUrl"
|
|
}
|