blob: 22b6577862df996d2d7f3a732003071caf2d2ec0 [file] [log] [blame]
Zack Williams27cd3e52018-09-18 16:44:50 -07001#!/usr/bin/env bash
Joey Armstrong28eddda2023-01-10 03:09:34 -05002# -----------------------------------------------------------------------
3# Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors
Zack Williams27cd3e52018-09-18 16:44:50 -07004#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Joey Armstrong28eddda2023-01-10 03:09:34 -050016#
Zack Williams27cd3e52018-09-18 16:44:50 -070017# github-release.sh
18# builds (with make) and uploads release artifacts (binaries, etc.) to github
19# given a tag also create checksums files and release notes from the commit
20# message
Joey Armstrong28eddda2023-01-10 03:09:34 -050021# -----------------------------------------------------------------------
Zack Williams27cd3e52018-09-18 16:44:50 -070022
Joey Armstrong2097d3e2023-03-26 10:32:03 -040023set -euo pipefail
24
25##-------------------##
26##---] GLOBALS [---##
27##-------------------##
28declare -g WORKSPACE
29declare -g GERRIT_PROJECT
Joey Armstrong78cecc52023-04-03 11:39:11 -040030declare -g __githost=github.com
Joey Armstrong43c48422023-04-03 10:17:32 -040031# export DEBUG=1
Joey Armstrong2097d3e2023-03-26 10:32:03 -040032
33## -----------------------------------------------------------------------
34## Uncomment to activate
35## -----------------------------------------------------------------------
Joey Armstronge8560da2023-04-26 15:44:45 -040036# Debug arguments
37# declare -i -g argv_gen_version=1
38# declare -i -g draft_release=1
Joey Armstrong41923cc2023-01-30 14:38:16 -050039
Joey Armstrong2097d3e2023-03-26 10:32:03 -040040declare -a -g ARGV=() # Capture args to minimize globals and arg passing
41[[ $# -gt 0 ]] && ARGV=("$@")
Joey Armstrongd99e3d22023-01-29 12:35:43 -050042
43declare -g scratch # temp workspace for downloads
Joey Armstrongd99e3d22023-01-29 12:35:43 -050044
Joey Armstronge8560da2023-04-26 15:44:45 -040045declare -g SCRIPT_VERSION='1.4' # git changeset needed
Joey Armstrong26707f02023-01-26 12:41:12 -050046
Joey Armstrong7f382ef2023-01-25 12:00:08 -050047##--------------------##
48##---] INCLUDES [---##
Joey Armstrong1962bcf2023-01-27 13:53:18 -050049##--------------------#
Joey Armstrong2097d3e2023-03-26 10:32:03 -040050
51## -----------------------------------------------------------------------
52## Intent: Register an interrupt handler to display a stack trace on error
53## -----------------------------------------------------------------------
54function errexit()
55{
56 local err=$?
57 set +o xtrace
58 local code="${1:-1}"
59
60 local prefix="${BASH_SOURCE[1]}:${BASH_LINENO[0]}"
61 echo -e "\nOFFENDER: ${prefix}"
62 if [ $# -gt 0 ] && [ "$1" == '--stacktrace-quiet' ]; then
63 code=1
64 else
65 echo "ERROR: '${BASH_COMMAND}' exited with status $err"
66 fi
67
68 # Print out the stack trace described by $function_stack
69 if [ ${#FUNCNAME[@]} -gt 2 ]
70 then
Joey Armstrong43c48422023-04-03 10:17:32 -040071 echo "Call tree:"
72 for ((i=1;i<${#FUNCNAME[@]}-1;i++))
73 do
74 echo " $i: ${BASH_SOURCE[$i+1]}:${BASH_LINENO[$i]} ${FUNCNAME[$i]}(...)"
75 done
Joey Armstrong2097d3e2023-03-26 10:32:03 -040076 fi
77
78 echo "Exiting with status ${code}"
79 echo
80 exit "${code}"
81 # return
82}
83
84# trap ERR to provide an error handler whenever a command exits nonzero
85# this is a more verbose version of set -o errexit
86trap errexit ERR
87
88# setting errtrace allows our ERR trap handler to be propagated to functions,
89# expansions and subshells
90set -o errtrace
Joey Armstrong7f382ef2023-01-25 12:00:08 -050091
92## -----------------------------------------------------------------------
Joey Armstrongd99e3d22023-01-29 12:35:43 -050093## Intent: Cleanup scratch area on exit
94## -----------------------------------------------------------------------
95function sigtrap()
96{
97 ## Prevent mishaps
98 local is_read_only
99 is_read_only="$(declare -p scratch)"
100 if [[ $is_read_only != *"declare -r scratch="* ]]; then
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400101 echo "ERROR: variable scratch is not read-only, cleanup skipped"
102 exit 1
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500103 fi
104
105 if [ -d "$scratch" ]; then
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400106 /bin/rm -fr "$scratch"
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500107 fi
108
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400109 do_logout
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500110 return
111}
112trap sigtrap EXIT
113
114## -----------------------------------------------------------------------
Joey Armstronge8560da2023-04-26 15:44:45 -0400115## Intent: Return a random release version string.
116## -----------------------------------------------------------------------
117## Note: Do not use this function in production. get_version() is
118## intended for local use or debugging $0 from within a jenkins
119## job.
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400120## -----------------------------------------------------------------------
121function get_version()
122{
123 declare -n ref="$1"
124
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400125 declare -a rev=()
126 rev+=("$(( RANDOM % 10 + 1 ))")
127 rev+=("$(( RANDOM % 256 + 1 ))")
Joey Armstrongeef8c2c2023-03-27 17:27:43 -0400128 rev+=("$(( RANDOM % 10000 + 1 ))")
Joey Armstrongfc20ed52023-04-03 19:37:58 -0400129 local ver="v${rev[0]}.${rev[1]}.${rev[2]}"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400130
Joey Armstrong43c48422023-04-03 10:17:32 -0400131 func_echo "VERSION: $ver"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400132 ref="$ver"
133 return
134}
135
136## -----------------------------------------------------------------------
137## Intent: Provide defaults for environment variables
138## -----------------------------------------------------------------------
139function initEnvVars()
140{
141 # when not running under Jenkins, use current dir as workspace and a blank
142 # project name
143 declare -g WORKSPACE=${WORKSPACE:-.}
144 declare -g GERRIT_PROJECT=${GERRIT_PROJECT:-}
Joey Armstrong76026b72023-03-29 12:19:17 -0400145
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400146 # Github organization (or user) this project is published on. Project name should
147 # be the same on both Gerrit and GitHub
Joey Armstrong76026b72023-03-29 12:19:17 -0400148 declare -g GITHUB_ORGANIZATION=${GITHUB_ORGANIZATION:-}
149
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400150 # glob pattern relative to project dir matching release artifacts
151 # ARTIFACT_GLOB=${ARTIFACT_GLOB:-"release/*"} # stat -- release/* not found, literal string (?)
152 declare -g ARTIFACT_GLOB=${ARTIFACT_GLOB:-"release/."}
Joey Armstrong76026b72023-03-29 12:19:17 -0400153
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400154 # Use "release" as the default makefile target, can be a space separated list
155 declare -g RELEASE_TARGETS=${RELEASE_TARGETS:-release}
Joey Armstrong76026b72023-03-29 12:19:17 -0400156
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400157 # Set and handle GOPATH and PATH
158 export GOPATH=${GOPATH:-$WORKSPACE/go}
159 export PATH=$PATH:/usr/lib/go-1.12/bin:/usr/local/go/bin:$GOPATH/bin
160 return
161}
162
163## -----------------------------------------------------------------------
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500164## Intent: Create a scratch area for downloads and transient tools
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400165## temp directory will be automatically removed upon exit.
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500166## -----------------------------------------------------------------------
167function init()
168{
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500169 local pkgbase="${0##*/}" # basename
170 local pkgname="${pkgbase%.*}"
171
Joey Armstrongad7b1e02023-03-27 11:55:48 -0400172 # initEnvVars # moved to full_banner()
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400173
174 ## Create a temp directory for auto-cleanup
175 declare -g scratch
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500176 scratch="$(mktemp -d -t "${pkgname}.XXXXXXXXXX")"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400177 readonly scratch
178 declare -p scratch
179
Joey Armstrong43c48422023-04-03 10:17:32 -0400180 ## prime the stream: cache answers
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400181 local work
182 get_release_dir work
183 declare -p work
Joey Armstrong43c48422023-04-03 10:17:32 -0400184
Joey Armstronge8560da2023-04-26 15:44:45 -0400185 local git_version
186 getGitVersion git_verison
187 func_echo "git_version = $git_version"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400188 return
189}
190
191## -----------------------------------------------------------------------
192## Intent: Verbose output for logging
193## -----------------------------------------------------------------------
194function banner()
195{
196 local iam="${0##*/}"
197 cat <<EOB
198
199** -----------------------------------------------------------------------
200** ${iam}::${FUNCNAME[1]}: $*
201** -----------------------------------------------------------------------
202EOB
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500203}
204
205## -----------------------------------------------------------------------
Joey Armstrong7f382ef2023-01-25 12:00:08 -0500206## Intent: Output a log banner to identify the running script/version.
207## -----------------------------------------------------------------------
208## TODO:
209## o SCRIPT_VERSION => git changeset for repo:ci-managment
210## o echo "library version: ${env."library.libName.version"}"
211# -----------------------------------------------------------------------
212# 14:18:38 > git fetch --no-tags --progress -- https://gerrit.opencord.org/ci-management.git +refs/heads/*:refs/remotes/origin/* # timeout=10
213# 14:18:39 Checking out Revision 50f6e0b97f449b32d32ec0e02d59642000351847 (master)
214# -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400215function full_banner()
Joey Armstrong7f382ef2023-01-25 12:00:08 -0500216{
Joey Armstrongad7b1e02023-03-27 11:55:48 -0400217 local iam="${0##*/}"
218
219 initEnvVars # set defaults
Joey Armstrong7f382ef2023-01-25 12:00:08 -0500220
221cat <<EOH
222
223** -----------------------------------------------------------------------
224** IAM: ${iam} :: ${FUNCNAME[0]}
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400225** ARGV: ${ARGV[@]}
Joey Armstrong7f382ef2023-01-25 12:00:08 -0500226** PWD: $(/bin/pwd)
227** NOW: $(date '+%Y/%m/%d %H:%M:%S')
228** VER: ${SCRIPT_VERSION:-'unknown'}
229** -----------------------------------------------------------------------
Joey Armstrongad7b1e02023-03-27 11:55:48 -0400230** GERRIT_PROJECT: $(declare -p GERRIT_PROJECT)
231** GITHUB_ORGANIZATION: $(declare -p GITHUB_ORGANIZATION)
232** RELEASE_TARGETS: $(declare -p RELEASE_TARGETS)
233** GOPATH: $(declare -p GOPATH)
234** -----------------------------------------------------------------------
235** PATH += /usr/lib/go-1.12/bin:/usr/local/go/bin:GOPATH/bin
236** -----------------------------------------------------------------------
Joey Armstrong7f382ef2023-01-25 12:00:08 -0500237EOH
238
239 return
240}
241
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500242## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400243## Intent: Display a message with 'iam' identifier for logging
Joey Armstrong50f6e0b2023-01-24 14:14:08 -0500244## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400245function func_echo()
Joey Armstrong1962bcf2023-01-27 13:53:18 -0500246{
247 local iam="${0##*/}"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400248 echo "** ${iam} :: ${FUNCNAME[1]}: $*"
Joey Armstrong1962bcf2023-01-27 13:53:18 -0500249 return
250}
251
252## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400253## Intent: Display an error message then exit with status.
254## -----------------------------------------------------------------------
255function error()
256{
257 local iam="${0##*/}"
258 echo "ERROR ${iam} :: ${FUNCNAME[1]}: $*"
259 exit 1
260}
261
262## -----------------------------------------------------------------------
263## Intent: Verify sandbox/build is versioned for release.
264## -----------------------------------------------------------------------
265function getGitVersion()
266{
267 declare -n varname="$1"; shift
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400268
Joey Armstrong43c48422023-04-03 10:17:32 -0400269 local __ver # use prefix('__') to protect callers variable name
270 if [[ -v cached_getGitVersion ]]; then
271 __ver="$cached_getGitVersion"
272 varname="$__ver"
273 return
Joey Armstrong39fac652023-03-27 18:50:43 -0400274
Joey Armstrong43c48422023-04-03 10:17:32 -0400275 elif [[ -v argv_gen_version ]]; then
276 get_version __ver
277
278 elif [[ -v WORKSPACE ]] && [[ -v GITHUB_TOKEN ]]; then # i_am_jenkins
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400279 local path="$GERRIT_PROJECT"
280 pushd "$path" || error "pushd GERRIT_PROJECT= failed $(declare -p path)"
Joey Armstrong43c48422023-04-03 10:17:32 -0400281 __ver="$(git tag -l --points-at HEAD)"
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400282 popd || error "popd GERRIT_PROJECT= failed"
Joey Armstrong43c48422023-04-03 10:17:32 -0400283
284 elif [[ -v argv_version_file ]]; then # local debug
285 [[ ! -f VERSION ]] && error "./VERSION file not found"
286 readarray -t tmp < <(sed -e 's/[[:blank:]]//g' 'VERSION')
287 __ver="v${tmp[0]}"
288
289 else
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400290 cd ..
291 local path="$GERRIT_PROJECT"
292 pushd "$path" || error "pushd GERRIT_PROJECT= failed $(declare -p path)"
Joey Armstrong43c48422023-04-03 10:17:32 -0400293 __ver="$(git tag -l --points-at HEAD)"
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400294 popd || error "popd GERRIT_PROJECT= failed"
Joey Armstrong43c48422023-04-03 10:17:32 -0400295 fi
Joey Armstrong76026b72023-03-29 12:19:17 -0400296
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400297 # ------------------------------------------------------
298 # match bare versions or v-prefixed golang style version
299 # Critical failure for new/yet-to-be-released repo ?
300 # ------------------------------------------------------
Joey Armstrong43c48422023-04-03 10:17:32 -0400301 if [[ "$__ver" =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
Joey Armstrongfc20ed52023-04-03 19:37:58 -0400302 echo "git has a SemVer released version tag: '$__ver'"
Joey Armstrong43c48422023-04-03 10:17:32 -0400303 echo "Building artifacts for GitHub release."
304
305 elif [[ "$__ver" =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+)-dev([0-9]+)$ ]]; then
Joey Armstronge8560da2023-04-26 15:44:45 -0400306 # v1.2.3-dev (*-dev*) is an implicit draft release.
Joey Armstrong43c48422023-04-03 10:17:32 -0400307 declare -i -g draft_release=1
308 echo "Detected --draft SemVer release version tag [$__ver]"
309 echo "Building artifacts for GitHub release."
310
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400311 else
Joey Armstrong43c48422023-04-03 10:17:32 -0400312 error "No SemVer released version tag found, exiting..."
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400313 fi
314
Joey Armstrong43c48422023-04-03 10:17:32 -0400315 ## Cache value for subsequent calls.
316 ## readonly is a guarantee assignment happens once.
317 declare -g cached_getGitVersion="$__ver"
318 readonly cached_getGitVersion;
319
320 varname="$__ver"
321 func_echo "Version is [$__ver] from $(/bin/pwd)"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400322 return
323}
324
325## -----------------------------------------------------------------------
326## Intent:
327## Note: Release description is sanitized version of the log message
328## -----------------------------------------------------------------------
329function getReleaseDescription()
330{
331 declare -n varname="$1"; shift
332
333 local msg
334 msg="$(git log -1 --pretty=%B)"
335
336 local val
337 val="$(tr -dc "[:alnum:]\n\r\.\[\]\:\-\\\/\`\' " <<< "$msg")"
338
339 [[ ${#val} -eq 0 ]] && error "Release Description is empty ($msg)"
340 varname="$val"
341 return
342}
343
344## -----------------------------------------------------------------------
345## Intent: Retrieve value of the release temp directory.
346## -----------------------------------------------------------------------
347## Note: Limit use of globals so logic can be isolated in function calls.
348## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400349function get_release_dir()
350{
351 declare -n varname=$1; shift
352
353 # Temporary staging directory to copy artifacts to
354 varname="$scratch/release"
355 mkdir -p "$varname"
356 return
357}
358
359## -----------------------------------------------------------------------
360## Intent: Retrieve github server hostname
361## -----------------------------------------------------------------------
362function get_gh_hostname()
363{
364 declare -n varname=$1; shift
365 varname+=('--hostname' "${__githost}")
366 return
367}
368
369## -----------------------------------------------------------------------
370## Intent: Retrieve repository organizaiton name
371## -----------------------------------------------------------------------
372function get_gh_repo_org()
373{
374 declare -n varname=$1; shift
375 declare -g __repo_org
Joey Armstrong76026b72023-03-29 12:19:17 -0400376
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400377 local org
378 if [[ -v __repo_org ]]; then
Joey Armstrong43c48422023-04-03 10:17:32 -0400379 org="$__repo_org"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400380 elif [[ ! -v GITHUB_ORGANIZATION ]]; then
Joey Armstrong43c48422023-04-03 10:17:32 -0400381 error "--repo-org or GITHUB_ORGANIZATION= are required"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400382 else
Joey Armstrong43c48422023-04-03 10:17:32 -0400383 org="${GITHUB_ORGANIZATION}"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400384 fi
385
386 # shellcheck disable=SC2178
387 varname="$org"
388 return
389}
390
391## -----------------------------------------------------------------------
392## Intent: Retrieve repository organizaiton name
393## -----------------------------------------------------------------------
394function get_gh_repo_name()
395{
396 declare -n varname=$1; shift
397 declare -g __repo_name
Joey Armstrong76026b72023-03-29 12:19:17 -0400398
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400399 local name
400 if [[ -v __repo_name ]]; then
Joey Armstrong43c48422023-04-03 10:17:32 -0400401 name="$__repo_name"
Joey Armstrong39fac652023-03-27 18:50:43 -0400402 elif [[ ! -v GERRIT_PROJECT ]]; then
Joey Armstrong43c48422023-04-03 10:17:32 -0400403 error "--repo-name or GERRIT_PROJECT= are required"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400404 else
Joey Armstrong43c48422023-04-03 10:17:32 -0400405 name="${GERRIT_PROJECT}"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400406 fi
407
408 varname="$name"
409 return
410}
411
412## -----------------------------------------------------------------------
413## Intent: Return path for the gh release query
414## -----------------------------------------------------------------------
415function get_gh_releases()
416{
417 declare -n ref="$1"
418
419 local repo_org
420 get_gh_repo_org repo_org
421
422 local repo_name
423 get_gh_repo_name repo_name
424
425 ref="repos/${repo_org}/${repo_name}/releases"
426 func_echo "ref=$ref"
427 return
428}
429
430## -----------------------------------------------------------------------
431## Intent: Retrieve repository path argument
432## -----------------------------------------------------------------------
433function get_argv_repo()
434{
435 declare -n varname=$1; shift
436
437 local repo_org
438 get_gh_repo_org repo_org
Joey Armstrong76026b72023-03-29 12:19:17 -0400439
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400440 local repo_name
Joey Armstrong76026b72023-03-29 12:19:17 -0400441 get_gh_repo_name repo_name
442
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400443 varname="${repo_org}/${repo_name}"
Joey Armstronge8560da2023-04-26 15:44:45 -0400444 # func_echo "varname=$(declare -p varname)"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400445 return
446}
447
448## -----------------------------------------------------------------------
449## Intent: Retrieve release name string "project - version"
450## -----------------------------------------------------------------------
451function get_argv_name()
452{
453 declare -n varname=$1; shift
454
455 local repo_name
456 get_gh_repo_name repo_name
Joey Armstrong43c48422023-04-03 10:17:32 -0400457
458 local repo_ver
459 getGitVersion repo_ver
460
461 # varname="${repo_name} - $GIT_VERSION"
462 varname="${repo_name} - ${repo_ver}"
Joey Armstronge8560da2023-04-26 15:44:45 -0400463 func_echo "varname=$(declare -p varname)"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400464 return
465}
466
467## -----------------------------------------------------------------------
468## Intent: Retrieve tag version
469## -----------------------------------------------------------------------
470function get_argv_tag()
471{
472 declare -n varname=$1; shift
473
474 # cached_argv_tag='v3.41.3204'
475 if [[ ! -v cached_argv_tag ]]; then
Joey Armstrong43c48422023-04-03 10:17:32 -0400476 declare -g cached_argv_tag
477 if [[ -v GIT_VERSION ]]; then # hello jenkins
478 cached_argv_tag="$GIT_VERSION"
479 fi
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400480 fi
481
482 [[ ${#cached_argv_tag} -eq 0 ]] && error "Unable to determine GIT_VERSION="
483 varname="$cached_argv_tag"
Joey Armstronge8560da2023-04-26 15:44:45 -0400484 func_echo "varname=$(declare -p varname)"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400485 return
486}
487
488## -----------------------------------------------------------------------
489## Intent:
490## -----------------------------------------------------------------------
491# To support golang projects that require GOPATH to be set and code checked out there
492# If $DEST_GOPATH is not an empty string:
493# - create GOPATH within WORKSPACE, and destination directory within
494# - set PATH to include $GOPATH/bin and the system go binaries
495# - move project from $WORKSPACE/$GERRIT_PROJECT to new location in $GOPATH
496# - start release process within that directory
497## -----------------------------------------------------------------------
498function get_release_path()
499{
500 declare -n varname=$1; shift
501
Joey Armstronge8560da2023-04-26 15:44:45 -0400502 # shellcheck disable=SC2128
503 local varpath="$varname"
504
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400505 DEST_GOPATH=${DEST_GOPATH:-}
506 if [ -n "$DEST_GOPATH" ]; then
Joey Armstrong43c48422023-04-03 10:17:32 -0400507 mkdir -p "$GOPATH/src/$DEST_GOPATH"
Joey Armstronge8560da2023-04-26 15:44:45 -0400508 varpath="$GOPATH/src/$DEST_GOPATH/$GERRIT_PROJECT"
509 mv "$WORKSPACE/$GERRIT_PROJECT" "$varpath"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400510 else
Joey Armstronge8560da2023-04-26 15:44:45 -0400511 varpath="$WORKSPACE/$GERRIT_PROJECT"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400512 fi
513
Joey Armstrong43c48422023-04-03 10:17:32 -0400514 ## Verify pwd is OK
515 for path in \
Joey Armstronge8560da2023-04-26 15:44:45 -0400516 "${varpath}/Makefile"\
517 "${varpath}/makefile"\
Joey Armstrong43c48422023-04-03 10:17:32 -0400518 "__ERROR__"\
519 ; do
520 case "$path" in
Joey Armstronge8560da2023-04-26 15:44:45 -0400521 __ERROR__) error "Makefile not found at ${varpath} !" ;;
Joey Armstrong43c48422023-04-03 10:17:32 -0400522 *) [[ -f "$path" ]] && break ;;
523 esac
524 done
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400525
526 return
527}
528
529## -----------------------------------------------------------------------
530## Intent: Display future enhancements
531## -----------------------------------------------------------------------
532function todo()
533{
534 local iam="${0##*/}"
535
536cat <<EOT
537
538** -----------------------------------------------------------------------
539** IAM: ${iam} :: ${FUNCNAME[0]}
540** -----------------------------------------------------------------------
541 o get_release_path()
542 - refactor redundant paths into local vars.
543 - see comments, do we have a one-off failure condition ?
Joey Armstrongad7b1e02023-03-27 11:55:48 -0400544 o PATH += golang appended 3 times, release needs a single, reliable answer.
545 o do_login, do_logout and api calls do not use the my_gh wrapper:
546 - Add a lookup function to cache and retrieve path to downloaded gh command.
Joey Armstrong76026b72023-03-29 12:19:17 -0400547
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400548EOT
549
550 return
551}
552
553## -----------------------------------------------------------------------
Joey Armstrong76026b72023-03-29 12:19:17 -0400554## Intent: Verify a directory contains content for release.
555## -----------------------------------------------------------------------
556## Given:
557## scalar Path to release/ directory
558## ref Results returned through this indirect var.
559## -----------------------------------------------------------------------
560## Usage:
561## declare -a artifacts=()
562## get_artifacts '/foo/bar/tans' artifacts
563## declare -p artifacts
564## -----------------------------------------------------------------------
565function get_artifacts()
566{
567 local dir="$1" ; shift
568 declare -n ref=$1 ; shift
569
Joey Armstrong55fe80e2023-04-05 18:32:14 -0400570 # Glob available files, exclude checksums
571 readarray -t __artifacts < <(find "$dir" -mindepth 1 ! -type d \
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400572 | grep -iv -e 'sum256' -e 'checksum')
573 # func_echo "$(declare -p __artifacts)"
Joey Armstrong76026b72023-03-29 12:19:17 -0400574
575 # -----------------------------------------------------------------------
576 # Verify count>0 to inhibit source-only release
577 # Problem children:
578 # o build or make release failures.
579 # o docker container filesystem mount problem (~volume)
580 # -----------------------------------------------------------------------
581 [[ ${#__artifacts[@]} -eq 0 ]] \
Joey Armstrong43c48422023-04-03 10:17:32 -0400582 && error "Artifact dir is empty: $(declare -p dir)"
Joey Armstrong76026b72023-03-29 12:19:17 -0400583
584 ref=("${__artifacts[@]}")
585 return
586}
587
588## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400589## Intent: Copy files from the build directory into the release staging
590## directory for publishing to github releases/ endpoint.
Joey Armstrong26707f02023-01-26 12:41:12 -0500591## -----------------------------------------------------------------------
592function copyToRelease()
593{
Joey Armstrong76026b72023-03-29 12:19:17 -0400594 banner ''
Joey Armstrong26707f02023-01-26 12:41:12 -0500595
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400596 local artifact_glob="${ARTIFACT_GLOB%/*}"
597 func_echo "$(declare -p artifact_glob)"
598
599 local work
600 get_release_dir work
Joey Armstrong76026b72023-03-29 12:19:17 -0400601 func_echo "Artifact dir: $(declare -p work)"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400602
Joey Armstrong76026b72023-03-29 12:19:17 -0400603 ## Verify release content is available
604 declare -a artifacts=()
Joey Armstrong43c48422023-04-03 10:17:32 -0400605 # get_artifacts "$work" artifacts
606 get_artifacts "$artifact_glob" artifacts
607 func_echo "Artifacts in copy_from: $(declare -p artifacts)"
Joey Armstrong472bfba2023-03-27 18:12:28 -0400608
Joey Armstrong26707f02023-01-26 12:41:12 -0500609 # Copy artifacts into the release temp dir
610 # shellcheck disable=SC2086
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400611 echo "rsync -rv --checksum \"$artifact_glob/.\" \"$work/.\""
612 rsync -rv --checksum "$artifact_glob/." "$work/."
Joey Armstrong1962bcf2023-01-27 13:53:18 -0500613
Joey Armstrong43c48422023-04-03 10:17:32 -0400614 get_artifacts "$work" artifacts
615 func_echo "Artifacts in copy_to: $(declare -p artifacts)"
616
Joey Armstrong26707f02023-01-26 12:41:12 -0500617 return
618}
619
620## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400621## https://docs.github.com/en/rest/releases?apiVersion=2022-11-28
622 # https://cli.github.com/manual/gh_release_create
623 # --target <branch> or commit SHA
624 # --title
625 # --generate-notes
626 # --release-notes (notes file)
627 # --release
628 # release create dist/*.tgz
629 # --discussion-category "General"
Joey Armstrongf085d872023-01-28 17:52:29 -0500630## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400631# https://cli.github.com/manual/gh_release_create
632## -----------------------------------------------------------------------
633function gh_release_create()
Joey Armstrong38bfeea2023-02-06 18:01:29 -0500634{
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400635 banner ''
Joey Armstrong38bfeea2023-02-06 18:01:29 -0500636
Joey Armstrong43c48422023-04-03 10:17:32 -0400637 local version
638 getGitVersion version
Joey Armstrong38bfeea2023-02-06 18:01:29 -0500639
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400640 local work
641 get_release_dir work
642
Joey Armstrong43c48422023-04-03 10:17:32 -0400643 declare -a args=()
644 args+=('--host-repo')
645 args+=('--title')
646 if [[ -v draft_release ]]; then
647 args+=('--draft')
648 else
649 args+=('--discussion-category' 'Announcements')
650 fi
651
Joey Armstrong55fe80e2023-04-05 18:32:14 -0400652 if [[ -v release_notes ]]; then
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400653 args+=('--notes-file' "$release_notes")
Joey Armstrong55fe80e2023-04-05 18:32:14 -0400654 fi
Joey Armstrong43c48422023-04-03 10:17:32 -0400655
Joey Armstrong78cecc52023-04-03 11:39:11 -0400656 pushd "$work/.." >/dev/null
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400657 # func_echo "WORK=$work"
Joey Armstrong78cecc52023-04-03 11:39:11 -0400658 readarray -t payload < <(find 'release' -maxdepth 4 ! -type d -print)
Joey Armstrong76026b72023-03-29 12:19:17 -0400659
Joey Armstronge8560da2023-04-26 15:44:45 -0400660 func_echo "$gh_cmd release create ${version} ${args[*]} ${payload[*]}"
Joey Armstrong43c48422023-04-03 10:17:32 -0400661
662 if [[ -v dry_run ]]; then
663 echo "[SKIP] dry run"
664 else
Joey Armstronge8560da2023-04-26 15:44:45 -0400665 func_echo "my_gh release create '$version' ${args[*]} ${payload[*]}"
Joey Armstrong4dbe7002023-04-04 12:47:38 -0400666 my_gh 'release' 'create' "$version" "${args[@]}" "${payload[@]}"
Joey Armstrong43c48422023-04-03 10:17:32 -0400667 fi
Joey Armstrong76026b72023-03-29 12:19:17 -0400668 popd >/dev/null
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400669
Joey Armstrong38bfeea2023-02-06 18:01:29 -0500670 return
671}
672
673## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400674## Intent: Authenticate credentials for a github gh session
Joey Armstrong38bfeea2023-02-06 18:01:29 -0500675## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400676## NOTE: my_gh currently unused due to --with-token < "$pac"
677## -----------------------------------------------------------------------
678function do_login()
Joey Armstrongf085d872023-01-28 17:52:29 -0500679{
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400680 declare -g pac
Joey Armstrong485081f2023-03-27 13:34:08 -0400681 declare -a login_args=()
682 [[ $# -gt 0 ]] && login_args+=("$@")
Joey Armstrongf085d872023-01-28 17:52:29 -0500683
Joey Armstrong485081f2023-03-27 13:34:08 -0400684 # https://github.com/cli/cli/issues/2922#issuecomment-775027762
Joey Armstrong75a0d932023-03-28 08:59:54 -0400685 # (sigh) why not quietly return VS forcing a special logic path
Joey Armstronge6e18eb2023-03-27 14:19:21 -0400686 # [[ -v WORKSPACE ]] && [[ -v GITHUB_TOKEN ]] && return
687
688# 12:58:36 ** -----------------------------------------------------------------------
689# 12:58:36 ** jenkins582353203049151829.sh::do_login: --hostname github.com
690# 12:58:36 ** --------------------------------------------------------------------# ---
691# 12:58:36 ** jenkins582353203049151829.sh :: do_login: Detected ENV{GITHUB_TOKEN}=
692# 12:58:36 The value of the GITHUB_TOKEN environment variable is being used for authentication.
693# 12:58:36 To have GitHub CLI store credentials instead, first clear the value from the environment.
Joey Armstrong43c48422023-04-03 10:17:32 -0400694# -----------------------------------------------------------------------
Joey Armstrong76026b72023-03-29 12:19:17 -0400695
Joey Armstrong485081f2023-03-27 13:34:08 -0400696 get_gh_hostname login_args
Joey Armstrongf085d872023-01-28 17:52:29 -0500697
Joey Armstrong485081f2023-03-27 13:34:08 -0400698 banner "${login_args[@]}"
Joey Armstrong78cecc52023-04-03 11:39:11 -0400699 func_echo "$(declare -p WORKSPACE)"
Joey Armstrongf085d872023-01-28 17:52:29 -0500700
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400701 ## Read from disk is safer than export GITHUB_TOKEN=
702 if [[ -v pac ]] && [[ ${#pac} -gt 0 ]]; then # interactive/debugging
Joey Armstrong43c48422023-04-03 10:17:32 -0400703 [ ! -f "$pac" ] && error "PAC token file $pac does not exist"
Joey Armstronge8560da2023-04-26 15:44:45 -0400704 func_echo "$gh_cmd auth login ${login_args[*]} --with-token < $pac"
Joey Armstrong485081f2023-03-27 13:34:08 -0400705 "$gh_cmd" auth login "${login_args[@]}" --with-token < "$pac"
Joey Armstrongf085d872023-01-28 17:52:29 -0500706
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400707 elif [[ ! -v GITHUB_TOKEN ]]; then
708 error "--token [t] or GITHUB_TOKEN= are required"
Joey Armstrong41923cc2023-01-30 14:38:16 -0500709
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400710 else # jenkins
Joey Armstronge8560da2023-04-26 15:44:45 -0400711 func_echo "$gh_cmd auth login ${login_args[*]} (ie: jenkins)"
Joey Armstrong733ea9f2023-04-03 21:19:46 -0400712
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400713 # https://github.com/cli/cli/issues/2922#issuecomment-775027762
714 # When using GITHUB_TOKEN, there is no need to even run gh auth login
Joey Armstrong733ea9f2023-04-03 21:19:46 -0400715 # "$gh_cmd" auth login "${login_args[@]}"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400716 fi
Joey Armstrongf085d872023-01-28 17:52:29 -0500717
Joey Armstrong43c48422023-04-03 10:17:32 -0400718 declare -i -g active_login=1 # signal logout needed
Joey Armstrongf085d872023-01-28 17:52:29 -0500719
Joey Armstrongf085d872023-01-28 17:52:29 -0500720 return
721}
722
723## -----------------------------------------------------------------------
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400724## Intent: Destroy credentials/gh session authenticated by do_login
725## -----------------------------------------------------------------------
726## NOTE: my_gh currently unused due to "<<< 'y'"
727## -----------------------------------------------------------------------
728function do_logout()
729{
730 declare -i -g active_login
731 [[ ! -v active_login ]] && return
732
Joey Armstrong78cecc52023-04-03 11:39:11 -0400733 declare -a logout_args=()
734 [[ $# -gt 0 ]] && logout_args+=("$@")
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400735
Joey Armstrong78cecc52023-04-03 11:39:11 -0400736 get_gh_hostname logout_args
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400737
Joey Armstrong78cecc52023-04-03 11:39:11 -0400738 banner "${logout_args[@]}"
Joey Armstronge8560da2023-04-26 15:44:45 -0400739 func_echo "$gh_cmd auth logout ${logout_args[*]} <<< 'Y'"
Joey Armstrong78cecc52023-04-03 11:39:11 -0400740 "$gh_cmd" auth logout "${logout_args[@]}" <<< 'Y'
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400741
742 unset active_login
743 return
744}
745
746## -----------------------------------------------------------------------
747## Intent: Query for repository version strings
748## -----------------------------------------------------------------------
749function get_releases()
750{
751 declare -n ref="$1"; shift
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400752
753 banner ""
754 pushd "$scratch" >/dev/null
Joey Armstrong76026b72023-03-29 12:19:17 -0400755
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400756 # gh api repos/{owner}/{repo}/releases
757 local releases_uri
758 get_gh_releases releases_uri
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400759 # declare -p releases_uri
Joey Armstrong76026b72023-03-29 12:19:17 -0400760
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400761 ref=()
Joey Armstronge8560da2023-04-26 15:44:45 -0400762 "$gh_cmd" api "$releases_uri" | jq . > 'release.raw'
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400763 readarray -t __tmp < <(jq '.[] | "\(.tag_name)"' 'release.raw')
764
765 local release
766 for release in "${__tmp[@]}";
767 do
Joey Armstrong43c48422023-04-03 10:17:32 -0400768 release="${release//\"/}"
769 ref+=("$release")
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400770 done
771
772 popd >/dev/null
773 return
774}
775
776## -----------------------------------------------------------------------
777## Intent: Display repository query strings.
778## Indirect: verify authentication and API
779## -----------------------------------------------------------------------
780function showReleases()
781{
Joey Armstrong43c48422023-04-03 10:17:32 -0400782 declare -a raw=()
783 get_releases raw
784
785 ## Sort for display, we may need to prune volume later on
Joey Armstronge8560da2023-04-26 15:44:45 -0400786 readarray -t releases < <(sort -nr <<<"${raw[*]}")
787 # IFS=$'\n' releases=($(sort -nr <<<"${raw[*]}"))
788 # unset IFS
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400789
790 local release
791 for release in "${releases[@]}";
792 do
Joey Armstrong43c48422023-04-03 10:17:32 -0400793 func_echo "$release"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400794 done
795 return
796}
797
798## -----------------------------------------------------------------------
799## Intent: Install the gh command line tool locally
Joey Armstrong26707f02023-01-26 12:41:12 -0500800## -----------------------------------------------------------------------
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500801function install_gh_binary()
Joey Armstrong26707f02023-01-26 12:41:12 -0500802{
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400803 banner
Joey Armstrong26707f02023-01-26 12:41:12 -0500804
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500805 pushd "$scratch"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400806 func_echo "Retrieve latest gh download URLs"
Joey Armstrongf085d872023-01-28 17:52:29 -0500807
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500808 local latest="https://github.com/cli/cli/releases/latest"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400809 local tarball="gh.tar.tgz"
810
Joey Armstrong76026b72023-03-29 12:19:17 -0400811 readarray -t latest < <(\
812 curl --silent -qI "$latest" \
Joey Armstrong43c48422023-04-03 10:17:32 -0400813 | awk -F '/' '/^location/ {print substr($NF, 1, length($NF)-1)}')
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400814 declare -p latest
815 if [ ${#latest[@]} -ne 1 ]; then
Joey Armstrong43c48422023-04-03 10:17:32 -0400816 error "Unable to determine latest gh package version"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400817 fi
Joey Armstrong76026b72023-03-29 12:19:17 -0400818
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400819 local VER="${latest[0]}"
820
821 func_echo "Download latest gh binary"
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500822 local url="https://github.com/cli/cli/releases/download/${VER}/gh_${VER#v}_linux_amd64.tar.gz"
Joey Armstrong43c48422023-04-03 10:17:32 -0400823 func_echo "wget --quiet --output-document='$tarball' '$url'"
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500824 wget --quiet --output-document="$tarball" "$url"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400825
826 func_echo "Unpack tarball"
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500827 tar zxf "$tarball"
828
Joey Armstrong78cecc52023-04-03 11:39:11 -0400829 declare -g gh_cmd
830 gh_cmd="$(find "${scratch}" -name 'gh' -print)"
831 #declare -g gh_cmd='/usr/bin/gh'
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500832 readonly gh_cmd
833
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400834 func_echo "Command: ${gh_cmd}"
835 func_echo "Version: $("$gh_cmd" --version)"
Joey Armstrongd99e3d22023-01-29 12:35:43 -0500836 popd
837
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400838 return
839}
840
841## -----------------------------------------------------------------------
842## Intent: Danger Will Robinson
843## -----------------------------------------------------------------------
844function releaseDelete()
845{
Joey Armstronge8560da2023-04-26 15:44:45 -0400846 declare -n args=$1; shift
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400847 local version="$1"; shift
Joey Armstrong76026b72023-03-29 12:19:17 -0400848
Joey Armstronge8560da2023-04-26 15:44:45 -0400849 banner "${args[@]}"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400850 declare -a args=()
851 args+=('--host-repo')
852 args+=('--yes')
853 # args+=('--cleanup-tag')
854
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400855 echo
856 echo "==========================================================================="
857 my_gh 'release' 'delete' "$version" "${args[@]}"
858 echo "==========================================================================="
859 echo
860
861 showReleases
862 return
863}
864
865## -----------------------------------------------------------------------
866## Intent: Copy binaries into temp/release, checksum then publish
867## -----------------------------------------------------------------------
868function release_staging()
869{
870 local release_temp
871 get_release_dir release_temp
872
873 banner ''
874 func_echo "Packaging release files"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400875
Joey Armstrong76026b72023-03-29 12:19:17 -0400876 pushd "$release_temp" >/dev/null \
Joey Armstrong43c48422023-04-03 10:17:32 -0400877 || error "pushd failed: dir is [$release_temp]"
Joey Armstrong76026b72023-03-29 12:19:17 -0400878
879 declare -a to_release=()
880 get_artifacts '.' to_release
881
Joey Armstrong55fe80e2023-04-05 18:32:14 -0400882 if false; then
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400883 for fyl in "${to_release[@]}";
884 do
885 func_echo "sha256sum $fyl > ${fyl}.sha256"
886 sha256sum "$fyl" > "${fyl}.sha256"
887 done
Joey Armstrong55fe80e2023-04-05 18:32:14 -0400888 fi
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400889
890 # Generate and check checksums
Joey Armstrong55fe80e2023-04-05 18:32:14 -0400891 sha256sum -- * | grep -iv -e 'checksum' -e 'sha256' > checksum.SHA256
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400892 sha256sum -c < checksum.SHA256
893
894 echo
895 func_echo "Checksums(checksum.SHA256):"
896 cat checksum.SHA256
897
Joey Armstrong43c48422023-04-03 10:17:32 -0400898 if false; then
Joey Armstrong78cecc52023-04-03 11:39:11 -0400899 # Careful with credentials display
Joey Armstrong43c48422023-04-03 10:17:32 -0400900 get_gh_hostname login_args
Joey Armstronge8560da2023-04-26 15:44:45 -0400901 banner "gh auth status ${login_args[*]}"
Joey Armstrong43c48422023-04-03 10:17:32 -0400902 gh auth status "${login_args[@]}"
903 fi
904
Joey Armstrong76026b72023-03-29 12:19:17 -0400905 gh_release_create # publish
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400906
907 popd >/dev/null || error "pushd failed: dir is [$release_temp]"
908
909 return
910}
911
912## -----------------------------------------------------------------------
Joey Armstrong43c48422023-04-03 10:17:32 -0400913## Intent: Normalize common arguments and access to the gh command.
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400914## o Cache path to the gh command
915## o Construct a gh command line from given args
916## o Command wrapper can provide defaults (--hostname github.com)
917## -----------------------------------------------------------------------
918## Given:
919## scalar Array variable name (declare -n is a reference)
920## Return:
921## ref gh command line passed back to caller
922## Switches:
923## --host Pass default github hostname
924## --verbose Enable verbose mode#
925## --version Display command version
926## @array Remaining arguments passed as command switches.
927## -----------------------------------------------------------------------
928## See Also:
929## o https://cli.github.com/manual
930## -----------------------------------------------------------------------
931function my_gh()
932{
Joey Armstrong73bb2f62023-04-17 19:31:50 -0400933 func_echo "ENTER"
934 set -x
935
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400936 declare -a cmd=()
937 cmd+=("$gh_cmd")
938
939 ## ----------------------
940 ## Construct command line
941 ## ----------------------
942 # shellcheck disable=SC2034
943 declare -A action=() # pending operations
944 declare -a args=() # common gh command line args
945
946 while [ $# -gt 0 ]; do
947 local arg="$1"; shift
Joey Armstrong73bb2f62023-04-17 19:31:50 -0400948 func_echo "function arg is [$arg]"
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400949 case "$arg" in
950
Joey Armstrong43c48422023-04-03 10:17:32 -0400951 # Modes
Joey Armstronge8560da2023-04-26 15:44:45 -0400952 -*debug)
953 # shellcheck disable=SC2034
954 declare -i -g debug=1
955 ;;
956 -*verbose) args+=('--verbose') ;;
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400957
Joey Armstrong43c48422023-04-03 10:17:32 -0400958 -*hostname)
959 get_gh_hostname in_args
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400960 ;;
961
Joey Armstrong43c48422023-04-03 10:17:32 -0400962 --host-repo)
963 local val
964 get_argv_repo val
Joey Armstrong76026b72023-03-29 12:19:17 -0400965
Joey Armstrong43c48422023-04-03 10:17:32 -0400966 # --repo <[HOST/]OWNER/REPO>
Joey Armstrong78cecc52023-04-03 11:39:11 -0400967 args+=('--repo' "${__githost}/${val}")
Joey Armstrong43c48422023-04-03 10:17:32 -0400968 ;;
Joey Armstrong76026b72023-03-29 12:19:17 -0400969
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400970# args+=('--repo' 'github.com/opencord/bbsim')
971
Joey Armstrong43c48422023-04-03 10:17:32 -0400972 --repo)
973 local val
974 get_argv_repo val
975 args+=('--repo' "$val")
976 ;;
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400977
Joey Armstrong43c48422023-04-03 10:17:32 -0400978 --tag)
979 local val
980 get_argv_tag val
Joey Armstrong4dbe7002023-04-04 12:47:38 -0400981 args+=("$val") # No switch, pass inline
Joey Armstrong43c48422023-04-03 10:17:32 -0400982 ;;
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400983
Joey Armstrong43c48422023-04-03 10:17:32 -0400984 --title)
985 local val
986 get_argv_name val
Joey Armstrongf9a0a882023-04-17 11:53:57 -0400987 args+=('--title' "'$val'")
Joey Armstrong43c48422023-04-03 10:17:32 -0400988 ;;
Joey Armstrong76026b72023-03-29 12:19:17 -0400989
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400990 *) args+=("$arg") ;;
991 esac
992 done
Joey Armstrong76026b72023-03-29 12:19:17 -0400993
Joey Armstrong2097d3e2023-03-26 10:32:03 -0400994 cmd+=("${args[@]}")
Joey Armstrong73bb2f62023-04-17 19:31:50 -0400995
996 echo
997 declare -p cmd
998
999 echo
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001000 echo "** Running: ${cmd[*]}"
1001 "${cmd[@]}"
1002 local status=$?
1003
Joey Armstrong73bb2f62023-04-17 19:31:50 -04001004 set +x
1005 func_echo "LEAVE"
1006
Joey Armstronge8560da2023-04-26 15:44:45 -04001007 if [[ $status -eq 0 ]]; then
1008 true
1009 else
1010 false
1011 fi
1012
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001013 return
1014}
1015
1016## ---------------------------------------------------------------------------
1017## Intent:
1018## ---------------------------------------------------------------------------
1019function usage()
1020{
1021 cat <<EOH
Joey Armstrong76026b72023-03-29 12:19:17 -04001022
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001023Usage: $0
1024Usage: make [options] [target] ...
1025 --help This mesage
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001026 --pac Personal Access Token (path to containing file or a string)
1027 --repo-name ex: voltctl
1028 --repo-org ex: opencord
Joey Armstronge8560da2023-04-26 15:44:45 -04001029 --release-notes [f] Release notes are passed by file argument
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001030
1031[DEBUG]
1032 --gen-version Generate a random release version string.
1033 --git-hostname Git server hostname (default=github.com)
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001034 --version-file Read version string from local version file (vs env var)
Joey Armstrongf9a0a882023-04-17 11:53:57 -04001035
1036[MODES]
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001037 --debug Enable script debug mode
1038 --draft Create a draft release (vs published)
Joey Armstrong43c48422023-04-03 10:17:32 -04001039 --dry-run Simulation mode
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001040 --todo Display future enhancement list
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001041
Joey Armstronge8560da2023-04-26 15:44:45 -04001042All other arguments are pass-through to the gh command.
1043
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001044Usage: $0 --draft --repo-org opencord --repo-name voltctl --git-hostname github.com --pac ~/access.pac
Joey Armstronge8560da2023-04-26 15:44:45 -04001045
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001046EOH
Joey Armstronge8560da2023-04-26 15:44:45 -04001047
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001048 return
1049}
1050
1051## ---------------------------------------------------------------------------
1052## Intent: Parse script command line arguments
1053## ---------------------------------------------------------------------------
1054function parse_args()
1055{
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001056 [[ -v DEBUG ]] && func_echo "ENTER"
1057
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001058 while [ $# -gt 0 ]; do
Joey Armstrong43c48422023-04-03 10:17:32 -04001059 local arg="$1"; shift
1060 func_echo "ARGV: $arg"
1061 case "$arg" in
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001062
Joey Armstrong43c48422023-04-03 10:17:32 -04001063 -*debug) declare -i -g debug=1 ;;
1064 --draft) declare -i -g draft_release=1 ;;
1065 --dry-run) declare -i -g dry_run=1 ;;
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001066
Joey Armstrong43c48422023-04-03 10:17:32 -04001067 --version-file)
1068 declare -i -g argv_version_file=1
1069 ;;
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001070
Joey Armstrong43c48422023-04-03 10:17:32 -04001071 -*gen-version)
1072 declare -g -i argv_gen_version=1
1073 ;;
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001074
Joey Armstrong43c48422023-04-03 10:17:32 -04001075 -*git-hostname)
1076 __githost="$1"; shift
1077 ;;
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001078
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001079 -*release-notes)
Joey Armstronge8560da2023-04-26 15:44:45 -04001080 [[ ! -f "$1" ]] && error "--release-notes: file path required (arg=\"$arg\")"
1081 declare -g release_notes="$1"; shift
Joey Armstrongf9a0a882023-04-17 11:53:57 -04001082 ;;
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001083
Joey Armstrong43c48422023-04-03 10:17:32 -04001084 -*repo-name)
1085 __repo_name="$1"; shift
1086 ;;
1087
1088 -*repo-org)
1089 __repo_org="$1"; shift
1090 ;;
1091
1092 -*pac)
1093 declare -g pac="$1"; shift
1094 readonly pac
1095 [[ ! -f "$pac" ]] && error "--token= does not exist ($pac)"
1096 : # nop/true
1097 ;;
1098
1099 -*todo) todo ;;
1100
1101 -*help)
1102 usage
1103 exit 0
1104 ;;
1105
1106 *) error "Detected unknown argument $arg" ;;
1107 esac
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001108 done
1109
Joey Armstrong26707f02023-01-26 12:41:12 -05001110 return
1111}
1112
Joey Armstrongaf577ab2022-12-15 14:43:33 -05001113##----------------##
1114##---] MAIN [---##
1115##----------------##
Joey Armstrong1962bcf2023-01-27 13:53:18 -05001116iam="${0##*/}"
1117
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001118full_banner
Joey Armstronge8560da2023-04-26 15:44:45 -04001119parse_args "$@"
Joey Armstrongd99e3d22023-01-29 12:35:43 -05001120init
1121install_gh_binary
Joey Armstrong7f382ef2023-01-25 12:00:08 -05001122
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001123do_login
Zack Williams27cd3e52018-09-18 16:44:50 -07001124
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001125release_path='/dev/null'
1126get_release_path release_path
1127declare -p release_path
Zack Williams27cd3e52018-09-18 16:44:50 -07001128
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001129pushd "$release_path" || error "pushd failed: dir is [$release_path]"
Zack Williams27cd3e52018-09-18 16:44:50 -07001130
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001131 # legacy: getGitVersion "$GERRIT_PROJECT" GIT_VERSION
1132 getGitVersion GIT_VERSION
1133 getReleaseDescription RELEASE_DESCRIPTION
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001134 if [[ ! -v release_notes ]]; then
Joey Armstronge8560da2023-04-26 15:44:45 -04001135 func_echo "Generating release notes from RELEASE_DESCRIPTION"
Joey Armstrongf9a0a882023-04-17 11:53:57 -04001136 declare -g release_notes="$scratch/release.notes"
1137 echo "$RELEASE_DESCRIPTION" > "$release_notes"
Joey Armstrong55fe80e2023-04-05 18:32:14 -04001138 fi
Joey Armstronge8560da2023-04-26 15:44:45 -04001139 cat "$release_notes"
Zack Williams27cd3e52018-09-18 16:44:50 -07001140
Joey Armstrongeef8c2c2023-03-27 17:27:43 -04001141 cat <<EOM
1142
1143** -----------------------------------------------------------------------
1144** GIT VERSION: $(declare -p GIT_VERSION)
1145** RELEASE_DESCRIPTION: $(declare -p RELEASE_DESCRIPTION)
1146** RELEASE_TARGETS: $(declare -p RELEASE_TARGETS)
Joey Armstrong43c48422023-04-03 10:17:32 -04001147** -----------------------------------------------------------------------
Joey Armstronge8560da2023-04-26 15:44:45 -04001148** URL: https://github.com/opencord/bbsim/releases
1149** -----------------------------------------------------------------------
Joey Armstrong43c48422023-04-03 10:17:32 -04001150** Running: make ${RELEASE_TARGETS}
Joey Armstrongeef8c2c2023-03-27 17:27:43 -04001151** -----------------------------------------------------------------------
1152EOM
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001153 # build the release, can be multiple space separated targets
1154 # -----------------------------------------------------------------------
1155 # % go build command-line-arguments:
1156 # copying /tmp/go-build4212845548/b001/exe/a.out:
1157 # open release/voltctl-1.8.25-linux-amd64: permission denied
1158 # missing: docker run mkdir
1159 # -----------------------------------------------------------------------
1160 # shellcheck disable=SC2086
Joey Armstrongeef8c2c2023-03-27 17:27:43 -04001161 make "$RELEASE_TARGETS"
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001162 copyToRelease
Joey Armstrong50f6e0b2023-01-24 14:14:08 -05001163
Joey Armstrong26707f02023-01-26 12:41:12 -05001164 cat <<EOM
Joey Armstrong1962bcf2023-01-27 13:53:18 -05001165
1166** -----------------------------------------------------------------------
1167** Create the release:
1168** 1) Create initial github release with download area.
1169** 2) Generate checksum.SHA256 for all released files.
1170** 3) Upload files to complete the release.
Joey Armstrong75a0d932023-03-28 08:59:54 -04001171** 4) Display released info from github
Joey Armstrong1962bcf2023-01-27 13:53:18 -05001172** -----------------------------------------------------------------------
Joey Armstrong26707f02023-01-26 12:41:12 -05001173EOM
1174
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001175 showReleases
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001176 release_staging
Joey Armstronge8560da2023-04-26 15:44:45 -04001177
1178 # Useful to display but --draft images use a non-standard subdir identifier.
1179 # showReleaseUrl
1180
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001181 popd || error "pushd failed: dir is [$release_path]"
Joey Armstrong28eddda2023-01-10 03:09:34 -05001182
Joey Armstrong2097d3e2023-03-26 10:32:03 -04001183do_logout
1184
Joey Armstrong28eddda2023-01-10 03:09:34 -05001185# [SEE ALSO]
1186# -----------------------------------------------------------------------
1187# https://www.shellcheck.net/wiki/SC2236
Joey Armstrong26707f02023-01-26 12:41:12 -05001188# https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28#create-a-release
Joey Armstrong28eddda2023-01-10 03:09:34 -05001189# -----------------------------------------------------------------------
Joey Armstrongf085d872023-01-28 17:52:29 -05001190# https://cli.github.com/manual/gh_help_reference
1191# https://cli.github.com/manual/gh_release
1192# -----------------------------------------------------------------------
Joey Armstrong28eddda2023-01-10 03:09:34 -05001193
1194# [EOF]