一、准备工作:

  • 两台服务器:192.168.206.212,192.168.206.213

  • 自己新建一个maven项目

其中两台机子做下面的软件配置

212机子:

  • 安装expect并配置;

  • 安装jenkins

  • 安装docker

  • 安装私有镜像仓库

  • 安装JDK并配置;

  • 安装maven并配置;

213机子:

  • 安装SVN

  • 安装JDK并配置;

  • 安装maven并配置;

  • 安装docker

其中项目的话可以参照截图,controller,model什么的这些自定义就行。

重点注意红框框的这几个

1、properties 配置

application-dev.properties 和 application-test.properties 主要就是数据库地址不一样,其他都一样。这里这两个文件不配置内容也可以。

2、pom文件

pom文件主要就配置红框框位置的这个,我这里的名称demo就可以让每次打包都是 demo.jar 这个名称

3、脚本文件

主要的来了。这五个配置文件

(1)docker_build.sh

  1. #!/bin/bash
  2. RUNENV=$1
  3. MODULE=$2
  4. echo "环境: ${RUNENV}"
  5. # docker 仓库地址
  6. IMAGE_NAME="192.168.206.212:5000/${MODULE}:1.0.0.RC"
  7. echo $IMAGE_NAME >> IMAGE_NAME
  8. docker build --build-arg RUNENV=${RUNENV} -t ${IMAGE_NAME} .
  9. docker push ${IMAGE_NAME}

(2)docker_deploy.sh

  1. #!/bin/bash
  2.  
  3. PORT=$1
  4. IMAGE=$2
  5. MODULE=$3
  6. echo "update image to: ${IMAGE}"
  7. docker stop ${MODULE}
  8. # 删除容器
  9. docker rm ${MODULE}
  10. # 减少磁盘空间 删除镜像
  11. docker rmi -f $(docker images | grep ${MODULE})
  12. docker run -d -p ${PORT}:8070 -v /home/logs:/home/logs --name ${MODULE} ${IMAGE}

(3)Dockerfile

  1. FROM airdock/oraclejdk
  2. MAINTAINER hmw 1445496485@qq.com
  3.  
  4. ARG RUNENV=${RUNENV}
  5. ENV RUNENV=${RUNENV}
  6.  
  7. ENV TZ=Asia/Shanghai
  8. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  9.  
  10. RUN mkdir -p /var/yjz/demo \
  11. echo ${RUNENV} > /tmp.properties
  12.  
  13. COPY target/demo.jar /var/yjz/demo/app.jar
  14.  
  15. WORKDIR /var/yjz/demo
  16.  
  17. ENTRYPOINT ["java","-jar","app.jar","--spring.profiles.active=${RUNENV}"]
  18.  
  19. # EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开!
  20. # 我们声明了EXPOSE端口之后,我们使用-P命令进行随机映射的时候,是会对这个端口进行映射的。
  21. # 比如说我们现在对一个tomcat容器进行EXPOSE 9999声明,那么我们进行-P随机映射的时候是会对9999端口进行映射的。
  22. EXPOSE 8063:8063

(4)expect.sh

  1. #!/usr/expect/bin/expect
  2.  
  3. set timeout -1
  4. # 获取传入参数
  5. set pwd [lindex $argv 0]
  6. set module [lindex $argv 1]
  7. set port [lindex $argv 2]
  8. set image [lindex $argv 3]
  9.  
  10. spawn scp $pwd/docker_deploy.sh root@192.168.206.213:/home/service/fesco/$module.sh
  11.  
  12. expect "*password:"
  13. send "root\r"
  14.  
  15. spawn ssh root@192.168.206.213
  16. expect "*password:"
  17. send "root\r"
  18.  
  19. expect "]# "
  20. send "sh /home/service/fesco/$module.sh $port $image $module\r"
  21.  
  22. send "exit\r"
  23. expect eof
  24. exit

(5)start.sh

  1. #!/bin/bash
  2.  
  3. PORT=$1
  4. MODULE=$2
  5. IMAGE_NAME="192.168.206.212:5000/${MODULE}:1.0.0.RC"
  6.  
  7. echo "目录:" $(pwd)
  8. echo "模块:" ${MODULE}
  9. echo "端口:" ${PORT}
  10.  
  11. ./expect.sh $(pwd) ${MODULE} ${PORT} ${IMAGE_NAME}

