Gradle和Aritifactory,实现上传Apk并发送消息到钉钉

news2024/9/23 7:20:01

Gradle和Aritifactory

本文链接:https://blog.csdn.net/feather_wch/article/details/131746580

文章目录

  • Gradle和Aritifactory
    • Gradle基本介绍
    • Gradle插件开发流程
    • 本地仓库
      • artifactory
        • 搭建
        • 添加仓库
        • 使用本地仓库
          • gradle插件
          • 仓库引入
    • 插件buildSrc开发步骤
      • xxxPlugin
      • PgyerUploadTask
      • SendMsgToDingTalkTask
    • 未来展望

Gradle基本介绍

1、Gradle是一种语言吗?

  1. 不是
  2. 而是一种构建自动化工具,用于多语言软件开发。
  3. 可以控制编译、打包、测试、部署和发布等任务。

2、gradle支持的语言有哪些?

  1. Java
  2. Kotlin
  3. Groovy
  4. Scala
  5. C/C++
  6. JavaScript²。

3、Gradle的构建脚本是用Groovy编程语言编写的。
4、Groovy是一种基于JVM的动态语言。
5、Gradle的整个API也是用Groovy语言设计的。

6、Gradl提供了一个基于Groovy语言的领域特定语言(DSL),支持两种DSL

  1. Groovy DSL => build.gradle
  2. Kotlin DSL => build.gradle.kts

7、DSL(领域特定语言)是什么?

  1. 一种针对特定领域或问题的语言,而不是通用的编程语言。
  2. Gradle的DSL是用来描述构建过程和项目结构的语言。

Gradle插件开发流程

  1. 开发
  2. 打包
  3. 上传
  4. 测试
  5. 发布
  6. -> 开发(1)

本地仓库

本地仓库构建两种方法:

  1. nexus-只支持java
  2. artifactory-支持java、php、docker等等

artifactory

目的:

  1. 本地组件提交到本地仓库
  2. 服务端拉到本地仓库

搭建

要在 windows 上搭建 jfrog artifactory,可以参考以下的资源:

  • Windows环境利用Artifactory搭建本地仓库_windows artifactory_科小喵的博客-CSDN博客:这篇文章介绍了 jfrog artifactory 的下载和安装、本地仓库和远程仓库的创建和配置、虚拟仓库的创建和使用、项目中使用仓库等内容。

实际步骤

  1. 下载压缩包artifactory_pro_and_crack,并且解压缩,包含内容:artifactory-injector-1.1.jar和jfrog-artifactory-pro-6.6.0.zip
  2. 配置好JAVA环境
  3. 破解1:输入 java -jar .\artifactory-injector-1.1.jar
  4. 破解2:选择2
  5. 破解3:输入aritifactory路径,需要下面有文件夹webapps,如 xxx\artifactory_pro_and_crack\jfrog-artifactory-pro-6.6.0\artifactory-pro-6.6.0
  6. 破解4:选择1,保存得到的密钥字符串
  7. 运行artifactory-pro-6.6.0\bin目录下的 artifactory.bat
  8. 浏览器输入:localhost:8081
  9. 点击上方提示文字:输入key
  10. 账户名:admin 密码:password

添加仓库

远程仓库

  1. 选择Remote
    image
  2. 右侧,+New
  3. 创建Maven仓库:代理google仓库
    image
  4. 创建成功
    image

本地仓库

  1. 选择Local
  2. 创建maven仓库:名称为android_local
  3. 测试:上传插件gradle-8.0-bin.zip

修改默认文件大小

  1. Admin->General Configuration
  2. File Upload Max Size 修改为 1000MB
  3. save

设置分组

  1. 原因:原来要设置远程和本地几个仓库,很麻烦,直接分一组
  2. Admin->Virtual
  3. New->取名为“android-group”
  4. 选择需要加进去的Repository
  5. 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【力扣周赛】第 354 场周赛

文章目录 Q1&#xff1a;6889. 特殊元素平方和思路——简单模拟题竞赛时代码 Q2&#xff1a;6929. 数组的最大美丽值思路——差分数组&#xff0c;计算每个数字可能出现的次数竞赛时代码 Q3&#xff1a;6927. 合法分割的最小下标思路——投票法求出现次数超过半数的元素 模拟竞…

dede tag彩色随机大小的样式修改方法

dede tag彩色随机大小的样式修改方法&#xff0c;打开include/common.func.php 在最下面添加以下代码&#xff1a; //TAG彩色 jinmengqiang.cn function getTagStyle() { $minFontSize8; //最小字体大小,可根据需要自行更改 $maxFontSize18; //最大字体大小,可根据需要自行更改…

(中等)剑指Offer II 062.实现前缀树 Java

Trie&#xff0c;又称前缀树或字典树&#xff0c;是一棵有根树&#xff0c;其每个节点包含以下字段&#xff1a; 指向子节点的指针数组children&#xff0c;对于本题而言&#xff0c;数组长度为26&#xff0c;即小写英文字母的数量。此时children[0]对应着小写字母a&#xff0…

数据结构(王道)——队列

一、队列的定义 三个重要名词&#xff1a;队头、队尾、空队列。 二、队列的基本操作 队列总结&#xff1a; 三、队列的顺序表实现 基本操作&#xff1a; 静态创建队列顺序表 队列顺序表的初始化操作&#xff1a; 入队操作&#xff1a; 入队操作优化&#xff1a; 最优版入队操作…

Navicat-Cracker NavicatCrackerDlg.cpp:332 -3已解决Navicat 162版本注册问题的详细分析与解决方案

博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精通》数据库是开发者必会基础之…

一零六五、零基础入门数据挖掘-心跳信号分类预测(阿里云天池赛)

目录 赛制官方链接 赛题简介 赛制说明 长期赛&#xff08;2021年7月&#xff5e;&#xff09; 正式赛&#xff08;3月12日 - 5月12日&#xff09; 大赛组织 赛题背景 赛题数据 评测标准 结果提交 代码实现 赛制官方链接 零基础入门数据挖掘-心跳信号分类预测_学习赛_…

哈希表以及用js封装一个哈希表

最近在学数据结构和算法&#xff0c;正好将学习的东西记录下来&#xff0c;我是跟着一个b站博主学习的&#xff0c;是使用js来进行讲解的&#xff0c;待会也会在文章后面附上视频链接地址&#xff0c;大家想学习的可以去看看 本文主要讲解哈希表&#xff0c;其他数据结构后续学…

轻松入门Python量化交易(三)

大家好&#xff0c;我们接第二部分继续分析金融数据。 配对图和相关矩阵 证券中的相关性分析为我们提供了有趣的投资策略。市场中一个广为人知的策略叫做“Long-Short”&#xff0c;即买入一家公司的证券&#xff0c;同时卖出另一家公司的证券&#xff0c;相信这两个资产在市…

《微服务架构设计模式》第八章 外部API模式

内容总结自《微服务架构设计模式》 外部API模式 一、API设计难题二、API Gateway 模式1、简介2、所有者模式3、好处和弊端4、设计问题5、实现一个API Gateway 三、使用GraphQL 实现API Gateway四、总结 一、API设计难题 1、移动客户端的API设计难题 在此设计中&#xff0c;移动…

动态规划(二) —— 打家劫舍系列问题总结

前言 除了背包系列问题&#xff0c;打家劫舍系列问题同样也是动态规划的经典题目。在这篇文章中荔枝将会把打家劫舍系列问题做一下总结&#xff0c;再仔细体会动态规划的思想&#xff0c;希望能帮到有需要的小伙伴~~~ 文章目录 前言 一、Leecode198.打家劫舍 1.1 分析 1.2 …

C2C、B2B、B2C、O2O电商定义区别

