Jenkins持續整合學習-Windows環境進行.Net開發4
Jenkins持續整合學習-Windows環境進行.Net開發4
目錄
Jenkins持續整合學習-Windows環境進行.Net開發1
Jenkins持續整合學習-Windows環境進行.Net開發2
Jenkins持續整合學習-Windows環境進行.Net開發3
Jenkins持續整合學習-Windows環境進行.Net開發4
前言
前面三篇介紹了使用SVN的持續整合,本篇就來學習如何使用git進行持續整合。
目標
探究 .net + git + jenkins方案的持續整合。
前面3篇文章總結的最終流程如下。
我們需要修改3個方面。
- 程式碼提交到Git上
- 提交到Git上自動觸發構建
- 從Git上更新程式碼
Github持續整合
先需要安裝Github相關外掛 Github plugin
。
提交程式碼到Github
首先新建一個git倉庫



提交前需要把obj目錄下的 project.assets.json
排出忽略,obj其他的檔案新增忽略。
關於 project.assets.json
的作用可以檢視 Jenkins持續整合學習-Windows環境進行.Net開發2

同時要把原始碼管理中的外掛修改為Git

最後提交即可。

從Github更新程式碼
在jenkins我們也新新增一個專案,名稱為gittest,為了方便,直接從svn的測試專案複製,這樣我們可以最大程度的減少重複配置。

將專案設定為Github專案,Job的選單就會顯示Github項。

Subversion
改為
Git

由於我之前git的外掛都已經安裝好,因此這裡沒有碰到任何問題。
新增git憑據,暫時使用使用者名稱和密碼

暫時先通過手動構建,測試一下流程是否通暢,暫時先把 Build Triggers
的鉤都去掉

配置完後Job的左邊的選單就會出現Github項,點選就會調轉到配置的Github專案的倉庫中。

點選構建

構建成功,git日誌如下
10:55:27 由使用者 jake 啟動 10:55:27 構建中 在工作空間 D:\Program Files (x86)\Jenkins\workspace\gittest 中 10:55:27> git.exe rev-parse --is-inside-work-tree # timeout=10 10:55:27 Fetching changes from the remote Git repository 10:55:27> git.exe config remote.origin.url https://Github.com/GuojieLin/Jenkins.Core.git # timeout=10 10:55:27 Fetching upstream changes from https://Github.com/GuojieLin/Jenkins.Core.git 10:55:27> git.exe --version # timeout=10 10:55:27 using GIT_ASKPASS to set credentials git賬號 10:55:27> git.exe fetch --tags --progress https://Github.com/GuojieLin/Jenkins.Core.git +refs/heads/*:refs/remotes/origin/* 10:55:34> git.exe rev-parse "refs/remotes/origin/master^{commit}" # timeout=10 10:55:34> git.exe rev-parse "refs/remotes/origin/origin/master^{commit}" # timeout=10 10:55:34 Checking out Revision 75be92d4a4c131924a4601504cde7ba613f57b9f (refs/remotes/origin/master) 10:55:34> git.exe config core.sparsecheckout # timeout=10 10:55:34> git.exe checkout -f 75be92d4a4c131924a4601504cde7ba613f57b9f 10:55:34 Commit message: "同上" 10:55:34> git.exe rev-list --no-walk da3b7456cf40552cdc66daf2d2db4ed43762c8e4 # timeout=10 10:55:34 Path To MSBuild.exe: D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe ... 10:55:43 [WS-CLEANUP] Deleting project workspace... 10:55:43 [WS-CLEANUP] done 10:55:43 Finished: SUCCESS
git上顯示構建狀態
在 Build
中新增 Set build status to "pending on Github commit"
,在構建前可以更新Git的提交的狀態為pending

若構建時上面步驟出現異常錯誤為 ERROR: [Github Commit Status Setter] Failed to update commit state on Github. Ignoring exception [Cannot retrieve Git metadata for the build]
,則檢查Git和GitClient外掛的版本,下面的rc版本有 bug 會導致無法更新狀態待git,使用後面的版本即可。

Post-build Action
新增
Set Github commit status(universal)

修改圈中的項,構建成功後就會更新對應的狀態到Git。

通過上面配置完後就可以顯示Jenkins的構建狀態了

自動觸發構建
Jenkins支援2種配置方式
- 手工模式
手工模式需要在git人工配置jenkins的webhook的通知接收地址,地址格式為$JENKINS_BASE_URL/Github-webhook/
,如:http://127.0.0.1:8080/Github-webhook/
。 - 自動模式
自動模式會通過Github的api自動建立webhook
詳細文件可以檢視 Github Plugin外掛文件 。
手工模式
在 Build Triggers
選擇 Github hook trigger for GITScm polling
Github上面需要新增一個鉤子,用於程式碼push完成後通知jenkins構建。
在設定中點選Webhooks

