欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  Java

gradle 应用构建分享(纯干货)

程序员文章站 2022-04-13 14:42:14
...
本篇文章给大家分享的是关于gradle 应用构建,但是由于这篇文章所说的内容不会涉及到基础知识,所以你需要去看一些 gradle/groovy 的基本知识
阅读本文你需要一些 gradle/groovy 的基本知识,本文所讲的内容全是利用各种插件去让自身的应用构建发布更简单,不会涉及到基础知识

在 2016 年时我写过一个示例《springboot+gradle+vue+webpack 组合使用》,经过了1年多我发现很多童鞋需要这方面的资源,我觉得应该把我们平时在使用 gradle 方式方法分享给大家。

Gradle 是什么

Gradle 是构建工具

Gradle 特点

  1. Build Anything 构建任何应用

  2. Automate Everything 自动化一切

  3. Deliver Faster 提供更快的构建

上面的三项全是官方解释对于第1点没有任何疑问,gradle 可以构建任何应用。所以下面我都是围绕第在2点上,利用 gradle 如何轻松实现让项目自动化,让你的项目打包、构建、发布更轻松。

本文不会将 gradle 与其它任何构建工具进行比较,因为这没有任何意义,每一种技术或者都有自身的应用场景,如果不适合自身所在的场景再优秀也是没有任何意义的

场景1 - gradle 集成 node 构建应用

  1. 首先你需要在项目中增加 node 插件 gradle-node-plugin

    plugins {
        id "com.moowork.node" version "1.2.0"
    }
  2. 配置 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

  3. 构建任务

    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 插件

  1. 插件依赖添加 gradle-ssh-plugin

    plugins {
        id 'org.hidetake.ssh' version '2.9.0'
    }
  2. 服务器配置

    remotes {
      webServer {
        host = '192.168.1.101'
        user = 'webserver'
        identity = file('id_rsa')
      }
    }
    remotes 服务器信息配置,关于 gradle-ssh-plugin 更详细的配置可以参考官方文档
  3. 部署任务配置

    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:在开发测试环境使用这种方式部署我只能说不要太好用

场景3 - gradle 集成 docker 构建

  1. 插件依赖添加 gradle-docker-plugin

    buildscript {
        dependencies {
            classpath "com.bmuschko:gradle-docker-plugin:3.2.1"
        }
    }
    
    apply plugin: "com.bmuschko.docker-remote-api"
  2. 编写构建任务

    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 更加详细的用法请参考官方文档

场景4 - gradle release 插件应用

  1. 插件依赖添加 gradle-release

    plugins {
        id "net.researchgate.release" version "2.6.0"
    }
  2. 使用
    master 分支中运行命令 gradlew release 即会自动创建 tag

该插件使用较简单,不需要修改任何参数运行命令后按照流程走即可,唯一要注意的是如果你是多项目记得运行修改成 gradlew :release 这样是在 root 项目中运行打 tag
下图是使用命令后 git 提交记录
gradle 应用构建分享(纯干货)

场景5 - travis 中使用 gradle 构建

.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 几乎使用到了上面所有的插件,大家可以参考该项目

懂得偷懒的人才会进步,但懒惰并不会使你进步


相关推荐:

怎样用Eclipse IDE里的Gradle来构建应用程序

给Android初学者的Gradle知识普及



以上就是gradle 应用构建分享(纯干货) 的详细内容,更多请关注其它相关文章!