任务目标:将内网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. abp大文件附件功能视频教程

    视频分享地址:https://share.weiyun.com/5wtofib

  2. Java之Hashmap中value为null,则返回json数据中key不存在

    前两天干活儿的时候,将实例对象放在Hashmap中返回给前端: ArtificialEntity artificialEntity = artificialService.getInfoById(id ...

  3. 对Python中一些“坑”的总结及技巧

    一.赋值即定义 1.运行以下代码会出现报错 #!/usr/bin/env python #_*_conding:utf-8_*_ x = 100 def outer(): def inner(): x ...

  4. java后台树形结构展示---懒加载

    一.数据库设计 二.实体类:entity import com.joyoung.cloud.security.common.validatedGroup.Add;import com.joyoung. ...

  5. Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  6. kotlin之变量与常量

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/217 kotlin之变量与常量 最近开始做新产品,于是乎用 ...

  7. Python 基础语法-str

    字符串常见操作 find:检测str是否包含在 mystr 中,如果是返回开始的索引值,否则返回 -1 mystr.index(str, start=0, end=len(mystr)) count: ...

  8. Troubleshooting: High Version Count Issues

    --查询版本高的原因 select * from v$sql_shared_cursor where sql_id=''; Configuring Download the script in the ...

  9. WCF、WebAPI、WCFREST、WebService的区别

    目录导航: 1. WCF 2. WebAPI 3. WebService 4. WCFREST 5. 如何选择WCF.WebAPI.WCFREST.WebService 1.WCF 这个是基于SOAP ...

  10. 12c Data guard Switchover Best Practices using SQLPLUS (Doc ID 1578787.1)

    12c Data guard Switchover Best Practices using SQLPLUS (Doc ID 1578787.1) APPLIES TO: Oracle Databas ...