jenkins+webhook+docker做持續集成


簡介:我們現在都流行把項目封裝成docker的鏡像,不過實際用的時候就會發現很麻煩,我們每次更改代碼了以后都要打包成docker容器

,事實證明項目比較多的時候真的會讓人崩潰,我這邊用spring cloud微服務+docker,才跑了6個項目每次修改上傳,內心早已崩潰

現在我介紹一下利用jenkins做持續集成,阿里code作代碼托管平台,為什么不用開源中國呢,其實我這邊的項目一直都是托管在開源中國上面的,主要是我實驗的時候發現開源中國的https協議的證書,不是很被官方jenkins容器認同,每次都可以觸發,但代碼就是下載失敗,jenkins是基於java的,所以我們要把開源中國的證書導入到java的cacerts中

本來把它的證書從瀏覽器導出來了,但是cacerts文件需要root權限而jenkins容器又只有jenkins用戶的權限,寶寶發脾氣就用了阿里的code了。

所以不推薦用開源中國webhook和jenkins搭配

環境:阿里雲code的代碼托管平台

         jenkins容器

         一台安裝docker環境的主服務器

思路:分為3個job,job1->job2->job3,只有當前面的一個job單元測試成功了,才觸發執行下一個job

job1:在阿里雲code上面設置webhook的push操作,我們提交代碼到阿里雲code,觸發webhook給jenkins發送消息,jenkins自動去配置好的git地址下載源碼到主目錄

job2:job1成功后,將源碼打包成docker鏡像,並且push到阿里雲的docker倉庫,或者自己的私有register的docker倉庫

job3:job2成功后,將以前老的容器stop,甚至刪除,從阿里雲的docker倉庫,或者自己的私有register的docker倉庫pull鏡像並且運行docker鏡像

步驟:

job1:

1.運行jenkins容器:

docker run -d -p 8080:8080 -p 50000:50000 -v /home/container:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone jenkins

這里映射注意:

/home/container目錄需要設置權限,jenkins內部的用戶是jenkins,不然會權限被拒絕,具體看http://www.cnblogs.com/waterlufei/p/6682283.html

jenkins的默認時間是有問題的,有8個小時的時差,是時區的問題所以我們需要映射下時間

點擊新建,建一個自由風格的項目,描述簡單介紹下

 

 

 填寫自己的項目git地址,和git的用戶名和密碼,阿里雲的用戶名和密碼不是登陸的用戶名密碼,這里和開源中國不一樣

觸發器:

 

 我用的是通用的webhook插件,在系統管理->管理插件中下載,如果你不想下載插件也可以直接用觸發遠程構建,不過我試過,阿里code和開源中國上面webhook一直添加不上去,

這里不深究,沒意義

構建的時候執行的命令,選擇構建->Execute shell:

然后apply,保存,job1就搭建完了

2.系統設置->管理用戶,點擊右邊的設置

這是我們的apikey,我們都知道訪問api的時候,正規點的軟件都會有提供專門的api的賬號密碼,我們訪問的時候攜帶這對用戶名和密碼就好了

3.系統設置->Configure Global Security,去掉防止跨站點請求偽造的勾,這樣我們就可以在瀏覽器和阿里的webhook訪問到api的地址了,不然我們把用戶名和密碼放到url

中,還是不能訪問

 

 4.進入阿里code的一個項目,點擊setting->webhook

http://userID:apitoken@IP:8080/generic-webhook-trigger/invoke

userID:apitoken就是前面看到的User ID和API Token

IP:8080是jenkin容器的主頁地址

generic-webhook-trigger/invoke是固定的,對應jenkins的Generic Webhook Trigger插件

現在我們測試下:

改變下項目,push下,然后觸發jenkins執行

主目錄下已經有我們的項目了

QA:我們的項目下載在jenkins容器里,不管怎么改都是在容器中而jenkins容器中又沒有docker的環境,對於這種情況有兩種思想:

1.想辦法在容器內部搭建docker環境,可以實現(不推薦)

2.容器是固定好的,容器只應該負責做它該做的事,而不是什么都干,像現在這種情況,應該是在別的有docker環境的主機上執行,jenkins只負責自己的觸發執行等等(推薦)

我們采用第二種方法,jenkins的設計者應該也是這么想的,所以提供的我們子節點的概念,我們可以配置子節點slave,並且用ssh協議連接

,這樣我們的工作空間就在一個有docker環境的主機上了,

job2

job2的工作就是打包docker鏡像,並將image推送到遠程,我這里用的是阿里雲的docker倉庫 

添加子節點:系統設置->管理節點,新建一個節點,我們用ssh連接,這里需要瞎子jdk上面的,它會自動下載

 

我們用jenkins新建一個job,命名為dockerimage,標簽是我們子節點的標識,后面要用的,工作空間會放我們下載的代碼,這樣我們就

實現了再主機環境上面構建docker

1.新建job2,填寫剛剛新建的子節點的標簽

設置當上一個job執行成功的時候,繼續執行job2

打包docker鏡像,這里需要自己寫好dockerfile文件

 

 然后我們再push下代碼,發現兩個job都能執行成功,在我的阿里雲上面也有對應的最新的鏡像了

待解決問題:

1.jenkins怎么解決版本依賴,這里我們實驗的時候是寫死的版本,實際開發肯定不能這樣

有實現版本標簽的插件,后面會介紹

2.jenkins怎么運行鏡像在容器中,我們每次運行一個新的容器,就要關掉以前的老容器

思路:可以寫好一個docker-compose.yml文件,利用docker compose來控制容器

未完待續。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM