From 89e71d95a57449be6b7ca85feda82b4a655cacf0 Mon Sep 17 00:00:00 2001 From: Brian Read Date: Sun, 9 Jul 2023 11:52:15 +0100 Subject: [PATCH] Added git-make-release.sh --- README.md | 16 ++++ git-make-release.sh | 205 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100755 git-make-release.sh diff --git a/README.md b/README.md index 284cef8..1fc3f74 100644 --- a/README.md +++ b/README.md @@ -125,3 +125,19 @@ Does: Set current date in change log Set Wiki and Issues links external (SME Wiki and Bugzilla) +## git-make-release.sh +Create a release and upload the rpm (src and bin) as attachments to that release + +* \ repository (package) to be editted (e.g. smeserver-yum) +* \ can be any organisation or user on the remote or local GITEA instance +* \ will have "SME" added to the front of it (so e.g. 10.2 -> SME10.2) + +optional: (in any order) + +* \ used with org= and will use local GITEA instance, default remote - will be passed to \ +* \ show line being executed +* \ run in debug modea + + Create the release (deleting one that is the same tag), + then uploads the .src.rpm and .rpm as an attachment (deleting any one of the same name) + diff --git a/git-make-release.sh b/git-make-release.sh new file mode 100755 index 0000000..b88b658 --- /dev/null +++ b/git-make-release.sh @@ -0,0 +1,205 @@ +#!/bin/bash +# +# git-make-release.sh [usual options] +# +# Create the release (deleting one that is the same tag), +# then uploads the .src.rpm and .rpm as an attachment (deleting any one of the same name) +# +# +if [[ -z $1 ]] ; then + echo "************make-release [local] [debug] [noisy]" + exit 0 +fi + +# +# Pull in parameters from a config file ~/.smegit/config +# +inifilename=$(echo ~)"/.smegit/config" +if [ ! -e $inifilename ] ; then + # Not here, look at system default + if [ ! -e /etc/smegit.ini ] ; then + echo "No ini file found $inifiename or /etc/smegit.ini" + echo "make-release [local] [debug] [noisy]" + exit 1 + else + initfilename="/etc/smegit.ini" + fi +fi + +while read -r line || [[ -n "$line" ]]; do + if [[ $line =~ ^\[.*\]$ ]] + then + section=${line#*[} + section=${section%]*} + else + if [[ $line =~ ^[^#]*= ]] + then + key=${line%=*} + value=${line#*=} + declare "${section}_${key}=$value" + fi + fi +done < "$inifilename" +DEBUG= +if [ ${smegit_DEBUG} == "true" ] ; then DEBUG=true ; fi + +GITEAUser=${remote_USER} +GITEAACCESSTOKEN=${remote_GITEAACCESSTOKEN} +GITEAHOST=${remote_GITEAHOST} +NOISY= +EXTRAPARAMS= +for param in $4 $5 $6; do + if [ $param ] ; then + case $param in + local ) + GITEAUser=${local_USER} + GITEAACCESSTOKEN=${local_GITEAACCESSTOKEN} + GITEAHOST=${local_GITEAHOST} + ;; + debug ) + DEBUG=true ;; + noisy ) + NOISY=true ;; + * ) + EXTRAPARAMS=$EXTRAPARAMS" "$param ;; + esac + else + break + fi +done + +if [ $NOISY ] ; then echo "make-release $1 $2 $3 $4 $5 $6" ; fi +if [ $DEBUG ] ; then echo "************found ini file: $inifilename" ; fi +# Make this null if you want lots of output. Still quite a bit anyway +QUIET="-q" +SILENT4CURL="-s" +SILENT4MAKE="-s" +if [ $DEBUG ] ; then + QUIET= + SILENT4CURL="-v" + SILENT4MAKE= +fi +# Make this null to get curl to check ssl cert +checkSSL="-k" + +LOCALUser=${local_USER} +if [[ $smegit_WORKDIR == ~* ]] ; then + # relative to users home dir + WORKDIR=$(echo ~)${smegit_WORKDIR:1} +else + # absolute path + WORKDIR=${smegit_WORKDIR} +fi +if [ $DEBUG ] ; then echo "WORKDIR=$WORKDIR" ; fi +RemoteRepoURL="$GITEAHOST/$2/$1" +if [ $DEBUG ] ; then echo "URL="$RemoteRepoURL; fi + +# First see if release exists: +RESPONSE=$(curl -X 'GET' \ + "$GITEAHOST/api/v1/repos/$2/$1/releases/tags/$3" \ + -H 'accept: application/json') +if [ $DEBUG ] ; then echo "See if Release exists response="$RESPONSE; fi +#parse result +ID="" +if echo "$RESPONSE" | jq empty >/dev/null 2>&1; then + if echo "$RESPONSE" | jq 'has("errors")' | grep -q 'true'; then + if [ $DEBUG ] ; then echo "Error detected:"; fi + ERROR=$(echo "$RESPONSE" | jq '.message') + if [ $DEBUG ] ; then echo "Error="$ERROR; fi + elif echo "$RESPONSE" | jq 'has("id")' | grep -q 'true'; then + if [ $DEBUG ] ; then echo "Id detected:"; fi + ID=$(echo "$RESPONSE" | jq -r '.id') + else + echo "No error or id detected ($RESPONSE)." + exit 1 + fi +else + echo "Invalid JSON string ($RESPONSE)" + exit 1 +fi + +if [[ -z "$ID" ]]; then + # Create Release + if [ $NOISY ]; then echo "Creating Release $3 for $2/$1"; fi + RESPONSE=$(curl -X 'POST' \ + "$GITEAHOST/api/v1/repos/$2/$1/releases" \ + -H 'accept: application/json' \ + -H "Authorization: token $GITEAACCESSTOKEN" \ + -H 'Content-Type: application/json' \ + -d '{ + "body": "'"1st Release of rpm built from git - `date` "'", + "draft": true, + "name": "'"$1"'", + "prerelease": true, + "tag_name": "'SME"$3"'", + "target_commitish": "" + }') + # Extract id from release + if [ $DEBUG ]; then echo "Create Release response="$RESPONSE; fi + ID=$(echo $RESPONSE | jq -r '.id') + if [[ -z $ID ]] ; then + echo "Unable to create release for $2/$1 ($3)" + exit 1 + fi +else + if [ $NOISY ]; then echo "Found Release $ID for $2/$1 ($3)"; fi +fi +if [ $DEBUG ] ; then echo "ID:"$ID; fi + +# And use it to upload the rpm and src rpm +cd $WORKDIR/$2/$1 +# Got to cd to rpm directory here +RPMDIR=$(ls $(basename `pwd`)*.rpm | sort | head -n 1 | sed 's/.src.rpm//' | sed 's/\./_/g') +echo $RPMDIR +# List the existing attachments +ASSETSRESPONSE=$(curl -X 'GET' \ + "$GITEAHOST/api/v1/repos/$2/$1/releases/$ID/assets" \ + -H 'accept: application/json') +if [ $DEBUG ]; then echo "Asset response:"$ASSETSRESPONSE; fi +NAMES=$(echo $ASSETSRESPONSE | jq -r '.[].name' | paste -sd "," -) +if [ $DEBUG ]; then echo "Names:"$NAMES; fi +if [ $DEBUG ]; then echo $(ls $RPMDIR/*.rpm); fi + +FULLPATH=$(pwd); +for File in $(ls $RPMDIR/*.rpm) ; do + if [ $NOISY ]; then echo "Uploading $File"; fi + BASEFile=$(basename $File) + if [ $DEBUG ]; then echo $BASEFile; fi + # Need to check if file is there already + if [[ "$NAMES" == *"$BASEFile"* ]] ; then + #Delete it - need the ID for it + if [ $NOISY ]; then echo "Deleting $BASEFile from $1/$2 $3 ($ID) release"; fi + ATTID=$(echo $ASSETSRESPONSE | jq -r '[ .[] | select(.name == "'"$BASEFile"'") | .id]') + #echo "ATTID:"$ATTID + ATTID=$(echo $ATTID | sed 's/\[//' | sed 's/\]//' | sed 's/ //g') + if [ $DEBUG ]; then echo "ATTID:"$ATTID; fi + RESPONSE=$(curl -X 'DELETE' \ + "$GITEAHOST/api/v1/repos/$2/$1/releases/$ID/assets/$ATTID" \ + -H "Authorization: token $GITEAACCESSTOKEN" \ + -H 'accept: application/json') + if [ $DEBUG ]; then echo "DELETED Response:"$RESPONSE; fi + if [[ -z $RESPONSE ]] ; then + echo "Deleted $BASEFile from $1/$2 $3 ($ID) release" + else + echo "Delete failed $BASEFile from $2/$1 $3 ($ID) release ($RESPONSE)" + fi + else + echo "Did not find $BASEFile in \"$NAMES\"" + fi + # Then send current version + FULLFILENAME=$FULLPATH/$File + if [ $DEBUG ] ; then echo $FULLFILENAME; fi + RESPONSE=$(curl -X 'POST' \ + "$GITEAHOST/api/v1/repos/$2/$1/releases/$ID/assets?name=$BASEFile" \ + -H 'accept: application/json' \ + -H "Authorization: token $GITEAACCESSTOKEN" \ + -H 'Content-Type: multipart/form-data' \ + -F "attachment=@$FULLFILENAME;type=application/x-rpm") + if [ $DEBUG ]; then echo "Send current version($File) response="$RESPONSE; fi + if echo "$RESPONSE" | jq 'has("errors")' | grep -q 'true'; then + ERROR=$(echo "$RESPONSE" | jq '.message') + echo "$BASEFile not sucessfully uploaded ($ERROR)" + else + if [ $NOISY ]; then echo "$BASEFile sucessfully uploaded"; fi + fi +done \ No newline at end of file