Jenkins + git submodule:解決代碼安全性問題
(8) Build 編譯
就是告訴 Jenkins 如何來構(gòu)建系統(tǒng),也就是說:Jenkins只是一個自動化的構(gòu)建系統(tǒng),具體的編譯過程,可以由用戶自己來決定,有如下選擇項目:
我們這里選擇直接執(zhí)行腳本(Execute Shell),輸入如下指令:
(9) Post-build Actions 編譯后操作
告訴 Jenkins: 編譯一個工程之后,需要做哪些事情?例如:發(fā)送郵件,觸發(fā)下一個工程的自動編譯等等,而且可以添加多個動作?蛇x項如下:
以上步驟配置好之后,Save 保存,此時在主界面就可以看到這個項目的全貌了,如下圖:
在 Jenkins 后臺中,這個項目的保存路徑是:/var/lib/jenkins/jobs/Test1。
6. 手動觸發(fā)編譯一次
由于在上面的步驟(6)中,我們沒有選擇任何觸發(fā)條件,所以需要我們在項目 Test1 的主界面中,手動單擊左側(cè)的 Build Now 按鈕來觸發(fā)。
此時,在左側(cè)的 Build History 中,可以看到編譯歷史記錄,單擊某次編譯記錄編號,可以看到這一次編譯的詳細信息。
在編譯詳細信息中,單擊左側(cè)的 Console Output 按鈕,可以看到編譯的輸出信息:成功編譯得到可執(zhí)行文件。
我們可以在 Jenkins 后臺中看到,源代碼被拉到 /var/lib/jenkins/jobs/Test1/workspace 目錄中了:
到這里,你已經(jīng)學(xué)會了 Jenkins 的最基本操作!
下面我們繼續(xù)講一下 git submodule 的使用,這部分才是核心內(nèi)容!
三、git submodule 基本使用
1. git submodule 是什么?
git submodule 是用于多模塊管理的工具,它允許一個項目作為 repository,其他項目作為子模塊存在于在父項目中。
父項目和子項目的提交是分開的,也就是說父項目提交的信息只包含子項目的信息,而不會包含子項目的代碼;子項目有自己獨立的 commit,push,pull操作。
git submodule 一般用在比較大的項目中,為了便于復(fù)用,或者為了代碼的安全性,常常需要分成若干個子項目來進行代碼管理。
常用的指令包括:
添加子模塊: git submodule add
更新子模塊: git submodule update
初始化子模塊: git submodule init遞歸的方式克隆整個項目: git clone--recursive
拉取所有子模塊: git submodule foreach git pull
2. 利用三個小項目,來測試一下 submodule 的用法
為了便于演示,我們我們創(chuàng)建 3 個項目,把它們都推送到遠程倉庫中,這里使用 gitee。
Test1:編譯得到一個動態(tài)庫:libtest1.so;Test2:編譯得到一個動態(tài)度:libtest2.so;Test3:編譯得到一個可執(zhí)行程序,加載、調(diào)用上面 2 個動態(tài)庫中的函數(shù)。
為什么要這樣設(shè)計模塊: 安全!
開發(fā)人員A:負責(zé) Test1,沒有權(quán)限拿到其他模塊的代碼;開發(fā)人員B:負責(zé) Test2,沒有權(quán)限拿到其他模塊的代碼;項目經(jīng)理:負責(zé) Test3 和 代碼整合,能拿到所有的代碼;
項目經(jīng)理需要把 Test1 和 Test2 作為 sub module,添加到 Test3 中,執(zhí)行下面的指令:
1. git submodule add https://gitee.com/[你的賬號]/test1.git test1
2. git submodule add https://gitee.com/[你的賬號]/test2.git test2
把 Test1 和 Test2 作為子模塊添加到 Test3 中之后,看一下文件有什么變化:
你還可以看一下 .gitmodules 文件中的內(nèi)容,可以看出,git 工具就是通過這個配置文件來管理子模塊的。
管理員需要對所有的模塊進行整合、編譯,因此,我們在 Test3 目錄下添加一個腳本 build.sh,所有的編譯指令,都寫在這個腳本中,內(nèi)容如下:
內(nèi)容都是最最基本的,直接調(diào)用 make 指令即可,執(zhí)行一下,輸出:
到這里,我們就完成了子模塊的添加功能。
3. 在一個空目錄中來編譯、驗證一下可行性
我們在另一個空目錄中,clone 一下 Test3 這個項目,可以發(fā)現(xiàn):克隆下來的 test1 和 test2 文件夾中是空的,如下所示:
需要手動獲取所有的子模塊,執(zhí)行指令:
git submodule update --init --recursive
此時,再使用 tree 命令看一下文件變化,可以看到 test1 和 test2 的文件都被拉取下來了。這里有一個問題需要注意:雖然子模塊的代碼被拉取下來了,但是其 head 并沒有指向 master 分支,需要手動處理一下,如圖:
這個時候,我們在 test3 目錄下再次執(zhí)行腳本 build.sh,就可以順利編譯所有的子模塊了。
以上這幾個步驟,我們是在本地的一個臨時目錄,手動測試 submodule 的編譯過程。
下一個章節(jié)我們把這個過程部署到 Jenkins 系統(tǒng)中,所以剛才執(zhí)行的這幾個指令,就需要寫在 build.sh 腳本中了。build.sh 的內(nèi)容變?yōu)椋?/p>
四、在 Jenkins 中使用 git module 來編譯所有的模塊
下面的操作,都是在瀏覽器的 Jenkins 面板中來操作的。
1. 重新配置項目
因為我們是在 Test3 中,來編譯整個項目(Test1 和 Test2 被作為子模塊包括進來),因此首先把之前添加的 Test1 項目刪除掉,如圖:
然后重新添加項目 Test3,復(fù)習(xí)一下步驟:
輸入描述信息,選擇自由風(fēng)格項目;輸入 git 倉庫地址和賬戶信息,選擇 master 分支;觸發(fā)器不設(shè)置;編譯環(huán)境不設(shè)置;編譯:選擇 Execute shell 執(zhí)行腳本,輸入編譯指令:./build.sh。(剛才說了,Jenkins 這是一個自動化構(gòu)建框架,具體的編譯過程由用戶決定,所以我們這里的編譯過程就是執(zhí)行 Test3 下的 build.sh 這個腳本。);編譯后動作不設(shè)置;
當(dāng)然,也可以直接在之前的 Test1 項目基礎(chǔ)上進行修改。
此時,我們在 Jenkins 中直接點擊 Build Now 按鈕,如果不出意外的話,會提示編譯錯誤(左側(cè)的 Build History 下面出現(xiàn)紅色的錯誤圓圈)。
點進去,看一下輸出信息(Console Output 按鈕),提示錯誤:
原因正如前文所說,子模塊在獲取之后,head 沒有指向 master 分支,需要我們在第一次編譯時手動修改一下(我沒有找到其它方法,如果你知道的話,請不吝賜教。
手動解決:在命令行窗口中,進入 Jenkins 系統(tǒng)的 Test3 目錄 /var/lib/jenkins/jobs/Test3/workspace ,執(zhí)行如下幾條指令:
git submodule update --init --recursivecd test1/git checkout mastercd -cd test2/git checkout mastercd -
此時,重新觸發(fā)編譯一次,一定可以成功的!
五、總結(jié)
這篇文章是屬于工具型的,一旦部署好之后,每次編譯只需要在瀏覽器中點一下按鈕就行,再也不用 ssh 登錄到遠程電腦中去手動操作了。
如果你還想繼續(xù)深入一下的話,下面幾件事情可以研究一下:
1. Jenkins 是如何保持編譯歷史記錄的
在目錄 /var/lib/jenkins/jobs/Test3/builds 下面,可以看到很多以數(shù)字命名的文件夾,記錄了每一次的編譯信息。
2. 編譯后動作
在我們的編譯腳本 build.sh 文件中,僅僅是生成了可執(zhí)行文件,你還可以繼續(xù)擴充功能,例如:自動部署。
或者在項目配置的 [Post-build Actions] 中,重新寫一個專門用來自動部署的腳本文件。
3. git subtree 功能
它與 git submodule 很類似,但是本質(zhì)不一樣。
subtree直接把子模塊代碼拷貝到主模塊中,使用命令簡單;submodule 使用的是“指針”指向子模塊,使用命令相對復(fù)雜一些,功能也更強大;4. 繼續(xù)研究 Jenkins 中的插件功能
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
11月20日火熱報名中>> 2024 智能家居出海論壇
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【在線會議】多物理場仿真助跑新能源汽車
推薦專題
- 1 腦機接口芯片,華為出了新專利!
- 2 今年諾獎對人工智能的重視,給我們的基礎(chǔ)教育提了個醒
- 3 銀行業(yè)AI大模型,從入局到求變
- 4 巨頭搶布局,VC狂撒錢,為了能讓「AI讀心」這些公司卷瘋了
- 5 阿斯麥ASML:“骨折級”洋相,又成AI第一殺手?
- 6 蘋果市值創(chuàng)新高,iPhone 16能否助力突破4萬億美元大關(guān)?
- 7 一場“載入史冊”的發(fā)布會,讓馬斯克失去了4700億
- 8 百度谷歌比較研究2024:中美“遠古AI龍頭”的現(xiàn)狀與趨勢
- 9 洞見AI風(fēng)潮 第二屆vivo藍河操作系統(tǒng)創(chuàng)新賽開啟招募
- 10 地平線開啟配售,阿里百度各砸5000萬美金,市值最高超500億
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市