背景:

领导下发需求,要求客户端实现代码自动上传至github的需求,本来我这项目是使用jenkins实现自动化打包操作的,由于两端不统一,再加上如果需要公司所有人看到包,需要给所有人开账号有些许不切实际...好吧,就是领导要求两端统一,做就完事了。。。。因此半吊子的我开始了集成之旅。

实现效果:

androidStudio + fastline+github action+fir+gradle 实现push自动打包并上传至fir+版本号自增的功能

步骤:

一、fastlane集成

  官方文档:http://docs.fastlane.tools/

  1.下载fastlane/初始化fastlane,参考官方文档。操作完成显示如下文件。

  

二、运行项目,并自动上传至fir。

  1.在Fastfile中添加如下命令,配置正式环境及测试环境执行命令。

  2.配置firCI。其中api_token为fir中申请的用户token。

default_platform(:android)

platform :android do

lane :release do
gradle(
task: 'assemble',
build_type: 'Release'
)
fir_cli(api_token: "*************", changelog: "Hello fir.im")
end lane :test do
gradle(
task: 'assemble',
build_type: 'Staging'
)
fir_cli(api_token: "*********", changelog: "test")
end end

  3.在Pluginfile中配置fastlane-fir插件。

# Autogenerated by fastlane
#
# Ensure this file is checked in to source control! gem 'fastlane-plugin-fir_cli'

  现在执行命令就可以自动打包上传至fir了。

fastlane android test

三、配置Github action

  简单入门参考:http://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html

  1.本地工程目录下,新建.github/workflows文件夹,并创建好需执行action的yml文件。

  

  配置文件如下。

name: Test Build

