Skip to content

Instantly share code, notes, and snippets.

@allex
Last active December 15, 2021 16:06
Show Gist options
  • Save allex/d76edec6238937813a9bc4d4e2f19d9c to your computer and use it in GitHub Desktop.
Save allex/d76edec6238937813a9bc4d4e2f19d9c to your computer and use it in GitHub Desktop.
#!/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