blob: 47e6ce88514c817c55bb3eb799c47a257c0a03e2 [file] [log] [blame]
Zack Williams27cd3e52018-09-18 16:44:50 -07001#!/usr/bin/env bash
2
Joey Armstrongaf577ab2022-12-15 14:43:33 -05003# Copyright 2018-2022 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.
16
17# 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
21
Joey Armstrongaf577ab2022-12-15 14:43:33 -050022## -----------------------------------------------------------------------
23## Intent:
24## Display available commands and paths for golang.
25## A github release job is failing due to a command being mia.
26##
27## Note: This function is being used for side effects, when commands
28## are unavailable to query for version info, fail the job.
29## -----------------------------------------------------------------------
30## 05:02:50 bash: go: command not found
31## 05:03:00 Unable to find image 'voltha/voltha-ci-tools:2.4.0-golang' locally
32## -----------------------------------------------------------------------
33function displayCommands()
34{
35 echo
36 echo "Installed /usr/lib/go"
37 echo "-----------------------------------------------------------------------"
38 find /usr/lib -mindepth 1 -maxdepth 1 -name 'go-*' -print || /bin/true
39
40 echo
41 echo "Go commands in \$PATH"
42 echo "-----------------------------------------------------------------------"
43 which -a go || /bin/true
44
45 echo
46 echo "VERSIONS:"
47 echo "-----------------------------------------------------------------------"
48 git --version
49 go version
50
51 return
52}
53
54##----------------##
55##---] MAIN [---##
56##----------------##
Zack Williams27cd3e52018-09-18 16:44:50 -070057set -eu -o pipefail
58
59# when not running under Jenkins, use current dir as workspace and a blank
60# project name
61WORKSPACE=${WORKSPACE:-.}
62GERRIT_PROJECT=${GERRIT_PROJECT:-}
63
64# Github organization (or user) this project is published on. Project name should
65# be the same on both Gerrit and GitHub
66GITHUB_ORGANIZATION=${GITHUB_ORGANIZATION:-}
67
68# glob pattern relative to project dir matching release artifacts
69ARTIFACT_GLOB=${ARTIFACT_GLOB:-"release/*"}
70
71# Temporary staging directory to copy artifacts to
72RELEASE_TEMP="$WORKSPACE/release"
Zack Williams2f8e8472019-05-21 16:29:06 -070073mkdir -p "$RELEASE_TEMP"
Zack Williams27cd3e52018-09-18 16:44:50 -070074
75# Use "release" as the default makefile target, can be a space separated list
76RELEASE_TARGETS=${RELEASE_TARGETS:-release}
77
Zack Williams0f398492019-10-23 16:02:24 -070078
Zack Williams27cd3e52018-09-18 16:44:50 -070079# check that we're on a semver released version, or exit
80pushd "$GERRIT_PROJECT"
81 GIT_VERSION=$(git tag -l --points-at HEAD)
82
Zack Williams6e070f52019-10-04 11:08:59 -070083 # match bare versions or v-prefixed golang style version
84 if [[ "$GIT_VERSION" =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]
Zack Williams27cd3e52018-09-18 16:44:50 -070085 then
86 echo "git has a SemVer released version tag: '$GIT_VERSION'"
87 echo "Building artifacts for GitHub release."
88 else
89 echo "No SemVer released version tag found, exiting..."
90 exit 0
91 fi
92popd
93
Zack Williams0f398492019-10-23 16:02:24 -070094# Set and handle GOPATH and PATH
95export GOPATH=${GOPATH:-$WORKSPACE/go}
96export PATH=$PATH:/usr/lib/go-1.12/bin:/usr/local/go/bin:$GOPATH/bin
97
Joey Armstrongaf577ab2022-12-15 14:43:33 -050098displayCommands
99
Zack Williams0f398492019-10-23 16:02:24 -0700100# To support golang projects that require GOPATH to be set and code checked out there
Zack Williams27cd3e52018-09-18 16:44:50 -0700101# If $DEST_GOPATH is not an empty string:
Zack Williams76356cb2019-08-30 10:44:42 -0700102# - create GOPATH within WORKSPACE, and destination directory within
Zack Williams27cd3e52018-09-18 16:44:50 -0700103# - set PATH to include $GOPATH/bin and the system go binaries
Zack Williams76356cb2019-08-30 10:44:42 -0700104# - move project from $WORKSPACE/$GERRIT_PROJECT to new location in $GOPATH
105# - start release process within that directory
Zack Williams27cd3e52018-09-18 16:44:50 -0700106
107DEST_GOPATH=${DEST_GOPATH:-}
108if [ ! -z "$DEST_GOPATH" ]; then
Zack Williams27cd3e52018-09-18 16:44:50 -0700109 mkdir -p "$GOPATH/src/$DEST_GOPATH"
Zack Williams27cd3e52018-09-18 16:44:50 -0700110 release_path="$GOPATH/src/$DEST_GOPATH/$GERRIT_PROJECT"
Zack Williams76356cb2019-08-30 10:44:42 -0700111 mv "$WORKSPACE/$GERRIT_PROJECT" "$release_path"
Zack Williams27cd3e52018-09-18 16:44:50 -0700112else
113 release_path="$WORKSPACE/$GERRIT_PROJECT"
114fi
115
116if [ ! -f "$release_path/Makefile" ]; then
117 echo "Makefile not found at $release_path!"
118 exit 1
119else
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500120
Zack Williams27cd3e52018-09-18 16:44:50 -0700121 pushd "$release_path"
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500122 set -x
Zack Williams27cd3e52018-09-18 16:44:50 -0700123
124 # Release description is sanitized version of the log message
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500125 RELEASE_DESCRIPTION="$(git log -1 --pretty=%B | tr -dc "[:alnum:]\n\r\.\[\]\:\-\\\/\`\' ")"
Zack Williams27cd3e52018-09-18 16:44:50 -0700126
127 # build the release, can be multiple space separated targets
128 # shellcheck disable=SC2086
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500129 make "$RELEASE_TARGETS"
Zack Williams27cd3e52018-09-18 16:44:50 -0700130
131 # Copy artifacts into the release temp dir
132 # shellcheck disable=SC2086
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500133 cp "$ARTIFACT_GLOB" "$RELEASE_TEMP"
Zack Williams27cd3e52018-09-18 16:44:50 -0700134
135 # create release
Zack Williams0d93d842019-05-21 17:02:49 -0700136 echo "Creating Release: $GERRIT_PROJECT - $GIT_VERSION"
Zack Williams0ba8a9b2020-04-30 22:25:52 -0700137 github-release release \
Zack Williams27cd3e52018-09-18 16:44:50 -0700138 --user "$GITHUB_ORGANIZATION" \
139 --repo "$GERRIT_PROJECT" \
140 --tag "$GIT_VERSION" \
141 --name "$GERRIT_PROJECT - $GIT_VERSION" \
142 --description "$RELEASE_DESCRIPTION"
143
144 # handle release files
145 pushd "$RELEASE_TEMP"
146
147 # Generate and check checksums
Zack Williams2f8e8472019-05-21 16:29:06 -0700148 sha256sum -- * > checksum.SHA256
Zack Williams27cd3e52018-09-18 16:44:50 -0700149 sha256sum -c < checksum.SHA256
150
Zack Williams0d93d842019-05-21 17:02:49 -0700151 echo "Checksums:"
152 cat checksum.SHA256
153
Zack Williams27cd3e52018-09-18 16:44:50 -0700154 # upload all files to the release
Zack Williams2f8e8472019-05-21 16:29:06 -0700155 for rel_file in *
Zack Williams27cd3e52018-09-18 16:44:50 -0700156 do
Zack Williams0d93d842019-05-21 17:02:49 -0700157 echo "Uploading file: $rel_file"
Zack Williams0ba8a9b2020-04-30 22:25:52 -0700158 github-release upload \
Zack Williams27cd3e52018-09-18 16:44:50 -0700159 --user "$GITHUB_ORGANIZATION" \
160 --repo "$GERRIT_PROJECT" \
161 --tag "$GIT_VERSION" \
162 --name "$rel_file" \
163 --file "$rel_file"
164 done
Joey Armstrongaf577ab2022-12-15 14:43:33 -0500165 set +x
Zack Williams27cd3e52018-09-18 16:44:50 -0700166 popd
167
168 popd
169fi