閱讀本文你須要一些
gradle/groovy
的基本知識,本文所講的內容全是利用各類插件去讓自身的應用構建發佈更簡單,不會涉及到基礎知識
在 2016 年時我寫過一個示例《 springboot+gradle+vue+webpack 組合使用》,通過了1年多我發現不少童鞋須要這方面的資源,我以爲應該把咱們平時在使用 gradle 方式方法分享給你們。
Gradle 是構建工具前端
Build Anything
構建任何應用Automate Everything
自動化一切Deliver Faster
提供更快的構建上面的三項全是官方解釋對於第1
點沒有任何疑問,gradle
能夠構建任何應用。因此下面我都是圍繞第在2
點上,利用 gradle
如何輕鬆實現讓項目自動化,讓你的項目打包、構建、發佈更輕鬆。vue
本文不會將
gradle
與其它任何構建工具進行比較,由於這沒有任何意義,每一種技術或者都有自身的應用場景,若是不適合自身所在的場景再優秀也是沒有任何意義的
首先你須要在項目中增長 node 插件 gradle-node-pluginjava
plugins { id "com.moowork.node" version "1.2.0" }
配置 node 任務參數node
node { version = "8.9.4" yarnVersion = "1.3.2" download = true }
version
node 的版本yarnVersion
yarn 的版本,這裏強烈推薦你們使用 yarn 而不是 npmdownload
這裏設置爲 true
你本地無需單獨安裝 node,在構建時會自動安裝對應版本的 node,雖然對於開發人員來講,你在開發過程當中必定會獨立安裝 node,可是這裏配置爲自動下載仍是會帶來 N 多的好處,好比多個應用構建時無需擔憂 node 版本衝不一致而帶來版本衝突,其次是在使用 CI 像(jenkins)時你無需在 CI 服務器單獨(手動)安裝 nodereact
構建任務linux
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
目錄,這樣就完成了先後端一體構建。webpack
這種方式只適合,你靜態資源文件是經過
java
訪問而且在一塊兒部署的場景,若是你的靜態資源是獨立部署的這種作法可能對你沒有任何意義
插件依賴添加 gradle-ssh-plugingit
plugins { id 'org.hidetake.ssh' version '2.9.0' }
服務器配置github
remotes { webServer { host = '192.168.1.101' user = 'webserver' identity = file('id_rsa') } }
remotes 服務器信息配置,關於 gradle-ssh-plugin 更詳細的配置能夠參考 官方文檔
部署任務配置web
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
你能夠根據本身的部署須要編寫各類 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 <kevinz@weghst.com>" 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 Zou <kevinz@weghst.com> COPY 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 更加詳細的用法請參考官方文檔
插件依賴添加 gradle-release
plugins { id "net.researchgate.release" version "2.6.0" }
gradlew release
即會自動建立 tag 該插件使用較簡單,不須要修改任何參數運行命令後按照流程走便可,惟一要注意的是若是你是多項目記得運行修改爲gradlew :release
這樣是在 root 項目中運行打 tag
下圖是使用命令後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 hubdeploy
若是構建的是 tag 則將 jar 包自動提交至 github releases
本文主要是與你們分享 gradle 的相關插件做用,你可使用這些插件去完成什麼樣的事情,具體關於插件的使用方法,還請多參考官方的文檔資料,每一個插件我都配上了官方地址
項目: https://github.com/zhudyos/duic 幾乎使用到了上面全部的插件,你們能夠參考該項目
懂得偷懶的人才會進步,但懶惰並不會使你進步