jenkins+webhook+docker作持續集成

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

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

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

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

因此不推薦用開源中國webhook和jenkins搭配spring

環境:阿里雲code的代碼託管平臺docker

         jenkins容器shell

         一臺安裝docker環境的主服務器api

思路:分爲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來控制容器

未完待續。。。。。。

相關文章
相關標籤/搜索