微服务轮子项目(45) -Jenkins自动化部署(下)

简介: 微服务轮子项目(45) -Jenkins自动化部署(下)

3.2 流水线

1.选择Pipeline script

2.本项目演示环境的pipeline脚本

下面的脚本仅供参考

是建立在目标服务器和git都已经做了免密登录的环境下

pipeline {
  agent any
  environment {
    REPOSITORY="https://gitee.com/zlt2000/microservices-platform.git"
    t_dir="/opt/application/microservices-platform"
    t_ssh="root@120.78.94.191"
    api_url="120.78.94.191:9900"
    sonar_url="120.78.94.191:9000"
  }
  stages {
    stage('获取代码') {
      steps {
        echo "start fetch code from git:${REPOSITORY}"
        deleteDir()
        git "${REPOSITORY}"
      }
    }
    stage('代码静态检查') {
      steps {
        echo "start code check"
        sh "mvn clean compile sonar:sonar -Dsonar.host.url=http://${sonar_url}"
      }
    }
    stage('单元测试') {
      steps {
        echo "start test"
        sh "mvn test"
        junit '**/target/surefire-reports/TEST-*.xml'
      }
    }
    stage('打包') {
      steps {
        echo "start package"
        sh "sed -i 's/127.0.0.1:9900/${api_url}/g' zlt-web/back-web/src/main/resources/static/module/apiUrl.js"
        sh "mvn package -Dmaven.test.skip=true"
      }
    }
    stage('部署') {
      steps {
        echo "start deploy"
        sh "ssh ${t_ssh} rm -f ${t_dir}/*.jar"
        script {
                    def apps = ['zlt-business/*', 'zlt-gateway/zuul-gateway'
                        , 'zlt-job/job-admin', 'zlt-job/job-executor-samples'
                        , 'zlt-monitor/*', 'zlt-uaa', 'zlt-web/*']
                    for (int i = 0; i < apps.size(); ++i) {
                        sh "scp ${apps[i]}/target/*.jar ${t_ssh}:${t_dir}"
                    }
                }
      }
    }
    stage('重启') {
      steps {
        echo "start restart"
        script {
                    def apps = ['zlt-uaa', 'user-center', 'file-center', 'zuul-gateway'
                        , 'log-center', 'code-generator'
                        , 'job-admin', 'job-executor-samples']
                    for (int i = 0; i < apps.size(); ++i) {
                        sh "ssh ${t_ssh} 'cd ${t_dir};sh shutdown.sh ${apps[i]}'"
                        if ("${apps[i]}" == 'sc-admin') {
                    sleep 60
                } else {
                    sleep 30
                }
                        sh "ssh ${t_ssh} 'cd ${t_dir};sh start.sh ${apps[i]}'"
                    }
                }
      }
    }
  }
  post {
        always {
            echo '构建结束...'
        }
        success {
            echo '恭喜您,构建成功!!!'
        }
        failure {
            echo '抱歉,构建失败!!!'
        }
        unstable {
            echo '该任务已经被标记为不稳定任务....'
        }
        changed {
            echo ''
        }
    }
}

3.目标服务器的shutdown.sh内容

pid=`ps ax | grep -i $1 |grep java | grep -v grep | awk '{print $1}'`
if [ -z "$pid" ] ; then
        echo "No $1 running."
fi
echo "The $1(${pid}) is running..."
kill ${pid}
echo "Send shutdown request to $1(${pid}) OK"

4.目标服务器的start.sh内容

nohup java -Dspring.profiles.active=test -Dzlt.nacos.server-addr=120.78.94.191:8848 -jar -Xmx256M -Xms256M $1.jar >> /dev/null 2>&1 &

4. 流水线简单例子

在构建的时候通过参数控制构建行为

4.1 新建任务

新建任务 -> 流水线

General:勾选参数化构建过程,添加参数:

4.2 构建触发器

如果需要通过git触发构建的话需要勾选触发远程构建和填写身份验证令牌

详细的git触发配置请看 webhook配置

4.3 流水线

1.选择Pipeline script

2.本项目演示环境的pipeline脚本

下面的脚本仅供参考

是建立在目标服务器和git都已经做了免密登录的环境下

脚本里的参数service_namesproject_version就是通过构建时传进去的:

pipeline {
  agent any
  environment {
    git_addr="https://gitee.com/zlt2000/microservices-platform.git"
    target_dir="/opt/application/microservices-platform"
    target_ssh="root@120.78.94.191"
    api_url="120.78.94.191:9900"
    sonar_url="192.168.28.134:9000"
    backup_dir="/opt/app/backup"
  }
  stages {
    stage('获取代码') {
      steps {
        echo "start fetch code from git:${git_addr}"
        deleteDir()
        git "${git_addr}"
      }
    }
    stage('代码静态检查') {
            when {
                environment name:'is_test', value:'是'
            }
      steps {
        echo "start code check"
        sh "mvn clean compile sonar:sonar -Dsonar.host.url=http://${sonar_url}"
      }
    }
    stage('单元测试') {
            when {
                environment name:'is_test', value:'是'
            }
      steps {
        echo "start test"
        sh "mvn test"
        junit '**/target/surefire-reports/TEST-*.xml'
      }
    }
    stage('打包') {
      steps {
        echo "start package"
        sh "sed -i 's/127.0.0.1:9900/${api_url}/g' zlt-web/back-web/src/main/resources/static/module/apiUrl.js"
        sh "mvn package -Dmaven.test.skip=true"
      }
    }
    stage('部署') {
      steps {
        echo "start deploy"
        sh '''
                    if [ ! -d "${backup_dir}/${project_version}" ];then
              mkdir -p ${backup_dir}/${project_version}
          fi
                '''
        script {
                    def apps = "${service_names}".split(",")
                    for (int i = 0; i < apps.size(); ++i) {
                      if ("${apps[i]}" == 'zlt-uaa') {
                    service_path = ''
                } else {
                    service_path = '*/'
                }
                sh "rm -f ${backup_dir}/${project_version}/${apps[i]}.jar"
                        sh "cp "+service_path+"${apps[i]}/target/*.jar ${backup_dir}/${project_version}/"
                sh "ssh ${target_ssh} rm -f ${target_dir}/${apps[i]}.jar"
                        sh "scp "+service_path+"${apps[i]}/target/*.jar ${target_ssh}:${target_dir}"
                    }
                }
      }
    }
    stage('重启') {
      steps {
        echo "start restart"
        script {
                    def apps = "${service_names}".split(",")
                    for (int i = 0; i < apps.size(); ++i) {
                        sh "ssh ${target_ssh} 'cd ${target_dir};sh shutdown.sh ${apps[i]}'"
                        if ("${apps[i]}" == 'sc-admin') {
                    sleep 60
                } else {
                    sleep 30
                }
                        sh "ssh ${target_ssh} 'cd ${target_dir};sh start.sh ${apps[i]}'"
                    }
                }
      }
    }
  }
  post {
        always {
            echo '构建结束...'
        }
        success {
            echo '恭喜您,构建成功!!!'
        }
        failure {
            echo '抱歉,构建失败!!!'
        }
        unstable {
            echo '该任务已经被标记为不稳定任务....'
        }
        changed {
            echo ''
        }
    }
}

3.目标服务器的shutdown.sh内容

pid=`ps ax | grep -i $1 |grep java | grep -v grep | awk '{print $1}'`
if [ -z "$pid" ] ; then
        echo "No $1 running."
fi
echo "The $1(${pid}) is running..."
kill ${pid}
echo "Send shutdown request to $1(${pid}) OK"

4.目标服务器的start.sh内容:

nohup java -Dspring.profiles.active=test -Dzlt.nacos.server-addr=120.78.94.191:8848 -jar -Xmx256M
目录
相关文章
|
6月前
|
XML jenkins 机器人
JMeter+Ant+Jenkins实现接口自动化测试持续集成
本文介绍了如何使用Ant生成JMeter接口测试报告,并集成到Jenkins中实现自动化测试。内容涵盖Ant与JMeter环境配置、build.xml文件设置、测试执行及报告生成,同时包括Jenkins插件安装、项目配置和钉钉消息通知的集成,帮助实现持续测试与结果可视化。
910 0
|
4月前
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
651 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
10月前
|
Java Maven Android开发
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
本文介绍了Spring Boot开发环境的搭建和项目启动流程。主要内容包括:jdk的配置(IDEA、STS/eclipse设置方法)、Spring Boot工程的构建方式(IDEA快速构建、官方构建工具start.spring.io使用)、maven配置(本地maven路径与阿里云镜像设置)以及编码配置(IDEA和eclipse中的编码设置)。通过这些步骤,帮助开发者顺利完成Spring Boot项目的初始化和运行准备。
973 0
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
|
10月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
203 0
|
10月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
1222 0
|
6月前
|
jenkins Java 持续交付
使用Jenkins完成springboot项目快速更新
本文介绍了使用Jenkins和WinSW实现SpringBoot项目自动化部署的完整流程。首先讲解了Jenkins作为持续集成工具的作用,然后详细说明了环境准备步骤:包括JDK版本管理、WinSW服务配置(含XML文件修改)以及bat启动脚本编写。重点演示了Jenkins的项目配置方法,包括源码管理设置和构建步骤中的Windows批处理命令调用。通过这套方案,开发者只需推送代码到Git仓库,即可触发Jenkins自动完成项目构建、服务重启等全流程,显著提升部署效率。文章还提到IDEA的Jenkins插件可进
290 1
|
5月前
|
Java jenkins 应用服务中间件
结合Jenkins与Tomcat,实施Maven项目的自动构建和部署流程。
任何项目构建和部署的自动化流程,总离不开对各个环节精细把控与密切配合。涉及到源代码管理、构建工具、持续集成服务器以及最终的运行时环境的协调。通过上述简洁实用的步骤,可以实现Maven项目从源代码到运行状态的无缝过渡,进而提升软件开发的效率与质量。
355 0
|
11月前
|
监控 jenkins 测试技术
Ansible与Jenkins:自动化工具的对比
Ansible和Jenkins是自动化领域的两大巨头。Ansible专注于配置管理和任务自动化,采用无代理架构,使用YAML定义配置,具有幂等性和可扩展性。Jenkins则擅长持续集成和持续交付(CI/CD),支持丰富的插件生态系统,适用于自动化构建、测试和部署。两者各有优势,Ansible适合配置管理与大规模部署,Jenkins则在CI/CD方面表现出色。结合使用可创建更强大的自动化工作流,提升团队生产力和软件质量。选择工具时应根据具体需求决定。
|
10月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
442 0
|
10月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
224 0

推荐镜像

更多