Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Add release instructions and update release script #94

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ jobs:
title: $version
branch: 'main|v[0-9]+'
token: ${{ secrets.GITHUB_TOKEN }}
- run: ci/publish.sh
28 changes: 28 additions & 0 deletions DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,31 @@ See JSON files in `tools/codegen/base` directory for examples of the manifest.
3\. Add tool name to test matrix in `.github/workflows/ci.yml`.

4\. Add tool name to table in "Supported tools" section in `README.md`.

## Release new version

Note: This is a guide for maintainers.

### Minor version vs patch version

Increase the patch version if only the following changes are included.

- Update the `@latest` version of the tool.

Rationale: Normally, tool versions are controlled by the `@<version>` syntax, which is explicitly separated from the versioning of the install-action itself.

Exception: If the major or minor version of the `cargo-binstall` is updated, the minor version should be increased because the behavior of the fallback may change slightly.

- Fix regressions or minor bugs.

Rationale: Semantic Versioning.

- Improve documentation or diagnostics.

Rationale: Semantic Versioning.

Increase the minor version otherwise.

### Release instructions

TODO: current release script assumes admin permissions
9 changes: 9 additions & 0 deletions ci/manifest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@ set -euxo pipefail
IFS=$'\n\t'
cd "$(dirname "$0")"/..

bail() {
echo >&2 "error: $*"
exit 1
}

if [[ -z "${CI:-}" ]]; then
bail "this script is intended to call from release workflow on CI"
fi

git config user.name "Taiki Endo"
git config user.email "[email protected]"

Expand Down
74 changes: 74 additions & 0 deletions ci/publish.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
cd "$(dirname "$0")"/..

# shellcheck disable=SC2154
trap 's=$?; echo >&2 "$0: Error on line "${LINENO}": ${BASH_COMMAND}"; exit ${s}' ERR

bail() {
echo >&2 "error: $*"
exit 1
}

if [[ -z "${CI:-}" ]]; then
bail "this script is intended to call from release workflow on CI"
fi
ref="${GITHUB_REF:-}"
if [[ "${ref}" != "refs/tags/"* ]]; then
bail "tag ref should start with 'refs/tags/'"
fi
tag="${ref#refs/tags/}"

git config user.name "Taiki Endo"
git config user.email "[email protected]"

version="${tag}"
version="${version#v}"

tools=()
for tool in tools/codegen/base/*.json; do
tools+=("$(basename "${tool%.*}")")
done
# Aliases
tools+=(nextest)
# Not manifest-base
tools+=(valgrind)

(
set -x

major_version_tag="v${version%%.*}"
git checkout -b "${major_version_tag}"
git push origin refs/heads/"${major_version_tag}"
if git --no-pager tag | grep -Eq "^${major_version_tag}$"; then
git tag -d "${major_version_tag}"
git push --delete origin refs/tags/"${major_version_tag}"
fi
git tag "${major_version_tag}"
git checkout main
git branch -d "${major_version_tag}"
)

for tool in "${tools[@]}"; do
(
set -x
git checkout -b "${tool}"
sed -i -e "s/required: true/required: false/g" action.yml
sed -i -e "s/# default: #publish:tool/default: ${tool}/g" action.yml
git add action.yml
git commit -m "${tool}"
git push origin -f refs/heads/"${tool}"
if git --no-pager tag | grep -Eq "^${tool}$"; then
git tag -d "${tool}"
git push --delete origin refs/tags/"${tool}"
fi
git tag "${tool}"
git checkout main
git branch -D "${tool}"
)
done

set -x

git push origin --tags
67 changes: 15 additions & 52 deletions tools/publish.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ trap 's=$?; echo >&2 "$0: Error on line "${LINENO}": ${BASH_COMMAND}"; exit ${s}
# Note: This script requires the following tools:
# - parse-changelog <https://github.com/taiki-e/parse-changelog>

x() {
local cmd="$1"
shift
(
set -x
"${cmd}" "$@"
)
}
bail() {
echo >&2 "error: $*"
exit 1
Expand All @@ -40,6 +48,7 @@ if gh release view "${tag}" &>/dev/null; then
bail "tag '${tag}' has already been created and pushed"
fi

# Make sure that the release was created from an allowed branch.
if ! git branch | grep -q '\* main$'; then
bail "current branch is not 'main'"
fi
Expand Down Expand Up @@ -88,57 +97,11 @@ echo "======================================="

if [[ -n "${tags}" ]]; then
# Create a release commit.
git add "${changelog}"
git commit -m "Release ${version}"
x git add "${changelog}"
x git commit -m "Release ${version}"
fi

tools=()
for tool in tools/codegen/base/*.json; do
tools+=("$(basename "${tool%.*}")")
done
# Aliases
tools+=(nextest)
# Not manifest-base
tools+=(valgrind)

(
set -x

git tag "${tag}"
git push origin main
git push origin --tags

major_version_tag="v${version%%.*}"
git checkout -b "${major_version_tag}"
git push origin refs/heads/"${major_version_tag}"
if git --no-pager tag | grep -Eq "^${major_version_tag}$"; then
git tag -d "${major_version_tag}"
git push --delete origin refs/tags/"${major_version_tag}"
fi
git tag "${major_version_tag}"
git checkout main
git branch -d "${major_version_tag}"
)

for tool in "${tools[@]}"; do
(
set -x
git checkout -b "${tool}"
sed -i -e "s/required: true/required: false/g" action.yml
sed -i -e "s/# default: #publish:tool/default: ${tool}/g" action.yml
git add action.yml
git commit -m "${tool}"
git push origin -f refs/heads/"${tool}"
if git --no-pager tag | grep -Eq "^${tool}$"; then
git tag -d "${tool}"
git push --delete origin refs/tags/"${tool}"
fi
git tag "${tool}"
git checkout main
git branch -D "${tool}"
)
done

set -x

git push origin --tags
x git tag "${tag}"
# TODO: the following still assumes admin permissions
x git push origin main
x git push origin --tags