Gradle和Aritifactory
本文链接:https://blog.csdn.net/feather_wch/article/details/131746580
文章目录
- Gradle和Aritifactory
- Gradle基本介绍
- Gradle插件开发流程
- 本地仓库
- artifactory
- 搭建
- 添加仓库
- 使用本地仓库
- gradle插件
- 仓库引入
- 插件buildSrc开发步骤
- xxxPlugin
- PgyerUploadTask
- SendMsgToDingTalkTask
- 未来展望
Gradle基本介绍
1、Gradle是一种语言吗?
- 不是
- 而是一种构建自动化工具,用于多语言软件开发。
- 可以控制编译、打包、测试、部署和发布等任务。
2、gradle支持的语言有哪些?
- Java
- Kotlin
- Groovy
- Scala
- C/C++
- JavaScript²。
3、Gradle的构建脚本是用Groovy编程语言编写的。
4、Groovy是一种基于JVM的动态语言。
5、Gradle的整个API也是用Groovy语言设计的。
6、Gradl提供了一个基于Groovy语言的领域特定语言(DSL),支持两种DSL
- Groovy DSL => build.gradle
- Kotlin DSL => build.gradle.kts
7、DSL(领域特定语言)是什么?
- 一种针对特定领域或问题的语言,而不是通用的编程语言。
- Gradle的DSL是用来描述构建过程和项目结构的语言。
Gradle插件开发流程
- 开发
- 打包
- 上传
- 测试
- 发布
- -> 开发(1)
本地仓库
本地仓库构建两种方法:
- nexus-只支持java
- artifactory-支持java、php、docker等等
artifactory
目的:
- 本地组件提交到本地仓库
- 服务端拉到本地仓库
搭建
要在 windows 上搭建 jfrog artifactory,可以参考以下的资源:
- Windows环境利用Artifactory搭建本地仓库_windows artifactory_科小喵的博客-CSDN博客:这篇文章介绍了 jfrog artifactory 的下载和安装、本地仓库和远程仓库的创建和配置、虚拟仓库的创建和使用、项目中使用仓库等内容。
实际步骤
- 下载压缩包artifactory_pro_and_crack,并且解压缩,包含内容:artifactory-injector-1.1.jar和jfrog-artifactory-pro-6.6.0.zip
- 配置好JAVA环境
- 破解1:输入 java -jar .\artifactory-injector-1.1.jar
- 破解2:选择2
- 破解3:输入aritifactory路径,需要下面有文件夹webapps,如 xxx\artifactory_pro_and_crack\jfrog-artifactory-pro-6.6.0\artifactory-pro-6.6.0
- 破解4:选择1,保存得到的密钥字符串
- 运行artifactory-pro-6.6.0\bin目录下的 artifactory.bat
- 浏览器输入:localhost:8081
- 点击上方提示文字:输入key
- 账户名:admin 密码:password
添加仓库
远程仓库
- 选择Remote
- 右侧,+New
- 创建Maven仓库:代理google仓库
- 创建成功
本地仓库
- 选择Local
- 创建maven仓库:名称为android_local
- 测试:上传插件gradle-8.0-bin.zip
修改默认文件大小
- Admin->General Configuration
- File Upload Max Size 修改为 1000MB
- save
设置分组
- 原因:原来要设置远程和本地几个仓库,很麻烦,直接分一组
- Admin->Virtual
- New->取名为“android-group”
- 选择需要加进去的Repository
- Save&Finish
使用本地仓库
gradle插件
gradle-wrapper.properties
https://services.gradle.org/distributions/gradle-8.0-bin.zip
修改为:
http://localhost:8081/artifactory/andorid_local/gradle-8.0-bin.zip
仓库引入
repositories {
maven { url 'http://localhost:8081/artifactory/andorid_group/' }
}
插件buildSrc开发步骤
xxxPlugin
核心代码
1、创建名为releaseHelper的任务,并且建立Extension配置项和Task的关联
project.getExtensions().create("releaseHelper", Extension.class, project);
2、创建任务一:App发布到蒲公英平台
// Create PgyUpload task
PgyerUploadTask pgyUploadTask = project.getTasks().
create("pgyUploadFor" + variantName, PgyerUploadTask.class);
pgyUploadTask.init(variant, project);
3、创建任务二:发送App发布消息到钉钉
// Create SendMsgToDingTalkTask task
SendMsgToDingTalkTask sendMsgToDingTalkTask = project.getTasks().
create("sendMsgToDingTalkFor" + variantName, SendMsgToDingTalkTask.class);
sendMsgToDingTalkTask.init(variant, project);
4、构建assembleRelease和两个task之间的依赖关系
// assembleRelease依赖于clean
variant.getAssembleProvider().get().dependsOn(project.getTasks().findByName("clean"));
// 蒲公英上传依赖于assembleRelease
pgyUploadTask.dependsOn(variant.getAssembleProvider().get());
// 钉钉消息依赖于蒲公英上传
sendMsgToDingTalkTask.dependsOn(pgyUploadTask);
PgyerUploadTask
@TaskAction
public void uploadToPgy() {
// 1、拿到app的build.gradle中android标签下内容
AppExtension appExtension = (AppExtension) targetProject.getExtensions().findByName("android");
for (BaseVariantOutput it : variant.getOutputs()) {
// 2、拿到输出文件
File apkFile = it.getOutputFile();
// 3、展示app相关信息
Extension extension = Extension.getConfig(targetProject);
System.out.println("#######################################################################");
System.out.println("# applicationId :" + variant.getMergedFlavor().getApplicationId());
System.out.println("# uploadFileName:" + apkFile.getAbsoluteFile());
System.out.println("# versionName :" + appExtension.getDefaultConfig().getVersionName());
System.out.println("# versionCode :" + appExtension.getDefaultConfig().getVersionCode());
System.out.println("# appName :" + extension.appName);
System.out.println("# changeLog :" + extension.changeLog);
System.out.println("#######################################################################");
// 4、Retrofit上传
try {
// 1. Get FIR upload info includes icon and apk uploading;
Response<ResponseBody> appsResponse = RetrofitUtil.
getRetrofit("https://www.pgyer.com/apiv2/").
create(PgyerUploadInterface.class).
uploadFile(RetrofitUtil.getTextBody(extension.pgyApiKey),
RetrofitUtil.getFilePart("application/vnd.android.package-archive", apkFile),
RetrofitUtil.getTextBody("2"),
RetrofitUtil.getTextBody("123456"),
RetrofitUtil.getTextBody("test"),
RetrofitUtil.getTextBody("XiangxueGradle"),
RetrofitUtil.getTextBody("2")).
execute();
System.out.println("\n1. AppsResponse:" + new Gson().toJson(appsResponse.body().string()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
SendMsgToDingTalkTask
发送消息到钉钉
@TaskAction
public void SendMessageToDingTalk() {
Extension extension = Extension.getConfig(targetProject);
DingMsg dingMsg = new DingMsg();
dingMsg.actionCard.title = extension.msgTitle;
dingMsg.actionCard.text = extension.msgContent;
dingMsg.actionCard.singleTitle = extension.singleButtonTitle;
dingMsg.actionCard.singleURL = extension.singleButtonUrl;
try {
Response<ResponseBody> response = RetrofitUtil.
getRetrofit("https://oapi.dingtalk.com/").
create(DingTalkInterface.class).
sendMsgToDingTalk(extension.apiToken, dingMsg).
execute();
System.out.println("DingTalkMsgResponse:" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
未来展望
1、支持多渠道、多维度打包
2、支持上传Jenkins