application-dev.properties 和 application-test.properties 主要就是資料庫地址不一樣,其他都一樣。這裡這兩個檔案不設定內容也可以。
主要的來了。這五個組態檔
(1)docker_build.sh
#!/bin/bash RUNENV=$1 MODULE=$2 echo "環境: ${RUNENV}" # docker 倉庫地址 IMAGE_NAME="192.168.206.212:5000/${MODULE}:1.0.0.RC" echo $IMAGE_NAME >> IMAGE_NAME docker build --build-arg RUNENV=${RUNENV} -t ${IMAGE_NAME} . docker push ${IMAGE_NAME}
(2)docker_deploy.sh
#!/bin/bash PORT=$1 IMAGE=$2 MODULE=$3 echo "update image to: ${IMAGE}" docker stop ${MODULE} # 刪除容器 docker rm ${MODULE} # 減少磁碟空間 刪除映象 docker rmi -f $(docker images | grep ${MODULE}) docker run -d -p ${PORT}:8070 -v /home/logs:/home/logs --name ${MODULE} ${IMAGE}
(3)Dockerfile
FROM airdock/oraclejdk MAINTAINER hmw [email protected] ARG RUNENV=${RUNENV} ENV RUNENV=${RUNENV} ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN mkdir -p /var/yjz/demo \ echo ${RUNENV} > /tmp.properties COPY target/demo.jar /var/yjz/demo/app.jar WORKDIR /var/yjz/demo ENTRYPOINT ["java","-jar","app.jar","--spring.profiles.active=${RUNENV}"] # EXPOSE命令只是宣告了容器應該開啟的埠並沒有實際上將它開啟! # 我們宣告了EXPOSE埠之後,我們使用-P命令進行隨機對映的時候,是會對這個埠進行對映的。 # 比如說我們現在對一個tomcat容器進行EXPOSE 9999宣告,那麼我們進行-P隨機對映的時候是會對9999埠進行對映的。 EXPOSE 8063:8063
(4)expect.sh
#!/usr/expect/bin/expect set timeout -1 # 獲取傳入引數 set pwd [lindex $argv 0] set module [lindex $argv 1] set port [lindex $argv 2] set image [lindex $argv 3] spawn scp $pwd/docker_deploy.sh [email protected]:/home/service/fesco/$module.sh expect "*password:" send "root\r" spawn ssh [email protected] expect "*password:" send "root\r" expect "]# " send "sh /home/service/fesco/$module.sh $port $image $module\r" send "exit\r" expect eof exit
(5)start.sh
#!/bin/bash PORT=$1 MODULE=$2 IMAGE_NAME="192.168.206.212:5000/${MODULE}:1.0.0.RC" echo "目錄:" $(pwd) echo "模組:" ${MODULE} echo "埠:" ${PORT} ./expect.sh $(pwd) ${MODULE} ${PORT} ${IMAGE_NAME}
node { stage('checkout_order') { deleteDir() checkout([ $class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [ [ credentialsId: '1a2dc2fc-8eed-46a3-b22d-169a863376ec', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'http://192.168.206.213/svn/svnrepos/branch/@HEAD' ] ], workspaceUpdater: [$class: 'UpdateUpdater'] ]) } stage("mvn_order") { echo "start compile mvn_common" sh "mvn -DskipTests clean package" } stage("docker_build") { echo "start build image" sh 'chmod 777 ./docker_build.sh' sh './docker_build.sh ${RUNENV} ${MODULE}' } stage("docker_deploy") { echo "deploy on docker" sh 'chmod 777 ./docker_deploy.sh' sh 'chmod 777 ./expect.sh' sh 'chmod 777 ./start.sh' sh './start.sh ${PORT} ${MODULE}' } }
credentialsId:憑據,如下圖所示設定一個
remote 後面填自己的專案svn地址,其他不變。下面這是我的。
指令碼的整個過程:
# 1、svn拉取專案 # 2、編譯maven專案,生成jar包 # 3、docker_build.sh結合DockerFile檔案 生成映象並push到映象倉庫 # 4、執行start.sh 傳入引數(埠號,專案名稱等,這裡可以把版本號作為引數也發來),呼叫expect.sh將212機子上的docker_deploy.sh傳送到213機子上,並登入213機子,啟動docker_deploy.sh, docker_deploy會停止當前容器,刪除容器,刪除映象,從映象倉庫上拉取映象重新生成容器並啟動。
解決方案:
# 這個方法只要docker服務重啟, 就需要重新設定一次 cd /var/run/ chmod 777 docker.sock
解決方案:
因為沒有安裝svn外掛,去外掛管理中安裝svn
解決方案:
jenkins中新增一個憑據 svn中的使用者
解決方案:
沒有找到maven中conf資料夾中的settting.conf設定的倉庫地址,我的是/usr/local/maven-repository。
所以在Jenknis所在的機子上操作,建立倉庫資料夾,並放開許可權
cd /usr/local/ mkdir maven-repository chmod -R 777 /usr/local/maven-repository/
修改jenkins的使用者為root,預設是jenkins
vim /etc/sysconfig/jenkins
重啟jenkins
systemctl restart jenkins
我的倉庫地址是 /usr/local/maven-repository/
chmod -R 777 /usr/local/maven-repository/