二、jenkins创建项目

1、新建item——>选择流水线(PipeLine)。

2、设置参数

3、流水线脚本

  1. node {
  2. stage('checkout_order') {
  3. deleteDir()
  4. checkout([
  5. $class: 'SubversionSCM',
  6. additionalCredentials: [],
  7. excludedCommitMessages: '',
  8. excludedRegions: '',
  9. excludedRevprop: '',
  10. excludedUsers: '',
  11. filterChangelog: false,
  12. ignoreDirPropChanges: false,
  13. includedRegions: '',
  14. locations: [
  15. [
  16. credentialsId: '1a2dc2fc-8eed-46a3-b22d-169a863376ec',
  17. depthOption: 'infinity',
  18. ignoreExternalsOption: true,
  19. local: '.',
  20. remote: 'http://192.168.206.213/svn/svnrepos/branch/@HEAD'
  21. ]
  22. ],
  23. workspaceUpdater: [$class: 'UpdateUpdater']
  24. ])
  25. }
  26. stage("mvn_order") {
  27. echo "start compile mvn_common"
  28. sh "mvn -DskipTests clean package"
  29. }
  30. stage("docker_build") {
  31. echo "start build image"
  32. sh 'chmod 777 ./docker_build.sh'
  33. sh './docker_build.sh ${RUNENV} ${MODULE}'
  34. }
  35.  
  36. stage("docker_deploy") {
  37. echo "deploy on docker"
  38. sh 'chmod 777 ./docker_deploy.sh'
  39. sh 'chmod 777 ./expect.sh'
  40. sh 'chmod 777 ./start.sh'
  41. sh './start.sh ${PORT} ${MODULE}'
  42. }
  43. }

 remote 后面填自己的项目svn地址,其他不变。下面这是我的。

脚本的整个过程:

  1. # 1、svn拉取项目
  2. # 2、编译maven项目,生成jar包
  3. # 3、docker_build.sh结合DockerFile文件 生成镜像并push到镜像仓库
  4. # 4、运行start.sh 传入参数(端口号,项目名称等,这里可以把版本号作为参数也发来),调用expect.sh将212机子上的docker_deploy.sh发送到213机子上,并登录213机子,启动docker_deploy.sh, docker_deploy会停止当前容器,删除容器,删除镜像,从镜像仓库上拉取镜像重新生成容器并启动。

4、新建好之后,构建项目即可。

三、构建过程中的问题:

1、错误信息: unix /var/run/docker.sock: connect: permission denied

解决方案:

  1. # 这个方法只要docker服务重启, 就需要重新设置一次
  2. cd /var/run/
  3. chmod 777 docker.sock

2、错误信息:java.lang.UnsupportedOperationException: no known implementation of class hudson.scm.SCM is named SubversionSCM

解决方案:

因为没有安装svn插件,去插件管理中安装svn

3、错误信息:hudson.remoting.ProxyException: org.tmatesoft.svn.core.SVNAuthenticationCancelledException: svn: E200015: Authentication cancelled

解决方案:

jenkins中添加一个凭据 svn中的用户

4、错误信息:[ERROR] Could not create local repository at /usr/local/maven-repository -> [Help 1]

解决方案:

没有找到maven中conf文件夹中的settting.conf配置的仓库地址,我的是/usr/local/maven-repository。

所以在Jenknis所在的机子上操作,创建仓库文件夹,并放开权限

  1. cd /usr/local/
  2. mkdir maven-repository
  3. chmod -R 777 /usr/local/maven-repository/

5、错误信息:[ERROR] [ERROR] Some problems were encountered while processing the POMs:

修改jenkins的用户为root,默认是jenkins

  1. vim /etc/sysconfig/jenkins

重启jenkins

  1. systemctl restart jenkins

另外,要将maven仓库的权限放开。

我的仓库地址是 /usr/local/maven-repository/

  1. chmod -R 777 /usr/local/maven-repository/

