任務目標:將內網APK打包後最新下載連接、更新時間、更改日誌顯示在一個我本身製做的APP裏html
任務做用:咱們在內網測試時更新下載APK更加便捷,而且可以清楚目標APK的版本狀況,迴歸、驗證作到有的放矢android
實現原理:nginx
APK下載部分git
使用Jenkins打包APK後執行shell將最新打包的APK複製到Nginx配置的根目錄web
cp -f $APK_BUILD_HOME/passenger-smzcself-release.apk /usr/local/nginx/htmlshell
Nginx配置:app
/usr/local/nginx/conf/nginx.conf 添加一個9000端口的serveride
這樣在網頁上請求"http://192.168.3.151:9000/passenger-smzcself-release.apk"就能夠下載都更新後的最新APKsvn
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上一次打包更新到了什麼內容
切割腳本以下:
1 #!/bin/sh 2 function funAWK() 3 { 4 out=`awk '/./ {print}' $1` 5 out1=`echo $out | awk ' 6 { 7 alen=split($0,a,"committer"); 8 for(k=2;k<=alen;k++) 9 { 10 print a[k]; 11 } 12 }'` 13 echo "$out1" > 001.log 14 out2=`cat 001.log | while read line 15 do 16 echo ${line%%100*} 17 done` 18 echo "$out2" > 001.log 19 out3=`cat 001.log | while read line 20 do 21 echo ${line%%This reverts*} 22 done` 23 echo "$out3" > 001.log 24 out4=`cat 001.log | while read line 25 do 26 echo ${line%%Change-Id*} 27 done` 28 echo "$out4" > 001.log 29 sed -i "s/+0800/提交/g" 001.log 30 cat 001.log > $2 31 } 32 funAWK /var/lib/jenkins/jobs/Android_Passenger_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/passenger_log.html 33 funAWK /var/lib/jenkins/jobs/Android_Taxi_Driver_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/taxi_log.html 34 funAWK /var/lib/jenkins/jobs/Android_Driver_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/driver_log.html
最終集成
我將這幾個網頁集成在同一個網頁上一個網頁顯示下載連接另外兩個網頁做爲整個網頁的iframe顯示,建立一個APP工程,這個工程很是的簡單隻有一個webview控件,這個控件顯示了我製做了的那個網頁,更新APK信息後在APP端只用下拉刷新網頁就會顯示最新的更新信息
最終效果
安卓佈局代碼:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.smzc_apk_update"> 4 <uses-permission android:name="android.permission.INTERNET"></uses-permission> 5 <application 6 android:allowBackup="true" 7 android:icon="@mipmap/smzc" 8 android:label="神馬APK升級" 9 android:roundIcon="@mipmap/smzc" 10 android:supportsRtl="true" 11 android:usesCleartextTraffic="true" 12 android:theme="@style/AppTheme"> 13 <activity android:name=".MainActivity"> 14 <intent-filter> 15 <action android:name="android.intent.action.MAIN" /> 16 17 <category android:name="android.intent.category.LAUNCHER" /> 18 </intent-filter> 19 </activity> 20 21 </application> 22 </manifest>
操做代碼:
1 package com.example.smzc_apk_update; 2 3 import android.os.Handler; 4 import android.support.v4.widget.SwipeRefreshLayout; 5 import android.support.v7.app.AppCompatActivity; 6 import android.os.Bundle; 7 import android.webkit.WebView; 8 9 public class MainActivity extends AppCompatActivity { 10 private WebView webview; SwipeRefreshLayout swipeRefreshLayout; 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate( savedInstanceState ); 14 setContentView( R.layout.activity_main ); 15 webview = (WebView) findViewById( R.id.webView ); 16 webview.loadUrl( "http://192.168.3.151:9000/" ); 17 swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); 18 //重寫這個佈局的下拉功能 19 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 20 @Override 21 public void onRefresh() { 22 webview.clearCache( true); 23 //webview.reload(); 24 webview.loadUrl( "http://192.168.3.151:9000/" ); 25 new Handler().postDelayed(new Runnable() { 26 @Override 27 public void run() { 28 swipeRefreshLayout.setRefreshing(false); 29 } 30 }, 31 2000); 32 } 33 }); 34 } 35 }
結語
又到了你們喜聞樂見的血淚總結時間,本次任務耗時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