微服务轮子项目(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
目录
相关文章
|
3月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
4月前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
141 2
|
4月前
|
自然语言处理 jenkins 测试技术
Jenkins适合什么样的项目
【10月更文挑战第18天】Jenkins适合什么样的项目
54 3
|
4月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
406 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
4月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
102 2
|
4月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
133 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
4月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
4月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
326 0
|
4月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
125 0
|
5月前
|
消息中间件 监控 开发工具
微服务(三)-实现自动刷新配置(不重启项目情况下)
微服务(三)-实现自动刷新配置(不重启项目情况下)

热门文章

最新文章