Jenkins+Svn+Docker搭建持续集成环境 自动部署的更多相关文章

  1. 使用Docker构建持续集成与自动部署的Docker集群

    为什么使用Docker " 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...

  2. Jenkins+Maven+SVN快速搭建持续集成环境

    http://www.cnblogs.com/sunzhenchao/archive/2013/01/30/2883289.htmlhttp://blog.csdn.net/pein_zero/art ...

  3. Jenkins+Maven+SVN快速搭建持续集成环境(转)

    Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面看看我们是如何几分钟就快速搭建一个持续集成环境吧. 假设我们目前已经有2个maven项目:entities(J ...

  4. Jenkins+ANT+SVN快速搭建持续集成环境

    伟大的语言都从helloworld开始,这里我们用Jenkins+ANT+SVN来搭建这一套持续集成环境. 环境准备: 一台已经配置好Jenkins和Ant的机器. 项目准备: 用Ecplise建立一 ...

  5. Jenkins + svn + maven 构建持续集成环境搭建

    Jenkins简介 Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: ...

  6. Jenkins+Maven+Git搭建持续集成和自动化部署的配置手记

    前言    持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新 ...

  7. Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的

    前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新项目正 ...

  8. selenium+jenkins+maven+testNG搭建持续集成环境

    为了简明起见,分几大部分,很基础的细节就不详述了 一·安装jenkins 二·创建一个maven项目的job 2.1   填上SVN的Repository URL 2.2  由于是在本地执行maven ...

  9. 阿里云 持续集成环境自动部署cordova项目热更新脚本

    linux脚本: #!/bin/sh rm -rf /home/tomcat/xiecang_hybird_web/xiecang_hybird_web.zip rm -rf /home/tomcat ...

随机推荐

  1. 前台主页搭建、后台主页轮播图接口设计、跨域问题详解、前后端互通、后端自定义配置、git软件的初步介绍

    今日内容概要 前台主页 后台主页轮播图接口 跨域问题详解 前后端打通 后端自定义配置 git介绍和安装 内容详细 1.前台主页 Homeviwe.vue <template> <di ...

  2. Linux获取本机公网IP,调整双节点主从服务的RPC调用逻辑

    简单记录一次双节点的之间的服务调用叭 ~ 现有: 服务A的双节点A1.A2 服务B的双节点B1.B2 服务A 和服务B 通过 Netty 实现 RPC 通信,可能会导致比较玄学的问题.如图: 要做到 ...

  3. 基于语义感知SBST的API场景测试智能生成

    摘要:面对庞大服务接口群,完备的接口测试覆盖和业务上下文场景测试看护才有可能保障产品服务的质量和可信.如果你想低成本实现产品和服务的测试高覆盖和高质量看护,这篇文章将为你提供你想要的. 本文分享自华为 ...

  4. 倒数第N个字符

    一. 题目描述 给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, aab ...

  5. 半导体行业如何保持高效远程办公?因果集群(Causal Clustering)了解一下!

    什么是因果集群?因果集群是下一代多站点复制技术.它支持数据中心的分布式系统集群模型.借助于因果集群技术,可以让远程工作团队成员体验到更卓越的性能和更健壮的复制功能,确保您的团队始终以高效状态工作. 因 ...

  6. 100ms的SQL把服务器搞崩溃了

    前言 一个项目上线了两个月,除了一些反馈的优化和小Bug之外,项目一切顺利:前期是属于推广阶段,可能使用人员没那么多,当然对于项目部署肯定提前想到并发量了,所以早就把集群安排上,而且还在测试环境搞了一 ...

  7. Oracle查看表空间大小

    遇到报错 java.sql.SQLException: ORA-01653: 表 MESHIS.HIS_RET_LOT_FQC 无法通过 8 (在表空间 MESHIS_DATA_TBS 中) 扩展 a ...

  8. openstack命令创建云主机实例

    @ 目录 前言 上传centos镜像 创建实例 创建外网卡 修改安全组规则 创建云主机实例 前言 简单创建云主机实例只需要上传一个测试镜像.创建一张外网卡.创建一个实例类型.修改安全组规则即可 注:这 ...

  9. Linux 常见必备

    一.学习Linux须知常识 1.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应用程序,比 ...

  10. 不要使用Java Executors 提供的默认线程池

    线程池构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUni ...