部署步骤一般为:

  1. 服务器上退出程序
  2. 服务器上删除 jar 包
  3. 上传 jar 包到服务器
  4. 服务器上启动程序

如果每次部署都手动执行一遍这些步骤,太麻烦,还容易出错,下面借助 Gradle 插件 org.hidetake.ssh 定义一个部署任务 deploy,然后命令行中执行 gradle deploy 就能自动完成上面这些部署步骤了:

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.2.2.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'org.hidetake.ssh' version '2.9.0'
}

remotes {
    server {
        host     = '192.168.10.11' // 服务器的 IP
        user     = 'root'          // 登录服务器的账号
        password = 'root'          // 登录服务器的密码
    }
}

ssh.settings {
    knownHosts = allowAnyHosts
}

task deploy(dependsOn: bootJar) {
    def jar  = bootJar.archiveFileName.get() // Jar 包的文件名
    def dir  = '/usr/local/com.xtuer'        // 部署 Jar 到服务器上的目录
    def path = "${dir}/${jar}"               // Jar 包在服务器上的路径
    def port = 8080                          // 程序运行端口

    doLast {
        ssh.run {
            session(remotes.server) {
                put from: "${buildDir}/libs/${jar}", into: "${path}.bak"
                execute """
                    source /root/.bash_profile;
                    kill `ps aux | grep -i ${jar} | grep -v grep | awk '{print \\\$2}'`;
                    mv -f ${path}.bak ${path};
                    nohup java -jar ${path} --server.port=${port} > /dev/null 2>&1 &
                """
            }
        }
    }
}

提示: execute 的多行字符串参数为上传结束后要在服务器上执行的命令。

如果有多个服务器,每次部署到不同的服务器时都修改一下服务器的信息,显然是很不好的。可以在配置文件中定义每个服务器的信息,部署的时候选择需要的服务器进行部署:

  • build.gradle 同级目录中创建配置文件 config.groovy
  • 修改部署脚本 build.gradle 读取指定的服务器信息
  • 部署命令: gradle deploy -Denv=test1

config.goovy:

// 部署: gradle clean deploy -Denv=test1

////////////////////////////////////////////////////////////////////////////////////
//                               定义所有环境下都有的通用配置
////////////////////////////////////////////////////////////////////////////////////
//environments {
//  usedByAllEnvironments {
        deploy {
            dir  = '/www.xtuer.com' // 部署目录
            port = 8080             // 程序端口
            username = 'root'       // 服务器账号
            password = 'root'       // 服务器密码
        }
//  }
//}

environments {
    // 测试服务器一
    test1 {
        deploy {
            port     = 8888
            host     = '192.168.10.173'
            username = 'root'
            password = 'xxxx'
        }
    }
}

build.gradle:

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.2.2.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'org.hidetake.ssh' version '2.9.0'
}

ext {
    // 部署: gradle clean deploy -Denv=test1
    environment = System.getProperty("env", "dev") // 获取 gradle 参数中 env 的值,选择环境
    config      = new ConfigSlurper(environment).parse(file('config.groovy').toURI().toURL()).toProperties()
}

////////////////////////////////////////////////////////////////////////////////
//                                   项目部署                                  //
////////////////////////////////////////////////////////////////////////////////
remotes {
    server {
        host     = config.getProperty('deploy.host')
        user     = config.getProperty('deploy.username')
        password = config.getProperty('deploy.password')
    }
}

ssh.settings {
    knownHosts = allowAnyHosts
}

task deploy(dependsOn: bootJar) {
    def jar  = bootJar.archiveFileName.get()
    def dir  = config.getProperty('deploy.dir')
    def path = "${dir}/${jar}"
    def port = config.getProperty('deploy.port')

    doLast {
        ssh.run {
            session(remotes.server) {
                put from: "${buildDir}/libs/${jar}", into: "${path}.bak"
                execute """
                    source /root/.bash_profile;
                    kill `ps aux | grep -i ${jar} | grep -v grep | awk '{print \$2}'`;
                    mv -f ${path}.bak ${path};
                    nohup java -jar ${path} --server.port=${port} > /dev/null 2>&1 &
                """
            }
        }
    }
}

results matching ""

    No results matching ""