溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

發(fā)布時(shí)間:2021-09-06 14:50:49 來(lái)源:億速云 閱讀:201 作者:小新 欄目:web開(kāi)發(fā)

這篇文章主要介紹了如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、一個(gè)真實(shí)的小故事

事情發(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):

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. Jenkins 的基本使用方法;

  3. git submodule 的基本指令用法;

  4. 通過(guò)三個(gè) demo 項(xiàng)目,一步一步操作實(shí)現(xiàn)代碼的安全管控;

  5. 利用 Jenkins + git submodule 來(lái)實(shí)現(xiàn)自動(dòng)化編譯;

  6. git subtree 與 submodule 的區(qū)別;

如果您需要文中提到的軟件和代碼資源,在文章末尾可以找到下載方式。

二、Jenkins 的基本使用

1. Jenkins 是什么?

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è)主題。

2. 安裝 JDK8

(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)

3. 安裝 Jenkins

(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ò)誤。

4. 在瀏覽器中配置 Jenkins

在瀏覽器中輸入: htpp://localhost:9090,稍等一會(huì),出現(xiàn)界面:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

按照界面提示,從 /var/lib/jenkins/secrets/initialAdminPassword 文件中復(fù)制安全密碼(需要 root  權(quán)限),填入到瀏覽器窗口中。

此時(shí)出現(xiàn)安裝插件窗口,一般只需要安裝推薦的插件即可:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

插件安裝結(jié)束后,進(jìn)入管理員配置界面:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

至此,Jenkins 的安裝就順利完成了!

5. 在 Jenkins 中配置一個(gè)小項(xiàng)目

(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)目

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

(3) 輸入項(xiàng)目名稱(chēng),并選擇第一個(gè)自由風(fēng)格(Free project)

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

(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:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

輸入 Username 和 Password :

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

賬號(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)目:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

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

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

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

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

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

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

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dò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 目錄中了:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

到這里,你已經(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 中之后,看一下文件有什么變化:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

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

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

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

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

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

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

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

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

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

需要手動(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)處理一下,如圖:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(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 Submodule實(shí)現(xiàn)自動(dòng)化編譯

四、在 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)目刪除掉,如圖:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

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

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 輸入描述信息,選擇自由風(fēng)格項(xiàng)目;

  3. 輸入 git 倉(cāng)庫(kù)地址和賬戶信息,選擇 master 分支;

  4. 觸發(fā)器不設(shè)置;

  5. 編譯環(huán)境不設(shè)置;

  6. 編譯:選擇 Execute shell 執(zhí)行腳本,輸入編譯指令:./build.sh。(剛才說(shuō)了,Jenkins  這是一個(gè)自動(dòng)化構(gòu)建框架,具體的編譯過(guò)程由用戶決定,所以我們這里的編譯過(guò)程就是執(zhí)行 Test3 下的 build.sh 這個(gè)腳本。);

  7. 編譯后動(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ò)誤:

如何使用Jenkins + Git Submodule實(shí)現(xiàn)自動(dòng)化編譯

原因正如前文所說(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í)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI