摘要:是什么是构建工具特点构建任何应用自动化一切提供更快的构建上面的三项全是官方解释对于第点没有任何疑问,可以构建任何应用。
阅读本文你需要一些 gradle/groovy 的基本知识,本文所讲的内容全是利用各种插件去让自身的应用构建发布更简单,不会涉及到基础知识
在 2016 年时我写过一个示例《springboot+gradle+vue+webpack 组合使用》,经过了1年多我发现很多童鞋需要这方面的资源,我觉得应该把我们平时在使用 gradle 方式方法分享给大家。Gradle 是什么
Gradle 是构建工具
Gradle 特点Build Anything 构建任何应用
Automate Everything 自动化一切
Deliver Faster 提供更快的构建
上面的三项全是官方解释对于第1点没有任何疑问,gradle 可以构建任何应用。所以下面我都是围绕第在2点上,利用 gradle 如何轻松实现让项目自动化,让你的项目打包、构建、发布更轻松。
本文不会将 gradle 与其它任何构建工具进行比较,因为这没有任何意义,每一种技术或者都有自身的应用场景,如果不适合自身所在的场景再优秀也是没有任何意义的场景1 - gradle 集成 node 构建应用
首先你需要在项目中增加 node 插件 gradle-node-plugin
plugins { id "com.moowork.node" version "1.2.0" }
配置 node 任务参数
node { version = "8.9.4" yarnVersion = "1.3.2" download = true }
version node 的版本
yarnVersion yarn 的版本,这里强烈推荐大家使用 yarn 而不是 npm
download 这里设置为 true 你本地无需多带带安装 node,在构建时会自动安装对应版本的 node,虽然对于开发人员来说,你在开发过程中一定会独立安装 node,但是这里配置为自动下载还是会带来 N 多的好处,比如多个应用构建时无需担心 node 版本冲不一致而带来版本冲突,其次是在使用 CI 像(jenkins)时你无需在 CI 服务器多带带(手动)安装 node
构建任务
task buildAdmin(type: YarnTask, dependsOn: yarn) { group = "node" args = ["run", "build"] } task copyAdminFiles(type: Copy, dependsOn: buildAdmin) { group = "node" from "dist/dist" include "**/**" into "${project.buildDir}/resources/main/public-web-resources" } jar.dependsOn copyAdminFiles
将 copyAdminFiles 任务绑定在 jar 命令上,这样你在运行 gradle build 命令进行打包时会自动进行 node 构建前端的相关资源并且将构建后的资源拷贝至 gradle 构建的 resources 目录,命令运行成功后你将会在 jar 文件的根目录中发现 public-web-resources 目录,这样就完成了前后端一体构建。
这种方式只适合,你静态资源文件是通过 java 访问并且在一起部署的场景,如果你的静态资源是独立部署的这种做法可能对你没有任何意义场景2 - gradle 集成 ssh 插件
插件依赖添加 gradle-ssh-plugin
plugins { id "org.hidetake.ssh" version "2.9.0" }
服务器配置
remotes { webServer { host = "192.168.1.101" user = "webserver" identity = file("id_rsa") } }
remotes 服务器信息配置,关于 gradle-ssh-plugin 更详细的配置可以参考官方文档
部署任务配置
task deploy { doLast { ssh.run { session(remotes.webServer) { put from: "example.war", into: "/webapps" execute "sudo service tomcat restart" } } } }
使用 gradlew deploy 命令运行任务,将会把 example.war 上传至服务器 /webapps 目录,并且重启你的服务器 tomcat场景3 - gradle 集成 docker 构建
你可以根据自己的部署需要编写各种 task,轻松实现一键部署,并且这种方式是完全跨平台的,不管你的开发环境是 windows、mac、linux 都是使用相同的命令部署
PS:在开发测试环境使用这种方式部署我只能说不要太好用
插件依赖添加 gradle-docker-plugin
buildscript { dependencies { classpath "com.bmuschko:gradle-docker-plugin:3.2.1" } } apply plugin: "com.bmuschko.docker-remote-api"
编写构建任务
task copyDockerJar(type: Copy, dependsOn: build) { group = "docker" from jar.archivePath.path into "${project.buildDir}/docker" rename { String fileName -> fileName.replace("-${project.version}", "") } }
将 jar 文件拷贝至 build/docker 目录为后面构建镜像做准备
task createDockerfile(type: com.bmuschko.gradle.docker.tasks.image.Dockerfile, dependsOn: copyDockerJar) { group = "docker" def jarName = "${project.name}.jar".toString() destFile = project.file("${project.buildDir}/docker/Dockerfile") from "openjdk:8u151-jdk-alpine3.7" maintainer "Kevin Zou" copyFile(jarName, "/app/$jarName".toString()) workingDir("/app") volume("/app/logs") runCommand("apk add --no-cache tzdata") environmentVariable("TZ", "Asia/Shanghai") // 默认时区设置为东8区 environmentVariable([ JVM_OPTS : "-Xms1g -Xmx1g -XX:MetaspaceSize=128m", JAVA_OPTS: "-server -XX:+UseG1GC $JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/ -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -Xloggc:logs/gc.log" ]) environmentVariable("DUIC_OPTS", "$JAVA_OPTS -Dreactor.trace.operatorStacktrace=true -Dspring.profiles.active=prod") exposePort(7777) defaultCommand("sh", "-c", "java $DUIC_OPTS -jar $jarName") }
生成 dockerfile
FROM openjdk:8u151-jdk-alpine3.7 MAINTAINER Kevin ZouCOPY duic.jar /app/duic.jar WORKDIR /app VOLUME ["/app/logs"] RUN apk add --no-cache tzdata ENV TZ Asia/Shanghai ENV JVM_OPTS="-Xms1g -Xmx1g -XX:MetaspaceSize=128m" JAVA_OPTS="-server -XX:+UseG1GC $JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/ -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -Xloggc:logs/gc.log" ENV DUIC_OPTS $JAVA_OPTS -Dreactor.trace.operatorStacktrace=true -Dspring.profiles.active=prod EXPOSE 7777 CMD ["sh", "-c", "java $DUIC_OPTS -jar duic.jar"]
task buildImage(type: com.bmuschko.gradle.docker.tasks.image.DockerBuildImage, dependsOn: createDockerfile) { group = "docker" inputDir = createDockerfile.destFile.parentFile tags = ["zhudyos/${project.name}:${project.version}".toString(), "zhudyos/${project.name}:latest".toString()] }
使用 gradlew buildImage 即会构建 2 个 tag 镜像,关于 gradle-docker-plugin 更加详细的用法请参考官方文档
场景4 - gradle release 插件应用
插件依赖添加 gradle-release
plugins { id "net.researchgate.release" version "2.6.0" }
使用
在 master 分支中运行命令 gradlew release 即会自动创建 tag
该插件使用较简单,不需要修改任何参数运行命令后按照流程走即可,唯一要注意的是如果你是多项目记得运行修改成 gradlew :release 这样是在 root 项目中运行打 tag场景5 - travis 中使用 gradle 构建
下图是使用命令后 git 提交记录
.travis.yml
sudo: required language: java jdk: openjdk8 services: - mongodb - docker before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ cache: directories: - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ - .gradle/ - node_modules/ before_install: - chmod +x gradlew script: - ./gradlew clean buildImage after_success: - if [ ! -z "$TRAVIS_TAG" ]; then docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; docker push zhudyos/duic; ./gradlew copyRelease; fi deploy: provider: releases api_key: secure: yXSciOem61T73TLenFyAGbgYi2CTg5QUoj1AstAAupCYURatOvFBeJGwE04ZIdAgIKO1LRPqrhG0M40pg5uzwAR+qcJ1yQHKE4xqqSsRiksZZKGMPx4G7HxPr43/wOGKGd87WLEKGe7NaDRdlQm53WXpes8aYqN9L8H0rf6Ftf1sTtG2j+W6u8TJu0GDI5rQ4dC1kX6oOVoMqXynFV1X3KJ6hQFJyDZRA3I9DStElvSnAL7UtzGqPZBqXlNcjewe/V/7jP60Z3gcAH83zZU/rGPrLrckhxpDCFt6prDIhv/mBhgvROP1mif0B+jHolfprIHUvtrDSYj8FkmWVmoSyjF8R3PyzVfYqhSuRAvYtmUZtRa4BjOzxMPZRpucJYPv2/yXs7PPhkFxglxBI4CmC1c4ZFbMeTUWZrld/ZhaszQ/30sfVU4sh/cZEcJd8ZS8/W7QHI6jPWh4t9Ip+kMAsaVKy9aXDnNXV5e5Xeoh9BH6vICCT6J827jfp7OJ0m912T56Ui9jPmEBq1qUp3pwYk4tYolsyYr7oykKbjiJ/D9TjsXx39qju8dSI1fb2dnkX+flIqDmDbqlNI8fr2lkoAPQXRB36WWEFEGVHv+ymX5jZQxlrewliuCt1t28m8b3Doycf6kfNw0yvrcTPvOs00s7EpGoH3E8NZluWo5aSyM= file_glob: true file: build/releases/* skip_cleanup: true on: repo: zhudyos/duic tags: true
在 travis 中主要集成有几项
script 构建 docker 镜像
after_success 如果构建的是 tag 则将镜像推送至 docker hub
deploy 如果构建的是 tag 则将 jar 包自动提交至 github releases
本文主要是与大家分享 gradle 的相关插件作用,你可以使用这些插件去完成什么样的事情,具体关于插件的使用方法,还请多参考官方的文档资料,每个插件我都配上了官方地址
项目:https://github.com/zhudyos/duic 几乎使用到了上面所有的插件,大家可以参考该项目
懂得偷懒的人才会进步,但懒惰并不会使你进步
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71085.html
摘要:应用继续瘦身,以及一些注意事项掘金自上次对应用瘦身过后,经历的若干功能的迭代,很快的,安装包大小又到了,老大说要控制在之内,于是便开始了新一轮的瘦身之旅。 2017 腾讯实习生 Android 客户端开发面试总结 - Android - 掘金先做个自我介绍,本人大三狗一枚,就读的是广州一个普通的一本大学 (非 985、211),专业是比较尴尬的电子商务 (非计算机学院,连 C 的课程都...
摘要:对下半年所分享的文章进行整理,上半年总结的篇好文请点击这里,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。 对下半年所分享的文章进行整理,上半年总结的 98 篇好文请点击这里,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可...
摘要:关于应用开发,国内很少有完整的书籍或教程。启动连续闪退保护方案来自微信读书团队博客分享。转换动画到代码并预览在微博分享动画这件事,以后可能和开发者没什么关系了。 写作是一件苦差事。无论写代码,还是写文章。 关于 Mac 应用开发,国内很少有完整的书籍或教程。最近@剑指人心写的 《Mac 应用开发基础教程》终于!完!稿!了! 这本书中对 Mac 平台中应用开发的 AppKit 系统控件做...
摘要:本期我们收录的文章有旧主题的延伸,还涉及了新的开发主题,摘要如下性能优化课程笔记在不要只做表面功夫中,我们推荐了陈启超分享的性能优化视频课程系列。 本期我们收录的文章有旧主题的延伸,还涉及了新的开发主题,摘要如下: Android 性能优化课程笔记 在 FIR.im Weekly - 不要只做表面功夫中,我们推荐了 @陈启超_V 分享的 Android 性能优化视频课程系列。本期我...
摘要:本期我们收录的文章有旧主题的延伸,还涉及了新的开发主题,摘要如下性能优化课程笔记在不要只做表面功夫中,我们推荐了陈启超分享的性能优化视频课程系列。 本期我们收录的文章有旧主题的延伸,还涉及了新的开发主题,摘要如下: Android 性能优化课程笔记 在 FIR.im Weekly - 不要只做表面功夫中,我们推荐了 @陈启超_V 分享的 Android 性能优化视频课程系列。本期我...
阅读 2788·2023-04-25 17:46
阅读 3315·2021-11-25 09:43
阅读 862·2021-11-18 10:02
阅读 2872·2021-10-14 09:43
阅读 2565·2021-10-13 09:40
阅读 1350·2021-09-28 09:35
阅读 1983·2019-08-30 15:52
阅读 3039·2019-08-30 14:06