如今是电子商务高度发展的时代&#xff0c;大多数传统企业商家都开始采取转型战略帮助企业发展&#xff0c;商业模式的选择是转型的关键点&#xff0c;下面小编向你详细介绍一下B2B、B2C、C2C、O2O这些商务模式&#xff0c;帮助你快速理解它们。 BBusiness&#xff0c;即企业;…

Servlet实现文件下载的功能

download.html <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>文件下载</title><base href"<%request.getContextPath()"/"%>>"> </head>…

前端基本功 用 React Hooks + Antd 实现一个 Todo-List

背景 使用 React Hooks 以及组件库 Antd 来实现一个可以 增删 标记是否完成 的 todo-list 思路 要实现一个 todo-list 首先想到用 useState 维护一个状态数组来保存当前 list &#xff0c;还要用一个状态维护添加框中的内容 const [todos, setTodos] useState(initialValu…

OpenCv图像基本变换

目录 一、图像翻转 二、图像旋转 三、仿射变换之平移 四、仿射变换之获取变换矩阵 五、仿射变换之透视变换 一、图像翻转 图像翻转不等同于旋转&#xff0c;类似于一些视频的拍摄&#xff0c;拍摄后实际是左右颠倒的&#xff0c;通过图像翻转可进行还原 案例代码如下: …

第十四章:Context Encoding for Semantic Segmentation ——语义分割的上下文编码

0.摘要 近期的研究在使用全卷积网络&#xff08;FCN&#xff09;框架改善像素级标注的空间分辨率方面取得了显著进展&#xff0c;通过采用扩张/空洞卷积、利用多尺度特征和细化边界等方法。本文通过引入上下文编码模块来探索全局上下文信息对语义分割的影响&#xff0c;该模块捕…

springMVC的开发步骤-15

第一步你用到前端核心控制器&#xff0c;你应该有他&#xff0c;因此导包&#xff1a; 第二步:配servlet 第三步&#xff1a;配控制器&#xff0c;用来调用视图 结束之后我要干嘛&#xff1f;这个springMvC,我能否将这个pojo放到容器内部当中&#xff0c;能否通过bean标签进行配…

Linux 系统编程-开发环境(三)

目录 16 vim 16.1 vi简介 16.1.1 命令行模式 16.1.2 文本输入模式 16.1.3 末行模式 16.2 vim基础操作 16.3 vim分屏操作 16.4 vim打造IDE 16.4.1 简洁版IDE 17 gcc 18 toolchain 19 静态库和共享库 19.1 静态库 19.2 共享库 19.2.1 基础班使 19.2.2 就业班使用…

BiSeNetv2(pytorch)测试、训练cityscapes

1. 源码&#xff1a; github: https://github.com/CoinCheung/BiSeNet git clone https://github.com/CoinCheung/BiSeNet.git2. 预训练模型&#xff1a; 工程下载后解压&#xff0c;并在其中创建文件夹【model】用于存放预训练模型&#xff1b; 3. 运行demo conda creat…

【安装】Linux环境下的 JDK的安装 安装配置 环境变量

目录 Linux安装java环境1.检查系统中是否有JDK2.删除原有的java相关的包3.上传jdk到指定的文件夹4.解压jdk-8u371-linux-x64.tar.gz5.配置jdk的环境变量6.让配置生效 运行一个jar包运行jar包进行测试 Oracle 甲骨文中国 | 云应用和云平台 windows环境下的 JDK官网下载 & 安…

Android实现抓包 使用Fiddler抓包

Fiddler下载&#xff1a;https://pan.baidu.com/s/1QzvL0xugp6XX7gbFBFlEJg?pwdbf6u 提取码&#xff1a;bf6u 1.Fiddler配置 如果用不到https可以不开启https抓包 电脑打开fiddler&#xff0c;手机电脑同一网段。fiddler打开https抓包(Tools->Options->HTTPS)&a…