1. 程式人生 > >約定Jenkins構建指令碼

約定Jenkins構建指令碼

  對於Jenkins的使用,我感覺只用到其中一小部分功能,但也就是這一小部分功能,也推動了整個CI/CD的過程,Jenkins的使用方式有很多中,可能我用到的只是其中一種,但是已經滿足我的需求,便不再貪婪,本次要約定好Jenkins中的指令碼規則,對於我的整個生成流水線來講,約定至高無上,遵從約定,或許會出現錯誤,但出現的機率肯定低於不遵從約定,隨意設計好的多。

   

 

一、Jenkins安裝及專案配置

  1、Jenkins安裝

  在以前的部落格中已經介紹過Jenkins的安裝,我使用的是在Docker中安裝Jenkins,利弊明顯,在容器中安裝方便,但是也帶來一些問題,如不能很好的和Docker Machie結合使用,如果想在Jenkins指令碼中分發服務到其他主機上,那必須要在Jenkins中額外安裝SSH外掛。而在主機上直接安裝Jenkins,則步驟要多一點,需要安裝Java環境等操作,但是可以在Jenkins中直接使用Docker Machine的功能,直接將服務分發到Swarm伺服器叢集中,這便帶來了優勢。

   Docker中完成Jenkins安裝:https://www.cnblogs.com/CKExp/p/9536864

  2、Jenkins叢集搭建

  對於Jenkins的作用需要重申重要一點就是,在我的整個生成流水線中Jenkins的最大目的是擔任奶媽角色,也就是映象的建立,甚至整個Jenkins叢集的目的都是映象的建立,在聊天時發現有人在自己的每一臺機器上安裝Jenkins,然後搭建Jenkins叢集,然後將構建任務下發至子節點中並構建完畢後生成服務,我的思路在剛開始使用Jenkins時甚至也是這樣,但是慢慢的我發現不對,這整個思路就是荒謬,難不成我的每一臺機器上都得安裝Jenkins,逐步探索,總結出來就是,Jenkins只是奶媽,最終目的只是映象生產者。

   Jenkins叢集搭建過程:https://www.cnblogs.com/CKExp/p/9541137.html

  3、Jenkins中新建專案

  在我的生成流水線中,Jenkins的主要職責便是將程式碼倉庫中的程式碼拉取過來,完成映象的構建,而對於Jenkins中,構建專案,有一些需要設定的地方,如Git地址,憑證,構建時間,構建指令碼等。

    Jenkins中新建專案:https://www.cnblogs.com/CKExp/p/9940479.html

 

二、約定Jenkins的構建指令碼

  利用在構建Jenkins指令碼時加入的Docker Compose工具,可以在指令碼構建時生成多個映象,且可以有依賴關係,方便相互關聯的服務部署。

  1、利用Docker Compose中的引數 -f 指定專案中的compose.yaml檔案,這個檔案的位置在之前約定專案結構中設定好了,在docker資料夾下,對於docker compose,會將這兩個yaml檔案合併為一個,因此,可以設定多個yaml檔案,用於不同的作用。通過制定-p 引數來設定專案名稱,down 引數將刪除指定的映象、服務、容器、閘道器等,對於構建映象的命令,可以使用up命令或是build命令,兩者區別是,使用up命令時會在本機上生成指定映象的容器,而build命令則只負責構建映象。

  約定專案檔案結構:https://www.cnblogs.com/CKExp/p/9940457.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引數時以專案名稱為主。

  2、映象構建完畢,將映象推送到映象倉庫中,指定倉庫地址,使用者名稱和密碼(我這裡使用的是騰訊雲的映象倉庫,如果使用的私有倉庫或其他雲的,則需要替換),可以利用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

  3、(可選)如果需要將建立服務到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

  4、對於構建過程中生成的無效映象等,可以利用Jenkins來定時刪除,不建議在專案構建完畢去發起命令刪除,原因在於,多個專案構建時,一個專案構建完畢,另一個專案正在構建過程中,可能會產生中間映象,但這映象或許是有作用的,當構建完畢的專案執行映象刪除時,會發生刪除錯誤,中間映象正在被使用,因此,最好是單獨設定一個任務去定時刪除無效映象

  Jenkins定時刪除無效映象:https://www.cnblogs.com/CKExp/p/9900539.html

  至此,Jenkins在我的整個生成流水線的過程算是完整了,最後在指明一點,Jenkins在我的整個生成流水線中,最大的角色就是映象生產者(奶媽)

 

 本文地址:https://www.cnblogs.com/CKExp/p/9940467.html  

 歡迎關注微信訂閱號,有新的文章將同步到訂閱號中

 

2018-12-01,望技術有成後能回來看見自己的腳步