天天看點

基于Docker容器的,Jenkins、GitLab建構持續內建CI1. 建構私有的GitLab容器2. 建構Jenkins容器我的gitlab 和jenkins的使用者都是jenkins,這裡應該填寫的是git使用者名

** 開發者将代碼送出(push)到gitlab後,gitlab通過hook通知jenkins,jenkins自動從gitlab中擷取項目最新的源碼進行內建和釋出。

通過docker-compose的方式安裝gitlab,docker-compose這個指令需要單獨安裝,docker-compose會對指定目錄下的docker-compose.yml檔案進行執行,這個檔案會一次性啟動所編輯的鏡像,及所要用到的參數,官方提供的yml檔案内容如下:

在docker-compose.yml檔案所在目錄下,執行docker-compose up指令(docker-compose指令需要安裝),如果之前沒有下載下傳過gitlab的鏡像會自動下載下傳,如果下載下傳過就直接啟動已有的容器。

這裡會在docker建立一個新的網橋,gitlab所需要的gitlab容器和redis容器及postgresql容器都在這個網橋指定的網段内,可以通過docker network ls檢視.

網橋的名稱通常為你yml檔案所在目錄名稱的小寫加上下劃線default,例如mygitlab_default。這個很有用,因為如果你想要容器内部互聯,就需要指定所要連接配接的容器在一個網段内,例如jenkins容器如果想内部連接配接gitlab容器,就得都在mygitlab_default這個網橋提供的網段内,docker預設會為容器指定在docker0這個網段内的一個ip,通常會是172.17.. 我的gitlab預設在172.18,是以需要在接下來建立jenkins容器并啟動時,指定到18這個網段内,當然你想通過主控端的ip和端口也是可以的

jenkins容器安裝jenkins的rpm包,jenkins依賴 jdk,是以需要在jenkins的容器中安裝配置jdk,本人使用jdk1.8,同時需要jenkins的容器調用maven的打包指令,是以也需要配置安裝maven,本人使用maven 3.3.9。

a.通過dockerfile建構一個jenkins容器,基于centos7的鏡像。

b.建構基礎鏡像,整合jdk及mvn。配置path ,安裝所需要的工具,dockerfile如下:

執行指令打包鏡像

c.通過基礎鏡像安裝jenkins,也是通過dockerfile

d.運作jenkins容器,這裡需要将container的網絡設定跟gtilab同網絡的環境下,同時我們希望jenkins容器在用maven打包之後,在調用docker驚醒封裝鏡像,然後推送鏡像至私有的鏡像倉庫,是以我們把主控端的/usr/bin/docker 和/run/docker.sock 和所依賴的共享庫檔案,在啟動容器時一并挂載至容器内部。

e.容器啟動後,8080端口被綁定到了主控端的8888端口,通路localhost:8888來通路jenkins

首次登入jenkins會需要輸入jenkins的超級管理者密碼,這個密碼在jenkins第一次啟動的日志中,可以進入jenkins容器,檢視運作日志,也可以根據頁面提示,直接去jenkins的家目錄下一個.jenkins/secrets/init…..的檔案内檢視密碼。登入後注冊一個使用者,并在系統管理-管理插件下,安裝gitlab的插件。第一次運作jenkins會讓你選擇安裝插件,選擇第一個推薦的安裝後,在管理插件的可選插件tab下搜尋gitlab plugin 和gitlab hook plugin插件進行安裝,然後重新開機jenkins

3.建構私有的docker 鏡像倉庫

拉取一個docker 的鏡像倉庫鏡像,并運作該容器,容器運作後會綁定主控端5000端口,我個人用的是daocloud.io提供的鏡像,這個鏡像倉庫需要注冊。

4.建構持續內建環境

萬事具備,下面我們開始利用gitlab,jenkins,來建構持續內建環境。

a.在gitlab中建立一個項目,項目類為public,建立後會有如下提示,這些提示用來告訴你如何通過用戶端下載下傳項目,并送出項目

b.進入jenkins容器,然後通過git用戶端,拉取項目。在拉取之前,需要用使用ssh-keygen來生成目前jenkins使用者在jenkins容器的公鑰密鑰,ssh-keygen需要安裝openssh。

可以一路回車,預設生成在jenkins使用者的家目錄下的一個.ssh的檔案夾,将.ssh/id_rsa.pub的内容全部複制

c.登入gitlab,右上角下拉清單下選擇setting,然後在首頁面有一個ssh keys的tab頁,将你剛才複制的公鑰内容添加至key這個文本框,然後點選add key。這個步驟的意思是,如果你想讓jenkins通過ssh協定從gitlab拉取項目,需要認證,配置的公鑰就是允許jenkins容器的jenkins使用者所運作的jenkins從gitlab通過ssh協定拉取項目(有點别扭,但是需要注意的是jenkins這個容器主機和jenkins使用者,jenkins程式是jenkins使用者啟動的)。

(這裡有一個沒有解決的問題,就是關于拉取private類型的項目,需要做的ssh認證,需要公鑰密鑰比對,但是沒有實作,是以暫時項目都是public。如果public的項目的話,可以通過http協定進行拉取,但是需不需要配置ssh的公鑰,我也沒試過,因該是不需要把。)

在配置好key之後,我們回到jenkins容器,目前使用者為jenkins。我們想通過git用戶端拉取項目的第二個準備工作,需要配置git的全局配置。

這兩個配置完成後,我們可以就可以拉取項目到本地了,以我自己demo為例

d.現在拉取到目前目錄的eurka是個空項目,我們把我們要上傳的項目源碼和dockerfile(用來jenkins調用docker打包鏡像用的)添加至這個目錄,然後git add ,git commit ,git push 指令将本地檔案添加送出并推送整合至gitlab這個項目的某個分支下,預設是master

e.送出完成後,我們開始配置jenkins,以jenkins使用者登入jenkins,建立,選擇 --建構一個自由風格的軟體項目然後确定

f.然後進入到這個項目的配置下,在源碼管理選擇git,然後在repository url下,填入項目的ssh位址,注意這裡不可一世用localhost,你可以填寫主機的ip加上10022端口,也可以配置gitlab容器的ip位址加上22端口,我這裡配置的是我的容器位址,例如ssh://[email protected]:22/jenkins/eurka.git,這裡不要寫10022端口!!!!因為是public項目,是以不需要添加認證

h.回到jenkins的設定,在建構中下execute shell下,編寫shell腳本,這裡就是gitlab被push後,通過webhook的方式讓jenkins自動從gitlab下拉取項目之後,要執行的代碼

預設拉取之後,會在這個項目的路徑下,如果不确定自己目前的工作目錄,可以通過echo $workdir來檢視目前位置,例如我的項目叫eurka,這個項目下我上傳了一個maven項目,是以我如果想要對這個maven項目打包,我得進入這個項目目錄,然後對這個項目下的pom檔案進行操作,貼出我的shell:

最初我們在run jenkins容器的時候,将主控端的docker檔案挂載進了容器内部,這個操作很重要,但我也很迷糊,但可以肯定的是,jenkins容器所運作的docker及操作是針對主控端的docker的

後續的持續內建,要基于kubernetes,kubernetes會自動的找其節點自動拉取剛push的鏡像,并自動部署。未完待續