Merge branch 'feature/auto-versioning'

This commit is contained in:
Cotes Chung 2022-03-03 03:11:08 +08:00
commit 7fef3fafec
No known key found for this signature in database
GPG key ID: 0D9E54843167A808
7 changed files with 248 additions and 156 deletions

View file

@ -1,6 +1,6 @@
# How to Contribute # How to Contribute
We want to thank you for sparing time to improve this project! Here are some guidelines for contributing We'd like to thank you for sparing time to improve this project! Here are some guidelines for contributing
To ensure that the blog design is not confused, this project does not accept suggestions for design changes, such as color scheme, fonts, typography, etc. If your request is about an enhancement, it is recommended to first submit a [_Feature Request_](https://github.com/cotes2020/jekyll-theme-chirpy/issues/new?labels=enhancement&template=feature_request.md) issue to discuss whether your idea fits the project. To ensure that the blog design is not confused, this project does not accept suggestions for design changes, such as color scheme, fonts, typography, etc. If your request is about an enhancement, it is recommended to first submit a [_Feature Request_](https://github.com/cotes2020/jekyll-theme-chirpy/issues/new?labels=enhancement&template=feature_request.md) issue to discuss whether your idea fits the project.
@ -9,34 +9,41 @@ To ensure that the blog design is not confused, this project does not accept sug
Generally, contribute to the project by: Generally, contribute to the project by:
1. Fork this project on GitHub and clone it locally. 1. Fork this project on GitHub and clone it locally.
2. Create a new branch from the default branch and give it a descriptive name (e.g., `my-new-feature`, `fix-a-bug`). 2. Create a new branch from the default branch and give it a descriptive name (format: `feature/<add-new-feat>` / `fix/<fix-a-bug>`).
3. After completing the development, submit a new _Pull Request_. 3. After completing the development, submit a new _Pull Request_. Note that the commit message must follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), otherwise it will fail the PR check.
## Modifying JavaScript ## Modifying JavaScript
If your contribution involves JS modification, please read the following sections. If your contribution involves JavaScript modification, please read the following sections.
### Inline Scripts ### Inline Scripts
If you need to add comments to the inline JS (the JS code between the tags `<script>` and `</script>`), please use `/**/` instead of two slashes `//`. Because the HTML will be compressed by [jekyll-compress-html](https://github.com/penibelst/jekyll-compress-html) during deployment, but it cannot handle the `//` properly. And this will disrupt the structure of the compressed HTML. If you need to add comments to the inline JavaScript (the code between the HTML tags `<script>` and `</script>`), please use `/* */` instead of two slashes `//`. Because the HTML will be compressed by [jekyll-compress-html](https://github.com/penibelst/jekyll-compress-html) during deployment, but it cannot handle the `//` properly, which will disrupt the structure of the compressed HTML.
### External Scripts ### External Scripts
If you need to add or modify JavaScripts in the directory `_javascript`, you need to install [Gulp.js](https://gulpjs.com/docs/en/getting-started/quick-start). If you need to add/change/delete the JavaScript in the directory `_javascript/`, setting up [`Node.js`](https://nodejs.org/) and [`npx`](https://www.npmjs.com/package/npx) is a requirement. And then install the development dependencies:
During development, real-time debugging can be performed through the following commands: ```console
$ npm i
```
During JavaScript development, real-time debugging can be performed through the following commands:
Firstly, start a Jekyll server:
```console ```console
$ bash tools/run.sh $ bash tools/run.sh
``` ```
Open another terminal tab and run: And then open a new terminal tab and run:
```console ```console
$ gulp dev # Type 'Ctrl + C' to stop # Type 'Ctrl + C' to stop
$ npx gulp dev
``` ```
After debugging, run the command `gulp` (without any argument) will automatically output the compressed files to the directory `assests/js/dist/`. After debugging, run the command `npx gulp` (without any argument) will automatically output the compressed files to the directory `assets/js/dist/`.
--- ---

11
.github/workflows/commitlint.yml vendored Normal file
View file

@ -0,0 +1,11 @@
name: Lint Commit Messages
on: pull_request
jobs:
commitlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: wagoid/commitlint-github-action@v4

1
.gitignore vendored
View file

@ -4,6 +4,7 @@
!.editorconfig !.editorconfig
!.nojekyll !.nojekyll
!.travis.yml !.travis.yml
!.husky
# bundler cache # bundler cache
_site _site

4
.husky/commit-msg Executable file
View file

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx --no -- commitlint --edit

View file

@ -12,12 +12,43 @@
"url": "https://github.com/cotes2020/jekyll-theme-chirpy/issues" "url": "https://github.com/cotes2020/jekyll-theme-chirpy/issues"
}, },
"homepage": "https://github.com/cotes2020/jekyll-theme-chirpy#readme", "homepage": "https://github.com/cotes2020/jekyll-theme-chirpy#readme",
"dependencies": { "scripts": {
"prepare": "husky install"
},
"devDependencies": {
"@commitlint/cli": "^16.2.1",
"@commitlint/config-conventional": "^16.2.1",
"gulp": "^4.0.2", "gulp": "^4.0.2",
"gulp-concat": "^2.6.1", "gulp-concat": "^2.6.1",
"gulp-insert": "^0.5.0", "gulp-insert": "^0.5.0",
"gulp-rename": "^2.0.0", "gulp-rename": "^2.0.0",
"gulp-uglify": "^3.0.2", "gulp-uglify": "^3.0.2",
"husky": "^7.0.4",
"standard-version": "^9.3.2",
"uglify-js": "^3.14.3" "uglify-js": "^3.14.3"
},
"commitlint": {
"extends": [
"@commitlint/config-conventional"
]
},
"standard-version": {
"skip": {
"commit": true,
"tag": true
},
"types": [{
"type": "feat",
"section": "Features"
},
{
"type": "fix",
"section": "Bug Fixes"
},
{
"type": "perf",
"section": "Improvements"
}
]
} }
} }

View file

@ -1,106 +0,0 @@
#!/usr/bin/env bash
#
#
# 1. Bump latest version number to the following files:
#
# - _sass/jekyll-theme-chirpy.scss
# - _javascript/copyright
# - assets/js/dist/*.js (will be built by gulp later)
# - jekyll-theme-chirpy.gemspec
# - package.json
#
# 2. Then create a commit to automatically save the changes.
#
# Usage:
#
# Run on the default branch or hotfix branch
#
# Requires: Git, Gulp
set -eu
ASSETS=(
"_sass/jekyll-theme-chirpy.scss"
"_javascript/copyright"
)
GEM_SPEC="jekyll-theme-chirpy.gemspec"
NODE_META="package.json"
_check_src() {
if [[ ! -f $1 && ! -d $1 ]]; then
echo -e "Error: Missing file \"$1\"!\n"
exit -1
fi
}
check() {
if [[ -n $(git status . -s) ]]; then
echo "Error: Commit unstaged files first, and then run this tool againt."
exit -1
fi
for i in "${!ASSETS[@]}"; do
_check_src "${ASSETS[$i]}"
done
_check_src "$NODE_META"
_check_src "$GEM_SPEC"
}
_bump_assets() {
for i in "${!ASSETS[@]}"; do
sed -i "s/v[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+/v$1/" "${ASSETS[$i]}"
done
gulp
}
_bump_gemspec() {
sed -i "s/[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+/$1/" "$GEM_SPEC"
}
_bump_node() {
sed -i \
"s,[\"]version[\"]: [\"][[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+[\"],\"version\": \"$1\"," \
$NODE_META
}
bump() {
_bump_assets "$1"
_bump_gemspec "$1"
_bump_node "$1"
if [[ -n $(git status . -s) ]]; then
git add .
git commit -m "Bump version to $1"
fi
}
main() {
check
_latest_tag="$(git describe --tags $(git rev-list --tags --max-count=1))"
echo "Input a version number (hint: latest version is ${_latest_tag:1})"
read -p "> " _version
[[ $_version =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]$ ]] ||
(
echo "Error: Illegal version number: '$_version'"
exit 1
)
if git tag --list | egrep -q "^v$_version$"; then
echo "Error: version '$_version' already exists"
exit 1
fi
echo -e "Bump version to $_version\n"
bump "$_version"
}
main

View file

@ -1,22 +1,44 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# According to the GitLab flow release branching model, # Release a new version to the GitLab flow production branch.
# cherry-pick the last commit on the main branch to the release branch, #
# and then create a tag and gem package on the release branch (naming format: 'release/<X.Y>'). # For a new major/minor version, bump version on the main branch, and then merge into the production branch.
#
# For a patch version, bump the version number on the patch branch, then merge that branch into the main branch
# and production branch.
# #
# #
# Usage: # Usage: run on main branch or the patch branch
# #
# It can be run on main branch, and it should be used after just finishing the last feature in the version plan, # Requires: Git, Node.js, NPX and RubyGems
# or just after merging the hotfix to the main branch.
#
# Requires: Git, Gulp
set -eu set -eu
opt_pre=false # preview mode option
working_branch="$(git branch --show-current)"
STAGING_BRANCH="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')"
PROD_BRANCH="production"
GEM_SPEC="jekyll-theme-chirpy.gemspec" GEM_SPEC="jekyll-theme-chirpy.gemspec"
opt_pre=false NODE_CONFIG="package.json"
FILES=(
"_sass/jekyll-theme-chirpy.scss"
"_javascript/copyright"
"$GEM_SPEC"
"$NODE_CONFIG"
)
TOOLS=(
"git"
"npm"
"npx"
"gem"
)
help() { help() {
echo "A tool to release new version Chirpy gem" echo "A tool to release new version Chirpy gem"
@ -26,19 +48,85 @@ help() {
echo " bash ./tools/release.sh [options]" echo " bash ./tools/release.sh [options]"
echo echo
echo "Options:" echo "Options:"
echo " -p, --preview Enable preview mode, only pakcage, and will not modify the branches" echo " -p, --preview Enable preview mode, only package, and will not modify the branches"
echo " -h, --help Print this information." echo " -h, --help Print this information."
} }
check() { _check_git() {
# ensure nothing is uncommitted
if [[ -n $(git status . -s) ]]; then if [[ -n $(git status . -s) ]]; then
echo "Error: Commit unstaged files first, and then run this tool againt." echo "Abort: Commit the staged files first, and then run this tool again."
exit -1 exit 1
fi fi
if [[ ! -f $GEM_SPEC ]]; then # ensure the working branch is the main/patch branch
echo -e "Error: Missing file \"$GEM_SPEC\"!\n" if [[ $working_branch != "$STAGING_BRANCH" && $working_branch != hotfix/* ]]; then
exit -1 echo "Abort: Please run on the main branch or patch branches."
exit 1
fi
}
_check_src() {
if [[ ! -f $1 && ! -d $1 ]]; then
echo -e "Error: Missing file \"$1\"!\n"
exit 1
fi
}
_check_command() {
if ! command -v "$1" &>/dev/null; then
echo "Command '$1' not found"
exit 1
fi
}
_check_node_packages() {
if [[ ! -d node_modules || "$(du node_modules | awk '{print $1}')" == "0" ]]; then
npm i
fi
}
check() {
_check_git
for i in "${!FILES[@]}"; do
_check_src "${FILES[$i]}"
done
for i in "${!TOOLS[@]}"; do
_check_command "${TOOLS[$i]}"
done
_check_node_packages
}
_bump_file() {
for i in "${!FILES[@]}"; do
sed -i "s/v[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+/v$1/" "${FILES[$i]}"
done
npx gulp
}
_bump_gemspec() {
sed -i "s/[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+/$1/" "$GEM_SPEC"
}
# 1. Bump latest version number to the following files:
#
# - _sass/jekyll-theme-chirpy.scss
# - _javascript/copyright
# - assets/js/dist/*.js (will be built by gulp later)
# - jekyll-theme-chirpy.gemspec
#
# 2. Create a commit to save the changes.
bump() {
_bump_file "$1"
_bump_gemspec "$1"
if [[ $opt_pre = false && -n $(git status . -s) ]]; then
git add .
git commit -m "chore(release): $1"
fi fi
} }
@ -52,39 +140,95 @@ resume_config() {
mv _config.yml.bak _config.yml mv _config.yml.bak _config.yml
} }
release() { # auto-generate a new version number to the file 'package.json'
_default_branch="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')" standard_version() {
_version="$(grep "spec.version" jekyll-theme-chirpy.gemspec | sed 's/.*= "//;s/".*//')" # X.Y.Z if $opt_pre; then
_release_branch="release/${_version%.*}" npx standard-version --prerelease rc
if [[ $opt_pre = "false" ]]; then
# Modify the GitLab release branches
if [[ -z $(git branch -v | grep "$_release_branch") ]]; then
# create a new release branch
git checkout -b "$_release_branch"
else else
# cherry-pick the latest commit from default branch to release branch npx standard-version
_last_commit="$(git rev-parse "$_default_branch")"
git checkout "$_release_branch"
git cherry-pick "$_last_commit" -m 1
fi fi
}
# Create a new tag # Prevent changelogs generated on master branch from having duplicate content
echo -e "Create tag v$_version\n" # (the another bug of `standard-version`)
git tag "v$_version" standard_version_plus() {
fi temp_branch="prod-mirror"
temp_dir="$(mktemp -d)"
# build a gem package git checkout -b "$temp_branch" "$PROD_BRANCH"
echo -e "Build the gem pakcage for v$_version\n" git merge --no-ff --no-edit "$STAGING_BRANCH"
standard_version
cp package.json CHANGELOG.md "$temp_dir"
git checkout "$STAGING_BRANCH"
git reset --hard HEAD # undo the changes from $temp_branch
mv "$temp_dir"/* . # rewrite the changelog
# clean up the temp stuff
rm -rf "$temp_dir"
git branch -D "$temp_branch"
}
# build a gem package
build_gem() {
echo -e "Build the gem package for v$_version\n"
cleanup_config cleanup_config
rm -f ./*.gem rm -f ./*.gem
gem build "$GEM_SPEC" gem build "$GEM_SPEC"
resume_config resume_config
} }
# Update the git branch graph, tag, and then build the gem package.
release() {
_version="$1" # X.Y.Z
if $opt_pre; then
$opt_pre
exit 0
fi
git checkout "$PROD_BRANCH"
git merge --no-ff --no-edit "$working_branch"
# Create a new tag on production branch
echo -e "Create tag v$_version\n"
git tag "v$_version"
build_gem
# merge from patch branch to the staging branch
# NOTE: This may break due to merge conflicts, so it may need to be resolved manually.
if [[ $working_branch == hotfix/* ]]; then
git checkout "$STAGING_BRANCH"
git merge --no-ff --no-edit "$working_branch"
git branch -D "$working_branch"
fi
}
main() { main() {
check check
release
if [[ "$working_branch" == "$STAGING_BRANCH" ]]; then
standard_version_plus
else
standard_version
fi
# Change heading of Patch version to level 2 (a bug from `standard-version`)
sed -i "s/^### \[/## \[/g" CHANGELOG.md
_version="$(grep '"version":' package.json | sed 's/.*: "//;s/".*//')"
echo -e "Bump version number to $_version\n"
bump "$_version"
release "$_version"
# Undo all changes on Git
$opt_pre && git reset --hard && git clean -fd
} }
while (($#)); do while (($#)); do