on:
push:
branches: [ release/* ] jobs:
publish_apps:
# runs-on: ubuntu-latest
runs-on: self-hosted
# runs-on: macOS-latest steps:
- uses: actions/checkout@v2 - uses: webfactory/ssh-agent@v0.4.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} # - uses: ruby/setup-ruby@v1
# with:
# ruby-version: 2.7
- name: Ruby cache
uses: actions/cache@v1.2.0
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-gems- - name: Gradle cache
uses: actions/cache@v1.2.0
with:
path: /root/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: |
${{ runner.os }}-gradle - name: Bundle install
run: |
bundle config path vendor/bundle
bundle check || bundle install - name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8 - name: Setup Android SDK
uses: android-actions/setup-android@v1 - name: Fastlane android test
run: bundle exec fastlane android test

  其中,

  runs-on:表示当前运行的环境,此处使用的是自己本地服务器。ubuntu-latest表示github服务器。
  secrets.SSH_PRIVATE_KEY:表示当前项目的签名key,在github project-Setting-Secrets中添加。
此处所做的操作为,当release/*分支push时,会触发github的action,依次执行命令,缓存,安装bundle、配置环境变量安装sdk等,最后fastlane打包命令进行自动化打包工作。

四、版本自增

方式一:

  1.在App目录下,新建一个version.properties文件,写入版本号。

  

   2.定义获取versionCode的方法。

def getVersionCode() {
def versionFile = file('version.properties')
if (versionFile.canRead()) {
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionFile))
def versionCode = versionProps['VERSION_CODE'].toInteger()
def runTasks = gradle.startParameter.taskNames //仅在assembleRelease任务是增加版本号
if ('assembleRelease' in runTasks || 'assembleStaging' in runTasks) {
versionProps['VERSION_CODE'] = (++versionCode).toString()
versionProps.store(versionFile.newWriter(), null) println("runTasks = ${runTasks} versionCode = ${versionCode}")
def showChange = "git status"
def commitCmd = "git commit app/version.properties -m 'versionCode:${versionCode}'"
def pushCmd = "git push"
println(showChange.execute().text.trim())
println(commitCmd.execute().text.trim())
println(pushCmd.execute().text.trim())
}
return versionCode
} else {
throw new GradleException("Could not find version.properties!")
}
}

方式二:

相比较方式一的好处是,不用修改文件,重新提交;根据fir上面的版本号进行自增,在正式包/热修复的时候不会自增

def getVersionCode() {
def versionCode = 79
def runTasks = gradle.startParameter.taskNames
String id = rootProject.APPLICATION_ID
HttpURLConnection conn = null
try {
URL url = new URL("http://api.bq04.com/apps/latest/${id}?api_token=${API_TOKEN}&type=android")
conn = (HttpURLConnection) url.openConnection()
conn.setRequestProperty("Accept-Charset", "UTF-8")
conn.setRequestProperty("connection", "keep-Alive")
conn.setRequestMethod("GET");
conn.connect()
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String result = "";
String tmp = "";
while ((tmp = br.readLine()) != null) {
result += tmp;
}
Gson gson = new GsonBuilder().create()
Map map = gson.fromJson(result, Object.class)
versionCode = Integer.parseInt(map.get("version"))
println(" oldversionCode = ${versionCode}")
//仅在assembleStaging任务是增加版本号
if ('assembleStaging' in runTasks) {
++versionCode
}
println("runTasks = ${runTasks} id = ${id} versionCode = ${versionCode}") if (br != null)
br.close()
}
} catch (Exception e) {
e.printStackTrace()
} finally {
if (conn != null) {
conn.disconnect()
}
} return versionCode
}

这样在每次打包的时候就能进行版本自增,并push到线上了。

至此,android自动化打包持续集成完成,历时一周时间。彻底解放双手,懒人开发必备。

android打包持续集成的更多相关文章

  1. Xamarin.Android VSTS 持续集成

    这些天做了一个基于 VSTS 的 Xamarin.Android的持续集成,这里分享下 Build Agent 环境需求 DotNetFramework msbuild visualstudio An ...

  2. Jenkins构建Android项目持续集成之findbugs的使用

    Findbugs简介 关于findbugs的介绍,可以自行百度下,这里贴下百度百科的介绍.findbugs是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题 ...

  3. Jenkins+Gradle实现android开发持续集成、打包

    Jenkins简介 Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时 Jenkins 能实施监控集成中存在的错误, ...

  4. Jenkins构建Android项目持续集成之单元测试及代码覆盖率

    单元测试 在软件开发中一直在推崇TDD(测试驱动开发),但是一直不能被有效的执行或者并不是真正的测试驱动开发(先开发后写单元测试),因为我们懒!而Android开发又是大多应用层面的开发,很多都是和视 ...

  5. 使用jenkins进行Android的持续集成

    关于持续集成的定义和意义可以参考它的 百度百科 主要意义有以下几点: 减少风险 减少重复过程 任何时间.任何地点生成可部署的软件 增强项目的可见性 建立团队对开发产品的信心 持续集成的实施 持续集成的 ...

  6. Jenkins Android APP 持续集成体系建设二—自动部署、执行测试任务,关联打包任务

    经过上一遍博客我们知道了怎么使用Jenkins自动打包,但打完包之后,我们还需要对新包进行回归测试,确定新包有没有问题,然后才能发布包,那么,话不多说,我们先来新建个自动化回归测试任务 新包自动化回归 ...

  7. jenkins+Android+gradle持续集成

    本文Android自动化打包采用jenkins+gradle+upload to pyger的方式来实现,job执行完后只需要打开链接扫描二维码即可下载apk. 一.环境准备 1.下载Android ...

  8. CI实践_Android持续集成

    之前已经实现了Android的持续集成,并在项目中应用了一段时间.恰逢现在有几分钟时间,把之前的一些零散的点滴记录和整理一下,供有需要的朋友参考,或后续复用. 需要的准备知识:gitlab.Jenki ...

  9. 使用 Jenkins 搭建 iOS/Android 持续集成打包平台【转】

    背景描述 根据项目需求,现要在团队内部搭建一个统一的打包平台,实现对iOS和Android项目的打包.而且为了方便团队内部的测试包分发,希望在打包完成后能生成一个二维码,体验用户(产品.运营.测试等人 ...

随机推荐

  1. 串口wifi

    串口wifi 串口WiFi ZLAN7146是一款wifi转串口的wifi串口服务器.该串口服务器可以方便地使得串口设备连接到WIFI无线网络,实现串口设备的无线化网络升级.RS232接口支持全双工. ...

  2. 程序员的“三十而已”,你都30岁了,不会还在XXX吧?

    一部<三十而已>火了 太太们的包包鄙视链出圈了 有人的地方就有江湖 是的,程序员入圈是容易的 不需要4万的LV,更不需要限量版的爱马仕 只需要一件耐躁的格子衫 然而,程序员的30岁, 却说 ...

  3. tr命令-转换和删除字符

    tr 转换和删除字符 支持标准输入 格式 tr [OPTION]...SET1[SET2] Translate, squeeze, and/or delete characters from stan ...

  4. 企业内部新建DNS服务器

    DNS软件bind isc 开源 免费使用 其他:powerdns(基于php) undound 安装bind yum list all bind 官方最新版本 www.isc.org/downloa ...

  5. [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构

    [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 目录 [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x0 ...

  6. 操作安装docker

    在本地建造起vue-cli服务 参考项目:https : //gitee.com/QiHanXiBei/myvue 在本地建造起一个django项目架构,通过/ hello能够打印出helloworl ...

  7. Kerberos与票据的爱情故事

    0x01.Kerberos认证原理 Kerberos是一种认证机制.目的是通过密钥系统为客户端/服务器应用程序提供强大的可信任的第三方认证服务: 保护服务器防止错误的用户使用,同时保护它的用户使用正确 ...

  8. SharedPreferences源码分析

    分析达成目标 了解基本实现 SharePreferences是否线程安全 SharePreferences的mode参数是什么 了解apply与commit的区别 导致ANR的原因 Android8. ...

  9. U137971 公司搬迁 - 并查集 奇偶性

    题目描述 因为人员规模扩大,T公司准备搬到新的写字楼去,写字楼分为A座和B座,n名不同工号的员工x(p1,p2,p3...pn) 按照下面两个规则确定在A座或者B座进行办公:(1)如果工号为x的员工在 ...

  10. Android 教你如何发现 APP 卡顿

    最近部门打算优化下 APP 在低端机上的卡顿情况,既然想优化,就必须获取卡顿情况,那么如何获取卡顿情况就是本文目的. 一般主线程过多的 UI 绘制.大量的 IO 操作或是大量的计算操作占用 CPU,导 ...