• Jenkins+Svn+Docker搭建持续集成环境 自动部署(多机子)


    一、准备工作:

    • 两台服务器:192.168.206.212,192.168.206.213

    • 自己新建一个maven项目

    其中两台机子做下面的软件配置(都有链接,可直达

    212机子:

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

    credentialsId:凭据,如下图所示配置一个

     

     

    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/
    
  • 相关阅读:
    columns布局应用场景
    flex速记
    css属性选择器模糊匹配
    ydui的rem适配方案
    vscode搜索失效问题
    ESP8266 超声波测距模块HC-SR04
    树莓派PICO Wifi 无线网卡 esp82666接线图
    查看数据库容量大小
    面试官问我JVM内存结构,我真的是
    深入浅出Java内存模型
  • 原文地址:https://www.cnblogs.com/qq1445496485/p/16427096.html
Copyright © 2020-2023  润新知