任务目标:将内网APK打包后最新下载链接、更新时间、更改日志显示在一个我自己制作的APP里

任务作用:我们在内网测试时更新下载APK更加便捷,并且能够清楚目标APK的版本情况,回归、验证做到有的放矢

实现原理:

APK下载部分

使用Jenkins打包APK后执行shell将最新打包的APK复制到Nginx配置的根目录

cp -f $APK_BUILD_HOME/passenger-smzcself-release.apk /usr/local/nginx/html

Nginx配置:

/usr/local/nginx/conf/nginx.conf 添加一个9000端口的server

这样在网页上请求"http://192.168.3.151:9000/passenger-smzcself-release.apk"就可以下载都更新后的最新APK

APK更新时间部分

echo 更新时间 > /usr/local/nginx/html/passenger.html
echo $CURRENT_TIME >> /usr/local/nginx/html/passenger.html

shell将 APK打包时间写入到passenger.html文件,网页请求http://192.168.3.151:9000/passenger.html显示打包更新时间

APK更新日志部分

Jenkins每次打包成功后都会根据git或者svn提交注释生成修改日志

这个变更日志保存在Jenkins工作文件夹jobs下builds/lastSuccessfulBuild/changelog.xml里面,这个文件的XML格式,我需要将它简单切割后内容发送到/usr/local/nginx/html/passenger_log.html,最终访问http://192.168.3.151:9000/passenger_log.html这个页面就可以显示我们的APK上一次打包更新到了什么内容

切割脚本如下:

 #!/bin/sh
function funAWK()
{
out=`awk '/./ {print}' $`
out1=`echo $out | awk '
{
alen=split($,a,"committer");
for(k=;k<=alen;k++)
{
print a[k];
}
}'`
echo "$out1" > .log
out2=`cat .log | while read line
do
echo ${line%%*}
done`
echo "$out2" > .log
out3=`cat .log | while read line
do
echo ${line%%This reverts*}
done`
echo "$out3" > .log
out4=`cat .log | while read line
do
echo ${line%%Change-Id*}
done`
echo "$out4" > .log
sed -i "s/+0800/提交/g" .log
cat .log > $
}
funAWK /var/lib/jenkins/jobs/Android_Passenger_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/passenger_log.html
funAWK /var/lib/jenkins/jobs/Android_Taxi_Driver_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/taxi_log.html
funAWK /var/lib/jenkins/jobs/Android_Driver_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/driver_log.html

最终集成

我将这几个网页集成在同一个网页上一个网页显示下载链接另外两个网页作为整个网页的iframe显示,创建一个APP工程,这个工程非常的简单只有一个webview控件,这个控件显示了我制作了的那个网页,更新APK信息后在APP端只用下拉刷新网页就会显示最新的更新信息

最终效果

安卓布局代码:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.smzc_apk_update">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/smzc"
android:label="神马APK升级"
android:roundIcon="@mipmap/smzc"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> </application>
</manifest>

操作代码:

 package com.example.smzc_apk_update;

 import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView; public class MainActivity extends AppCompatActivity {
private WebView webview; SwipeRefreshLayout swipeRefreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
webview = (WebView) findViewById( R.id.webView );
webview.loadUrl( "http://192.168.3.151:9000/" );
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
//重写这个布局的下拉功能
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
webview.clearCache( true);
//webview.reload();
webview.loadUrl( "http://192.168.3.151:9000/" );
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
},
2000);
}
});
}
}

结语

又到了大家喜闻乐见的血泪总结时间,本次任务耗时4天,其中对更改日志的切割耗时1天半,总结的坑点如下:

1.在shell脚本中 echo $a 和echo “$a” 是不一样的,不加引号时输出会自动合并到一行里,我反反复复在这个问题里面饶了1天才明白过来

2.在安卓里

23                 //webview.reload();
24 webview.loadUrl( "http://192.168.3.151:9000/" );是不一样的,
webview.reload()不会刷新 网页的iframe
												

