#!/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" true) 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\"") local existing_release=$(gitea_api "/repos/$GITEA_RELEASE_ORG/$GITEA_RELEASE_PROJECT/releases" -XGET | jq -e ".[] | select(.tag_name == \"${GITEA_RELEASE_VERSION}\") | .id") if [ ! -z "${existing_release}" ]; then gitea_api "/repos/$GITEA_RELEASE_ORG/$GITEA_RELEASE_PROJECT/releases/${existing_release}" -XDELETE fi local tmpfile=$(mktemp) echo "$payload" > "$tmpfile" gitea_api "/repos/$GITEA_RELEASE_ORG/$GITEA_RELEASE_PROJECT/releases" \ -H "Content-Type:application/json" \ -d "@$tmpfile" rm -f "$tmpfile" } function json_set { local data=$1 local key=$2 local value=$3 local use_raw_file=$4 if [ "$use_raw_file" != "true" ]; then echo $data | jq -cr --argjson v "$value" --arg k "$key" '.[$k] = $v' else local tmpfile=$(mktemp) echo "$value" > "$tmpfile" echo $data | jq -cr --rawfile v "$tmpfile" --arg k "$key" '.[$k] = $v' rm -f "$tmpfile" fi } 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