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