blob: 8ff8754b738ead8a69830bde2deedccbec9d5a2f [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 Armstrongaf577ab2022-12-15 14:43:33 -050023## -----------------------------------------------------------------------
Joey Armstrong50f6e0b2023-01-24 14:14:08 -050024## Intent:
25## Display available command versions
26## A github release job is failing due to a command being mia.
27## -----------------------------------------------------------------------
28function displayCommands()
29{
30 # which git || /bin/true
31 # git --version || /bin/true
32 # go version || /bin/true
33 # helm version || /bin/true
34 return
35}
36
37## -----------------------------------------------------------------------
Joey Armstrongaf577ab2022-12-15 14:43:33 -050038## -----------------------------------------------------------------------
Joey Armstrong1b443bf2023-01-24 10:22:18 -050039function doDebug()
Joey Armstrongaf577ab2022-12-15 14:43:33 -050040{
Joey Armstrong1b443bf2023-01-24 10:22:18 -050041 echo "** ${FUNCNAME[0]}: ENTER"
Joey Armstrong28eddda2023-01-10 03:09:34 -050042
Joey Armstrongaf577ab2022-12-15 14:43:33 -050043 echo
Joey Armstrong1b443bf2023-01-24 10:22:18 -050044 echo "** PWD: $(/bin/pwd)"
45 echo "** make-pre: $(/bin/ls -l)"
46 echo
47
48 declare -p ARTIFACT_GLOB
49 declare -p RELEASE_TEMP
Joey Armstrongaf577ab2022-12-15 14:43:33 -050050
51 echo
Joey Armstrong1b443bf2023-01-24 10:22:18 -050052 echo "** ${FUNCNAME[0]}: ARTIFACT_GLOB=${ARTIFACT_GLOB}"
53 local artifact_glob="${ARTIFACT_GLOB%/*}"
54 declare -p artifact_glob
55 find "$artifact_glob" -print || /bin/true
Joey Armstrongaf577ab2022-12-15 14:43:33 -050056
Joey Armstrong1b443bf2023-01-24 10:22:18 -050057 # Copy artifacts into the release temp dir
58 # shellcheck disable=SC2086
59 cp -v "$ARTIFACT_GLOB" "$RELEASE_TEMP"
60
Joey Armstrongaf577ab2022-12-15 14:43:33 -050061 echo
Joey Armstrong1b443bf2023-01-24 10:22:18 -050062 echo "** ${FUNCNAME[0]}: RELEASE_TEMP=${RELEASE_TEMP}"
63 find "$RELEASE_TEMP" -print || /bin/true
Joey Armstrongaf577ab2022-12-15 14:43:33 -050064
Joey Armstrong1b443bf2023-01-24 10:22:18 -050065 echo "** ${FUNCNAME[0]}: LEAVE"
66 echo
Joey Armstrongaf577ab2022-12-15 14:43:33 -050067 return
68}
69
70##----------------##
71##---] MAIN [---##
72##----------------##
Zack Williams27cd3e52018-09-18 16:44:50 -070073set -eu -o pipefail
74
75# when not running under Jenkins, use current dir as workspace and a blank
76# project name
77WORKSPACE=${WORKSPACE:-.}
78GERRIT_PROJECT=${GERRIT_PROJECT:-}
79
80# Github organization (or user) this project is published on. Project name should
81# be the same on both Gerrit and GitHub
82GITHUB_ORGANIZATION=${GITHUB_ORGANIZATION:-}
83
84# glob pattern relative to project dir matching release artifacts
Joey Armstrong50f6e0b2023-01-24 14:14:08 -050085# ARTIFACT_GLOB=${ARTIFACT_GLOB:-"release/*"}
86ARTIFACT_GLOB=${ARTIFACT_GLOB:-"release/."}
Zack Williams27cd3e52018-09-18 16:44:50 -070087
88# Temporary staging directory to copy artifacts to
89RELEASE_TEMP="$WORKSPACE/release"
Zack Williams2f8e8472019-05-21 16:29:06 -070090mkdir -p "$RELEASE_TEMP"
Zack Williams27cd3e52018-09-18 16:44:50 -070091
92# Use "release" as the default makefile target, can be a space separated list
93RELEASE_TARGETS=${RELEASE_TARGETS:-release}
94
Zack Williams0f398492019-10-23 16:02:24 -070095
Zack Williams27cd3e52018-09-18 16:44:50 -070096# check that we're on a semver released version, or exit
97pushd "$GERRIT_PROJECT"
98 GIT_VERSION=$(git tag -l --points-at HEAD)
99
Zack Williams6e070f52019-10-04 11:08:59 -0700100 # match bare versions or v-prefixed golang style version
101 if [[ "$GIT_VERSION" =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]
Zack Williams27cd3e52018-09-18 16:44:50 -0700102 then
103 echo "git has a SemVer released version tag: '$GIT_VERSION'"
104 echo "Building artifacts for GitHub release."
105 else
106 echo "No SemVer released version tag found, exiting..."
107 exit 0
108 fi
109popd
110
Zack Williams0f398492019-10-23 16:02:24 -0700111# Set and handle GOPATH and PATH
112export GOPATH=${GOPATH:-$WORKSPACE/go}
113export PATH=$PATH:/usr/lib/go-1.12/bin:/usr/local/go/bin:$GOPATH/bin
114
115# To support golang projects that require GOPATH to be set and code checked out there
Zack Williams27cd3e52018-09-18 16:44:50 -0700116# If $DEST_GOPATH is not an empty string:
Zack Williams76356cb2019-08-30 10:44:42 -0700117# - create GOPATH within WORKSPACE, and destination directory within
Zack Williams27cd3e52018-09-18 16:44:50 -0700118# - set PATH to include $GOPATH/bin and the system go binaries
Zack Williams76356cb2019-08-30 10:44:42 -0700119# - move project from $WORKSPACE/$GERRIT_PROJECT to new location in $GOPATH
120# - start release process within that directory
Zack Williams27cd3e52018-09-18 16:44:50 -0700121
122DEST_GOPATH=${DEST_GOPATH:-}
Joey Armstrong28eddda2023-01-10 03:09:34 -0500123if [ -n "$DEST_GOPATH" ]; then
Zack Williams27cd3e52018-09-18 16:44:50 -0700124 mkdir -p "$GOPATH/src/$DEST_GOPATH"
Zack Williams27cd3e52018-09-18 16:44:50 -0700125 release_path="$GOPATH/src/$DEST_GOPATH/$GERRIT_PROJECT"
Zack Williams76356cb2019-08-30 10:44:42 -0700126 mv "$WORKSPACE/$GERRIT_PROJECT" "$release_path"
Zack Williams27cd3e52018-09-18 16:44:50 -0700127else
128 release_path="$WORKSPACE/$GERRIT_PROJECT"
129fi
130
131if [ ! -f "$release_path/Makefile" ]; then
132 echo "Makefile not found at $release_path!"
133 exit 1
134else
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500135
Zack Williams27cd3e52018-09-18 16:44:50 -0700136 pushd "$release_path"
137
138 # Release description is sanitized version of the log message
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500139 RELEASE_DESCRIPTION="$(git log -1 --pretty=%B | tr -dc "[:alnum:]\n\r\.\[\]\:\-\\\/\`\' ")"
Zack Williams27cd3e52018-09-18 16:44:50 -0700140
141 # build the release, can be multiple space separated targets
142 # shellcheck disable=SC2086
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500143 make "$RELEASE_TARGETS"
Zack Williams27cd3e52018-09-18 16:44:50 -0700144
Joey Armstrong1b443bf2023-01-24 10:22:18 -0500145 doDebug # deterine why ARTIFACT_GLOB is empty
Joey Armstrong50f6e0b2023-01-24 14:14:08 -0500146
147 # Are we failing on a literal string "release/*" ?
Joey Armstrong1b443bf2023-01-24 10:22:18 -0500148 # cp -v "$ARTIFACT_GLOB" "$RELEASE_TEMP"
Joey Armstrong50f6e0b2023-01-24 14:14:08 -0500149 echo "rsync -rv --checksum \"$ARTIFACT_GLOB\" \"$RELEASE_TEMP/.\""
150 rsync -rv --checksum "$ARTIFACT_GLOB" "$RELEASE_TEMP/."
151
152 echo
153 echo "RELEASE_TEMP(${RELEASE_TMP}) contains:"
154 find "$RELEASE_TEMP" -ls
155
Zack Williams27cd3e52018-09-18 16:44:50 -0700156 # create release
Zack Williams0d93d842019-05-21 17:02:49 -0700157 echo "Creating Release: $GERRIT_PROJECT - $GIT_VERSION"
Zack Williams0ba8a9b2020-04-30 22:25:52 -0700158 github-release release \
Zack Williams27cd3e52018-09-18 16:44:50 -0700159 --user "$GITHUB_ORGANIZATION" \
160 --repo "$GERRIT_PROJECT" \
161 --tag "$GIT_VERSION" \
162 --name "$GERRIT_PROJECT - $GIT_VERSION" \
163 --description "$RELEASE_DESCRIPTION"
164
165 # handle release files
166 pushd "$RELEASE_TEMP"
167
168 # Generate and check checksums
Zack Williams2f8e8472019-05-21 16:29:06 -0700169 sha256sum -- * > checksum.SHA256
Zack Williams27cd3e52018-09-18 16:44:50 -0700170 sha256sum -c < checksum.SHA256
171
Zack Williams0d93d842019-05-21 17:02:49 -0700172 echo "Checksums:"
173 cat checksum.SHA256
174
Zack Williams27cd3e52018-09-18 16:44:50 -0700175 # upload all files to the release
Zack Williams2f8e8472019-05-21 16:29:06 -0700176 for rel_file in *
Zack Williams27cd3e52018-09-18 16:44:50 -0700177 do
Zack Williams0d93d842019-05-21 17:02:49 -0700178 echo "Uploading file: $rel_file"
Zack Williams0ba8a9b2020-04-30 22:25:52 -0700179 github-release upload \
Zack Williams27cd3e52018-09-18 16:44:50 -0700180 --user "$GITHUB_ORGANIZATION" \
181 --repo "$GERRIT_PROJECT" \
182 --tag "$GIT_VERSION" \
183 --name "$rel_file" \
184 --file "$rel_file"
185 done
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500186 set +x
Zack Williams27cd3e52018-09-18 16:44:50 -0700187 popd
188
189 popd
190fi
Joey Armstrong28eddda2023-01-10 03:09:34 -0500191
192# [SEE ALSO]
193# -----------------------------------------------------------------------
194# https://www.shellcheck.net/wiki/SC2236
195# -----------------------------------------------------------------------
196
197# [EOF]