Giter VIP home page Giter VIP logo

spring-boot-ci-demo's Introduction

项目介绍

  • ci(持续构建测试项目),数据源使用h2

概述

image.png

  • 第一个红框里是加特林(gatling)脚本的存放目录位置与结构

  • 第二个红框的Dockerfile也是必须的

  • 项目必须为maven项目

  • 前提用docker-compose构建服务器,步骤如下

    • 创建宿主机挂载目录:mkdir -p /data/docker/ci/nexus /data/docker/ci/jenkins/lib /data/docker/ci/jenkins/home /data/docker/ci/sonarqube /data/docker/ci/postgresql /data/docker/ci/gatling/results

    • 赋权(避免挂载的时候,一些程序需要容器中的用户的特定权限使用):chmod -R 777 /data/docker/ci/nexus /data/docker/ci/jenkins/lib /data/docker/ci/jenkins/home /data/docker/ci/sonarqube /data/docker/ci/postgresql /data/docker/ci/gatling/results

    • 使用docker-compose执行如下脚本

    
    version: '3'
    
    networks:
    
      prodnetwork:
    
        driver: bridge
    
    services:
    
      sonardb:
    
        image: postgres:9.6.6
    
        restart: always
    
        ports:
    
          - "5433:5432"
    
        networks:
    
          - prodnetwork
    
        volumes:
    
          - /data/docker/ci/postgresql:/var/lib/postgresql
    
        environment:
    
          - POSTGRES_USER=sonar
    
          - POSTGRES_PASSWORD=sonar
    
      sonar:
    
        image: sonarqube:6.7.1
    
        restart: always
    
        ports:
    
        - "19000:9000"
    
        - "19092:9092"
    
        networks:
    
          - prodnetwork
    
        depends_on:
    
          - sonardb
    
        volumes:
    
          - /data/docker/ci/sonarqube/conf:/opt/sonarqube/conf
    
          - /data/docker/ci/sonarqube/data:/opt/sonarqube/data
    
          - /data/docker/ci/sonarqube/extension:/opt/sonarqube/extensions
    
          - /data/docker/ci/sonarqube/bundled-plugins:/opt/sonarqube/lib/bundled-plugins
    
        environment:
    
          #- SONARQUBE_JDBC_URL=jdbc:postgresql://sonardb:5433/sonar
    
          - SONARQUBE_JDBC_URL=jdbc:postgresql://sonardb:5432/sonar
    
          - SONARQUBE_JDBC_USERNAME=sonar
    
          - SONARQUBE_JDBC_PASSWORD=sonar
    
      nexus:
    
        image: sonatype/nexus3
    
        restart: always
    
        ports:
    
          - "18081:8081"
    
        networks:
    
          - prodnetwork
    
        volumes:
    
          - /data/docker/ci/nexus:/nexus-data
    
      jenkins:
    
        image: wine6823/jenkins:1.1
    
        restart: always
    
        ports:
    
          - "18080:8080"
    
        networks:
    
          - prodnetwork
    
        volumes:
    
          - /var/run/docker.sock:/var/run/docker.sock
    
          - /etc/localtime:/etc/localtime:ro
    
          - $HOME/.ssh:/root/.ssh
    
          - /data/docker/ci/jenkins/lib:/var/lib/jenkins/
    
          - /usr/bin/docker:/usr/bin/docker
    
          - /data/docker/ci/jenkins/home:/var/jenkins_home
    
        depends_on:
    
          - nexus
    
          - sonar
    
        environment:
    
          - NEXUS_PORT=8081
    
          - SONAR_PORT=9000
    
          - SONAR_DB_PORT=5432
    
    
  • 最后用dockers启动一个nginx服务器,命令如下


docker run --name some-nginx -v /data/docker/ci/gatling/results:/usr/share/nginx/html:ro -p 8080:80 -d nginx

步骤一(jenkins)

image.png

image.png

  • Jenkinsfiles脚本代码如下

