当前位置: 首页 > news >正文

超简单配置Android持续集成自动化打包流程 - GitHub+GitLab-CI+蒲公英+钉钉

我的Github:github.com/BzCoder

GitLab-CI的相关语法:fennay.github.io/gitlab-ci-c…

欢迎各位留言讨论

场景

为了优化工作流程,解放开发人员双手,不整天被【帮我打一个测最近的包】这种琐碎的事儿打乱工作的节奏,这两天就研究了下有关于Android持续集成的东西,特此记录。我们项目是存放在GitHub的私有仓库,现在有三个持续集成自动化打包的方案:

  • Travis CI:Github亲儿子,它对于开源库是免费使用,但是针对GitHub私有库的持续集成是收费的。
  • Jenkins:功能强大,使用灵活,但是Jenkins配置的复杂度和部署成本都相对比较高,有学习成本,但是一个不错的方案。
  • GitLab CI:非常简单完全免费,且完全不需要配置额外服务器资源的方案,支持私有仓库,学习成本低。

本着薅资本主义羊毛的原则,我们来介绍下这个方案。

工具集

  • GitHub:世界最大代码托管平台,世界最大程序员交友平台。
  • GitLab:很多功能都比GitHub好,但是可惜用的人没有GitHub多,但是很多公司都把他私有化部署。
  • GitLab-CI:配合GitLab平台的持续继承平台。
  • 蒲公英:国内知名APP内测分发平台。
  • 钉钉:阿里出品办公软件,我们主要使用机器人功能进行相关人员通知。

总体流程

简单地了解了工具,接下来我们就开始持续集成之旅。

同步代码到GitLab

首先要将GitHub上的代码转移一份到GitLab上,并且保持同步。万幸的是,这最关键的一部,贴心的GitLab已经搞定了。 【登录Gitlab】【New project】 【CI/CD for external repo】【GitHub】,只要经过授权,GitLab就可以获取到你GitHub帐号下所有的仓库。选择【Connect】后即可同步你的GitHub项目到GitLab。

配置GitLab-CI

配置GitLab-CI其实十分简单,我们只要将GitLab-CI的持续集成脚本文件.gitlab-ci.yml加入到我们工程的根目录即可,如果你是想即拿即用,那么你只需要复制粘帖以下代码,替换相关Key值与SDK,JDK版本即可。

image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "28"
  ANDROID_BUILD_TOOLS: "28.0.2"
  ANDROID_SDK_TOOLS:   "4333796"

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
  - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
  - unzip -d android-sdk-linux android-sdk.zip
  - echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
  - echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
  - echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
  - export ANDROID_HOME=$PWD/android-sdk-linux
  - export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
  - chmod +x ./gradlew
  # temporarily disable checking for EPIPE error and use yes to accept all licenses
  - set +o pipefail
  - yes | android-sdk-linux/tools/bin/sdkmanager --licenses
  - set -o pipefail

stages:
  - build

assembleDebug:
  stage: build
  only:
    - master
  script:
    - ./gradlew assembleDebug
    - curl -F "file=@app/build/outputs/apk/debug/app-debug.apk" -F "uKey=蒲公英uKey" -F "_api_key=蒲公英api_key" https://qiniu-storage.pgyer.com/apiv1/app/upload
    - curl "钉钉WebHook地址" -XPOST -H 'content-type:application/json' -d '{"msgtype":"text","text":{"content":"@135xxxxxxx@135xxxxxxx@135xxxxxxx【xxxx】打包完成,下载地址:https://www.pgyer.com/xxxx"},"at":{"atMobiles":["135xxxxxxx","135xxxxxxx","135xxxxxxx"],"isAtAll":false}}'
  artifacts:
    paths:
      - app/build/outputs/apk/debug/app-debug.apk
复制代码

配置脚本

这边地解释下常用的几处配置项的含义,毕竟我们的要求是快速简单配置,过多的就不赘述了。

1.配置JDK版本,SDK版本

根据项目实际SDK版本情况修改。

image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "28"
  ANDROID_BUILD_TOOLS: "28.0.2"
  ANDROID_SDK_TOOLS:   "4333796"
复制代码

2.打包指令

此处根据需要更改打包命令,示例中打的是Debug包。

./gradlew assembleDebug
复制代码

3.上传蒲公英

第一个参数为你打包后文件的路径,“@”符号不能丢。第二个第三个参数可以在蒲公英官网查询。

curl -F "file=@app/build/outputs/apk/debug/app-debug.apk" -F "uKey=蒲公英uKey"
 -F "_api_key=蒲公英api_key" https://qiniu-storage.pgyer.com/apiv1/app/upload
