热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Jenkins+Svn+Docker搭建持续集成环境自动部署

一、准备工作:两台服务器:192.168.206.212,192.168.206.213自己新建一个maven项目其中两台机子做下面的软件配置212机子:安装expect并配置;安

一、准备工作:

  • 两台服务器: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

#!/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 1445496485@qq.com


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 root@192.168.206.213:/home/service/fesco/$module.sh

expect "*password:"
send "root\r"


spawn ssh root@192.168.206.213
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}

二、jenkins创建项目

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

  

 2、设置参数

 

 

 

 3、流水线脚本

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}'
     }
}

 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会停止当前容器,删除容器,删除镜像,从镜像仓库上拉取镜像重新生成容器并启动。

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

三、构建过程中的问题:

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

 解决方案:

# 这个方法只要docker服务重启, 就需要重新设置一次
cd /var/run/
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所在的机子上操作,创建仓库文件夹,并放开权限

cd /usr/local/
mkdir maven-repository
chmod -R 777 /usr/local/maven-repository/

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

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

vim /etc/sysconfig/jenkins

 重启jenkins

systemctl restart jenkins

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

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

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

 


推荐阅读
  • 【云计算】Dockerfile、镜像、容器快速入门 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
author-avatar
小熊2502872357
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有