成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

gradle 應(yīng)用構(gòu)建分享(純干貨)

Ryan_Li / 3573人閱讀

摘要:是什么是構(gòu)建工具特點(diǎn)構(gòu)建任何應(yīng)用自動(dòng)化一切提供更快的構(gòu)建上面的三項(xiàng)全是官方解釋對(duì)于第點(diǎn)沒有任何疑問,可以構(gòu)建任何應(yīng)用。

閱讀本文你需要一些 gradle/groovy 的基本知識(shí),本文所講的內(nèi)容全是利用各種插件去讓自身的應(yīng)用構(gòu)建發(fā)布更簡(jiǎn)單,不會(huì)涉及到基礎(chǔ)知識(shí)
在 2016 年時(shí)我寫過一個(gè)示例《springboot+gradle+vue+webpack 組合使用》,經(jīng)過了1年多我發(fā)現(xiàn)很多童鞋需要這方面的資源,我覺得應(yīng)該把我們平時(shí)在使用 gradle 方式方法分享給大家。
Gradle 是什么

Gradle 是構(gòu)建工具

Gradle 特點(diǎn)

Build Anything 構(gòu)建任何應(yīng)用

Automate Everything 自動(dòng)化一切

Deliver Faster 提供更快的構(gòu)建

上面的三項(xiàng)全是官方解釋對(duì)于第1點(diǎn)沒有任何疑問,gradle 可以構(gòu)建任何應(yīng)用。所以下面我都是圍繞第在2點(diǎn)上,利用 gradle 如何輕松實(shí)現(xiàn)讓項(xiàng)目自動(dòng)化,讓你的項(xiàng)目打包、構(gòu)建、發(fā)布更輕松。

本文不會(huì)將 gradle 與其它任何構(gòu)建工具進(jìn)行比較,因?yàn)檫@沒有任何意義,每一種技術(shù)或者都有自身的應(yīng)用場(chǎng)景,如果不適合自身所在的場(chǎng)景再優(yōu)秀也是沒有任何意義的
場(chǎng)景1 - gradle 集成 node 構(gòu)建應(yīng)用

首先你需要在項(xiàng)目中增加 node 插件 gradle-node-plugin

plugins {
    id "com.moowork.node" version "1.2.0"
}

配置 node 任務(wù)參數(shù)

node {
    version = "8.9.4"
    yarnVersion = "1.3.2"
    download = true
}

version node 的版本
yarnVersion yarn 的版本,這里強(qiáng)烈推薦大家使用 yarn 而不是 npm
download 這里設(shè)置為 true 你本地?zé)o需多帶帶安裝 node,在構(gòu)建時(shí)會(huì)自動(dòng)安裝對(duì)應(yīng)版本的 node,雖然對(duì)于開發(fā)人員來說,你在開發(fā)過程中一定會(huì)獨(dú)立安裝 node,但是這里配置為自動(dòng)下載還是會(huì)帶來 N 多的好處,比如多個(gè)應(yīng)用構(gòu)建時(shí)無需擔(dān)心 node 版本沖不一致而帶來版本沖突,其次是在使用 CI 像(jenkins)時(shí)你無需在 CI 服務(wù)器多帶帶(手動(dòng))安裝 node

構(gòu)建任務(wù)

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 任務(wù)綁定在 jar 命令上,這樣你在運(yùn)行 gradle build 命令進(jìn)行打包時(shí)會(huì)自動(dòng)進(jìn)行 node 構(gòu)建前端的相關(guān)資源并且將構(gòu)建后的資源拷貝至 gradle 構(gòu)建的 resources 目錄,命令運(yùn)行成功后你將會(huì)在 jar 文件的根目錄中發(fā)現(xiàn) public-web-resources 目錄,這樣就完成了前后端一體構(gòu)建。

這種方式只適合,你靜態(tài)資源文件是通過 java 訪問并且在一起部署的場(chǎng)景,如果你的靜態(tài)資源是獨(dú)立部署的這種做法可能對(duì)你沒有任何意義

場(chǎng)景2 - gradle 集成 ssh 插件

插件依賴添加 gradle-ssh-plugin

plugins {
    id "org.hidetake.ssh" version "2.9.0"
}

服務(wù)器配置

remotes {
  webServer {
    host = "192.168.1.101"
    user = "webserver"
    identity = file("id_rsa")
  }
}
remotes 服務(wù)器信息配置,關(guān)于 gradle-ssh-plugin 更詳細(xì)的配置可以參考官方文檔

部署任務(wù)配置

task deploy {
  doLast {
    ssh.run {
      session(remotes.webServer) {
        put from: "example.war", into: "/webapps"
        execute "sudo service tomcat restart"
      }
    }
  }
}
使用 gradlew deploy 命令運(yùn)行任務(wù),將會(huì)把 example.war 上傳至服務(wù)器 /webapps 目錄,并且重啟你的服務(wù)器 tomcat
你可以根據(jù)自己的部署需要編寫各種 task,輕松實(shí)現(xiàn)一鍵部署,并且這種方式是完全跨平臺(tái)的,不管你的開發(fā)環(huán)境是 windows、mac、linux 都是使用相同的命令部署
PS:在開發(fā)測(cè)試環(huán)境使用這種方式部署我只能說不要太好用

場(chǎng)景3 - gradle 集成 docker 構(gòu)建

插件依賴添加 gradle-docker-plugin

buildscript {
    dependencies {
        classpath "com.bmuschko:gradle-docker-plugin:3.2.1"
    }
}

apply plugin: "com.bmuschko.docker-remote-api"

編寫構(gòu)建任務(wù)

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 目錄為后面構(gòu)建鏡像做準(zhǔn)備
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") // 默認(rèn)時(shí)區(qū)設(shè)置為東8區(qū)
    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 
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 即會(huì)構(gòu)建 2 個(gè) tag 鏡像,關(guān)于 gradle-docker-plugin 更加詳細(xì)的用法請(qǐng)參考官方文檔

場(chǎng)景4 - gradle release 插件應(yīng)用

插件依賴添加 gradle-release

plugins {
    id "net.researchgate.release" version "2.6.0"
}

使用
master 分支中運(yùn)行命令 gradlew release 即會(huì)自動(dòng)創(chuàng)建 tag

該插件使用較簡(jiǎn)單,不需要修改任何參數(shù)運(yùn)行命令后按照流程走即可,唯一要注意的是如果你是多項(xiàng)目記得運(yùn)行修改成 gradlew :release 這樣是在 root 項(xiàng)目中運(yùn)行打 tag
下圖是使用命令后 git 提交記錄
場(chǎng)景5 - travis 中使用 gradle 構(gòu)建

.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 中主要集成有幾項(xiàng)

script 構(gòu)建 docker 鏡像

after_success 如果構(gòu)建的是 tag 則將鏡像推送至 docker hub

deploy 如果構(gòu)建的是 tag 則將 jar 包自動(dòng)提交至 github releases

本文主要是與大家分享 gradle 的相關(guān)插件作用,你可以使用這些插件去完成什么樣的事情,具體關(guān)于插件的使用方法,還請(qǐng)多參考官方的文檔資料,每個(gè)插件我都配上了官方地址

項(xiàng)目:https://github.com/zhudyos/duic 幾乎使用到了上面所有的插件,大家可以參考該項(xiàng)目

懂得偷懶的人才會(huì)進(jìn)步,但懶惰并不會(huì)使你進(jìn)步

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71085.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<