git commit 、CHANGELOG 和版本發佈的標準自動化

来源:https://www.cnblogs.com/zivxiaowei/archive/2018/12/08/10089201.html
-Advertisement-
Play Games

一直以來,因為團隊項目迭代節奏很快,每次發佈的更新日誌和版本更新都是通過人肉來完成的。有時候實在忙的團團轉,對於手動的寫這些更新信息就顯得力不從心了。對於團隊新來的小伙伴,有時候遇到些緊急情況,就更顯的亂糟糟,還是得麻煩團隊資深的同學。顯然這些工作,用自動化工具再適合不過了。 本文是一篇項目自動化方 ...


一直以來,因為團隊項目迭代節奏很快,每次發佈的更新日誌和版本更新都是通過人肉來完成的。有時候實在忙的團團轉,對於手動的寫這些更新信息就顯得力不從心了。對於團隊新來的小伙伴,有時候遇到些緊急情況,就更顯的亂糟糟,還是得麻煩團隊資深的同學。顯然這些工作,用自動化工具再適合不過了。 

本文是一篇項目自動化方面的使用教程,社區裡面針對四類問題的解決方案很多,今天這裡主要介紹的是 onventional-changelog 方案相關的內容。 如果你正在思考或者試圖解決這方面的問題的話,不妨瞭解一下。

conventional-changelog

conventional-changelog 是一款可以根據項目的commit 和 metadata信息自動生成 changelogs 和 release notes的系列工具,並且在輔助 standard-version 工具的情況下,可以自動幫你完成生成version、打tag, 生成CHANGELOG等系列過程。

conventional-changelog 生態主要模塊

以上是 onventional-changelog 生態重要的幾個主要模塊,實際工作中這幾個工具常常是配套使用的,當然也需要根據自己的情況而定。篇幅有限,今天我們就主要介紹 commitizenconventional-changelog-cli 、standard-version 這三工具了。

commitizen

commitizen 是一款標準化 git commit 信息的工具。在沒有規範的情況下,開發人員的 commit 信息是常常是隨意的,這就導致 commit 信息顯的很無用。可是當你在做git logcode review、編寫changelog等情況時,良好的 commit 規範就顯的尤為重要。

commitizen 安裝
$ npm install -g commitizen
# 或者本地安裝
$ npm install --save-dev commitizen
安裝適配器(Adapter)

因為不同的項目本身的構建方式的不同,commitizen 支持不同適配器的擴展,從而去滿足不同的構建需求的。本文主要使用cz-conventional-changelog的構建標準,當然你也可以根據具體的情況選擇其他的適配器,更多請看

$ npm install -g cz-conventional-changelog

全局安裝完成後,我們需要在項目根目錄下添加 .czrc 配置文件,文件內容如下:

// path 用來指定適配器
{ "path": "cz-conventional-changelog" }
本地安裝
$ npm install cz-conventional-changelog --save-dev
# 或者使用 commitizen 工具
$ commitizen init cz-conventional-changelog --save-dev --save-exact

commitizen 工具會自動在package.json中添加配置相應的配置,具體如下:

  "config": {
    "commitizen": {
      "path": "cz-conventional-changelog"
    }
  }

安裝並添加完後,我們便可以使用 git cz 命令替換 git commit 來使用了。我們修改一個文件並 git add 後,通過 git cz 試一下:

git-cz

可以看到,git cz 給出了 commit 的幾種類型選項,如下:

  • feat 新功能
  • fix Bug 修複
  • docs 文檔更新
  • style 代碼的格式,標點符號的更新
  • refactor 代碼重構
  • perf 性能優化
  • test 測試更新
  • build 構建系統或者包依賴更新
  • ci CI 配置,腳本文件等更新
  • chore 非 src 或者 測試文件的更新
  • revert commit 回退

使用的時候,我們應該根據項目具體變更情況選擇。如果想修改已經打好的 commit 信息,我們可以通過 git reset命令來修複。

