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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

甲板上的战舰(力扣)递归 JAVA

给你一个大小为 m x n 的矩阵 board 表示甲板&#xff0c;其中&#xff0c;每个单元格可以是一艘战舰 ‘X’ 或者是一个空位 ‘.’ &#xff0c;返回在甲板 board 上放置的 战舰 的数量。 战舰 只能水平或者垂直放置在 board 上。换句话说&#xff0c;战舰只能按 1 x k&#xf…

Redis入门基础命令

文章目录 一、redis1.1 redis概述1.2 redis安装 二、string2.1 基础命令2.2 存储结构2.3 应用 三、list3.1 基础命令3.2 应用 四、hash4.1 基础命令4.2 存储结构4.3 应用 五、set5.1 基础命令5.2 存储结构5.3 应用 六、zset6.1 基础命令6.2 存储结构6.3 应用 一、redis 1.1 re…

随手笔记——如何手写高斯牛顿法

随手笔记——如何手写高斯牛顿法 说明源代码 说明 将演示如何手写高斯牛顿法 源代码 #include <iostream> #include <chrono> #include <opencv2/opencv.hpp> #include <Eigen/Core> #include <Eigen/Dense>using namespace std; using names…

【前端知识】React 基础巩固(二十八)——StrictMode

React 基础巩固(二十八)——StrictMode StrictMode StrictMode 是一个用来突出显示应用程序中潜在问题的工具 与 Fragment 一样&#xff0c;StrictMode 不会渲染任何可见的 UI为后代出发额外的检测和警告严格模式检查仅在开发模式下运行&#xff0c;不影响生产构建 严格模式检…

线程与信号

1. 进程内所有线程共享信号处理配置&#xff0c;故信号配置可以全部放在主线程内。 2. 每个线程有自己的信号掩码sigset_t&#xff0c;线程创建时继承创建时线程的信号掩码。 3. 触发信号处理函数按创建线程顺序分配给当前空闲线程&#xff0c;信号处理函数内是可以阻塞的。 …

Django实现接口自动化平台(十三)接口模块Interfaces序列化器及视图【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;十二&#xff09;自定义函数模块DebugTalks 序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; pytho…

华润燃气牵手腾讯云 数字技术助力燃气行业高质量发展

7月13日&#xff0c;华润燃气与腾讯云正式签署战略合作协议。双方将充分发挥各自优势&#xff0c;探索AI大模型在燃气行业的深度应用&#xff0c;并深耕分布式计算、连接和客户运营等领域&#xff0c;不断提升燃气民生服务的效率、质量&#xff0c;共同推动行业数字化转型和高质…

巧妙使用 CSS 渐变来实现波浪动画

目录 一、波浪的原理 二、曲面的绘制 三、波浪动画 四、文字波浪动画 五、总结一下 参考资料 之前看到coco[1]的这样一篇文章&#xff1a;纯 CSS 实现波浪效果&#xff01;[2]&#xff0c;非常巧妙&#xff0c;通过改变border-radius和不断旋转实现的波浪效果&#xff0c…

初探KVM虚拟化技术:新手指南

首先了解一下虚拟化的概念 虚拟化是指对资源的逻辑抽象、隔离、再分配、管理的一个过程&#xff0c;通常对虚拟化的理解有广义狭义之分。广义包括平台虚拟化、应用程序虚拟化、存储虚拟化、网络虚拟化、设备虚拟化等等。狭义的虚拟化专门指计算机上模拟运行多个操作系统平台。…

面试中关于自动化测试的认识

目录 一、什么是自动化测试&#xff0c;自动化测试的优势是什么&#xff1f; 二、什么样的项目比较适合做自动化测试&#xff0c;什么样的不适合做自动化测试&#xff1f; 三、在制定自动化测试计划的时候一般要考虑哪些点&#xff1f; 四、编写自动化脚本时的一些规范&…

C#图片处理

查找图片所在位置 原理&#xff1a;使用OpenCvSharp对比查找小图片在大图片上的位置 private static System.Drawing.Point Find(Mat BackGround, Mat Identify, double threshold 0.8) {using (Mat res new Mat(BackGround.Rows - Identify.Rows 1, BackGround.Cols - Iden…

WEB:shrine

背景知识 了解Flask SSIT模板注入 题目 进行代码审计 import flask import osapp flask.Flask(__name__) /*创建了flask包下的Flask类的对象&#xff0c;name是一个适用于多数情况的快捷方式。有了这个参数&#xff0c;Flask才知道在哪里可以找到模板和静态文件*/app.confi…

【Fiddler】Fiddler实现mock测试(模拟接口数据)

软件接口测试过程中&#xff0c;经常会遇后端接口还没有开发完成&#xff0c;领导就让先介入测试&#xff0c;然后缩短项目时间&#xff0c;有的人肯定会懵&#xff0c;接口还没开发好&#xff0c;怎么介入测试&#xff0c;其实这就涉及到了我们要说的mock了。 一、mock原理 m…

小程序:页面跳转闪屏

自己的笔记&#xff0c;随手记录。扛精走开。 1、问题描述 进入页面&#xff0c;是一个组件&#xff0c;通过路由传参判断是由哪个页面进入&#xff0c;不同的页面拿的已选值不一样&#xff0c;需要回显值&#xff0c;在编辑数据。此时会出现一个问题&#xff0c;A页面中进来…

微信小程序——字符串截取

indexOf() &#xff1a; 判断一个字符是否在字符串 中 存在&#xff0c;如果存在返回该元素或字符第一次出现 的 位置 的 索引&#xff0c;不存在返回-1。 lastIndexOf() &#xff1a; 返回一个指定的字符串值最后出现的位置&#xff0c;在一个字符串中的指定位置从后向前搜索。…

【NLP】多头注意力概念(02)

接上文: 【NLP】多头注意力概念(01) 五、计算注意力 将 Q、K 和 V 拆分为它们的头部后,现在可以计算 Q 和 K 的缩放点积。上面的等式表明,第一步是执行张量乘法。但是,必须先转置 K。 展望未来,每个张量的seq_length形状将通过其各自的张量来识别,以确保清晰…

⚡【C语言趣味教程】(3) 浮点类型:单精度浮点数 | 双精度浮点型 | IEEE754 标准 | 介绍雷神之锤 III 源码中的平方根倒数速算法 | 浮点数类型的表达方式

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…

Linux Ubuntu安装RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

使用qemu创建ubuntu-base文件系统,并安装PM相关内核模块

目录 一、配置镜像二、使用qemu模拟nvdimm&#xff08;安装PM相关内核模块&#xff09;运行记录 遇到的一些问题1、ext4文件系统损坏问题&#xff1a;系统启动时&#xff0c;遇到ext4的报错信息解决办法&#xff1a;2、内核模块未成功加载3、qemu报错4、主机终端无法正常打开5、…

【Spring 】执行流程解析:了解Bean的作用域及生命周期

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 Spring 项目的执行流程解析 和 Bean 对象的6 种作用域以及生命周期&#xff0c;本文将为大家讲解&#xff0c;一起来看看叭~ 本期收录于博主的专栏&#xff1a;JavaEE_保…