您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
事情發(fā)生在功能機(jī)的時(shí)代,我們項(xiàng)目組開(kāi)發(fā)一款手機(jī),軟件開(kāi)發(fā)成員大概有 20 人左右吧。結(jié)果在手機(jī)發(fā)布的一周后,另一家小廠就推出了軟件界面、功能幾乎完全一樣的手機(jī),除了開(kāi)機(jī)界面。
因?yàn)槟莻€(gè)時(shí)代,大家?guī)缀醵际鞘褂?MTK、高通提供的解決方案,都是統(tǒng)一的菜單式功能,你沒(méi)法拿出有力的證據(jù)來(lái)說(shuō)明別人偷竊了你的代碼。
后來(lái)內(nèi)部查明,的確是有開(kāi)發(fā)人員把代碼泄漏出去了,于是后來(lái)所有的電腦上 USB 口全部被禁掉了。
這是我親身經(jīng)歷的真實(shí)故事,當(dāng)時(shí)每個(gè)人負(fù)責(zé)一個(gè)模塊,比如:A 負(fù)責(zé)通話管理和電話簿,B 負(fù)責(zé)系統(tǒng)設(shè)置,C 負(fù)責(zé)短信和彩信。。。在編譯的時(shí)候,是需要所有的代碼放在一起,統(tǒng)一編譯的,這也就意味著所有的軟件人員都可以拿到全部源代碼,這也就為代碼泄漏埋下了隱患,出現(xiàn)了這次嚴(yán)重的事件,畢竟人為財(cái)死、鳥(niǎo)為食亡!
那么,是否有一些代碼管控方式,來(lái)解決這個(gè)權(quán)限問(wèn)題呢?
現(xiàn)在項(xiàng)目中,都強(qiáng)調(diào)要分層、分模塊,這是從軟件工程的角度來(lái)考慮的。如果再進(jìn)一步, 把這些模塊都劃分為一個(gè)小的子系統(tǒng),每個(gè)開(kāi)發(fā)人員只負(fù)責(zé)自己的模塊,并且只能有權(quán)限拉取自己的代碼,這樣他就沒(méi)法獲取到一個(gè)項(xiàng)目中所有模塊的代碼了。
只有項(xiàng)目整合人員(管理員),才有全部權(quán)限來(lái)拉取所有源代碼來(lái)構(gòu)建整個(gè)系統(tǒng),這樣的話,就可以對(duì)代碼的安全問(wèn)題有更好的掌控了。
要實(shí)現(xiàn)這樣的代碼管控,使用 git 工具中的 submodule 就可以完成,這篇文章,我們就來(lái)詳細(xì)的講解一下 git submodule 的使用。
這篇文章是工具型的,可能比較長(zhǎng),為了提供一站式服務(wù),我會(huì)把相關(guān)的資源、步驟、遇到的錯(cuò)誤信息等細(xì)節(jié)都記錄下來(lái),方便以后查閱。
不論如何,經(jīng)過(guò)這篇文章,你可以學(xué)習(xí)、了解下面這幾個(gè)方面的知識(shí)點(diǎn):
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
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是一個(gè)開(kāi)源、由 Java 編寫(xiě)的持續(xù)集成工具,也就是說(shuō)它幫助我們自動(dòng)構(gòu)建各類(lèi)項(xiàng)目。Jenkins 運(yùn)行在 Servlet 容器中(例如 Apache Tomcat),在 Ubuntu 系統(tǒng)中使用 apt-get 就可以一鍵安裝。
Jenkins 有下面幾個(gè)特點(diǎn):
嵌入在 Web 服務(wù)器中,通過(guò)瀏覽器來(lái)操作,非常方便;
可以執(zhí)行基于Apache Ant和Apache Maven的項(xiàng)目,以及任意的Shell腳本和Windows批處理命令;
可以通過(guò)各種手段觸發(fā)構(gòu)建。例如提交給版本控制系統(tǒng)時(shí)被觸發(fā),通過(guò)類(lèi)似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ā)布、部署等等。
其他的有點(diǎn)我就不吹了,我覺(jué)得很好用,如果有機(jī)會(huì),你也可以試一下。另外,我測(cè)試用的虛擬機(jī)是新安裝的 Ubuntu16.04-64,按照下面的流程操作,保證可以順利運(yùn)行。
JDK 和 Jenkins 的安裝方法,在網(wǎng)絡(luò)上很多資料,有些過(guò)程是有問(wèn)題的,或者某些關(guān)鍵步驟沒(méi)寫(xiě)清楚。為了便于你一次就操作成功,我還是記錄在這里。
如果你對(duì)安裝過(guò)程已經(jīng)很熟悉了,可以直接滑到下一個(gè)主題。
(1) 下載,解壓
下載 jdk-8u221-linux-x64.tar.gz,(文末提供下載地址),解壓到目錄 /home/sewain/OpenSource ,解壓指令:
sudo tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt
(2) 設(shè)置環(huán)境變量
執(zhí)行指令:vim ~/.bashrc,在末尾添加如下內(nèi)容:
export JAVA_HOME=/opt/jdk1.8.0_221 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=./$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jart
我建議你也用這樣的環(huán)境變量,以后如果升級(jí) JDK 版本,只需要修改 JAVA_HOME 就可以了。
(3) )重新加載環(huán)境變量
執(zhí)行指令:source ~/.bashrc,此時(shí)環(huán)境變量就生效了。
驗(yàn)證一下: java -version,出現(xiàn)如下信息就說(shuō)明 OK 了:
java version "1.8.0_221" Java(TM) SE Runtime Environment (build 1.8.0_221-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
(1) 導(dǎo)入 Jenkins 存儲(chǔ)庫(kù)的 GPG 密鑰
sudo wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
(2) Jenkins存儲(chǔ)庫(kù)添加到系統(tǒng)中
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
(3) 使用 apt 安裝
sudo apt update sudo apt install jenkins
Jenkins 服務(wù)將在安裝過(guò)程完成后自動(dòng)啟動(dòng),可以通過(guò)指令 systemctl status jenkins 進(jìn)行驗(yàn)證。
systemctl status jenkins
(4) 配置端口
Jenkins 是嵌入在一個(gè) tomcat 服務(wù)器中的,默認(rèn)使用端口 8080,容易與其他服務(wù)沖突,因此需要修改一下。涉及到 2 個(gè)文件:
文件一:/etc/init.d/jenkins
第一行的 PATH 變量中,添加自己的 JDK 地址:
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/opt/jdk1.8.0_221/bin
文件二:/etc/default/jenkins
把 HTTP_PORT 的值修改為新的端口號(hào),例如: HTTP_PORT=9090 。
(5) Jenkins 的啟動(dòng)和停止指令
sudo service jenkins start sudo service jenkins stop
如果不幸遇到錯(cuò)誤,可以反復(fù)使用這兩個(gè)指令來(lái)排除錯(cuò)誤。
在瀏覽器中輸入: htpp://localhost:9090,稍等一會(huì),出現(xiàn)界面:
按照界面提示,從 /var/lib/jenkins/secrets/initialAdminPassword 文件中復(fù)制安全密碼(需要 root 權(quán)限),填入到瀏覽器窗口中。
此時(shí)出現(xiàn)安裝插件窗口,一般只需要安裝推薦的插件即可:
插件安裝結(jié)束后,進(jìn)入管理員配置界面:
至此,Jenkins 的安裝就順利完成了!
(1) 準(zhǔn)備一個(gè)測(cè)試代碼 Test1
Jenkins 僅僅是一個(gè)構(gòu)件框架,具體的編譯過(guò)程是由用戶來(lái)決定的。Jenkins 首先通過(guò) git 工具獲取遠(yuǎn)程倉(cāng)庫(kù)中的代碼,然后執(zhí)行用戶指定的編譯指令。
因此,我們需要先提前準(zhǔn)備好一份測(cè)試代碼,并放到 Jenkins 可以訪問(wèn)到的遠(yuǎn)程倉(cāng)庫(kù)中,當(dāng)然了,你在本地的 Ubuntu 系統(tǒng)中部署一個(gè) git 倉(cāng)庫(kù)也是可以的。為了方便,我測(cè)試的代碼 Test1 放在 gitee 中了。
(2) 創(chuàng)建一個(gè)新項(xiàng)目
(3) 輸入項(xiàng)目名稱(chēng),并選擇第一個(gè)自由風(fēng)格(Free project)
(4) 在第一個(gè)標(biāo)簽 General下,輸入項(xiàng)目的描述信息(Description)
內(nèi)容可以隨便寫(xiě)。
(5) Source Code Management 源碼管理
Jenkins 在構(gòu)建(編譯)的過(guò)程中,需要獲取到源代碼,因此需要配置 git 倉(cāng)庫(kù)的地址和賬號(hào)信息(用戶名和密碼)。
首先在 Add 下拉按鈕下,選擇 Jenkins:
輸入 Username 和 Password :
賬號(hào)添加之后,在 Credentials 的下拉框中,選擇剛才添加的 gitee 賬戶,此時(shí)可以看到 紅色的權(quán)限錯(cuò)誤提示消失了,說(shuō)明可以拉取到遠(yuǎn)程倉(cāng)庫(kù)中的源代碼了。
(6) Build Triggers 選擇編譯觸發(fā)器
可以根據(jù)需要選擇不同的方式來(lái)觸發(fā),比如:定時(shí)觸發(fā),當(dāng)其他某個(gè)項(xiàng)目構(gòu)建成功之后觸發(fā)等等。
我們這里不選擇任何項(xiàng)目,下面我們會(huì)在主界面,手動(dòng)點(diǎn)擊按鈕來(lái)觸發(fā)。
(7) Build Environment 編譯環(huán)境
這部分我用的比較少,利用其他工具來(lái)輔助 Jenkins 的功能。
(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)中,我們沒(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 是用于多模塊管理的工具,它允許一個(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
為了便于演示,我們我們創(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í)行一下,輸出:
到這里,我們就完成了子模塊的添加功能。
我們?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 面板中來(lái)操作的。
因?yàn)槲覀兪窃?Test3 中,來(lái)編譯整個(gè)項(xiàng)目(Test1 和 Test2 被作為子模塊包括進(jìn)來(lái)),因此首先把之前添加的 Test1 項(xiàng)目刪除掉,如圖:
然后重新添加項(xiàng)目 Test3,復(fù)習(xí)一下步驟:
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
輸入描述信息,選擇自由風(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 --recursive cd test1/ git checkout master cd - cd test2/ git checkout master cd -
此時(shí),重新觸發(fā)編譯一次,一定可以成功的!
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。