對於Jenkins的使用,我感受只用到其中一小部分功能,但也就是這一小部分功能,也推進了整個CI/CD的過程,Jenkins的使用方式有不少中,可能我用到的只是其中一種,可是已經知足個人需求,便再也不貪婪,本次要約定好Jenkins中的腳本規則,對於個人整個生成流水線來說,約定至高無上,聽從約定,或許會出現錯誤,但出現的概率確定低於不聽從約定,隨意設計好的多。html
1、Jenkins安裝及項目配置java
一、Jenkins安裝git
在之前的博客中已經介紹過Jenkins的安裝,我使用的是在Docker中安裝Jenkins,利弊明顯,在容器中安裝方便,可是也帶來一些問題,如不能很好的和Docker Machie結合使用,若是想在Jenkins腳本中分發服務到其餘主機上,那必需要在Jenkins中額外安裝SSH插件。而在主機上直接安裝Jenkins,則步驟要多一點,須要安裝Java環境等操做,可是能夠在Jenkins中直接使用Docker Machine的功能,直接將服務分發到Swarm服務器集羣中,這便帶來了優點。docker
Docker中完成Jenkins安裝:https://www.cnblogs.com/CKExp/p/9536864
sass
二、Jenkins集羣搭建bash
對於Jenkins的做用須要重申重要一點就是,在個人整個生成流水線中Jenkins的最大目的是擔任奶媽角色,也就是鏡像的建立,甚至整個Jenkins集羣的目的都是鏡像的建立,在聊天時發現有人在本身的每一臺機器上安裝Jenkins,而後搭建Jenkins集羣,而後將構建任務下發至子節點中並構建完畢後生成服務,個人思路在剛開始使用Jenkins時甚至也是這樣,可是慢慢的我發現不對,這整個思路就是荒謬,難不成個人每一臺機器上都得安裝Jenkins,逐步探索,總結出來就是,Jenkins只是奶媽,最終目的只是鏡像生產者。服務器
Jenkins集羣搭建過程:http://www.javashuo.com/article/p-dkgzmyii-s.html
微信
三、Jenkins中新建項目ssh
在個人生成流水線中,Jenkins的主要職責即是將代碼倉庫中的代碼拉取過來,完成鏡像的構建,而對於Jenkins中,構建項目,有一些須要設置的地方,如Git地址,憑證,構建時間,構建腳本等。ide
Jenkins中新建項目:http://www.javashuo.com/article/p-kkioerms-eq.html
2、約定Jenkins的構建腳本
利用在構建Jenkins腳本時加入的Docker Compose工具,能夠在腳本構建時生成多個鏡像,且能夠有依賴關係,方便相互關聯的服務部署。
一、利用Docker Compose中的參數 -f 指定項目中的compose.yaml文件,這個文件的位置在以前約定項目結構中設置好了,在docker文件夾下,對於docker compose,會將這兩個yaml文件合併爲一個,所以,能夠設置多個yaml文件,用於不一樣的做用。經過制定-p 參數來設置項目名稱,down 參數將刪除指定的鏡像、服務、容器、網關等,對於構建鏡像的命令,可使用up命令或是build命令,二者區別是,使用up命令時會在本機上生成指定鏡像的容器,而build命令則只負責構建鏡像。
約定項目文件結構:http://www.javashuo.com/article/p-tlnkmkfj-hp.html
#!/bin/bash # 獲取短版本號 GITHASH=`git rev-parse --short HEAD` docker-compose -f ./docker/docker-compose.yml -f ./docker/docker-compose.override.yml -p multimap down --rmi local --remove-orphans docker-compose -f ./docker/docker-compose.yml -f ./docker/docker-compose.override.yml -p multimap up -d --build
# docker-compose -f ./docker/docker-compose.yml -f ./docker/docker-compose.override.yml -p multimap build
注意:若是不指定-p 參數,則會使用默認文件夾名,在此處爲docker文件夾名,則會帶來一系列問題,如對於默認網關名稱,鏡像名稱等,都是使用docker開頭,這就致使多個項目會發生衝突,都是使用docker開頭的網關,多個項目只能一個有效,所以約定每一個項目在指定-p參數時以項目名稱爲主。
二、鏡像構建完畢,將鏡像推送到鏡像倉庫中,指定倉庫地址,用戶名和密碼(我這裏使用的是騰訊雲的鏡像倉庫,若是使用的私有倉庫或其餘雲的,則須要替換),能夠利用docker-compose提供的push命令,將docker compose中生成的鏡像都推送到鏡像倉庫中。
echo ---------------Push-Images...------------------ docker login -u=xxx用戶名xxx -p=xxx密碼xxx ccr.ccs.tencentyun.com docker-compose -f ./docker/docker-compose.yml -f ./docker/docker-compose.override.yml push
三、(可選)若是須要將建立服務到Swarm集羣(或是k8s中),也能夠利用Jenkins完成,若是是將Jenkins安裝在宿主機上,則可使用以下命令建立服務:
首先執行登陸倉庫功能:
docker-machine ssh host1 docker login -u xxx用戶名xxx -p xxx密碼xxx ccr.ccs.tencentyun.com
建立服務,指定服務內外端口,指定鏡像,如需指定更多信息,能夠查看命令幫助,指定完畢服務建立會從鏡像倉庫中獲取最新的鏡像,我使用的是latest標籤,若是是生產環境須要打上數字標籤,方便應用程序版本管理:
docker-machine ssh host1 docker service create \
--with-registry-auth \
--name multimapService
--publish published=32700,target=80 \
ccr.ccs.tencentyun.com/sassassin/multimap:latest
更新服務,指定鏡像名稱,仍然是該鏡像倉庫地址,若是顯示沒有鏡像,從新使用docker login登陸,而後執行命令(登陸命令很關鍵)。
docker-machine ssh host1 docker service update --image ccr.ccs.tencentyun.com/sassassin/multimap:latest xxxService
四、對於構建過程當中生成的無效鏡像等,能夠利用Jenkins來定時刪除,不建議在項目構建完畢去發起命令刪除,緣由在於,多個項目構建時,一個項目構建完畢,另外一個項目正在構建過程當中,可能會產生中間鏡像,但這鏡像或許是有做用的,當構建完畢的項目執行鏡像刪除時,會發生刪除錯誤,中間鏡像正在被使用,所以,最好是單獨設置一個任務去定時刪除無效鏡像
Jenkins定時刪除無效鏡像:http://www.javashuo.com/article/p-rbbrhxyf-eu.html
至此,Jenkins在個人整個生成流水線的過程算是完整了,最後在指明一點,Jenkins在個人整個生成流水線中,最大的角色就是鏡像生產者(奶媽)。
本文地址:http://www.javashuo.com/article/p-udjaimda-gr.html
歡迎關注微信訂閱號,有新的文章將同步到訂閱號中
2018-12-01,望技術有成後能回來看見本身的腳步