# Jenkins 實現持續構建java 應用
### 基礎環境依賴
- base/gradle:3.4.1-8u101
- base/spring:2.1-8u101-kazoo
- test應用項目倉庫[地址](https://gitee.com/huyipow/test.git)
- zookeeper_dev
### 本地構建應用
1. 打包:`gradle build `
2. 啟動參數:`java -jar XXX.jar -Dserver.port=8080`
3. 應用包地址:`build/libs/test-1.0-SNAPSHOT.jar`
4. 請求地址: `http://localhost:8080/test?name=uuu`
### setenv.sh 配置啟動參數
JAVA_OPTS="
-server -Xms128M -Xmx128M
-Dserver.port=8080
${JAVA_OPTS}
"
### jenkins job (1): 構建應用鏡像
#!/bin/sh
# 測試docker倉庫
curl --connect-timeout 30 -I ${DOCKER_REGISTRY} 2>/dev/null | grep 'HTTP/1.1 200 OK'
# 檢查當前版本的鏡像是否已經存在
if ! ${NoCache}
then
curl -I `echo ${ToImage} | sed 's/\([^/]\+\)\([^:]\+\):/\1\/v1\/repositories\2\/tags\//'` | grep 'HTTP/1.1 200 OK' && exit 0 || echo
fi
rm -rf buildspace/ && mkdir -p buildspace/ # 清理工作環境
eval ${BuildCmd} # 編譯代碼
cd ${WORKSPACE} # 返回工作目錄
eval ${TarCmd} # 打包代碼
cd ${WORKSPACE} # 返回工作目錄
CodeBasename=${CodeTarget##*/}
cp -a ${CodeTarget} buildspace/${CodeBasename} # 復制代碼包
#tar zcf ${CodeTarget} dist/ #打包代碼包
# 生成Dockerfile文件
cat > buildspace/Dockerfile << EOF
FROM ${FromImage}
MAINTAINER devops <devops@dianrong.com>
COPY ${CodeBasename} \${SPRING_HOME}
EOF
docker pull ${FromImage} # 同步上層鏡像
docker build --no-cache=${NoCache} -t ${ToImage} buildspace/ && docker push ${ToImage} # 開始構建鏡像,成功后Push到倉庫
docker rmi ${ToImage} || echo # 刪除鏡像
### jenkins job (2):自動部署應用鏡像
#!/bin/sh
# 循環部署多實例
for AppAddress in ${AppAddresses}
do
# 初始化變量
ADDRESS=${AppAddress%%,*} # 宿主機地址和宿主機端口
AppExpose=`echo ,${AppAddress#*,} | sed 's/,/ -p /g'` # 需要影射的端口
AppIp=${ADDRESS%%_*} # 宿主機地址
AppPort=${ADDRESS##*_} # 宿主機端口
AppId=`echo ${AppOrg}_${AppEnv}_${AppName}_${AppIp}_${AppPort} ` # 實例Id/容器名
AppHostname=`echo ${AppPort}-${AppIp}-${AppName}-${AppEnv}-${AppOrg} ` # 實例主機名
RunImage=${ToImage%:*}:${GitBranch##*/} # 版本鏡像
JmxPort=$(( AppPort + 10 ))
docker -H ${AppIp}:4243 pull ${ToImage} >/dev/null # 同步版本鏡像
docker -H ${AppIp}:4243 tag ${ToImage} ${RunImage} # 新增鏡像Tag
RESULT=`docker -H ${AppIp}:4243 inspect -f '{{.Image}}' ${AppId} || echo 0` # 保留當前實例的鏡像Id
docker -H ${AppIp}:4243 stop ${AppId} || echo # 停止當前實例
sleep 10
docker -H ${AppIp}:4243 rm -f ${AppId} || echo # 刪除當前實例
sleep 3
# 部署新實例
docker -H ${AppIp}:4243 run --name=${AppId} --hostname=${AppHostname} \
-v ${DUMP}/${AppId}:/VolumeDump -v ${LOGS}/${AppId}:/VolumeLogs \
-e AppId=${AppId} -e AppAddress=${AppIp}:${AppPort} -e AppLabel="${AppOrg}_${AppEnv}_${AppName}" \
${AppExpose} ${RunOptions} ${RunImage} ${RunCmd}
docker -H ${AppIp}:4243 rmi ${RESULT} || echo # 刪除之前的鏡像
done
- 第一章 Docker核心技術(一)
- 第一章 Docker核心技術(二)
- 第一章 Docker核心技術(三)
- 第一章 Docker核心技術(四)
- 第二章 Docker 入門
- 第三章 使用docker鏡像
- 第四章 實戰應用使用Docker構建LNMP環境 (一)
- 第四章 實戰應用使用Docker構建LNMP環境 (二)
- 第四章 實戰應用使用Docker構建LNMP環境 (三)
- 第五章 構建企業級Harbor-Registry
- 第六章 構建Docker應用發布系統(一)
- 第六章 構建Docker應用發布系統(二)
- 第六章 構建Docker應用發布系統(三)
- 第六章 構建Docker應用發布系統(四)