node {

/*****************************git代码块***********************************/

    // ! git 仓库路径

    gitUrl = 'https://github.com/14251104246/spring-boot-ci-demo.git'

    // ! git 分支

    gitBranch = 'master'

    // ! git 使用的jenkins证书id

    gitCredential = '5b3912a8-0074-4955-b48f-c0af217785ac'

    stage ('git') {

        git branch: gitBranch,

            credentialsId: gitCredential,

            url: gitUrl

    }

/*****************************预处理代码块***********************************/

    // ! maven最终构建项目ArtifactId(项目目录请和ArtifactId一致)(可改)

    mavenArtifactId = 'yisike-parent'

    // 文件夹分隔

    DELIMITER = '/'

    // jenkins挂载在宿主机的所有项目地址

    volumeRoot = '/data/docker/ci/jenkins/home';

    // jenkins在容器中的所有项目地址

    jenkinsRoot = '/var/jenkins_home'

    // 具体项目工作区

    projectWorkspace = 'workspace'

    // jenkins挂载在宿主机的项目地址

    volumeDeployRootPath = volumeRoot + DELIMITER + projectWorkspace + DELIMITER + env.JOB_NAME

    // jenkins在容器中的项目路径

    jenkinsDeployRootPath = env.WORKSPACE

    // jenkins挂载在宿主机的构建地址

    volumeDeployPath = ''

    // jenkins在容器中的构建路径

    jenkinsDeployPath = ''

    //是否只有一个项目

    mavenSingleModule = true

    String relativePath = ''

    stage ('pre') {

        echo '路径预处理'

        volumeDeployPath = volumeDeployRootPath

        jenkinsDeployPath = jenkinsDeployRootPath

        println 'jenkins挂载在宿主机的项目地址:' + volumeDeployRootPath

        println 'jenkins在容器中的项目路径:' + jenkinsDeployRootPath

        println 'jenkins挂载在宿主机的构建地址:' + volumeDeployPath

        println 'jenkins在容器中的构建路径:' + jenkinsDeployPath

    }

  /*******************************maven代码块*********************************/

    // maven地址

    MVN_HOME = 'docker run -t --rm --name my-maven-project -v '+volumeDeployPath+':/usr/src/mymaven -v $HOME/.m2:/root/.m2 -w /usr/src/mymaven maven:3.3-jdk-8 '

    stage ('mvn') {

        echo 'start mvn'

        //暂时使用sh,后边替换为 ArtifactoryMavenBuild

        stage ('mvn-clean') {

            sh """

${MVN_HOME} mvn clean

"""

        }

        stage ('mvn-package') {

            thisPath = jenkinsDeployRootPath + DELIMITER + (relativePath == null || relativePath.size() == 0 ? relativePath : relativePath + DELIMITER)+ DELIMITER

            sh """

            ${MVN_HOME} mvn package  -DskipTests

            """

        }

        echo 'stop mvn'

    }

/**********************************docker代码块************************************************************/

/**********************************docker代码块************************************************************/

    //服务名称(子模块目录名称)

    def srvName = 'demo'

    //仓库地址

    def registryUrl = 'hboverseas.banggood.cn'

    //远程服务器地址(用于部署)

    def devHost = '122.152.225.111'

    def devDockerDaemon = "tcp://${devHost}:2376"

    //项目名称

    def project = 'ad'

    //远程docker容器启动参数

    def dockerParam = "--name ${srvName} -v /etc/hosts:/etc/hosts -v /data/docker/logs/yisike/yisike-registry:/data/docker/logs --restart=always  -p 8090:8090"

    stage ('docker') {

        echo 'start docker'

        stage ('构建镜像')

        {

            sh """

                cd ${jenkinsDeployPath}/

                docker build -t $registryUrl/$project/$srvName:$BUILD_NUMBER ./

              """

        }

        //stage ('推送镜像')

        //{

        //    sh """

        //      docker push $registryUrl/$project/$srvName:$BUILD_NUMBER

        //      docker rmi $registryUrl/$project/$srvName:$BUILD_NUMBER

        //      """

        //}

        //stage ('部署生产环境')

        //{

        // sh """

        //  docker -H ${devDockerDaemon} pull $registryUrl/$project/$srvName:$BUILD_NUMBER

        //  docker -H ${devDockerDaemon} rm -f ${srvName} | true

        //  docker -H ${devDockerDaemon} run -d  ${dockerParam}  $registryUrl/$project/$srvName:$BUILD_NUMBER

        //    """

        //}

        stage ('部署生产环境')

        {

          sh """

            docker rm -f ${srvName} | true

            docker run -d  ${dockerParam}  $registryUrl/$project/$srvName:$BUILD_NUMBER

            """

        }

        echo 'complete docker'

    }

}

  • 点击保存后进入ci-demo流水线,点击立即构建(图中2是构建结果)

