溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成

發(fā)布時(shí)間:2020-04-05 13:58:17 來源:網(wǎng)絡(luò) 閱讀:22607 作者:KaliArch 欄目:建站服務(wù)器

Docker基礎(chǔ)教程可參考:容器Docker詳解
Jenkins基礎(chǔ)知識(shí)可參考:jenkins筆記(1)
Git基礎(chǔ)知識(shí)可參考:GIT筆記
文件腳本內(nèi)容參考:junsansi,可以根據(jù)實(shí)際項(xiàng)目具體修改腳本。

一、概要

開發(fā)將源碼上傳到github倉(cāng)庫(kù),通過jenkins持續(xù)集成引擎結(jié)合git工具,將源碼拉取到j(luò)enkins服務(wù)器,通過工具maven在本地講源碼編譯打包成war包,在ssh到Docker宿主機(jī),通過執(zhí)行腳本生成制作自定義的Dockerfile,最終執(zhí)行生成images,并啟動(dòng)container,即啟動(dòng)了包含war包的tomcat,即可實(shí)現(xiàn)對(duì)外提供web服務(wù)。

二、環(huán)境部署

主機(jī)名 IP地址 作用
Docker-server 172.20.6.20 Docker宿主機(jī)
Jenkins-server 172.20.6.22 Jenkins服務(wù)器

2.1 Jenkins服務(wù)器配置

Jenkins的安裝及配置Jenkins服務(wù)器的相關(guān)工具(maven、git、ssh)配置,詳細(xì)步驟可參考jenkins筆記(1)的相關(guān)工具的安裝及配置。

2.2 Docker宿主機(jī)配置

Docker的基礎(chǔ)命令可參考容器Docker詳解,需要在Docker宿主機(jī)pull下tomcat的基礎(chǔ)環(huán)境以及jenkins服務(wù)器通過docker用戶登錄Docker宿主機(jī),講war包發(fā)布到制定目錄,執(zhí)行特定腳本來生成Dockerfile,最終根據(jù)Dockerfile生成images,并啟動(dòng)基于包含war包的container,從而實(shí)現(xiàn)對(duì)外提供WEB服務(wù)。

創(chuàng)建ssh發(fā)布用戶及目錄

useradd docker
echo "docker:docker" |chpasswd      #為docker用戶設(shè)置密碼
mkdir -pv /data/dockerfiles/scripts

上傳腳本

將腳本上傳到 /data/dockerfiles/scripts,命名為devops,此名稱可自定義,但是之后在配置jenkins執(zhí)行ssh命令時(shí)候的腳本名稱需要一致。由于腳本內(nèi)部的分發(fā)路徑是寫的絕對(duì)路徑,所以需要講目錄為固定,也可以根據(jù)實(shí)際修改。此腳本author:junsansi,可以參考其進(jìn)行修改。

cat >/data/dockerfiles/scripts/devops.sh<<EOF
#!/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
# 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}
EOF
chmod +x  /data/dockerfiles/scripts/devops.sh
chown docker.docker /data/dockerfiles -R

Docker宿主機(jī)獲取tomcat鏡像

docker pull docker.io/tomcat
使用docker images查看tomcat鏡像
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
此時(shí)Docker宿主機(jī)就已經(jīng)配置完畢。

三、Jenkins配置

登錄Jenkins的WEB界面

3.1 配置Docker宿主機(jī)的ssh信息

系統(tǒng)管理---系統(tǒng)設(shè)置---Publish over SSH---增加SSH Server
添加SSH Server可以使用密鑰形式添加,也可以直接使用用戶名密碼, 此處使用用戶名密碼,選擇
Use password authentication, or use a different key,即docker用戶的密碼,進(jìn)行登錄發(fā)布,之前已經(jīng)講/data/dockerfiles目錄的屬主屬組更改為docker,確認(rèn)Jenkins服務(wù)器使用docker用戶可以正常在此目錄下進(jìn)行后續(xù)操作。
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成

3.2 構(gòu)建一個(gè)maven項(xiàng)目

一般設(shè)置

Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
為保證Jenkins服務(wù)器的磁盤有充足的空間,在選中丟棄舊的構(gòu)建->保持構(gòu)建的最大個(gè)數(shù)為10個(gè)
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
在真實(shí)開發(fā)環(huán)境中,成員直接相互協(xié)助,GIT是多分支的,考慮到分支管理,需在此選中參數(shù)化構(gòu)建->選擇Git Parameter->定義名稱為release_branch,因此選擇參數(shù)類型為Branch:如果自己發(fā)現(xiàn)devops腳本可以看到里面是調(diào)用了此參數(shù)進(jìn)行選擇構(gòu)建的分支。
同時(shí)創(chuàng)建考慮到創(chuàng)建Docker的名稱,此時(shí)需要給后續(xù)創(chuàng)建的docker images以項(xiàng)目的名稱命名。
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成

源碼管理

源碼管理選擇git,填入倉(cāng)庫(kù)url:git@github.com:redhatxl/zrlog.git
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
此時(shí)發(fā)現(xiàn)會(huì)出現(xiàn)報(bào)錯(cuò)信息,因?yàn)榇藗}(cāng)庫(kù)為我的私有倉(cāng)庫(kù),需要配置Credentials,點(diǎn)開add, Add Credentials的 Kind選擇SSH Username with private key,Username選擇之前在github上傳的公鑰用戶的用戶名,此次為root,Private Key為jenkins服務(wù)器登錄github的本地私鑰,查看私鑰cat /root/.ssh/id_rsa 復(fù)制粘貼到Key區(qū)域,完成添加。此時(shí)可以發(fā)現(xiàn)報(bào)錯(cuò)已經(jīng)消失。
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
在Branches to build模塊需要填寫之前我們參數(shù)話的變量,在此引用$release_branch
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成

環(huán)境構(gòu)建

在build的Goals and options添加maven構(gòu)建參考及命令:clean install -D maven.test.skip=true
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成

增加構(gòu)建后操作

增加構(gòu)建后步驟---選擇Send build artifacts over SSH
SSH-Server name選擇Docker宿主機(jī)
Transfers中填寫Source files:target/*.war

Remove prefix:target/
Remote directory:/war/$project_name,即在遠(yuǎn)端/data/dockerfiles下的war目錄(/data/dockerfiles/war/docker01-tomcat-zrlog)
Exec command:/data/dockerfiles/scripts/devop.sh $project_name zrlog $release_branch 8888 8080
即jenkins服務(wù)器ssh到docker宿主機(jī)之后執(zhí)行的腳本命令,執(zhí)行/data/dockerfiles/scripts/devop.sh腳本,此腳本需要傳入5個(gè)參考,
project_name:項(xiàng)目名稱,即docker生成images的名稱
zrlog:即項(xiàng)目名稱
release_branch:在git上提交的分支,此處我們只有master分支
兩個(gè)端口,前一個(gè)端口及宿主機(jī)的監(jiān)聽端口,后一個(gè)端口及映射到docker容器內(nèi)部的端口,在此處使用的為tomcat,默認(rèn)的為8080端口。
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
注意:再次可以添加多個(gè)server,即實(shí)現(xiàn)集群,可以講web服務(wù)器為無狀態(tài),將日志文件掛載到本地物理磁盤以實(shí)現(xiàn)日志監(jiān)控即數(shù)據(jù)持久化存儲(chǔ)。

添加增加構(gòu)建后操作,選擇Editable Email Notification,利用插件郵件來發(fā)送通知。
可以根據(jù)需求自定義郵件主題與內(nèi)容,此處添加信息接受人,由于全局配置了always,在高級(jí)設(shè)置內(nèi),填寫接受人郵箱。
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
創(chuàng)建完畢后點(diǎn)擊應(yīng)用并保存。

3.3 執(zhí)行構(gòu)建

選擇Build with Parameters,然后在右邊release_branch內(nèi)選擇需要執(zhí)行的github上的分支,此處為master,同理選擇 project_name,為docker images的name可以選擇自己添加自定義的名字,點(diǎn)擊開始構(gòu)建
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
查看Console Output
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
查看郵件通知
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
登錄docker宿主機(jī)查看images與container
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
網(wǎng)頁(yè)測(cè)試
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
至此利用jenkins簡(jiǎn)單的實(shí)現(xiàn)了講github上的源碼拉去到j(luò)enkins服務(wù)器本地,利用maven編譯生成war包并分發(fā)到docker宿主機(jī),執(zhí)行腳本生成dockerfile,并啟動(dòng)容器,最終郵件通知。

四、啟動(dòng)多個(gè)容器

在配置jenkins的ssh后的命令我們可以添加多個(gè)server從而實(shí)現(xiàn)分布式,同時(shí)我們也可以對(duì)在一臺(tái)主機(jī)上通過區(qū)分端口號(hào)來生成多個(gè)images并啟動(dòng)多個(gè)不通端口的container
在General的參數(shù)化構(gòu)建過程中增加第三個(gè)參數(shù)proxy_port可以設(shè)置為docker宿主機(jī)的本地監(jiān)聽端口從而實(shí)現(xiàn)多端口多實(shí)例
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
在ssh命令中調(diào)用
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
在構(gòu)建開始時(shí)可以定義不同的images對(duì)應(yīng)不通的端口
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
查看啟動(dòng)后的容器
Docker+Jenkins+GIT+Tomcat實(shí)戰(zhàn)持續(xù)化集成
注意:如果有特殊需求,例如發(fā)布php代碼或其他可以自行對(duì)腳本進(jìn)行修改,可以根據(jù)需求定義多個(gè)參數(shù)靈活使用。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI