release: remove old scripts and update process doc
- remove prep_release.sh and notes.sample - update license in release.sh - add notes for maintainers on the release process - mention CHANGES file modifications
This commit is contained in:
parent
4255e1ed7b
commit
2a0d6fd0e3
4 changed files with 120 additions and 216 deletions
|
@ -7,10 +7,84 @@ distinct machines, and end up with a byte-for-byte identical binary. However,
|
||||||
this wasn't _fully_ solved in `go1.13`, as the build system still includes the
|
this wasn't _fully_ solved in `go1.13`, as the build system still includes the
|
||||||
directory the binary is built into the binary itself. As a result, our scripts
|
directory the binary is built into the binary itself. As a result, our scripts
|
||||||
utilize a work around needed until `go1.13.2`.
|
utilize a work around needed until `go1.13.2`.
|
||||||
|
Every release should note which Go version was used to build the release, so
|
||||||
|
that version should be used for verifying the release.
|
||||||
|
|
||||||
## Building a New Release
|
## Building a New Release
|
||||||
|
|
||||||
### macOS/Linux/Windows (WSL)
|
### Tagging and pushing a new tag (for maintainers)
|
||||||
|
|
||||||
|
Before running release scripts, a few things need to happen in order to finally
|
||||||
|
create a release and make sure there are no mistakes in the release process.
|
||||||
|
|
||||||
|
First, make sure that before the tagged commit there are modifications to the
|
||||||
|
[CHANGES](../CHANGES) file committed.
|
||||||
|
The CHANGES file should be a changelog that roughly mirrors the release notes.
|
||||||
|
Generally, the PRs that have been merged since the last release have been
|
||||||
|
listed in the CHANGES file and categorized.
|
||||||
|
For example, these changes have had the following format in the past:
|
||||||
|
```
|
||||||
|
Changes in X.YY.Z (Month Day Year):
|
||||||
|
- Protocol and Network-related changes:
|
||||||
|
- PR Title One (#PRNUM)
|
||||||
|
- PR Title Two (#PRNUMTWO)
|
||||||
|
...
|
||||||
|
- RPC changes:
|
||||||
|
- Crypto changes:
|
||||||
|
...
|
||||||
|
|
||||||
|
- Contributors (alphabetical order):
|
||||||
|
- Contributor A
|
||||||
|
- Contributor B
|
||||||
|
- Contributor C
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
If the previous tag is, for example, `vA.B.C`, then you can get the list of
|
||||||
|
contributors (from `vA.B.C` until the current `HEAD`) using the following command:
|
||||||
|
```bash
|
||||||
|
git log vA.B.C..HEAD --pretty="%an" | sort | uniq
|
||||||
|
```
|
||||||
|
After committing changes to the CHANGES file, the tagged release commit
|
||||||
|
should be created.
|
||||||
|
|
||||||
|
The tagged commit should be a commit that bumps version numbers in `version.go`
|
||||||
|
and `cmd/btcctl/version.go`.
|
||||||
|
For example (taken from [f3ec130](https://github.com/btcsuite/btcd/commit/f3ec13030e4e828869954472cbc51ac36bee5c1d)):
|
||||||
|
```diff
|
||||||
|
diff --git a/cmd/btcctl/version.go b/cmd/btcctl/version.go
|
||||||
|
index 2195175c71..f65cacef7e 100644
|
||||||
|
--- a/cmd/btcctl/version.go
|
||||||
|
+++ b/cmd/btcctl/version.go
|
||||||
|
@@ -18,7 +18,7 @@ const semanticAlphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr
|
||||||
|
const (
|
||||||
|
appMajor uint = 0
|
||||||
|
appMinor uint = 20
|
||||||
|
- appPatch uint = 0
|
||||||
|
+ appPatch uint = 1
|
||||||
|
|
||||||
|
// appPreRelease MUST only contain characters from semanticAlphabet
|
||||||
|
// per the semantic versioning spec.
|
||||||
|
diff --git a/version.go b/version.go
|
||||||
|
index 92fd60fdd4..fba55b5a37 100644
|
||||||
|
--- a/version.go
|
||||||
|
+++ b/version.go
|
||||||
|
@@ -18,7 +18,7 @@ const semanticAlphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr
|
||||||
|
const (
|
||||||
|
appMajor uint = 0
|
||||||
|
appMinor uint = 20
|
||||||
|
- appPatch uint = 0
|
||||||
|
+ appPatch uint = 1
|
||||||
|
|
||||||
|
// appPreRelease MUST only contain characters from semanticAlphabet
|
||||||
|
// per the semantic versioning spec.
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, this commit should be signed by the maintainer using `git commit -S`.
|
||||||
|
The commit should be tagged and signed with `git tag <TAG> -s`, and should be
|
||||||
|
pushed using `git push origin TAG`.
|
||||||
|
|
||||||
|
### Building a release on macOS/Linux/Windows (WSL)
|
||||||
|
|
||||||
No prior set up is needed on Linux or macOS is required in order to build the
|
No prior set up is needed on Linux or macOS is required in order to build the
|
||||||
release binaries. However, on Windows, the only way to build the release
|
release binaries. However, on Windows, the only way to build the release
|
||||||
|
@ -25,6 +99,46 @@ This will then create a directory of the form `btcd-<TAG>` containing archives
|
||||||
of the release binaries for each supported operating system and architecture,
|
of the release binaries for each supported operating system and architecture,
|
||||||
and a manifest file containing the hash of each archive.
|
and a manifest file containing the hash of each archive.
|
||||||
|
|
||||||
|
### Pushing a release (for maintainers)
|
||||||
|
|
||||||
|
Now that the directory `btcd-<TAG>` is created, the manifest file needs to be
|
||||||
|
signed by a maintainer and the release files need to be published to GitHub.
|
||||||
|
|
||||||
|
Sign the `manifest-<TAG>.txt` file like so:
|
||||||
|
```sh
|
||||||
|
gpg --sign --detach-sig manifest-<TAG>.txt
|
||||||
|
```
|
||||||
|
This will create a file named `manifest-<TAG>.txt.sig`, which will must
|
||||||
|
be included in the release files later.
|
||||||
|
|
||||||
|
#### Note before publishing
|
||||||
|
Before publishing, go through the reproducible build process that is outlined
|
||||||
|
in this document with the files created from `release/release.sh`. This includes
|
||||||
|
verifying commit and tag signatures using `git verify-commit` and git `verify-tag`
|
||||||
|
respectively.
|
||||||
|
|
||||||
|
Now that we've double-checked everything and have all of the necessary files,
|
||||||
|
it's time to publish release files on GitHub.
|
||||||
|
Follow [this documentation](https://docs.github.com/en/github/administering-a-repository/managing-releases-in-a-repository)
|
||||||
|
to create a release using the GitHub UI, and make sure to write release notes
|
||||||
|
which roughly follow the format of [previous release notes](https://github.com/btcsuite/btcd/releases/tag/v0.20.1-beta).
|
||||||
|
This is different from the [CHANGES](../CHANGES) file, which should be before the
|
||||||
|
tagged commit in the git history.
|
||||||
|
Much of the information in the release notes will be the same as the CHANGES
|
||||||
|
file.
|
||||||
|
It's important to include the Go version used to produce the release files in
|
||||||
|
the release notes, so users know the correct version of Go to use to reproduce
|
||||||
|
and verify the build.
|
||||||
|
When following the GitHub documentation, include every file in the `btcd-<TAG>`
|
||||||
|
directory.
|
||||||
|
|
||||||
|
At this point, a signed commit and tag on that commit should be pushed to the main
|
||||||
|
branch. The directory created from running `release/release.sh` should be included
|
||||||
|
as release files in the GitHub release UI, and the `manifest-<TAG>.txt` file
|
||||||
|
signature, called `manifest-<TAG>.txt.sig`, should also be included.
|
||||||
|
A release notes document should be created and written in the GitHub release UI.
|
||||||
|
Once all of this is done, feel free to click `Publish Release`!
|
||||||
|
|
||||||
## Verifying a Release
|
## Verifying a Release
|
||||||
|
|
||||||
With `go1.13`, it's now possible for third parties to verify release binaries.
|
With `go1.13`, it's now possible for third parties to verify release binaries.
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
- Each release note is preceded by a dash
|
|
||||||
- Each release note must not exceed 74 characters per line
|
|
||||||
- Release notes that require a longer explanation than will fit on a
|
|
||||||
single line should be wrapped with the text indented as in this line
|
|
||||||
- No periods at the end of each release note
|
|
||||||
- Other minor cleanup and bug fixes
|
|
|
@ -1,205 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013 Conformal Systems LLC <info@conformal.com>
|
|
||||||
#
|
|
||||||
# Permission to use, copy, modify, and distribute this software for any
|
|
||||||
# purpose with or without fee is hereby granted, provided that the above
|
|
||||||
# copyright notice and this permission notice appear in all copies.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Prepares for a release:
|
|
||||||
# - Bumps version according to specified level (major, minor, or patch)
|
|
||||||
# - Updates all version files and package control files with new version
|
|
||||||
# - Performs some basic validation on specified release notes
|
|
||||||
# - Updates project changes file with release notes
|
|
||||||
#
|
|
||||||
|
|
||||||
PROJECT=btcd
|
|
||||||
PROJECT_UC=$(echo $PROJECT | tr '[:lower:]' '[:upper:]')
|
|
||||||
SCRIPT=$(basename $0)
|
|
||||||
VERFILE=../version.go
|
|
||||||
VERFILES="$VERFILE ../cmd/btcctl/version.go"
|
|
||||||
PROJ_CHANGES=../CHANGES
|
|
||||||
|
|
||||||
# verify params
|
|
||||||
if [ $# -lt 2 ]; then
|
|
||||||
echo "usage: $SCRIPT {major | minor | patch} release-notes-file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
CUR_DIR=$(pwd)
|
|
||||||
cd "$(dirname $0)"
|
|
||||||
|
|
||||||
# verify version files exist
|
|
||||||
for verfile in $VERFILES; do
|
|
||||||
if [ ! -f "$verfile" ]; then
|
|
||||||
echo "$SCRIPT: error: $verfile does not exist" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# verify changes file exists
|
|
||||||
if [ ! -f "$PROJ_CHANGES" ]; then
|
|
||||||
echo "$SCRIPT: error: $PROJ_CHANGES does not exist" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
RTYPE="$1"
|
|
||||||
RELEASE_NOTES="$2"
|
|
||||||
if [ $(echo $RELEASE_NOTES | cut -c1) != "/" ]; then
|
|
||||||
RELEASE_NOTES="$CUR_DIR/$RELEASE_NOTES"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# verify valid release type
|
|
||||||
if [ "$RTYPE" != "major" -a "$RTYPE" != "minor" -a "$RTYPE" != "patch" ]; then
|
|
||||||
echo "$SCRIPT: error: release type must be major, minor, or patch"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# verify release notes
|
|
||||||
if [ ! -e "$RELEASE_NOTES" ]; then
|
|
||||||
echo "$SCRIPT: error: specified release notes file does not exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -s "$RELEASE_NOTES" ]; then
|
|
||||||
echo "$SCRIPT: error: specified release notes file is empty"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# verify release notes format
|
|
||||||
while IFS='' read line; do
|
|
||||||
if [ -z "$line" ]; then
|
|
||||||
echo "$SCRIPT: error: release notes must not have blank lines"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [ ${#line} -gt 74 ]; then
|
|
||||||
echo -n "$SCRIPT: error: release notes must not contain lines "
|
|
||||||
echo "with more than 74 characters"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if expr "$line" : ".*\.$" >/dev/null 2>&1 ; then
|
|
||||||
echo -n "$SCRIPT: error: release notes must not contain lines "
|
|
||||||
echo "that end in a period"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if ! expr "$line" : "\-" >/dev/null 2>&1; then
|
|
||||||
if ! expr "$line" : " " >/dev/null 2>&1; then
|
|
||||||
echo -n "$SCRIPT: error: release notes must not contain lines "
|
|
||||||
echo "that do not begin with a dash and are not indented"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done <"$RELEASE_NOTES"
|
|
||||||
|
|
||||||
# verify git is available
|
|
||||||
if ! type git >/dev/null 2>&1; then
|
|
||||||
echo -n "$SCRIPT: error: Unable to find 'git' in the system path."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# verify the git repository is on the master branch
|
|
||||||
BRANCH=$(git branch | grep '\*' | cut -c3-)
|
|
||||||
if [ "$BRANCH" != "master" ]; then
|
|
||||||
echo "$SCRIPT: error: git repository must be on the master branch."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# verify there are no uncommitted modifications prior to release modifications
|
|
||||||
NUM_MODIFIED=$(git diff 2>/dev/null | wc -l | sed 's/^[ \t]*//')
|
|
||||||
NUM_STAGED=$(git diff --cached 2>/dev/null | wc -l | sed 's/^[ \t]*//')
|
|
||||||
if [ "$NUM_MODIFIED" != "0" -o "$NUM_STAGED" != "0" ]; then
|
|
||||||
echo -n "$SCRIPT: error: the working directory contains uncommitted "
|
|
||||||
echo "modifications"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# get version
|
|
||||||
PAT_PREFIX="(^[[:space:]]+app"
|
|
||||||
PAT_SUFFIX='[[:space:]]+uint[[:space:]]+=[[:space:]]+)[0-9]+$'
|
|
||||||
MAJOR=$(egrep "${PAT_PREFIX}Major${PAT_SUFFIX}" $VERFILE | awk '{print $4}')
|
|
||||||
MINOR=$(egrep "${PAT_PREFIX}Minor${PAT_SUFFIX}" $VERFILE | awk '{print $4}')
|
|
||||||
PATCH=$(egrep "${PAT_PREFIX}Patch${PAT_SUFFIX}" $VERFILE | awk '{print $4}')
|
|
||||||
if [ -z "$MAJOR" -o -z "$MINOR" -o -z "$PATCH" ]; then
|
|
||||||
echo "$SCRIPT: error: unable to get version from $VERFILE" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# bump version according to level
|
|
||||||
if [ "$RTYPE" = "major" ]; then
|
|
||||||
MAJOR=$(expr $MAJOR + 1)
|
|
||||||
MINOR=0
|
|
||||||
PATCH=0
|
|
||||||
elif [ "$RTYPE" = "minor" ]; then
|
|
||||||
MINOR=$(expr $MINOR + 1)
|
|
||||||
PATCH=0
|
|
||||||
elif [ "$RTYPE" = "patch" ]; then
|
|
||||||
PATCH=$(expr $PATCH + 1)
|
|
||||||
fi
|
|
||||||
PROJ_VER="$MAJOR.$MINOR.$PATCH"
|
|
||||||
|
|
||||||
# update project changes with release notes
|
|
||||||
DATE=$(date "+%a %b %d %Y")
|
|
||||||
awk -v D="$DATE" -v VER="$PROJ_VER" '
|
|
||||||
/=======/ && first_line==0 {
|
|
||||||
first_line=1
|
|
||||||
print $0
|
|
||||||
next
|
|
||||||
}
|
|
||||||
/=======/ && first_line==1 {
|
|
||||||
print $0
|
|
||||||
print ""
|
|
||||||
print "Changes in "VER" ("D")"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
{ print $0 }
|
|
||||||
' <"$PROJ_CHANGES" >"${PROJ_CHANGES}.tmp"
|
|
||||||
cat "$RELEASE_NOTES" | sed 's/^/ /' >>"${PROJ_CHANGES}.tmp"
|
|
||||||
awk '
|
|
||||||
/=======/ && first_line==0 {
|
|
||||||
first_line=1
|
|
||||||
next
|
|
||||||
}
|
|
||||||
/=======/ && first_line==1 {
|
|
||||||
second_line=1
|
|
||||||
next
|
|
||||||
}
|
|
||||||
second_line==1 { print $0 }
|
|
||||||
' <"$PROJ_CHANGES" >>"${PROJ_CHANGES}.tmp"
|
|
||||||
|
|
||||||
# update version filef with new version
|
|
||||||
for verfile in $VERFILES; do
|
|
||||||
sed -E "
|
|
||||||
s/${PAT_PREFIX}Major${PAT_SUFFIX}/\1${MAJOR}/;
|
|
||||||
s/${PAT_PREFIX}Minor${PAT_SUFFIX}/\1${MINOR}/;
|
|
||||||
s/${PAT_PREFIX}Patch${PAT_SUFFIX}/\1${PATCH}/;
|
|
||||||
" <"$verfile" >"${verfile}.tmp"
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
# Apply changes
|
|
||||||
mv "${PROJ_CHANGES}.tmp" "$PROJ_CHANGES"
|
|
||||||
for verfile in $VERFILES; do
|
|
||||||
mv "${verfile}.tmp" "$verfile"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "All files have been prepared for release."
|
|
||||||
echo "Use the following commands to review the changes for accuracy:"
|
|
||||||
echo " git status"
|
|
||||||
echo " git diff"
|
|
||||||
echo ""
|
|
||||||
echo "If everything is accurate, use the following commands to commit, tag,"
|
|
||||||
echo "and push the changes"
|
|
||||||
echo " git commit -am \"Prepare for release ${PROJ_VER}.\""
|
|
||||||
echo -n " git tag -a \"${PROJECT_UC}_${MAJOR}_${MINOR}_${PATCH}\" -m "
|
|
||||||
echo "\"Release ${PROJ_VER}\""
|
|
||||||
echo " git push"
|
|
||||||
echo " git push --tags"
|
|
|
@ -1,11 +1,12 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright (c) 2016 Company 0, LLC.
|
||||||
|
# Copyright (c) 2016-2020 The btcsuite developers
|
||||||
|
# Use of this source code is governed by an ISC
|
||||||
|
# license that can be found in the LICENSE file.
|
||||||
|
|
||||||
# Simple bash script to build basic btcd tools for all the platforms we support
|
# Simple bash script to build basic btcd tools for all the platforms we support
|
||||||
# with the golang cross-compiler.
|
# with the golang cross-compiler.
|
||||||
#
|
|
||||||
# Copyright (c) 2016 Company 0, LLC.
|
|
||||||
# Use of this source code is governed by the ISC
|
|
||||||
# license.
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue