使用Jenkins git submodule 實(shí)現(xiàn)自動(dòng)化編譯,解決代碼安全性問(wèn)題
道哥的第 030 篇原創(chuàng)
-
一、一個(gè)真實(shí)的代碼泄漏故事
-
二、Jenkins 的基本使用
-
三、git submodule 基本使用
-
四、在 Jenkins 中使用 git module 來(lái)編譯所有的模塊
-
五、總結(jié)
-
六、資源下載
一、一個(gè)真實(shí)的小故事
事情發(fā)生在功能機(jī)的時(shí)代,我們項(xiàng)目組開發(fā)一款手機(jī),軟件開發(fā)成員大概有 20 人左右吧。結(jié)果在手機(jī)發(fā)布的一周后,另一家小廠就推出了軟件界面、功能幾乎完全一樣的手機(jī),除了開機(jī)界面。
如果您需要文中提到的軟件和代碼資源,在文章末尾可以找到下載方式。
- Jenkins 的基本使用方法;
- git submodule 的基本指令用法;
- 通過(guò)三個(gè) demo 項(xiàng)目,一步一步操作實(shí)現(xiàn)代碼的安全管控;
- 利用 Jenkins git submodule 來(lái)實(shí)現(xiàn)自動(dòng)化編譯;
- git subtree 與 submodule 的區(qū)別;
二、Jenkins 的基本使用
1. Jenkins 是什么?
Jenkins是一個(gè)開源、由 Java 編寫的持續(xù)集成工具,也就是說(shuō)它幫助我們自動(dòng)構(gòu)建各類項(xiàng)目。Jenkins 運(yùn)行在 Servlet 容器中(例如 Apache Tomcat),在 Ubuntu 系統(tǒng)中使用 apt-get 就可以一鍵安裝。
其他的有點(diǎn)我就不吹了,我覺(jué)得很好用,如果有機(jī)會(huì),你也可以試一下。另外,我測(cè)試用的虛擬機(jī)是新安裝的 Ubuntu16.04-64,按照下面的流程操作,保證可以順利運(yùn)行。
- 嵌入在 Web 服務(wù)器中,通過(guò)瀏覽器來(lái)操作,非常方便;
- 可以執(zhí)行基于Apache Ant和Apache Maven的項(xiàng)目,以及任意的Shell腳本和Windows批處理命令;
- 可以通過(guò)各種手段觸發(fā)構(gòu)建。例如提交給版本控制系統(tǒng)時(shí)被觸發(fā),通過(guò)類似Cron的機(jī)制調(diào)度,在其他的構(gòu)建已經(jīng)完成時(shí),還可以通過(guò)一個(gè)特定的URL進(jìn)行請(qǐng)求;
- Jenkins強(qiáng)大的插件式,使得Jenkins可以集成很多軟件,可能幫助我們持續(xù)集成我們的工程項(xiàng)目;
- 給用戶很大的權(quán)限和靈活性來(lái)自動(dòng)發(fā)布、部署等等。
2. 安裝 JDK8
(1) 下載,解壓
(2) 設(shè)置環(huán)境變量
我建議你也用這樣的環(huán)境變量,以后如果升級(jí) JDK 版本,只需要修改JAVA_HOME就可以了。
3. 安裝 Jenkins
(1) 導(dǎo)入 Jenkins 存儲(chǔ)庫(kù)的 GPG 密鑰
(2) Jenkins存儲(chǔ)庫(kù)添加到系統(tǒng)中
(3) 使用 apt 安裝
Jenkins 服務(wù)將在安裝過(guò)程完成后自動(dòng)啟動(dòng),可以通過(guò)指令systemctl status jenkins進(jìn)行驗(yàn)證。
文件二:/etc/default/jenkins
如果不幸遇到錯(cuò)誤,可以反復(fù)使用這兩個(gè)指令來(lái)排除錯(cuò)誤。
4. 在瀏覽器中配置 Jenkins
在瀏覽器中輸入: htpp://localhost:9090,稍等一會(huì),出現(xiàn)界面:
5. 在 Jenkins 中配置一個(gè)小項(xiàng)目
(1) 準(zhǔn)備一個(gè)測(cè)試代碼 Test1
6. 手動(dòng)觸發(fā)編譯一次
由于在上面的步驟(6)中,我們沒(méi)有選擇任何觸發(fā)條件,所以需要我們?cè)陧?xiàng)目 Test1 的主界面中,手動(dòng)單擊左側(cè)的 Build Now 按鈕來(lái)觸發(fā)。
三、git submodule 基本使用
1. git submodule 是什么?
git submodule 是用于多模塊管理的工具,它允許一個(gè)項(xiàng)目作為 repository,其他項(xiàng)目作為子模塊存在于在父項(xiàng)目中。
添加子模塊: 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。
為什么要這樣設(shè)計(jì)模塊: 安全!
- 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ù)。
項(xiàng)目經(jīng)理需要把 Test1 和 Test2 作為 sub module,添加到 Test3 中,執(zhí)行下面的指令:
- 開發(fā)人員A:負(fù)責(zé) Test1,沒(méi)有權(quán)限拿到其他模塊的代碼;
- 開發(fā)人員B:負(fù)責(zé) Test2,沒(méi)有權(quán)限拿到其他模塊的代碼;
- 項(xiàng)目經(jīng)理:負(fù)責(zé) Test3 和 代碼整合,能拿到所有的代碼;
1. git submodule add https://gitee.com/[你的賬號(hào)]/test1.git test1把 Test1 和 Test2 作為子模塊添加到 Test3 中之后,看一下文件有什么變化:
2. git submodule add https://gitee.com/[你的賬號(hào)]/test2.git test2
3. 在一個(gè)空目錄中來(lái)編譯、驗(yàn)證一下可行性
我們?cè)诹硪粋€(gè)空目錄中,clone 一下 Test3 這個(gè)項(xiàng)目,可以發(fā)現(xiàn):克隆下來(lái)的 test1 和 test2 文件夾中是空的,如下所示:
此時(shí),再使用 tree 命令看一下文件變化,可以看到 test1 和 test2 的文件都被拉取下來(lái)了。這里有一個(gè)問(wèn)題需要注意:雖然子模塊的代碼被拉取下來(lái)了,但是其 head 并沒(méi)有指向 master 分支,需要手動(dòng)處理一下,如圖:
四、在 Jenkins 中使用 git module 來(lái)編譯所有的模塊
下面的操作,都是在瀏覽器的 Jenkins 面板中來(lái)操作的。
1. 重新配置項(xiàng)目
因?yàn)槲覀兪窃?span> Test3 中,來(lái)編譯整個(gè)項(xiàng)目(Test1 和 Test2 被作為子模塊包括進(jìn)來(lái)),因此首先把之前添加的 Test1 項(xiàng)目刪除掉,如圖:
當(dāng)然,也可以直接在之前的 Test1 項(xiàng)目基礎(chǔ)上進(jìn)行修改。
- 輸入描述信息,選擇自由風(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è)置;
此時(shí),重新觸發(fā)編譯一次,一定可以成功的!
五、總結(jié)
這篇文章是屬于工具型的,一旦部署好之后,每次編譯只需要在瀏覽器中點(diǎn)一下按鈕就行,再也不用 ssh 登錄到遠(yuǎn)程電腦中去手動(dòng)操作了。
1. Jenkins 是如何保持編譯歷史記錄的
在目錄 /var/lib/jenkins/jobs/Test3/builds 下面,可以看到很多以數(shù)字命名的文件夾,記錄了每一次的編譯信息。
2. 編譯后動(dòng)作
在我們的編譯腳本 build.sh 文件中,僅僅是生成了可執(zhí)行文件,你還可以繼續(xù)擴(kuò)充功能,例如:自動(dòng)部署。
3. git subtree 功能
它與 git submodule 很類似,但是本質(zhì)不一樣。
- subtree直接把子模塊代碼拷貝到主模塊中,使用命令簡(jiǎn)單;
- submodule 使用的是“指針”指向子模塊,使用命令相對(duì)復(fù)雜一些,功能也更強(qiáng)大;
4. 繼續(xù)研究 Jenkins 中的插件功能
六、資源下載
文中用到的資源,放在了網(wǎng)盤中。如果需要的話,請(qǐng)?jiān)诠娞?hào)留言區(qū)發(fā)送數(shù)字:030,即可收到下載地址。