訂閱
糾錯(cuò)
加入自媒體

Jenkins + git submodule:解決代碼安全性問(wèn)題

(8) Build 編譯

就是告訴 Jenkins 如何來(lái)構(gòu)建系統(tǒng),也就是說(shuō):Jenkins只是一個(gè)自動(dòng)化的構(gòu)建系統(tǒng),具體的編譯過(guò)程,可以由用戶自己來(lái)決定,有如下選擇項(xiàng)目:

我們這里選擇直接執(zhí)行腳本(Execute Shell),輸入如下指令:

(9) Post-build Actions 編譯后操作

告訴 Jenkins: 編譯一個(gè)工程之后,需要做哪些事情?例如:發(fā)送郵件,觸發(fā)下一個(gè)工程的自動(dòng)編譯等等,而且可以添加多個(gè)動(dòng)作?蛇x項(xiàng)如下:

以上步驟配置好之后,Save 保存,此時(shí)在主界面就可以看到這個(gè)項(xiàng)目的全貌了,如下圖:

在 Jenkins 后臺(tái)中,這個(gè)項(xiàng)目的保存路徑是:/var/lib/jenkins/jobs/Test1。

6. 手動(dòng)觸發(fā)編譯一次

由于在上面的步驟(6)中,我們沒(méi)有選擇任何觸發(fā)條件,所以需要我們?cè)陧?xiàng)目 Test1 的主界面中,手動(dòng)單擊左側(cè)的 Build Now 按鈕來(lái)觸發(fā)。

此時(shí),在左側(cè)的 Build History 中,可以看到編譯歷史記錄,單擊某次編譯記錄編號(hào),可以看到這一次編譯的詳細(xì)信息。

在編譯詳細(xì)信息中,單擊左側(cè)的 Console Output 按鈕,可以看到編譯的輸出信息:成功編譯得到可執(zhí)行文件。

我們可以在 Jenkins 后臺(tái)中看到,源代碼被拉到 /var/lib/jenkins/jobs/Test1/workspace 目錄中了:

到這里,你已經(jīng)學(xué)會(huì)了 Jenkins 的最基本操作!

下面我們繼續(xù)講一下 git submodule 的使用,這部分才是核心內(nèi)容!

三、git submodule 基本使用

 1. git submodule 是什么?

git submodule 是用于多模塊管理的工具,它允許一個(gè)項(xiàng)目作為 repository,其他項(xiàng)目作為子模塊存在于在父項(xiàng)目中。

父項(xiàng)目和子項(xiàng)目的提交是分開(kāi)的,也就是說(shuō)父項(xiàng)目提交的信息只包含子項(xiàng)目的信息,而不會(huì)包含子項(xiàng)目的代碼;子項(xiàng)目有自己獨(dú)立的 commit,push,pull操作。

git submodule 一般用在比較大的項(xiàng)目中,為了便于復(fù)用,或者為了代碼的安全性,常常需要分成若干個(gè)子項(xiàng)目來(lái)進(jìn)行代碼管理。

常用的指令包括:

添加子模塊: git submodule add

更新子模塊: git submodule update

初始化子模塊: git submodule init遞歸的方式克隆整個(gè)項(xiàng)目: git clone--recursive

拉取所有子模塊: git submodule foreach git pull

2. 利用三個(gè)小項(xiàng)目,來(lái)測(cè)試一下 submodule 的用法

為了便于演示,我們我們創(chuàng)建 3 個(gè)項(xiàng)目,把它們都推送到遠(yuǎn)程倉(cāng)庫(kù)中,這里使用 gitee。

Test1:編譯得到一個(gè)動(dòng)態(tài)庫(kù):libtest1.so;Test2:編譯得到一個(gè)動(dòng)態(tài)度:libtest2.so;Test3:編譯得到一個(gè)可執(zhí)行程序,加載、調(diào)用上面 2 個(gè)動(dòng)態(tài)庫(kù)中的函數(shù)。

為什么要這樣設(shè)計(jì)模塊: 安全!

開(kāi)發(fā)人員A:負(fù)責(zé) Test1,沒(méi)有權(quán)限拿到其他模塊的代碼;開(kāi)發(fā)人員B:負(fù)責(zé) Test2,沒(méi)有權(quán)限拿到其他模塊的代碼;項(xiàng)目經(jīng)理:負(fù)責(zé) Test3 和 代碼整合,能拿到所有的代碼;

項(xiàng)目經(jīng)理需要把 Test1 和 Test2 作為 sub module,添加到 Test3 中,執(zhí)行下面的指令:

1. git submodule add https://gitee.com/[你的賬號(hào)]/test1.git test1

2. git submodule add https://gitee.com/[你的賬號(hào)]/test2.git test2

把 Test1 和 Test2 作為子模塊添加到 Test3 中之后,看一下文件有什么變化:

你還可以看一下 .gitmodules 文件中的內(nèi)容,可以看出,git 工具就是通過(guò)這個(gè)配置文件來(lái)管理子模塊的。

管理員需要對(duì)所有的模塊進(jìn)行整合、編譯,因此,我們?cè)?Test3 目錄下添加一個(gè)腳本 build.sh,所有的編譯指令,都寫(xiě)在這個(gè)腳本中,內(nèi)容如下:

