转载:https://blog.csdn.net/weixin_34150503/article/details/88860558
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
你可以根据自己的部署需要编写各种 task,轻松实现 一键部署,并且这种方式是完全跨平台的,不管你的开发环境是 windows、mac、linux 都是使用相同的命令部署
PS:在开发测试环境使用这种方式部署我只能说 不要太好用
场景 3 - gradle 集成 docker 构建
插件依赖添加 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 目录为后面构建镜像做准备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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
1
2
3
4
5
6
7
8
9
10
11
|
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"]
|
1
2
3
4
5
|
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
1
2
3
4
5
6
7
8
9
|
plugins {
id "net.researchgate.release" version "2.6.0"
}
|
-
使用
在 master 分支中运行命令 gradlew release
即会自动创建 tag
该插件使用较简单,不需要修改任何参数运行命令后按照流程走即可,唯一要注意的是如果你是多项目记得运行修改成 gradlew :release
这样是在 root 项目中运行打 tag
下图是使用命令后 git
提交记录
场景 5 - travis 中使用 gradle 构建
.travis.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
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 几乎使用到了上面所有的插件,大家可以参考该项目
配置指南
maven 配置指南
打开 maven 的配置文件(windows 机器一般在 maven 安装目录的 conf/settings.xml),在<mirrors></mirrors>
标签中添加 mirror 子节点:
1
2
3
4
5
6
|
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
|
如果想使用其它代理仓库,可在<repositories></repositories>
节点中加入对应的仓库使用地址。以使用 spring 代理仓为例:
1
2
3
4
5
6
7
8
9
10
|
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
|
gradle 配置指南
在 build.gradle 文件中加入以下代码:
1
2
3
4
5
6
7
|
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public/' }
mavenLocal()
mavenCentral()
}
}
|
如果想使用 maven.aliyun.com 提供的其它代理仓,以使用 spring 仓为例,代码如下:
1
2
3
4
5
6
7
8
|
allProjects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://maven.aliyun.com/repository/spring/'}
mavenLocal()
mavenCentral()
}
}
|