代碼規範校驗,commit
規範校驗,CHANGELOG.md
生成,版本升級,打tag
,發佈release
前端
demonode
目前前端項目已經在pre-commit
時使用lint-stage
和eslint
作了增量的代碼格式校驗,在代碼層面作了必定程度的規範化。爲了進一步規範前端開發的流程以及便於協同工做時方便其餘人知道咱們每一個版本都作了些什麼,或者咱們本身回顧本身作的東西時,更清晰易懂,沒必要切到當時的分支去查看代碼。所以,我對代碼校驗後的流程又作了以下的一些規範化優化:git
commit
使用Conventional Commits
規範commit-msg
階段對commit
進行校驗semver
規範,升級版本,而且打上tag
commit
信息生成CHANGELOG.md
release
,這裏的release
指的是github
或者gitlab
中的release
在開始前介紹整個流程前,先看下實現後的效果圖: github
下面介紹在優化整個流程過程當中用到的工具(部分經常使用的工具只作簡單介紹):shell
攔截Git Hooks
,讓你在Git
的生命週期作一些事情。這裏使用的是 husky v4
npm
huksy 支持全部Git Hooks
:json
commit msg
使用huksy
攔截Git Hooks
,會致使,即使你只改了一個js
文件,可是git commit
的時候,仍是會校驗全部的js
文件gulp
lint-stage
就能夠解決上面發生的問題,它只會校驗你提交或者說你修改的部份內容性能優化
代碼格式校驗bash
commit-msg
,並生成CHANGELOG.md
以前,咱們須要先知道,目前比較主流的commit-msg
規範是怎麼樣的?conventional-commits是目前使用最廣的寫法,比較合理和系統化,而且有配套的工具
每次提交,Commit message 都包括三個部分:Header,Body 和 Footer。
<type>(<scope>): <subject> // 空一行 <body> // 空一行 <footer>
其中,Header 是必需的,Body 和 Footer 能夠省略。
Header 部分只有一行,包括三個字段:type
(必需)、scope
(可選)和subject
(必需)
(1)
type
用於說明 commit 的類別
feat:新功能(feature) fix:修補bug docs:文檔(documentation) style: 格式(不影響代碼運行的變更) refactor:重構(即不是新增功能,也不是修改bug的代碼變更) test:增長測試 chore:構建過程或輔助工具的變更 ...
(2)scope
用於說明 commit 影響的範圍,好比數據層、控制層、視圖層等等,視項目不一樣而不一樣。(3)
subject
是 commit 目的的簡短描述,不超過 50 個字符
Body 部分是對本次 commit 的詳細描述,能夠分紅多行
(1)不兼容變更
若是當前代碼與上一個版本不兼容,則 Footer 部分以BREAKING CHANGE
開頭,後面是對變更的描述、以及變更理由和遷移方法
(2)關閉 Issue
若是當前 commit 針對某個 issue,那麼能夠在 Footer 部分關閉這個 issue
Closes #123, #245, #992
commit-msg
這裏只介紹本地使用的方式,便於協同做業,安裝的版本相同
# 安裝 npm install --save-dev commitizen # 安裝適配器,使項目對commitizen友好 npx commitizen init cz-conventional-changelog --save-dev --save-exact
在package.json
中配置
{ "scripts": { "commit": "cz" } } // npm run commit 後將彈出交互命令行
若是想強制必須使用該交互方式,能夠攔截prepare-commit-msg
,那麼在git commit
時也會彈出交互命令行
{ "husky": { "hooks": { "prepare-commit-msg": "exec < /dev/tty && git cz --hook || true" } } }
在介紹完conventional commit
和交互式的commit
工具以後,如今還須要一個能校驗咱們所提交的代碼是否嚴格遵循了conventional commit
規範的工具。這個工具就是commitlint
這個工具使用很簡單,僅需一下兩步便可:
# Install commitlint cli and conventional config npm install --save-dev @commitlint/{config-conventional,cli} # Configure commitlint to use conventional config echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
commitlint-config-conventional (based on the the Angular convention) 支持一下類型:
build
: 影響構建系統或外部依賴項的更改(示例範圍:gulp、broccoli、npm)ci
: 對 CI 配置文件和腳本的更改(示例範圍:Travis, Circle, BrowserStack, SauceLabs)chore
: 其餘不修改 src 或測試文件的更改, 發版docs
: 文檔變動feat
: 新的特性、功能fix
: bug 修復perf
: 性能優化refactor
: 重構revert
: 返回先前的提交style
: 不影響代碼含義的更改(空白、格式、缺乏分號等)test
: 測試commit-msg
的交互式提交和格式校驗工具都已經實現,下面就須要根據咱們的約定提交內容生成變動文檔了CHANGELOG.md
conventional-changelog
提取git log
歷史信息,而後生成文檔
快速開始
$ npm install -g conventional-changelog-cli $ cd my-project # 在以前CHANGELOG.md基礎上疊加,更新最近一個tag的commit msg $ conventional-changelog -p angular -i CHANGELOG.md -s # 更新所有commit msg,覆蓋CHANGELOG.md conventional-changelog -p angular -i CHANGELOG.md -s -r 0
在package.json
中配置
{ "scripts": { "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0" } }
語義化版本控制版本格式:MAJOR.MINOR.PATCH
,版本號遞增規則以下:
主版本號:當你作了不兼容的 API 修改,
次版本號:當你作了向下兼容的功能性新增,
修訂號:當你作了向下兼容的問題修正
standard-version
是基於semver(Semantic Versioning)和Conventional Commits進行版本變動和生成 changeLog 的實用工具
standard-version
做了如下幾件事:
package.json
中版本package.json
中版本號和package-lock.json
中版本號changelog
bumpFiles
和更新的CHANGELOG
)tag
npm install --save-dev standard-version
package.json
中添加腳本{ "scripts": { "release": "standard-version" } } // npm run release
發佈到Github release
或者GitLab release
使用前須要先設置環境變量CONVENTIONAL_GITHUB_RELEASER_TOKEN
,github 獲取Personal access tokens。若是是私有倉庫選擇 scope repo
,若是是公開的倉庫選擇 scope public_repo
不建議將Personal access tokens
放到項目本地使用,發佈到github
識別後會當即失效
$ npm install -g conventional-github-releaser $ cd my-project $ conventional-github-releaser -p angular
// package.json { "scripts": { "release": "conventional-github-releaser -p angular -n changelog-options.js -i CHANGELOG.md -s -r 0 -t e3c6d36e80b8faba29f44e91c5778a8271e83291" } }
{ "scripts": { "commit": "cz", // conventional-commit 交互式提交 commit "changelog": "conventional-changelog -p angular -n changelog-options.js -i CHANGELOG.md -s -r 0", // 生成 CHANGELOG.md "github-releaser": "conventional-github-releaser -p angular -n changelog-options.js -i CHANGELOG.md -s -r 0 -t e3c6d36e80b8faba29f44e91c5778a8271e83291", // 發佈github或者gitlab releaser "update-project-version: project-minor": "node scripts/release/version-updater.js -t project -r minor", // 更新項目的版本信息 "update-project-version: project-patch": "node scripts/release/version-updater.js -t project -r minor", // 更新項目的版本信息 "update-package-version: patch": "node scripts/release/version-updater.js -r patch", // 更新組件庫版本信息 "update-package-version: minor": "node scripts/release/version-updater.js -r minor",// 更新組件庫版本信息 "tag": "node scripts/release/tag.js", // 打tag標籤 "release": "npm run tag && npm run github-releaser" } }
package
(組件庫)
beta發版
update-package-version: patch
更新組件庫版本,而後打包publish
release發版
update-package-version: minor
更新組件庫版本,而後打包publish
release
分支從新發版,update-package-version: patch
更新組件庫版本,而後打包publish
master發版
changelog
-> 在CHANGELOG.md
添加迭代相關信息 -> commit
-> release
迭代項目
beta發版
build
release發版
update-project-version: project-minor
版本,而後build
release
分支從新發版,update-project-version: project-patch
更新版本,而後打包build
master發版
changelog
-> 在CHANGELOG.md
添加迭代相關信息 -> commit
-> release