APK更新集成实践的更多相关文章

  1. APK瘦身实践

    首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...

  2. [独孤九剑]持续集成实践(二)– MSBuild语法入门

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  3. 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践

    目录 系列文章 数据传输对象 输入DTO最佳实践 不要在输入DTO中定义不使用的属性 不要重用输入DTO 输入DTO中验证逻辑 输出DTO最佳实践 对象映射 学习帮助 系列文章 基于ABP落地领域驱动 ...

  4. atitit.hbnt orm db 新新增更新最佳实践o99

    atitit.hbnt orm db 新新增更新最佳实践o99 1. merge跟个save了. 1 2. POJO对象处于游离态.持久态.托管态.使用merge()的情况. 1 3. @Dynami ...

  5. atitit.hbnt orm db 新新增更新最佳实践o7

    atitit.hbnt orm db 新新增更新最佳实践o7 1. merge跟个save了. 1 2. POJO对象处于游离态.持久态.托管态.使用merge()的情况. 1 3. @Dynamic ...

  6. [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  7. 基于Jenkins的开发测试全流程持续集成实践

    今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...

  8. Pytest权威教程22-优质集成实践

    目录 优质集成实践 使用pip安装包 Python测试发现的约定 选择测试布局结构/导入规则 在应用程序代码外测试 测试作为应用程序代码的一部分 tox 返回: Pytest权威教程 优质集成实践 使 ...

  9. 「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点

    1. 前言 随着互联网软件行业快速发展,为了抢占市场先机,企业不得不持续提高软件的交付效率.特别是现在国内越来越多企业已经在逐步引入DevOps研发模式的变迁,在这些背景催促之下,对于企业研发团队所需 ...

随机推荐

  1. vue app项目 第一天 基本架构和路由配置

    一.前言 今天开始打算花6天时间 完成一个基于vue的买菜app 在这里记录一下项目的流程和第一次做这个项目遇到的坑 以及解决的办法 二.第一步 脚手架的安装 使用npm 安装好脚手架  安装脚手架教 ...

  2. RabbitMQ异常注意 reply-code=404, reply-text=NOT_FOUND - no exchange 'topic' in vhost '/', class-id=50, method-id=

    第一次,一定要先启动Provider再启动Consumer!!! rabbitmq为初始状态没有队列信息,然后我又没有启动consumer,所以导致provider找不到queue和exchange. ...

  3. Image 缩略图

    方法一:通过调用Image对象的自带方法GetThumbnailImage()进行图片转换. /// <summary> /// 生成缩略图重载方法,返回缩略图的Image对象 /// & ...

  4. C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比

    测试结果如下图: 测试结果整理后: 结论: 1.这几个工具中,protobuf-net序列化和反序列化效率是最快的 2.BinaryFormatter和Newtonsoft.Json反序列化慢的比较多 ...

  5. node.js安装本地模块遇到的目录锁定问题【新手问题】

    昨天发过文字版的,后来以为问题没解决就删除,今天偷个懒,直接上图. 被书中的介绍给误导了,虽然和书中不一样,但实际上自己练习写的模块已经是可用了.也犯了个常识性的错误:Warn一般不会有太大的影响.

  6. [转]UiPath Build Data Table

    本文转自:https://docs.uipath.com/activities/docs/build-data-table UiPath.Core.Activities.BuildDataTable ...

  7. Python导入运行的当前模块报错

    引言 今天遇到了一个奇怪的现象,简单举个栗子: 文件结构如下:

  8. 范罗士空气净化器PT65评测

    买了一台空气净化器,之前网上查了查,哟,是个知名品牌,做碎纸机的. 你问我为啥找个卖碎纸机的买空气净化器?因为年轻,咱们往下看 包装还可以 一打开就有疑问了,这塑料味道不对呀,三手料也不该这个味儿啊. ...

  9. Python Weekly 419

    文章,教程或讲座 如何用 Dropbox Security 构建用于日志系统的威胁检测和事件响应的工具 https://blogs.dropbox.com/tech/2019/10/how-dropb ...

  10. 【ST开发板评测】使用Python来开发STM32F411

    前言 板子申请了也有一段时间了,也快到评测截止时间了,想着做点有意思的东西,正好前一段时间看到过可以在MCU上移植MicroPython的示例,就自己尝试一下,记录移植过程. MicroPython是 ...