日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 滿天芯
[導讀]道哥的第030篇原創(chuàng)一、一個真實的代碼泄漏故事二、Jenkins的基本使用三、gitsubmodule基本使用四、在Jenkins中使用gitmodule來編譯所有的模塊五、總結六、資源下載一、一個真實的小故事事情發(fā)生在功能機的時代,我們項目組開發(fā)一款手機,軟件開發(fā)成員大概有20...


道哥的第 030 篇原創(chuàng)


  • 一、一個真實的代碼泄漏故事


  • 二、Jenkins 的基本使用


  • 三、git submodule 基本使用


  • 四、在 Jenkins 中使用 git module 來編譯所有的模塊


  • 五、總結


  • 六、資源下載


一、一個真實的小故事

事情發(fā)生在功能機的時代,我們項目組開發(fā)一款手機,軟件開發(fā)成員大概有 20 人左右吧。結果在手機發(fā)布的一周后,另一家小廠就推出了軟件界面、功能幾乎完全一樣的手機,除了開機界面。


因為那個時代,大家?guī)缀醵际鞘褂?span> MTK、高通提供的解決方案,都是統(tǒng)一的菜單式功能,你沒法拿出有力的證據(jù)來說明別人偷竊了你的代碼。


后來內部查明,的確是有開發(fā)人員把代碼泄漏出去了,于是后來所有的電腦上 USB 口全部被禁掉了。


這是我親身經(jīng)歷的真實故事,當時每個人負責一個模塊,比如:A 負責通話管理和電話簿,B 負責系統(tǒng)設置,C 負責短信和彩信。。。在編譯的時候,是需要所有的代碼放在一起,統(tǒng)一編譯的,這也就意味著所有的軟件人員都可以拿到全部源代碼,這也就為代碼泄漏埋下了隱患,出現(xiàn)了這次嚴重的事件,畢竟人為財死、鳥為食亡!


那么,是否有一些代碼管控方式,來解決這個權限問題呢?


現(xiàn)在項目中,都強調要分層、分模塊,這是從軟件工程的角度來考慮的。如果再進一步, 把這些模塊都劃分為一個小的子系統(tǒng),每個開發(fā)人員只負責自己的模塊,并且只能有權限拉取自己的代碼,這樣他就沒法獲取到一個項目中所有模塊的代碼了。


只有項目整合人員(管理員),才有全部權限來拉取所有源代碼來構建整個系統(tǒng),這樣的話,就可以對代碼的安全問題有更好的掌控了。


要實現(xiàn)這樣的代碼管控,使用 git 工具中的 submodule 就可以完成,這篇文章,我們就來詳細的講解一下 git submodule 的使用


這篇文章是工具型的,可能比較長,為了提供一站式服務,我會把相關的資源、步驟、遇到的錯誤信息等細節(jié)都記錄下來,方便以后查閱。


不論如何,經(jīng)過這篇文章,你可以學習、了解下面這幾個方面的知識點:


  1. Jenkins 的基本使用方法;
  2. git submodule 的基本指令用法;
  3. 通過三個 demo 項目,一步一步操作實現(xiàn)代碼的安全管控;
  4. 利用 Jenkins git submodule 來實現(xiàn)自動化編譯;
  5. git subtree 與 submodule 的區(qū)別;
如果您需要文中提到的軟件和代碼資源,在文章末尾可以找到下載方式。


二、Jenkins 的基本使用

1. Jenkins 是什么?

Jenkins是一個開源、由 Java 編寫的持續(xù)集成工具,也就是說它幫助我們自動構建各類項目。Jenkins 運行在 Servlet 容器中(例如 Apache Tomcat),在 Ubuntu 系統(tǒng)中使用 apt-get 就可以一鍵安裝。


Jenkins 有下面幾個特點:


  1. 嵌入在 Web 服務器中,通過瀏覽器來操作,非常方便;
  2. 可以執(zhí)行基于Apache Ant和Apache Maven的項目,以及任意的Shell腳本和Windows批處理命令;
  3. 可以通過各種手段觸發(fā)構建。例如提交給版本控制系統(tǒng)時被觸發(fā),通過類似Cron的機制調度,在其他的構建已經(jīng)完成時,還可以通過一個特定的URL進行請求;
  4. Jenkins強大的插件式,使得Jenkins可以集成很多軟件,可能幫助我們持續(xù)集成我們的工程項目;
  5. 給用戶很大的權限和靈活性來自動發(fā)布、部署等等。
其他的有點我就不吹了,我覺得很好用,如果有機會,你也可以試一下。另外,我測試用的虛擬機是新安裝的 Ubuntu16.04-64,按照下面的流程操作,保證可以順利運行。


JDK 和 Jenkins 的安裝方法,在網(wǎng)絡上很多資料,有些過程是有問題的,或者某些關鍵步驟沒寫清楚。為了便于你一次就操作成功,我還是記錄在這里。


