2017-09-18


接着上次博客部署的问题。建议先阅读一下上一篇相关文章 gradle-ssh-plugin

后面想了一下,有尝试着将 80809090 端口对应的 jar 包本地打好,然后通过 gradle-ssh-plugin 上传到服务器部署。 但是 jar 包一般几十兆,上传时间消耗过长,这个方案不理想。

所以,最终方案只能是服务器上拉取一份源码,然后分别打好 80809090 端口对应的 jar 包,然后启动服务相应部署。 这一步可以通过自定义 gradle 任务实现。

gradle task 简单介绍


先看一个最简单的 gradle task

task hello {
    doLast {
        println 'Hello gradle!'
    }
}

shell 上运行 ./gradlew hello 就可以看到输出 Hello gradle!

更具体的 gradle 语法可以查看官方文档。

我这里主要介绍一些内置的任务语法:

task clean
task build

cleanbuildgradle 内置的两个任务。

假设现在要定义任务 buildFiles,依赖 cleanbuild,并且要求 clean 先执行于 build。 那么代码定义应该是这样的:

task buildFiles {
    dependsOn clean
    dependsOn build
    build.mustRunAfter clean
}

gradle task 实现 SpringBoot 8080 9090 端口切换打包


要实现动态切换端口打包,需要在 resources 目录下新建 80809090 两个目录, 里面分别放着 application.ymlapplication-production.yml 两个文件。

目录看起来像下面这样:

resources
    8080
        application.yml
        application-production.yml
    9090
        application.yml
        application-production.yml
    application.yml
    application-development.yml

application.yml 内容是 SpringBoot 环境切换的配置:

spring:
  profiles:
    active: development // or production

application-production.yml 内容则是具体的 SpringBoot 的配置了。

接着定义根据端口号打包 jar 的 gradle task:

// deploy
def resourcesDir = "$projectDir/src/main/resources"
def ymlFile = 'application.yml'
def libsDir = "$buildDir/libs"
def releasesDir = "$projectDir/releases"

task configFiles {
    doLast {
        exec {
            workingDir resourcesDir
            executable 'mv'
            args ymlFile, "${ymlFile}.bak"
        }

        file("$resourcesDir/$port").listFiles().each {
            def fileName = it.name
            exec {
                workingDir resourcesDir
                executable 'cp'
                args "$resourcesDir/$port/$fileName", '.'
            }
        }
    }
}

task buildFiles {
    dependsOn clean
    dependsOn build
    build.mustRunAfter clean
}

task reconfigFiles {
    dependsOn buildFiles

    doLast {
        file(libsDir).listFiles().each {
            def fileName = it.name
            if (fileName.endsWith("jar")) {
                exec {
                    executable 'cp'
                    args "$libsDir/$fileName", "$releasesDir/blog-${port}.jar"
                }
            }
        }

        exec {
            workingDir resourcesDir
            executable 'rm'
            args ymlFile, 'application-production.yml'
        }

        exec {
            workingDir resourcesDir
            executable 'mv'
            args "${ymlFile}.bak", ymlFile
        }
    }
}

task buildJar {
    dependsOn configFiles
    dependsOn reconfigFiles
    reconfigFiles.mustRunAfter configFiles
}

项目根目录下创建 releases 目录,然后执行 ./gradlew -Pport=8080 buildJarblog-8080.jar 文件就出现在 releases 目录里面了。

服务器上的 blog.sh


上一次说到有一个 deploy 的 gradle task:

task deploy {
    doLast {
        ssh.run {
            session(remotes.server) {
                def result = execute 'bash blog.sh'
                println "\n==> $result"
            }
        }
    }
}

blog.sh 文件的内容是:

cd blog
git pull

service blog8080 stop
rm /etc/init.d/blog8080
./gradlew -Pport=8080 buildJar
sudo ln -s ~/blog/releases/blog-8080.jar /etc/init.d/blog8080
service blog8080 start

service blog9090 stop
rm /etc/init.d/blog9090
./gradlew -Pport=9090 buildJar
sudo ln -s ~/blog/releases/blog-9090.jar /etc/init.d/blog9090
service blog9090 start

到这一步,博客的部署工作就很轻松了。



温馨提醒

为了获得更好的阅读体验,您应该使用 Chrome 浏览器访问本站!


联系站长

Email: hi@zengzhihao.pw