多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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