內(nèi)容都是最最基本的,直接調(diào)用 make 指令即可,執(zhí)行一下,輸出:

到這里,我們就完成了子模塊的添加功能。

3. 在一個(gè)空目錄中來(lái)編譯、驗(yàn)證一下可行性

我們?cè)诹硪粋(gè)空目錄中,clone 一下 Test3 這個(gè)項(xiàng)目,可以發(fā)現(xiàn):克隆下來(lái)的 test1 和 test2 文件夾中是空的,如下所示:

需要手動(dòng)獲取所有的子模塊,執(zhí)行指令:

git submodule update --init --recursive

此時(shí),再使用 tree 命令看一下文件變化,可以看到 test1 和 test2 的文件都被拉取下來(lái)了。這里有一個(gè)問(wèn)題需要注意:雖然子模塊的代碼被拉取下來(lái)了,但是其 head 并沒(méi)有指向 master 分支,需要手動(dòng)處理一下,如圖:

這個(gè)時(shí)候,我們?cè)?test3 目錄下再次執(zhí)行腳本 build.sh,就可以順利編譯所有的子模塊了。

以上這幾個(gè)步驟,我們是在本地的一個(gè)臨時(shí)目錄,手動(dòng)測(cè)試 submodule 的編譯過(guò)程。

下一個(gè)章節(jié)我們把這個(gè)過(guò)程部署到 Jenkins 系統(tǒng)中,所以剛才執(zhí)行的這幾個(gè)指令,就需要寫(xiě)在 build.sh 腳本中了。build.sh 的內(nèi)容變?yōu)椋?/p>

四、在 Jenkins 中使用 git module 來(lái)編譯所有的模塊

下面的操作,都是在瀏覽器的 Jenkins 面板中來(lái)操作的。

1. 重新配置項(xiàng)目

因?yàn)槲覀兪窃?Test3 中,來(lái)編譯整個(gè)項(xiàng)目(Test1 和 Test2 被作為子模塊包括進(jìn)來(lái)),因此首先把之前添加的 Test1 項(xiàng)目刪除掉,如圖:

然后重新添加項(xiàng)目 Test3,復(fù)習(xí)一下步驟:

輸入描述信息,選擇自由風(fēng)格項(xiàng)目;輸入 git 倉(cāng)庫(kù)地址和賬戶信息,選擇 master 分支;觸發(fā)器不設(shè)置;編譯環(huán)境不設(shè)置;編譯:選擇 Execute shell 執(zhí)行腳本,輸入編譯指令:./build.sh。(剛才說(shuō)了,Jenkins 這是一個(gè)自動(dòng)化構(gòu)建框架,具體的編譯過(guò)程由用戶決定,所以我們這里的編譯過(guò)程就是執(zhí)行 Test3 下的 build.sh 這個(gè)腳本。);編譯后動(dòng)作不設(shè)置;

當(dāng)然,也可以直接在之前的 Test1 項(xiàng)目基礎(chǔ)上進(jìn)行修改。

此時(shí),我們?cè)?Jenkins 中直接點(diǎn)擊 Build Now 按鈕,如果不出意外的話,會(huì)提示編譯錯(cuò)誤(左側(cè)的 Build History 下面出現(xiàn)紅色的錯(cuò)誤圓圈)。

點(diǎn)進(jìn)去,看一下輸出信息(Console Output 按鈕),提示錯(cuò)誤:

原因正如前文所說(shuō),子模塊在獲取之后,head 沒(méi)有指向 master 分支,需要我們?cè)诘谝淮尉幾g時(shí)手動(dòng)修改一下(我沒(méi)有找到其它方法,如果你知道的話,請(qǐng)不吝賜教!)

手動(dòng)解決:在命令行窗口中,進(jìn)入 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 -

此時(shí),重新觸發(fā)編譯一次,一定可以成功的!

五、總結(jié)

這篇文章是屬于工具型的,一旦部署好之后,每次編譯只需要在瀏覽器中點(diǎn)一下按鈕就行,再也不用 ssh 登錄到遠(yuǎn)程電腦中去手動(dòng)操作了。

如果你還想繼續(xù)深入一下的話,下面幾件事情可以研究一下:

1. Jenkins 是如何保持編譯歷史記錄的

在目錄 /var/lib/jenkins/jobs/Test3/builds 下面,可以看到很多以數(shù)字命名的文件夾,記錄了每一次的編譯信息。

2. 編譯后動(dòng)作

在我們的編譯腳本 build.sh 文件中,僅僅是生成了可執(zhí)行文件,你還可以繼續(xù)擴(kuò)充功能,例如:自動(dòng)部署。

或者在項(xiàng)目配置的 [Post-build Actions] 中,重新寫(xiě)一個(gè)專門(mén)用來(lái)自動(dòng)部署的腳本文件。

3. git subtree 功能

它與 git submodule 很類似,但是本質(zhì)不一樣。

subtree直接把子模塊代碼拷貝到主模塊中,使用命令簡(jiǎn)單;submodule 使用的是“指針”指向子模塊,使用命令相對(duì)復(fù)雜一些,功能也更強(qiáng)大;4. 繼續(xù)研究 Jenkins 中的插件功能

<上一頁(yè)  1  2  3  
聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)