Last active
December 15, 2021 16:06
-
-
Save allex/d76edec6238937813a9bc4d4e2f19d9c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# vim: set ft=sh fdm=manual ts=2 sw=2 sts=2 tw=85 et: | |
# ================================================ | |
# Description: git-release-npm for release npm package | |
# Last Modified: Thu Dec 16, 2021 00:06 | |
# Author: Allex Wang ([email protected]) | |
# GistID: d76edec6238937813a9bc4d4e2f19d9c | |
# GistURL: https://gist.github.com/allex/d76edec6238937813a9bc4d4e2f19d9c | |
# ================================================ | |
set -eu | |
die () { echo >&2 "${1-}"; exit "${2-1}"; } | |
npm_tag=latest | |
release_as=${CI_BUILD_TAG:-} | |
next_version= | |
message="ci(release): %s" | |
force=false | |
dry_run=false | |
args=( ) | |
while [ $# -gt 0 ]; do | |
case "$1" in | |
-f) force=true ;; | |
-t | --tag) | |
# publish tag name, eg, alpha, beat, next, rc etc,. (defaults to latest) | |
npm_tag=${2-} | |
shift | |
;; | |
-r | --release-as) | |
# specify the release type/version manually. | |
# (like npm version npm version [<newversion>|major|minor|patch|premajor|preminor|prepatch|prerelease [--preid=<prerelease-id>]|from-git]) | |
# can be a specify version: 1.5.1, 1.5.1-dev.01 (read from package.json#version if not provided) | |
# support `date` FORMAT interpreted sequences, eg: 1.5.2-insiders.%Y%m%d | |
release_as="$(date +"${2-}")" | |
shift | |
;; | |
# base version for some snapshot release tags, such as: dev, insiders | |
--next-version) | |
next_version="${2-}" | |
shift | |
;; | |
-m | --message) | |
# forward to npm version -m, npm will use it as a commit message when creating a version commit, support version number pattern `%s` | |
message=${2-} | |
shift | |
;; | |
--dry-run) | |
dry_run=true | |
;; | |
-h | --help) | |
echo "git-release-npm [-f | -t <npm_tag> -r | -m <commit_message> | -h]" | |
exit | |
;; | |
*) die "fatal: invalid parameter: $1" ;; | |
esac | |
shift | |
done | |
if [ "${dry_run}" = "true" ]; then | |
run() { | |
echo "$1" | |
} | |
else | |
run() { | |
eval "$1" | |
} | |
fi | |
# Auto generate revision by daily rotate (only for dev,insiders tags) | |
if [ -z "$release_as" ] && [[ "$npm_tag" =~ ^(dev|insiders)$ ]]; then | |
release_as="${next_version:?next version invalid}-${npm_tag}.$(date +"%Y%m%d")" | |
fi | |
# Parsing metas by bump file: package.json | |
pkg_name="$(jq -r ".name" package.json)" | |
pkg_version="$(jq -r ".version" package.json)" | |
release_as="${release_as:-${pkg_version}}" | |
# assert and verify | |
[ -n "${release_as}" ] || die "warning: git tag cannot empty. (abort)" | |
[ -n "$pkg_name" ] && [ -n "$pkg_version" ] || die "fatal: invalid package.json" | |
echo "=> release $pkg_name@${release_as} (tag: ${npm_tag}) ..." | |
if [ "$(npm v "${pkg_name}@${release_as}" version)" ]; then | |
is_force_permit=1 | |
if npm config get registry | grep npmjs.com &>/dev/null; then | |
echo >&2 "${release_as} already published." | |
is_force_permit=0 | |
fi | |
# unpublish first | |
if $force && [ "$is_force_permit" != 0 ]; then | |
echo "> unpublish $pkg_name@${release_as}..." | |
run "npm unpublish $pkg_name@${release_as} -f" | |
fi | |
fi | |
echo "> publish $pkg_name@${release_as}..." | |
# automate generate a release commit if package.json#version mismatch | |
if [ "$pkg_version" != "${release_as}" ]; then | |
run "npm version ${release_as} -m '${message}' --no-git-tag-version --allow-same-version --tag-version-prefix=''" | |
fi | |
run "npm publish --tag ${npm_tag}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment