基於Jenkins+Git+Docker的持續整合(下)
接上篇 基於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 Directory和Exec 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於Jenkins+Git+Docker的持續整合(上)JenkinsGitDocker
- 前端專案基於GitLab-CI的持續整合/持續部署(CI/CD)前端Gitlab
- 基於Jenkins快速搭建持續整合環境Jenkins
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別
- 基於 Docker 打造前端持續整合開發環境Docker前端開發環境
- 持續整合、持續部署、持續交付、持續釋出
- 持續整合、持續交付、持續部署簡介
- 基於 abapGit 和 abaplint 的 ABAP 持續整合的一個例子Git
- 整合持續整合工具
- 基於jenkins搭建一個持續整合伺服器Jenkins伺服器
- Azure DevOps(一)基於 Net6.0 的 WPF 程式如何進行持續整合、持續編譯dev編譯
- 對持續整合、 持續交付、持續部署和持續釋出的介紹
- iOS 持續整合iOS
- 關於DVCS、持續整合和特性分支
- 基於Gitlab-CI/CD Docker 持續整合 node 專案GitlabDocker
- 基於Jmeter+Maven+Jenkins持續整合介面測試框架JMeterMavenJenkins框架
- Linux下搭建Jenkins持續整合LinuxJenkins
- 基於Kubernetes/K8S構建Jenkins持續整合平臺(下)K8SJenkins
- 談談持續整合,持續交付,持續部署之間的區別
- 花椒前端基於 Docker 的 SSR 持續開發整合環境實踐前端Docker
- 淺談持續整合(CI)、持續交付(CD)、持續部署(CD)
- Ansible 持續整合Anolis、Ubuntu基線配置Ubuntu
- 持續整合工具之Jenkins基礎使用Jenkins
- Jenkins持續整合Jenkins
- 淺談持續整合的理解以及實現持續整合,需要做什麼?
- 持續整合、持續交付和持續部署有什麼區別?0基礎學習linux技能Linux
- SAP開源的持續整合-持續交付的解決方案
- 小程式的持續整合方案
- 從持續整合到持續交付——DockerCloud概覽DockerCloud
- 基於 flow.ci 實現 PHP 專案自動化持續整合PHP
- 基於CentOS、docker搭建jenkins內網前端可持續整合環境CentOSDockerJenkins內網前端
- 用於持續整合的13種Jenkins替代方案 -DEVJenkinsdev
- 通過Docker容器執行持續整合/持續部署Docker
- 基於Saltstack、Artifactory打造傳統模式下持續部署平臺模式
- 持續整合配置之Nuget
- Taro 小程式持續整合
- 持續整合JenkinsBlueOcean初探Jenkins
- Jenkins持續整合配置Jenkins