基於Jenkins+Git+Docker的持續整合(下)

dbasdk發表於2018-02-28

    

    接上篇  基於Jenkins+Git+Docker的持續整合(上)

    三、配置docker宿主機

在我們的這套解決方案裡,是在Jenkins中透過SSH呼叫docker宿主機中的指令碼實現映象和容器的管理維護,因此,這裡我們首先建立好相關的目錄和指令碼檔案,以便在後續的部署環境,能夠直接使用。

提示:以下操作是在docker宿主機端執行,如非特別說明,均是在root使用者下操作。

首先建立目錄

root@docker01:~# mkdir /data/dockerfiles/scripts -p

編輯維護用的指令碼檔案:

root@docker01:~# vi /data/dockerfiles/scripts/deploy.sh

增加下列內容:

#!/bin/bash

############################################

# this script function is :               

# deploy new docker container            

#                                         

# USER        YYYY-MM-DD - ACTION         

# junsansi    2016-01-25 - CREATED       

#                                         

############################################ 

parasnum=5

# function

help_msg()

{

cat << help

+----------------------------------------------------+

+ Error Cause:

+ you enter $# parameters

+ the total paramenter number must be $parasnum

+ 1st :DOCKER_NAME

+ 2nd :PROJECT_NAME

+ 3rd :PROJECT_VERSION

+ 4th :SOURCE_PORT

+ 5th :DESTINATION_PORT

+----------------------------------------------------+

help

} 

# ----------------------------------------------------

# Check parameter number

# ----------------------------------------------------

if [ $# -ne ${parasnum} ]

then

        help_msg

        exit

fi 

# ----------------------------------------------------

# Initialize the parameter.

# ----------------------------------------------------

DOCKER_NAME=$1

PROJECT_NAME=$2

PROJ_VERSION=$3

SPORT=$4

DPORT=$5 

PROJ_VERSION=${PROJ_VERSION/"origin/"/""} 

DOCKER_FILE="/data/dockerfiles/${DOCKER_NAME}/Dockerfile"

DOCKER_FILE_DIR=/data/dockerfiles/${DOCKER_NAME}

if [ ! -d ${DOCKER_FILE_DIR} ]; then

        mkdir -p ${DOCKER_FILE_DIR}

fi 

# ----------------------------------------------------

# check docker images

# ----------------------------------------------------

DOCKER_IMAGE=`/usr/bin/docker images | grep ${DOCKER_NAME} | awk -F ' ' '{print $3}'`

if [ -n "${DOCKER_IMAGE}" ]; then

        # check docker container

        for dc in `/usr/bin/docker ps -a | grep ${DOCKER_NAME} | awk -F " " '{print $1}'`

        do

                echo "Stop container: ${dc}"

                /usr/bin/docker stop ${dc}

                # delete while docker container was exists

                echo "##Delete exists Container_Id: "${dc}

                /usr/bin/docker rm ${dc}

        done 

        # delete while docker image was exists

        echo "##Delete exists Image: "${DOCKER_IMAGE}

        /usr/bin/docker rmi ${DOCKER_IMAGE}

fi

echo "" 

# ----------------------------------------------------

# Init dockerfile

# ----------------------------------------------------

echo "**Init dockerfile start: "${DOCKER_FILE}

echo "FROM tomcat" > ${DOCKER_FILE}

echo 'MAINTAINER junsansi "junsansi@sina.com"' >> ${DOCKER_FILE}

echo "ADD *.war /usr/local/tomcat/webapps/${PROJECT_NAME}.war" >> ${DOCKER_FILE}

echo "EXPOSE 8080" >> ${DOCKER_FILE}

echo "CMD /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out" >> ${DOCKER_FILE}

cat ${DOCKER_FILE}

echo "**Init dockerfile end." 

# ----------------------------------------------------

# Build dockerfile

# ----------------------------------------------------

cd ${DOCKER_FILE_DIR}

rm *.war -rf

mv /data/dockerfiles/war/${DOCKER_NAME}/*.war ./

echo ""

echo "##Build dockerfile for "${DOCKER_NAME}

/usr/bin/docker build -t ${DOCKER_NAME}:${PROJ_VERSION} . 

# ----------------------------------------------------

# Run docker container

# ----------------------------------------------------

echo ""

echo "##Running docker container: "${DOCKER_NAME}

/usr/bin/docker run --name ${DOCKER_NAME}_d1 -d -p ${SPORT}:${DPORT} ${DOCKER_NAME}:${PROJ_VERSION} 

#/usr/bin/docker run ${cmd} 

echo ""


    該指令碼就進行詳細介紹,語法比較簡單,即便是對
shell不熟悉的同學,只要認真閱讀也應能理解。

為該指令碼增加執行許可權:

root@docker01:~# chmod +x /data/dockerfiles/scripts/deploy.sh


     修改屬主為
docker使用者:

root@docker01:~# chown docker:docker /data/dockerfiles -R

 

    四、配置Jenkins應用環境

    首先進行全域性配置:系統管理->Global Tool Configuration

    這裡請大家根據實際情況配置:

    Maven Configuration
JDK
Git
Maven

具體的配置過程,介面已經非常直觀,這裡就不演示了。


    接下來要配置
SSH Servers。在本例中,我們要部署和執行docker容器的伺服器是172.19.10.157,因此我們需要在系統設定中,配置透過SSH連線該伺服器的訪問使用者名稱和密碼,如下所示:


      系統管理
->系統設定->Publish over SSH

 


如果有多個伺服器可用於釋出,那麼可以一次性都新增進去。 

    
五、Jenkins中建立和配置釋出任務

    
Jenkins主介面右側,點選“建立一個新任務”,在頁面上輸出專案名稱(名稱完全由操作者自定義),這裡我們選擇構建的是MAVEN專案:

在《通用設定》中操作如下:

選中丟棄舊的構建->保持構建的最大個數為10個;

選中引數化構建->選擇Git Parameter->定義名稱為release_branch,因為我們內部應用的釋出管理都是基於分支的,因此選擇引數型別為Branch

在《原始碼管理》中選擇Git,根據實際情況指定倉庫地址和鑑權證書,Branches那裡修改為前面定義的$release_branch引數名稱,具體設定如下圖所示:

在《Build》設定中設定Goals and options選項值為:clean package -DskipTests=true,當然,這裡您也可以根據您的專案實際情況進行設定:

在《構建後操作》中選擇“Send build artifacts over SSH”,透過SSH傳送檔案到遠端,並執行遠端伺服器命令,配置如下:

 
      配置操作完成之後點選左下角“儲存”按鈕。

點選左側“Build with Parameters”,在隨後出現的頁面中選擇要構建專案的版本,這裡目前僅只有一個版本,不管,先選中它,而後點選開始構建:


     執行部署,我們可以透過當前正在構建任務的“Console Output”來獲取任務的執行情況,例如,本次構建過程中的輸出日誌摘要如下:


     透過日誌可以看到,容器建立和啟動均已成功,接下來就可以透過瀏覽器訪問該
docker中執行的工程了:

竣工!

    六Jenkins中將同一個服務釋出到多個容器

如果你有多個工程,需要部署到不同的伺服器,那麼參照前面2-6小節中的步驟,對目標伺服器和專案進行適當配置即可。

如果你有一個工程,需要以叢集方式部署到多個伺服器,那麼參照前面4-5小節中的步驟,新增SSH伺服器,而後在“構建後操作”中加入對該伺服器的部署步驟即可。

如果你有一個工程,需要以叢集方式部署多個容器,那麼我來演示一下嘛,儘管我們當前沒有多餘的伺服器,不過透過docker宿主機演示這樣的過程還是沒什麼問題。

我們仍然進入到“first_docker_project”這個專案的配置頁面,在“構建後操作”設定中,點選“Add Server”新增一臺伺服器,配置如下 :

如果是部署到不同的伺服器,那麼此處只需要選擇適當的SSH Server即可,不過當前的演示環境只有一臺伺服器,那麼SSH Server還是172.19.10.157,只是要對Remote DirectoryExec command兩項配置中的引數做適當調整,以避免路徑衝突。

修改完成後點選儲存,然後再次嘗試構建,注意觀察日誌,等看到SUCCESS提示之後,同一個專案就被成功釋出到兩個容器中了。

登入到docker宿主機檢視一下容器的狀態:

docker@docker01:~$ docker ps -a

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                     NAMES

ed763842395e        first_docker_proj02:master   "/bin/sh -c '/usr/..."   18 seconds ago      Up 17 seconds       0.0.0.0:12000->8080/tcp   first_docker_proj02_d1

6a907dfae707        first_docker_proj01:master   "/bin/sh -c '/usr/..."   19 seconds ago      Up 18 seconds       0.0.0.0:11000->8080/tcp   first_docker_proj01_d1

docker@docker01:~$ docker images

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE

first_docker_proj01   master              4adbac00f9ed        21 seconds ago      355 MB

first_docker_proj02   master              4adbac00f9ed        21 seconds ago      355 MB

tomcat                latest              99765a0d7f44        2 days ago          355 MB


    您瞧,透過Jenkins結合Docker來進行部署,就是這麼簡單。(完)

    轉載請聯絡作者!更多內容請掃描二維碼,關注【IT營養師】!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-2151376/,如需轉載,請註明出處,否則將追究法律責任。

相關文章