如果你對安裝過程已經(jīng)很熟悉了,可以直接滑到下一個主題。


2. 安裝 JDK8

(1) 下載,解壓


下載 jdk-8u221-linux-x64.tar.gz,(文末提供下載地址),解壓到目錄 /home/sewain/OpenSource ,解壓指令:


sudo tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt
(2) 設置環(huán)境變量


執(zhí)行指令:vim ~/.bashrc,在末尾添加如下內容:


export JAVA_HOME=/opt/jdk1.8.0_221export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=./$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jart
我建議你也用這樣的環(huán)境變量,以后如果升級 JDK 版本,只需要修改JAVA_HOME就可以了。


(3) )重新加載環(huán)境變量


執(zhí)行指令:source ~/.bashrc,此時環(huán)境變量就生效了。


驗證一下:java -version,出現(xiàn)如下信息就說明 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) 導入 Jenkins 存儲庫的 GPG 密鑰


sudo wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
(2) Jenkins存儲庫添加到系統(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 updatesudo apt install jenkins
Jenkins 服務將在安裝過程完成后自動啟動,可以通過指令systemctl status jenkins進行驗證。


systemctl status jenkins (4) 配置端口


Jenkins 是嵌入在一個 tomcat 服務器中的,默認使用端口 8080,容易與其他服務沖突,因此需要修改一下。涉及到 2 個文件:


文件一:/etc/init.d/jenkins


第一行的 PATH 變量中,添加自己的 JDK 地址:


PATH=/bin:/usr/bin:/sbin:/usr/sbin:/opt/jdk1.8.0_221/bin
文件二:/etc/default/jenkins


HTTP_PORT 的值修改為新的端口號,例如: HTTP_PORT=9090 。


(5) Jenkins 的啟動和停止指令


sudo service jenkins startsudo service jenkins stop
如果不幸遇到錯誤,可以反復使用這兩個指令來排除錯誤。


4. 在瀏覽器中配置 Jenkins

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


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


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


插件安裝結束后,進入管理員配置界面:


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


5. 在 Jenkins 中配置一個小項目

(1) 準備一個測試代碼 Test1


Jenkins 僅僅是一個構件框架,具體的編譯過程是由用戶來決定的。Jenkins 首先通過 git 工具獲取遠程倉庫中的代碼,然后執(zhí)行用戶指定的編譯指令。


因此,我們需要先提前準備好一份測試代碼,并放到 Jenkins 可以訪問到的遠程倉庫中,當然了,你在本地的 Ubuntu 系統(tǒng)中部署一個 git 倉庫也是可以的。為了方便,我測試的代碼 Test1 放在 gitee 中了。


(2) 創(chuàng)建一個新項目


(3) 輸入項目名稱,并選擇第一個自由風格(Free project)


(4) 在第一個標簽 General下,輸入項目的描述信息(Description)


內容可以隨便寫。


(5) Source Code Management 源碼管理


Jenkins 在構建(編譯)的過程中,需要獲取到源代碼,因此需要配置 git 倉庫的地址和賬號信息(用戶名和密碼)。


首先在 Add 下拉按鈕下,選擇 Jenkins:


輸入 Username Password


賬號添加之后,在 Credentials 的下拉框中,選擇剛才添加的 gitee 賬戶,此時可以看到 紅色的權限錯誤提示消失了,說明可以拉取到遠程倉庫中的源代碼了。


(6) Build Triggers 選擇編譯觸發(fā)器


可以根據(jù)需要選擇不同的方式來觸發(fā),比如:定時觸發(fā),當其他某個項目構建成功之后觸發(fā)等等。


我們這里不選擇任何項目,下面我們會在主界面,手動點擊按鈕來觸發(fā)。


(7) Build Environment 編譯環(huán)境


這部分我用的比較少,利用其他工具來輔助 Jenkins 的功能。


(8) Build 編譯


就是告訴 Jenkins 如何來構建系統(tǒng),也就是說:Jenkins只是一個自動化的構建系統(tǒng),具體的編譯過程,可以由用戶自己來決定,有如下選擇項目:


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


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


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


以上步驟配置好之后,Save 保存,此時在主界面就可以看到這個項目的全貌了,如下圖:


在 Jenkins 后臺中,這個項目的保存路徑是:/var/lib/jenkins/jobs/Test1。


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

由于在上面的步驟(6)中,我們沒有選擇任何觸發(fā)條件,所以需要我們在項目 Test1 的主界面中,手動單擊左側的 Build Now 按鈕來觸發(fā)。


此時,在左側的 Build History 中,可以看到編譯歷史記錄,單擊某次編譯記錄編號,可以看到這一次編譯的詳細信息。


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


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


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


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


三、git submodule 基本使用

1. git submodule 是什么?

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


父項目和子項目的提交是分開的,也就是說父項目提交的信息只包含子項目的信息,而不會包含子項目的代碼;子項目有自己獨立的 commit,push,pull操作。


git submodule 一般用在比較大的項目中,為了便于復用,或者為了代碼的安全性,常常需要分成若干個子項目來進行代碼管理。


常用的指令包括:


添加子模塊: git submodule add
更新子模塊: git submodule update
初始化子模塊: git submodule init 遞歸的方式克隆整個項目: git clone--recursive
拉取所有子模塊: git submodule foreach git pull


2. 利用三個小項目,來測試一下 submodule 的用法

為了便于演示,我們我們創(chuàng)建 3 個項目,把它們都推送到遠程倉庫中,這里使用 gitee。


  1. Test1:編譯得到一個動態(tài)庫:libtest1.so;
  2. Test2:編譯得到一個動態(tài)度:libtest2.so;
  3. Test3:編譯得到一個可執(zhí)行程序,加載、調用上面 2 個動態(tài)庫中的函數(shù)。
為什么要這樣設計模塊: 安全!


  1. 開發(fā)人員A:負責 Test1,沒有權限拿到其他模塊的代碼;
  2. 開發(fā)人員B:負責 Test2,沒有權限拿到其他模塊的代碼;
  3. 項目經(jīng)理:負責 Test3 和 代碼整合,能拿到所有的代碼;
項目經(jīng)理需要把 Test1 和 Test2 作為 sub module,添加到 Test3 中,執(zhí)行下面的指令:


1. git submodule add https://gitee.com/[你的賬號]/test1.git test1
2. git submodule add https://gitee.com/[你的賬號]/test2.git test2


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


你還可以看一下 .gitmodules 文件中的內容,可以看出,git 工具就是通過這個配置文件來管理子模塊的。


管理員需要對所有的模塊進行整合、編譯,因此,我們在 Test3 目錄下添加一個腳本 build.sh,所有的編譯指令,都寫在這個腳本中,內容如下:


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


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


3. 在一個空目錄中來編譯、驗證一下可行性

我們在另一個空目錄中,clone 一下 Test3 這個項目,可以發(fā)現(xiàn):克隆下來的 test1 和 test2 文件夾中是空的,如下所示:


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


git submodule update --init --recursive
此時,再使用 tree 命令看一下文件變化,可以看到 test1 和 test2 的文件都被拉取下來了。這里有一個問題需要注意:雖然子模塊的代碼被拉取下來了,但是其 head 并沒有指向 master 分支,需要手動處理一下,如圖:


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


以上這幾個步驟,我們是在本地的一個臨時目錄,手動測試 submodule 的編譯過程。


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


四、在 Jenkins 中使用 git module 來編譯所有的模塊

下面的操作,都是在瀏覽器的 Jenkins 面板中來操作的。


1. 重新配置項目

因為我們是在 Test3 中,來編譯整個項目(Test1 和 Test2 被作為子模塊包括進來),因此首先把之前添加的 Test1 項目刪除掉,如圖:


然后重新添加項目 Test3,復習一下步驟:


  1. 輸入描述信息,選擇自由風格項目;
  2. 輸入 git 倉庫地址和賬戶信息,選擇 master 分支;
  3. 觸發(fā)器不設置;
  4. 編譯環(huán)境不設置;
  5. 編譯:選擇 Execute shell 執(zhí)行腳本,輸入編譯指令:./build.sh。(剛才說了,Jenkins 這是一個自動化構建框架,具體的編譯過程由用戶決定,所以我們這里的編譯過程就是執(zhí)行 Test3 下的 build.sh 這個腳本。);
  6. 編譯后動作不設置;
當然,也可以直接在之前的 Test1 項目基礎上進行修改。


此時,我們在 Jenkins 中直接點擊 Build Now 按鈕,如果不出意外的話,會提示編譯錯誤(左側的 Build History 下面出現(xiàn)紅色的錯誤圓圈)。


點進去,看一下輸出信息(Console Output 按鈕),提示錯誤:


原因正如前文所說,子模塊在獲取之后,head 沒有指向 master 分支,需要我們在第一次編譯時手動修改一下(我沒有找到其它方法,如果你知道的話,請不吝賜教!)


手動解決:在命令行窗口中,進入 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 -
此時,重新觸發(fā)編譯一次,一定可以成功的!


五、總結

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


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


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

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


2. 編譯后動作

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


或者在項目配置的 [Post-build Actions] 中,重新寫一個專門用來自動部署的腳本文件。


3. git subtree 功能

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


  1. subtree直接把子模塊代碼拷貝到主模塊中,使用命令簡單;
  2. submodule 使用的是“指針”指向子模塊,使用命令相對復雜一些,功能也更強大;

4. 繼續(xù)研究 Jenkins 中的插件功能

六、資源下載

文中用到的資源,放在了網(wǎng)盤中。如果需要的話,請在公眾號留言區(qū)發(fā)送數(shù)字:030,即可收到下載地址。


好文章,要轉發(fā);越分享,越幸運!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