image.png

步骤二(集成sonar)

  • 进入sonarQube服务器创建一个新的需要分析的项目(打开官方引导教程)

image.png

  • 复制生成的mvn命令

image.png

image.png

  • 把mvn命令加入到Jenkinsfiles脚本,如下

node {

/*****************************git代码块***********************************/

    // ! git 仓库路径

    gitUrl = 'https://github.com/14251104246/spring-boot-ci-demo.git'

    // ! git 分支

    gitBranch = 'master'

    // ! git 使用的jenkins证书id

    gitCredential = '5b3912a8-0074-4955-b48f-c0af217785ac'

    stage ('git') {

        git branch: gitBranch,

            credentialsId: gitCredential,

            url: gitUrl

    }

/*****************************预处理代码块***********************************/

    // ! maven最终构建项目ArtifactId(项目目录请和ArtifactId一致)(可改)

    mavenArtifactId = 'yisike-parent'

    // 文件夹分隔

    DELIMITER = '/'

    // jenkins挂载在宿主机的所有项目地址

    volumeRoot = '/data/docker/ci/jenkins/home';

    // jenkins在容器中的所有项目地址

    jenkinsRoot = '/var/jenkins_home'

    // 具体项目工作区

    projectWorkspace = 'workspace'

    // jenkins挂载在宿主机的项目地址

    volumeDeployRootPath = volumeRoot + DELIMITER + projectWorkspace + DELIMITER + env.JOB_NAME

    // jenkins在容器中的项目路径

    jenkinsDeployRootPath = env.WORKSPACE

    // jenkins挂载在宿主机的构建地址

    volumeDeployPath = ''

    // jenkins在容器中的构建路径

    jenkinsDeployPath = ''

    //是否只有一个项目

    mavenSingleModule = true

    String relativePath = ''

    stage ('pre') {

        echo '路径预处理'

        volumeDeployPath = volumeDeployRootPath

        jenkinsDeployPath = jenkinsDeployRootPath

        println 'jenkins挂载在宿主机的项目地址:' + volumeDeployRootPath

        println 'jenkins在容器中的项目路径:' + jenkinsDeployRootPath

        println 'jenkins挂载在宿主机的构建地址:' + volumeDeployPath

        println 'jenkins在容器中的构建路径:' + jenkinsDeployPath

    }

  /*******************************maven代码块*********************************/

    // maven地址

    MVN_HOME = 'docker run -t --rm --name my-maven-project -v '+volumeDeployPath+':/usr/src/mymaven -v $HOME/.m2:/root/.m2 -w /usr/src/mymaven maven:3.3-jdk-8 '

    stage ('mvn') {

        echo 'start mvn'

        //暂时使用sh,后边替换为 ArtifactoryMavenBuild

        stage ('mvn-clean') {

            sh """

${MVN_HOME} mvn clean

"""

        }

        stage ('mvn-package') {

            thisPath = jenkinsDeployRootPath + DELIMITER + (relativePath == null || relativePath.size() == 0 ? relativePath : relativePath + DELIMITER)+ DELIMITER

            sh """

            ${MVN_HOME} mvn package  -DskipTests

            """

        }

        stage ('mvn-代码质量') {

            sh """

            ${MVN_HOME} mvn sonar:sonar \

                            -Dsonar.host.url=http://172.17.0.1:19000 \

                            -Dsonar.login=40aee4cc56ecf6d6742af9cb36fd0f00f896e306

            """

        }

        echo 'stop mvn'

    }

/**********************************docker代码块************************************************************/

/**********************************docker代码块************************************************************/

    //服务名称(子模块目录名称)

    def srvName = 'demo'

    //仓库地址

    def registryUrl = 'hboverseas.banggood.cn'

    //远程服务器地址(用于部署)

    def devHost = '122.152.225.111'

    def devDockerDaemon = "tcp://${devHost}:2376"

    //项目名称

    def project = 'ad'

    //远程docker容器启动参数

    def dockerParam = "--name ${srvName} -v /etc/hosts:/etc/hosts -v /data/docker/logs/yisike/yisike-registry:/data/docker/logs --restart=always  -p 8090:8090"

    stage ('docker') {

        echo 'start docker'

        stage ('构建镜像')

        {

            sh """

                cd ${jenkinsDeployPath}/

                docker build -t $registryUrl/$project/$srvName:$BUILD_NUMBER ./

              """

        }

        //stage ('推送镜像')

        //{

        //    sh """

        //      docker push $registryUrl/$project/$srvName:$BUILD_NUMBER

        //      docker rmi $registryUrl/$project/$srvName:$BUILD_NUMBER

        //      """

        //}

        //stage ('部署生产环境')

        //{

        // sh """

        //  docker -H ${devDockerDaemon} pull $registryUrl/$project/$srvName:$BUILD_NUMBER

        //  docker -H ${devDockerDaemon} rm -f ${srvName} | true

        //  docker -H ${devDockerDaemon} run -d  ${dockerParam}  $registryUrl/$project/$srvName:$BUILD_NUMBER

        //    """

        //}

        stage ('部署生产环境')

        {

          sh """

            docker rm -f ${srvName} | true

            docker run -d  ${dockerParam}  $registryUrl/$project/$srvName:$BUILD_NUMBER

            """

        }

        echo 'complete docker'

    }

}

  • 点击保存后进入ci-demo流水线,点击立即构建

