diff --git a/scripts/create-release-branch.sh b/scripts/create-release-branch.sh
new file mode 100755
index 0000000..210c5fc
--- /dev/null
+++ b/scripts/create-release-branch.sh
@@ -0,0 +1,181 @@
+#!/bin/bash
+# requires following packages:
+# - git; I believe it's already installed.
+# - sed; GNU sed is preferred. POSIX sed may not work.
+
+BASE_BRANCH="develop"
+
+PACKAGE_NAME="ssh-key-action"
+URL_PRODUCT="https://github.com/shimataro/${PACKAGE_NAME}"
+URL_REPOSITORY="${URL_PRODUCT}.git"
+URL_COMPARE="${URL_PRODUCT}/compare"
+URL_RELEASE="${URL_PRODUCT}/releases/new"
+
+COLOR_ERROR="\e[1;41m"
+COLOR_SECTION="\e[1;34m"
+COLOR_COMMAND_NAME="\e[1;34m"
+COLOR_OPTION="\e[4;36m"
+COLOR_COMMAND="\e[4m"
+COLOR_FILE="\e[1;34m"
+COLOR_BRANCH="\e[1;31m"
+COLOR_INPUT="\e[1;31m"
+COLOR_SELECT="\e[1;32m"
+COLOR_RESET="\e[m"
+
+function main() {
+ cd $(dirname ${0})/..
+
+ if [ $# -lt 1 ]; then
+ usage
+ fi
+
+ local VERSION=$1
+ local BRANCH="release/v${VERSION}"
+ local TAG="v${VERSION}"
+
+ check_version_format ${VERSION}
+ check_current_branch
+
+ run create_branch ${BRANCH}
+ run update_changelog ${VERSION}
+ run update_package_version ${VERSION}
+ run update_dependencies_version
+ run regenerate_package_lock
+ run build_package
+ run commit_changes ${VERSION}
+ run finish ${VERSION} ${BRANCH} ${TAG}
+}
+
+function usage() {
+ local COMMAND=`basename ${0}`
+
+ echo -e "${COLOR_SECTION}NAME${COLOR_RESET}
+ ${COMMAND} - Prepare for new release
+
+${COLOR_SECTION}SYNOPSIS${COLOR_RESET}
+ ${COLOR_COMMAND_NAME}${COMMAND}${COLOR_RESET} <${COLOR_OPTION}new-version${COLOR_RESET}>
+
+${COLOR_SECTION}DESCRIPTION${COLOR_RESET}
+ This command will...
+ - create a new branch for release
+ - update ${COLOR_FILE}CHANGELOG.md${COLOR_RESET}
+ - update package version in ${COLOR_FILE}package.json${COLOR_RESET}
+ - update dependencies version in ${COLOR_FILE}package.json${COLOR_RESET}
+ - verify
+ - ...and commit!
+
+ ${COLOR_OPTION}new-version${COLOR_RESET} must follow \"Semantic Versioning\" .
+"
+ exit 1
+}
+
+function check_version_format() {
+ if [[ $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
+ return
+ fi
+
+ echo -e "${COLOR_ERROR}ERROR:${COLOR_RESET} Follow \"Semantic Versioning\" for new version.
+" >&2
+ exit 2
+}
+
+function check_current_branch() {
+ local CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`
+ if [ ${CURRENT_BRANCH} = ${BASE_BRANCH} ]; then
+ return
+ fi
+
+ echo -e "${COLOR_ERROR}ERROR:${COLOR_RESET} Work on ${COLOR_BRANCH}${BASE_BRANCH}${COLOR_RESET} branch
+ ${COLOR_COMMAND}git checkout ${BASE_BRANCH}${COLOR_RESET}
+" >&2
+ exit 2
+}
+
+function run() {
+ "$@" || exit 1
+}
+
+function create_branch() {
+ local BRANCH=$1
+
+ git checkout -b ${BRANCH} ${BASE_BRANCH}
+}
+
+function update_changelog() {
+ local VERSION=$1
+ local DATE=`date "+%Y-%m-%d"`
+ local KEYWORD="Unreleased"
+
+ sed -i".bak" -r \
+ -e "s/^((##\s+)\[${KEYWORD}\])$/\1\n\n\2[${VERSION}] - ${DATE}/" \
+ -e "s/^(\[${KEYWORD}\](.*))(v.*)\.\.\.HEAD$/\1v${VERSION}...HEAD\n[${VERSION}]\2\3...v${VERSION}/" \
+ CHANGELOG.md
+}
+
+function update_package_version() {
+ local VERSION=$1
+
+ sed -i".bak" -r \
+ -e "s/(\"version\"\s*:\s*)\".*?\"/\1\"${VERSION}\"/" \
+ package.json
+}
+
+function update_dependencies_version() {
+ npm run check-updates -- -u
+}
+
+function regenerate_package_lock() {
+ rm -rf package-lock.json node_modules &&
+ npm install
+}
+
+function build_package() {
+ npm run build
+ npm run verify
+}
+
+function commit_changes() {
+ local VERSION=$1
+
+ npm ci --only=production &&
+ git add CHANGELOG.md package.json package-lock.json node_modules lib &&
+ git commit -m "version ${VERSION}"
+}
+
+function finish() {
+ local VERSION=$1
+ local BRANCH=$2
+ local TAG=$3
+ local TARGET_BRANCH="v${VERSION%%[!0-9]*}"
+
+ echo -e "
+Branch ${COLOR_BRANCH}${BRANCH}${COLOR_RESET} has been created.
+Remaining processes are...
+
+1. Make sure all changes are correct
+ ${COLOR_COMMAND}git diff ${BASE_BRANCH} ${BRANCH}${COLOR_RESET}
+2. Push to remote origin
+ ${COLOR_COMMAND}git push --set-upstream origin ${BRANCH}${COLOR_RESET}
+3. Create a pull-request: ${COLOR_BRANCH}${BRANCH}${COLOR_RESET} to ${COLOR_BRANCH}${BASE_BRANCH}${COLOR_RESET}
+ ${URL_COMPARE}/${BASE_BRANCH}...${BRANCH}
+ select ${COLOR_SELECT}Squash and merge${COLOR_RESET}
+4. Create a pull-request: ${COLOR_BRANCH}${BASE_BRANCH}${COLOR_RESET} to ${COLOR_BRANCH}${TARGET_BRANCH}${COLOR_RESET}
+ ${URL_COMPARE}/${TARGET_BRANCH}...${BASE_BRANCH}
+ select ${COLOR_SELECT}Create a merge commit${COLOR_RESET}
+5. Create a new release
+ ${URL_RELEASE}
+ Tag version: ${COLOR_INPUT}${TAG}${COLOR_RESET}
+ Target: ${COLOR_INPUT}${TARGET_BRANCH}${COLOR_RESET}
+ Release title: ${COLOR_INPUT}${PACKAGE_NAME} ${VERSION} released${COLOR_RESET}
+ Description this release: (copy and paste CHANGELOG.md)
+6. Post processing
+ ${COLOR_COMMAND}git checkout ${BASE_BRANCH}${COLOR_RESET}
+ ${COLOR_COMMAND}git pull${COLOR_RESET}
+ ${COLOR_COMMAND}git fetch -p${COLOR_RESET}
+ ${COLOR_COMMAND}git branch -D ${BRANCH}${COLOR_RESET}
+
+That's all!
+"
+}
+
+main "$@"