需要註意的是,僅僅是添加 commit 工具是不夠的,為了保證 commit 格式的一致性,這裡強烈建議你記得整合 commitlint 工具, 配合 git commit-msg hook 來使用,在這裡就不相信介紹了,具體可以查看官方文檔。

conventional-changelog-cli

conventional-changelog-cli 預設推薦的 commit 標準是來自angular項目,除了 angular 標準以外,目前集成了包括 atom, codemirror, ember, eslint, express, jquery 等項目的標準,具體可以根據自己口味來選用。

安裝
# Help conventional-changelog --help
$ npm install -g conventional-changelog-cli

基本使用

$ conventional-changelog -p angular -i CHANGELOG.md -s

以上命令中參數-p angular用來指定使用的 commit message 標準,假如想使用atom的標準,則是:

$ conventional-changelog -p atom -i CHANGELOG.md -s

參數-i CHANGELOG.md表示從 CHANGELOG.md 讀取 changelog, -s 表示讀寫 changelog 為同一文件。需要註意的是,上面這條命令產生的 changelog 是基於上次 tag 版本之後的變更(Feature、Fix、Breaking Changes等等)所產生的,所以如果你想生成之前所有 commit 信息產生的 changelog 則需要使用這條命令:

$ conventional-changelog -p angular -i CHANGELOG.md -s -r 0

其中 -r 表示生成 changelog 所需要使用的 release 版本數量,預設為1,全部則是0。

自定義參數

生成的 changlog 中有些常用內容可以通過自定義參數來根據需求更改,例如版本號、commit 地址等等。 changelog 中生成的版本號即是從 package.json 中獲取 version 欄位來的。commit 連接的倉庫地址我們需要修改 package.json 中的repository地址,changelog 中 issuse 預設的連接地址也是根據 repository 來生成的。如果你使用了第三方的協作系統(例如 bitbucket), 那麼你可以使用這個標準conventional-changelog-angular-bitbucket。或者像我們使用 redmine 來管理 isssue ,那麼在生成 changelog 後可以使用 replace 工具來處理文本中的原有地址:

$ replace 'https://github.com/myproject/issues/' 'https://redmine.example.com' CHANGELOG.md

最後看看大致生成的效果:

changelog

conventional-changelog 更多的選項配置可以看這裡。

standard-version

standard-version 是一款遵循語義化版本( semver) commit message 標準規範 的版本和 changlog 自動化工具。通常情況線下,我們會在 master 分支進行如下的版本發佈操作:

1. git pull origin master
2. 根據 pacakage.json 中的 version 更新版本號,更新 changelog
3. git add -A, 然後 git commit
4. git tag 打版本操作
5. push 版本 tag 和 master 分支到倉庫

其中2,3,4則是 standard-version 工具會自動完成的工作,配合本地的 shell 腳本,則可以自動完成一系列版本發佈的工作了。

安裝 & 使用

在這裡我仍然推薦的全局安裝:

$ npm install -g standard-version
# 或者
$ npm install --save-dev standard-version

執行:

# Help standard-version --help
$ standard-version 

執行 standard-version 命令,我們會在控制台看到整個執行流程的 log 信息,在這裡幾個常用的參數需要註意下:

--release-as, -r 指定版本號

預設情況下,工具會自動根據 主版本(major),次版本( minor) or 修訂版(patch) 規則生成版本號,例如如果你package.json 中的version 為 1.0.0, 那麼執行後版本號則是:1.0.1。自定義可以通過:

$ standard-version -r minor
# output 1.1.0
$ standard-version -r 2.0.0
# output 2.0.0
$ standard-version -r 2.0.0-test
# output 2.0.0-test

需要註意的是,這裡的版本名稱不是隨便的字元,而是需要遵循語義化版本( semver) 規範的

--prerelease, -p 預發版本命名

用來生成預發版本, 如果當期的版本號是 2.0.0,例如

$ standard-version --prerelease alpha
# output 2.0.0-alpha.0
--tag-prefix, -t 版本 tag 首碼

用來給生成 tag 標簽添加首碼,例如如果前版本號為 2.0.0,則:

$ standard-version --tag-prefix "stable-"
# output tag: stable-v2.0.0

以上這幾個參數可能我們用的比較多,還有其他選項可以通過 standard-version --help查看。

集成 npm

最後記得把命令集成到 npm package.json的 scripts 中, 並配合 shell 腳本使用, 如下:

"scripts": {
    "release": "./scripts/release.sh",
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md && npm run changeissueurl",
    "changeissueurl": "replace 'https://github.com/myproject/issues/' 'https://redmine.example.com/' CHANGELOG.md"
  },
  
// 配置好後使用 npm run 執行發佈
$ npm run release

添加 release.sh 腳本:

#!/bin/bash

# Release branch
master="master"
prefix="DTinsight_v"

git pull origin $master
echo "Current pull origin $master."

# Auto generate version number and tag
standard-version -r $release --tag-prefix $prefix

git push --follow-tags origin $master

echo "Git push origin $master"
echo "Release finished."

上面的腳本只是做了簡單的分支 pull, 執行 standard-version 和最後的版本 push 工作,如果要做一些定製化的執行參數,則需要做定製修改了。

最後

項目的工程化是一件很有意思的事情,通過自動化的工具,可以有效提升項目可維護性和質量,並且避免很多不確定因素。如果你工作中發現了這些問題,而不想繼續通過人肉的方法解決這些問題的話,那就趕緊試試~

原文地址:http://imziv.com/blog/article/index.htm


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在我們使用資料庫進行查詢或者建表時,經常需要查看表結構,下麵以employees資料庫中的departments表為例進行表結構查詢: 以上三種方法的查詢結果相同: 方法 4: 借用MySQL自身的information_schema資料庫,輸入如下指令: 查詢結果如下: 建表信息查詢 : show ...
  • 因為項目不同,有些公用庫而且還是c++的,還有一些帶資源的,簡單的複製遇到庫升級又是一輪配置,編譯成aar則解決這些麻煩。 但是預設andriod studio的make moudle只生成debug包,在3.0以上及時生成release的apk,release的aar也不會生成。 這個時候要用到 ...
  • 1.某個控制項要放在Linearlayout佈局的底部(底部導航條) ...//嵌套的其他佈局…… ...//嵌套的其他佈局 簡單說明一下,上面的代碼中有一個Linearlayout,裡面嵌套了兩個Linearlayout 這裡的關鍵是嵌套裡面的第一個 佈局,註意這個佈局裡面的這兩行屬性代碼 第二個L ...
  • 從零學習Fluter(四):Flutter中ListView組件系列詳展 ...
  • 上一篇基於修改系統源碼的前提下,實現了完全的沉浸式體驗效果。可參考這篇 [戳這][1] 一、自定義Dialog 在沉浸式效果下,當界面彈出對話框時,對話框將獲取到焦點,這將導致界面退出沉浸式效果,那麼是不是能通過屏蔽對話框獲取焦點來達到不退出沉浸式的目的呢。說乾就乾,我們先來看一下改善後的效果圖。 ...
  • 這兩天看了javascript DOM編程。 對象:由一些屬性和方法組合在一起而構成的一個數據實體。 屬性是隸屬於某個特定對象的變數。 方法是只有某個特定對象才能調用的函數。 對象分為: 內建對象:比如Array() 數組對象;Math對象Date對象。 宿主對象:Form對象 Image對象 El ...
  • 本文重點是要梳理執行上下文的生命周期中的建立作用域鏈,在此之前,先回顧下關於作用域的一些知識。 1.什麼是作用域(scope)? 在《JavaScritp高級程式設計》中並沒有找到確切的關於作用域的定義,只是在“4.2執行環境及作用域”中簡單說了下執行環境(execution context)的概念 ...
  • Agax局部非同步刷新全稱ASynchronous JavaScript And XML.使用Javascript代碼獲取伺服器的數據,Ajax當中有兩個請求方法,一個是get方法,一個是post請求方法。 ①get請求方法:請求參數在URL的後面,多個參數之間用&連接。 ②post請求方法:請求參在 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...