diff --git a/resources/com/cadoles/gitea/gitea-release.sh b/resources/com/cadoles/gitea/gitea-release.sh new file mode 100644 index 0000000..34d90b4 --- /dev/null +++ b/resources/com/cadoles/gitea/gitea-release.sh @@ -0,0 +1,153 @@ +#!/bin/bash + +set -eo pipefail + +GITEA_RELEASE_PROJECT=${GITEA_RELEASE_PROJECT} +GITEA_RELEASE_ORG=${GITEA_RELEASE_ORG} +GITEA_RELEASE_BASE_URL=${GITEA_BASE_URL:-https://forge.cadoles.com} +GITEA_RELEASE_USERNAME=${GITEA_RELEASE_USERNAME} +GITEA_RELEASE_PASSWORD=${GITEA_RELEASE_PASSWORD} +GITEA_RELEASE_VERSION=${GITEA_RELEASE_VERSION} +GITEA_RELEASE_COMMITISH_TARGET=${GITEA_RELEASE_COMMITISH_TARGET} +GITEA_RELEASE_IS_DRAFT=${GITEA_RELEASE_IS_DRAFT:-false} +GITEA_RELEASE_IS_PRERELEASE=${GITEA_RELEASE_IS_PRERELEASE:-true} +GITEA_RELEASE_BODY=${GITEA_RELEASE_BODY} +GITEA_RELEASE_ATTACHMENTS=${GITEA_RELEASE_ATTACHMENTS} + +function check_dependencies { + assert_command_available 'curl' + assert_command_available 'jq' +} + +function assert_command_available { + local command=$1 + local command_path=$(which $command) + + if [ -z "$command_path" ]; then + echo "The '$command' command could not be found. Please install it before using this script." 1>&2 + exit 1 + fi +} + +function check_environment { + assert_environment GITEA_RELEASE_PROJECT + assert_environment GITEA_RELEASE_ORG + assert_environment GITEA_RELEASE_BASE_URL +} + +function source_env_file { + if [ ! -f '.env' ]; then + return 0 + fi + set -o allexport + source .env + set +o allexport +} + +function assert_environment { + local name=$1 + local value=${!name} + + if [ -z "$value" ]; then + echo "The $"$name" environment variable is empty." 1>&2 + exit 1 + fi +} + +function ask_credentials { + if [ -z "$GITEA_RELEASE_USERNAME" ]; then + echo -n "Username: " + read GITEA_RELEASE_USERNAME + + fi + if [ -z "$GITEA_RELEASE_PASSWORD" ]; then + echo -n "Password: " + stty -echo + read GITEA_RELEASE_PASSWORD + stty echo + echo + fi +} + +function retrieve_version { + if [ ! -z "$GITEA_RELEASE_VERSION" ]; then + return + fi + + set +e + GITEA_RELEASE_VERSION=$(git describe --abbrev=0 --tags 2>/dev/null) + GITEA_RELEASE_VERSION=${GITEA_RELEASE_VERSION} + set -e +} + +function retrieve_commitish_target { + if [ ! -z "$GITEA_RELEASE_COMMITISH_TARGET" ]; then + return + fi + + GITEA_RELEASE_COMMITISH_TARGET=$(git log -n 1 --pretty="format:%h") +} + +function create_release { + local payload={} + + payload=$(json_set "$payload" body "\"$GITEA_RELEASE_BODY\"") + payload=$(json_set "$payload" draft $GITEA_RELEASE_IS_DRAFT) + payload=$(json_set "$payload" name "\"$GITEA_RELEASE_VERSION\"") + payload=$(json_set "$payload" prerelease $GITEA_RELEASE_IS_PRERELEASE) + payload=$(json_set "$payload" tag_name "\"${GITEA_RELEASE_VERSION:-$GITEA_RELEASE_COMMITISH_TARGET}\"") + payload=$(json_set "$payload" target_commitish "\"$GITEA_RELEASE_COMMITISH_TARGET\"") + + gitea_api "/repos/$GITEA_RELEASE_ORG/$GITEA_RELEASE_PROJECT/releases" \ + -H "Content-Type:application/json" \ + -d "$payload" +} + +function json_set { + local data=$1 + local key=$2 + local value=$3 + echo $data | jq -cr --argjson v "$value" --arg k "$key" '.[$k] = $v' +} + +function upload_release_attachments { + local release="$1" + local release_id=$(echo "$release" | jq -r .id) + + if [ -z "$GITEA_RELEASE_ATTACHMENTS" ]; then + set +e + GITEA_RELEASE_ATTACHMENTS="$(ls release/*.{tar.gz,zip} 2>/dev/null)" + set -e + fi + + for file in $GITEA_RELEASE_ATTACHMENTS; do + local filename=$(basename "$file") + gitea_api "/repos/$GITEA_RELEASE_ORG/$GITEA_RELEASE_PROJECT/releases/$release_id/assets?name=$filename" \ + -H "Content-Type:multipart/form-data" \ + -F "attachment=@$file" + done +} + +function gitea_api { + local path=$1 + local args=${@:2} + + curl -L \ + --fail \ + -u "$GITEA_RELEASE_USERNAME:$GITEA_RELEASE_PASSWORD" \ + ${args} \ + "$GITEA_RELEASE_BASE_URL/api/v1$path" +} + +function main { + check_dependencies + source_env_file + check_environment + ask_credentials + retrieve_commitish_target + retrieve_version + local release=$(create_release) + upload_release_attachments "$release" +} + +main \ No newline at end of file diff --git a/vars/gitea.groovy b/vars/gitea.groovy index 73542c4..5f682e4 100644 --- a/vars/gitea.groovy +++ b/vars/gitea.groovy @@ -3,7 +3,7 @@ def commentPullRequest(String repo, String issueId, String comment, Integer comm withCredentials([ string(credentialsId: 'GITEA_JENKINS_PERSONAL_TOKEN', variable: 'GITEA_TOKEN'), ]) { - writeFile(file: ".prComment", text: comment) + writeFile(file: '.prComment', text: comment) sh """#!/bin/bash set -xeo pipefail @@ -37,4 +37,62 @@ def commentPullRequest(String repo, String issueId, String comment, Integer comm fi """ } -} \ No newline at end of file +} + +// Effectue une "release" sur Gitea pour le / donné. +def release(String credentialsId, String org, String project, Map options = [:]) { + def isDraft = options.get('isDraft', false) + def baseUrl = options.get('baseUrl', 'https://forge.cadoles.com') + def defaultVersion = sh(returnStdout: true, script: 'git describe --always').trim() + def releaseVersion = options.get('releaseVersion', defaultVersion) + def commitishTarget = options.get('commitishTarget', env.GIT_COMMIT) + + def defaultIsPrerelease = true + try { + sh(script: "git describe --exact-match ${GIT_COMMIT}") + defaultIsPrerelease = false + } catch (err) { + println "Could not find tag associated with commit '${GIT_COMMIT}' ! Using 'prerelease' as default." + } + + def isPrerelease = options.get('isPrerelease', defaultIsPrerelease) + def body = options.get('body', '') + def attachments = options.get('attachments', []) + + def scriptTempDir = ".gitea-release-script-${System.currentTimeMillis()}" + sh("mkdir -p '${scriptTempDir}'") + + def giteaReleaseScript = "${scriptTempDir}/gitea-release.sh" + + def giteaReleaseScriptContent = libraryResource 'com/cadoles/gitea/gitea-release.sh' + writeFile file: giteaReleaseScript, text:giteaReleaseScriptContent + sh("chmod +x '${giteaReleaseScript}'") + + try { + withCredentials([ + usernamePassword( + credentialsId: credentialsId, + usernameVariable: 'GITEA_RELEASE_USERNAME', + passwordVariable: 'GITEA_RELEASE_PASSWORD' + ) + ]) { + sh """ + export GITEA_RELEASE_PROJECT="${project}" + export GITEA_RELEASE_ORG="${org}" + export GITEA_RELEASE_BASE_URL="${baseUrl}" + export GITEA_RELEASE_VERSION="${releaseVersion}" + export GITEA_RELEASE_COMMITISH_TARGET="${commitishTarget}" + export GITEA_RELEASE_IS_DRAFT="${isDraft}" + export GITEA_RELEASE_IS_PRERELEASE="${isPrerelease}" + export GITEA_RELEASE_BODY="${body}" + export GITEA_RELEASE_ATTACHMENTS="${attachments.join(' ')}" + + ${giteaReleaseScript} + """ + } + } finally { + dir(scriptTempDir) { + deleteDir() + } + } +}