為什麼需要集中管理版本號?
1)同一個產品包含多個模組,對同一個包指定了不同的版本
比如A模組用了"Serilog.Sinks.Async"的“1.1.2”版本,
B模組用了“Serilog.Sinks.Async”的“1.5.0”版本,
最終整合在C專案裡,就會有版本不一致的問題。大多數情況下,這個無所謂。
2)團隊在使用自動整合,但是沒有集中管理版本號。
如果最終的C專案,是用於部署應用程式的。這個專案的程式碼,很少需要改動,只是用於釋出而已。
當上遊的專案,重新編譯並推送了新的包到NuGet倉庫。
而C專案並沒有在Visual Studio開啟,更新整個解決方案的NuGet包。
那麼Gitlab裡,這個C專案的包的定義就還是舊的。
C專案在docker build、docker push和docker run之後,就還可能在使用專案A和專案B的舊的包。
Directory.Build.props的特點
這是dotnet內建的技術,原理很簡單。就是dotnet restore的時候,從當前目錄下開始尋找Directory.Build.props。
當前目錄沒有,就去上級目錄裡找。
直到找到一個Directory.Build.props,就不再向上尋找了。
也就是說,Directory.Build.props和NuGet.Config的機制不一樣。
那麼 Directory.Build.props有兩個特點:
1、Directory.Build.props的定義是不能繼承,也不能映像子目錄的。
2、和*.csproj檔案一樣,可以Import其它的檔案
如何共享Directory.Build.props及其Import的檔案呢?
1、設立分發檔案的http網站
用寶塔設立分發Directory.Build.props及其Import檔案的網站
2、Windows開發環境的共享
Windows開發環境如何啟用Directory.Build.props版本號集中管理
3、在Gitlab Runner裡,dotnet build的時候,獲取檔案
Gitlab中的打包作業完成後,更新http伺服器裡的版本號檔案
這篇文章裡,就是這一句話在起作用:
build-job: # This job runs in the build stage, which runs first.
stage: build
before_script:
- bash $DOWNLOAD_ALL_DIRECTORY_BUILD_PROPS_FILES $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME
$DOWNLOAD_ALL_DIRECTORY_BUILD_PROPS_FILES 這個指令碼哪裡找?在這篇文章裡:
製作docker方式執行Gitlab Runner所需要的映象
4、在Gitlab Runner裡,dotnet pack成功之後,把最新版本號寫入分發檔案的網站
Gitlab中的打包作業完成後,更新http伺服器裡的版本號檔案
這篇文章裡,呼叫這一段指令碼,就可以了:
更新版本號: # This job runs in the test stage.
stage: update-version # It only starts when the job in the build stage completes successfully.
script:
- echo "SSH到http伺服器,更新檔案裡的版本號……"
- bash $DIRECTORY_BUILD_UPDATE_VERSION_SH $DIRECTORY_BUILD_DIST_SERVER_USER $DIRECTORY_BUILD_DIST_SERVER $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME "Directory.Build.Change.EasyComment.props" $EASY_COMMENT_VERSION_ID
$DIRECTORY_BUILD_UPDATE_VERSION_SH 這個指令碼哪裡找?在這篇文章裡:
製作docker方式執行Gitlab Runner所需要的映象
5、在Gitlab Runner裡,docker build的時候,獲取最新檔案
用Docker釋出網站時,自動下載Directory.Build.props及其Import的檔案
在Visual Studio生成的Dockerfile裡,把
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
修改成這樣即可:
FROM docker.amicap.cn/amihome/dotnet/sdk8:2024 AS build
WORKDIR /
# 因為要執行下邊這個shell,所以build映象不能用預設的mcr.microsoft.com/dotnet/sdk:8.0
# 我們自己的映象是包含下邊這個shell的
RUN /home/public/download-directory-builds-props.sh dev.amihome.cn
這裡用到的docker.amicap.cn/amihome/dotnet/sdk8:2024,根據這篇文章來製作:
適配http分發Directory.Build.props檔案,需要替換預設的微軟sdk:8.0映像