复制代码

当然你也可以配置其他参数来满足你的需求。

参数类型说明
uKeyString(必填) 用户Key
_api_keyString(必填) API Key
fileFile(必填) 需要上传的ipa或者apk文件
installTypeInteger(选填)应用安装方式,值为(1,2,3)。1:公开,2:密码安装,3:邀请安装。默认为1公开
passwordString(选填) 设置App安装密码,如果不想设置密码,请传空字符串,或不传。
updateDescriptionString(选填) 版本更新描述,请传空字符串,或不传。

4.通知钉钉

curl "钉钉WebHook地址" -XPOST -H 'content-type:application/json' -d '钉钉消息json'
复制代码

钉钉WebHook地址可以在【群聊】【添加机器人】【自定义】中获取。

钉钉消息中的Json可以参考以下格式

{
  "msgtype": "text",
  "text": {
    "content": "@135xxxxxxx@135xxxxxxx@135xxxxxxx【xxxx】打包完成,下载地址:https://www.pgyer.com/xxxx"
  },
  "at": {
    "atMobiles": [
      "135xxxxxxx",
      "135xxxxxxx",
      "135xxxxxxx"
    ],
    "isAtAll": false
  }
}
复制代码
参数参数类型必须说明
msgtypeString消息类型,此时固定为:text
contentString消息内容
atMobilesArray被@人的手机号(在content里添加@人的手机号)
isAtAllbool@所有人时:true,否则为:false

@后面为你所需要通知的同事的钉钉绑定的手机号码,更多用法可以参考钉钉机器人文档。

当然你也可以在蒲公英后台中设置webhook直接设置通知钉钉:

蒲公英应用下载地址,可以在后台查看。

##5.指定分支 我们并不需要每次提交都触发持续集成。所以我们需要指定触发持续集成的分支。

 only:
    - master
复制代码
参数说明
only定义一列git分支,进行集成
except定义一列git分支,不进行集成

##6.上传artifacts文件路径

  - app/build/outputs/apk/debug/app-debug.apk
复制代码

可以在Gitlab中下载打出来的包。

注意事项

到此流程全部结束,只要你提交代码到Github,Gitlab-CI就会帮你自动打包,你可以在【GitLab】【对应工程】【CI/CD】中查看打包的进程。

打包成功后就会发送通知到你的钉钉,并同步至蒲公英,当然你也可以到GitLab中从附件中下载安装包,如果你的微信绑定了蒲公英,在你的微信里也会有相应的提示。
但是有一点要注意。由于在GitlLab上打包,它并不会缓存仓库,所以每次都需要重新下载工程中所有被依赖的库。从图中也可以看到,一个中型工程的集成时间在25-30分钟左右。打包速度异常缓慢,但已经足够满足日常的一些需求。当然如果能利用Jenkins把环境部署在本地将是一个更好的选择。

转载于:https://juejin.im/post/5d02392ff265da1bbe5dff50

相关文章:

  • 51NOD 1565:模糊搜索——题解
  • STL priority实例
  • Severless SQL on OSS 实验(DataLakeAnalytics on OSS)
  • MYSQL下对远程用户进行连接授权
  • php中mysqli 处理查询结果集的几个方法
  • python常用模块
  • windows mysql 8
  • 云计算大数据,知识体系
  • 瓜脸识别神器让标签看得见,看ET农业大脑是如何将生鲜品牌化?
  • Jenkins+pipeline+参数构建+人工干预确定
  • sql -- 移除数据中的换行符和回车符
  • 总结http get和post的区别
  • SpringBoot案例中关于添加的方式
  • WORD文档怎么转换成EXCEL
  • Java基础学习总结(24)——Java单元测试之JUnit4详解
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Druid 在有赞的实践
  • Java,console输出实时的转向GUI textbox
  • JavaScript设计模式之工厂模式
  • Less 日常用法
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • oschina
  • PHP 的 SAPI 是个什么东西
  • Sass Day-01
  • SSH 免密登录
  • 记一次删除Git记录中的大文件的过程
  • 聊聊hikari连接池的leakDetectionThreshold
  • 深度学习中的信息论知识详解
  • 使用Gradle第一次构建Java程序
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一道闭包题引发的思考
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (南京观海微电子)——COF介绍
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)elasticsearch 源码之启动流程分析
  • (一)appium-desktop定位元素原理
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ***通过什么方式***网吧
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ./configure,make,make install的作用(转)
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net MySql
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET开源项目介绍及资源推荐:数据持久层