點選新增Webhooks

由於Github需要通知到我本地的jenkins服務,因此Jenkins的鉤子回撥地址必須能被Github訪問到,我用花生殼做了內網穿透。

將Jenkins的鉤子地址配置到Github的webhooks中。只需要push事件即可。

自動模式
在系統設定中找到Github伺服器,新增一個憑證,點選連線測試。若顯示 Credentials verified for user XXXX, rate limit: XXXX
即表示連線成功,由於Github有訪問限制具體檢視 Understanding rate limits for Github Apps 。
然後點選Advanced後可以修改hook的url,我在本地預設是 127.0.0.1
的地址,Github肯定是訪問不到的,需要修改為正確的可被外部訪問到的外網地址。

設定完後當修改Job的配置儲存時就會觸發建立Github的鉤子。
但是發現通過Github無法通知到我本地的jenkens,一值顯示超時。

測試了下通知地址外網是可以訪問到的,因此懷疑是不是由於某些原因導致Github無法訪問進來。
Gitlab持續整合
由於在國內Github訪問速度不是很理想,大部分公司都會搭建私有的Git倉庫,比如Gitlab。
為了方便,我直接將Github的專案匯入到了Gitlab中,具體匯入方法可以檢視 如何從Github遷移到Gitlab?
同時我需要在VS專案中新增Gitlab的遠端庫。
在VS 團隊資源管理器
- 儲存庫
中新增一個遠端。

安裝外掛
安裝必要的外掛 Gitlab Authentication plugin
、 Gitlab Hook Plugin
、 Gitlab Plugin
。
需要注意的是安裝 Gitlab Hook Plugin
外掛的時候,若Jenkins的安裝目錄路徑存在空格,則可能安裝失敗。原因是因為 Gitlab Hook Plugin
依賴於 ruby-runtime
,而 ruby-runtime
不支援有空格的路徑。因此解決辦法是將jenkins遷移到無空格的路徑下,如我本來安裝的目錄是 D:\Program Files (x86)\Jenkins
,將其遷移到 D:\Jenkins
。具體步驟如下:
- 開啟工作管理員或到windows服務中找到Jenkins,關閉Jenkins服務。
- 將Jenkins整個複製到
D:\Jenkins
。 - 去登錄檔
計算機\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Jenkins
修改Jenkins服務路徑。為D:\Jenkins
。
-
啟動Jenkins服務
Gitlab Hook Plugin
外掛可能有個安全問題會提示警告。
通過上述步驟 Gitlab Hook Plugin
外掛就能安裝成功了
配置Gitlab賬號
在Jenkins系統設定中找到Gitlab的配置
鉤起 Enable authentication for '/project' end-point
,這樣在Gitlab通知時需要身份驗證,保證安全性。

新增Token
Gitlab
右上角的使用者頭像點選右鍵找到
Setting

然後找到 Access Token
生成一個Token,只需要勾選 api
許可權即可。

新增憑據
將生成好的Token複製下來,回到Jenkins配置

新增一個憑據,選擇 Gitlab API token
,使用剛才生成的token新增即可。

新增完成後測試連通性顯示 Success
即可。
在 Gitlab connections
我們需要增加如何連線 Gitlab
,和Github一樣,我們需要增加一個token,用於授權Jenkins的訪問。
配置Git地址
修改Git路徑。選擇剛才新增的Gitlab連線。

修改原始碼管理中的專案路徑

我們可以使用使用者名稱密碼或者token的方式訪問Gitlab
配置鉤子
在 Build Triggers
中勾選 Build when a change is pushed to Gitlab
,後面會生成鉤子路徑,如果是本地注意將後面的迴環地址ip改為本地ip。
在 Secret token
點選生成一個token,這個token是用於授權web hook訪問的。若沒有配置在鉤子觸發是可能會返回 403
錯誤碼。

到Gitlab新增一個web鉤子,在 Setting
- Integrations
中配置
將剛才的鉤子通知地址輸入,我本地無需SSL,因此去除了勾選,只有在 Push
的時候才需要觸發。然後新增鉤子。

新增完成點選 Push events
發起一個測試,

返回200則表明觸發成功。

通知Gitlab狀態
在Job的配置中 Post-build action
新增 Publish build status to Gitlab
,構建完後就可通知到Gitlab上構建狀態。

結語
本章完成了使用Github和Gitlab進行原始碼管理進行持續整合。但是Github由於無法通知到我本地的jenkins所以無法自動構建。
無論使用SVN還是GIT進行原始碼管理,整體流程不變,自動通知的關鍵都是程式碼提交後通知Jenkins觸發構建。
|SVN|Git|
|-|-|
|通過客戶端或SVN伺服器鉤子,程式碼提交後執行指令碼通知Jenkins。|程式碼push後,Git通過web hook通知Jenkins|