# 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应用发布系统(四)