步骤三(集成gatling)

  • 打开jenkins服务器首页,创建gatling的测试

  • Jenkinsfile脚本如下


node {

/*****************************git代码块***********************************/

    // ! git 仓库路径

    gitUrl = 'https://github.com/14251104246/spring-boot-ci-demo.git'

    // ! git 分支

    gitBranch = 'master'

    // ! git 使用的jenkins证书id

    gitCredential = '5b3912a8-0074-4955-b48f-c0af217785ac'

    stage ('git') {

        git branch: gitBranch,

            credentialsId: gitCredential,

            url: gitUrl

    }

/*****************************预处理代码块***********************************/

    // ! maven最终构建项目ArtifactId(项目目录请和ArtifactId一致)(可改)

    mavenArtifactId = 'yisike-parent'

    // 文件夹分隔

    DELIMITER = '/'

    // jenkins挂载在宿主机的所有项目地址

    volumeRoot = '/data/docker/ci/jenkins/home';

    // jenkins在容器中的所有项目地址

    jenkinsRoot = '/var/jenkins_home'

    // 具体项目工作区

    projectWorkspace = 'workspace'

    // jenkins挂载在宿主机的项目地址

    volumeDeployRootPath = volumeRoot + DELIMITER + projectWorkspace + DELIMITER + env.JOB_NAME

    // jenkins在容器中的项目路径

    jenkinsDeployRootPath = env.WORKSPACE

    // jenkins挂载在宿主机的构建地址

    volumeDeployPath = ''

    // jenkins在容器中的构建路径

    jenkinsDeployPath = ''

    //是否只有一个项目

    mavenSingleModule = true

    String relativePath = ''

    stage ('pre') {

        echo '路径预处理'

        volumeDeployPath = volumeDeployRootPath

        jenkinsDeployPath = jenkinsDeployRootPath

        println 'jenkins挂载在宿主机的构建地址:' + volumeDeployPath

        println 'jenkins在容器中的构建路径:' + jenkinsDeployPath

    }

  /*******************************gatling代码块*********************************/

    scalaScriptDir = volumeDeployPath + '/src/test/gatling/user-files'

    resultDir = '/data/docker/ci/gatling/results'

    // 加特林命令行

    COM_DOCKER = 'docker run  -t --rm  -v '+ scalaScriptDir +':/opt/gatling/user-files -v '+ resultDir +':/opt/gatling/results denvazh/gatling --mute'

    stage ('gatling') {

        echo 'start gatling'

        //暂时使用sh,后边替换为 ArtifactoryMavenBuild

        stage ('gatling') {

            sh """

            rm -f out.txt | true

${COM_DOCKER}  1>>out.txt

cat out.txt

echo http://localhost:8080\$(cat out.txt | grep 'Please open the following file' | cut -b 53- )

"""

        }

        echo 'stop gatling'

    }

}

  • 创建完成后,点击构建,等待构建完成后查看输出

image.png

  • 点击上图中2指向的蓝点,查看最底下的输出

image.png

  • 点击链接,查看gatling的测试结果

image.png

spring-boot-ci-demo's People

Contributors

14251104246 avatar judasn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.