1. 程式人生 > >Android Gradle JenKins SVN 自動化打包

Android Gradle JenKins SVN 自動化打包

JenKins 是什麼?

理解:是一個整合各種外掛,通過配置、管理 的本地Web,去自動化打包Android、IOS的工具。

整體流程

外掛配置——————》系統設定 sdk HOME 和路徑  ,全域性設定JDK、GRADLE 、GIT 的本地路徑 交由JenKins 管理(即Jenkins通過上步安裝的外掛 配置好 就可以管理本地的gradle了)新建一個任務————》動態構造自定義本地引數寫入build。gradle ——————》配置git 或svn 路徑(下載原始碼到jenkins 好接管編譯)——————————》配置gradle 及task (編譯命令和編譯寫入構造好的引數)——》設定編譯的版本名稱————》構建專案 ——————控制檯看log  ——————》自定義的輸出apk路徑 找到打出的apk包

環境變數配置:其實就是將本地計算機的配置 在JenKins上面配置一遍,Jenkins 通過外掛就可以自己去管理了。原本studio 通過gradle 編譯的android 專案在jenkins上處理了。


本文截圖及原始碼下載連結如下:

http://download.csdn.net/detail/jxmy_1989/9756479


step.1
JDK JDK 7.0+ Gradle Gradle 中文網 安裝板或解壓版 對應目錄下的 gradle.xxx.zip 包


apache 的官網 http://tomcat.apache.org/

step.2

將 Jenkins.war

 放到 其解壓後的webapps的目錄下

step.3

解壓後的tomcat的bin目錄下 點選startup.bat 啟動tomcat (shutdown.bat 停止tomcat)

step.4

開啟本地瀏覽器

http://localhost:8080/jenkins/

然後註冊使用者名稱密碼。

這時候會出現  一個資料夾路徑  拷貝到C盤 開啟此資料夾 ,會出現數字密碼。將其複製到 下面密碼框即可。

step.5 外掛配置


進入系統管理--》外掛管理介面 可選外掛 安裝如下外掛,這些外掛之後會用到。 點選下載後在安裝。下載成功後。關閉tomcat 在開啟。在訪問genkins 同上面step3 和step4. 在次進入 已安裝即可檢視到。

1.Branch API Plugin
2.build timeout plugin
3.build-name-setter
4.Credentials Binding Plugin
5.description setter plugin
6.Dynamic Parameter Plug-in
7.Environment Injector Plugin

13.Pipeline: Basic Steps
14.Pipeline: Build Step
15.Pipeline: Input Step
16.Pipeline: Nodes and Processes
17.Pipeline: Stage Step
18.Scriptler
19.Workspace Cleanup Plugin
20.Post-Build Script Plug-in
21.Email Extension Plugin
22.SSH Slaves plugin
23.Timestamper 使用git安裝如下 9.Git plugin
10.GIT server Plugin
11.Gradle Plugin
12.Git Parameter Plug-In
如果你使用的SVN 還需要安裝
Subversion Plug-in
Subversion Release Manager plugin 
step.6 設定全域性屬性

點選environment variables 選項 配置 SDK

ANDROID_HOME

xx\sdk     -----SDK 具體路徑 (studio 引用的sdk絕對路徑)

step.7 設定重點屬性(理解就是在本地的名稱 和其絕對路徑)
JDK  、gradle、git 環境變數配置
JDK 模組: name:jdk_1.8   home :複製jdk 在本地資料夾的絕對路徑 xxx/jdk_1.8    gradle模組:
注:引用 android studio 安裝板或解壓版 對應目錄下的 gradle 即可 name:gradle-2.14.1   home:複製jdk 在本地資料夾的絕對路徑 xxx/gradle/gradle-2.14.1  
git模組也一樣  使用svn 此模組就預設就好。
step.8 新建任務
點選新建任務 輸入名稱 Jenkins-》新建-》構建一個自由風格的軟體專案-》 點選ok即可

step.9 配置專案
1. 自定義動態引數配置  這邊對應設定gradle.properties檔案 ,給build.gradle動態賦值 管理
  找到 引數化構建過程選項→打勾
  • 選項引數使用 Choice  理解為下拉框多選
  • 字元輸入引數使用 String Parameter 理解為一個字串引數
  • 時間引數使用 Dynamic Parameter 理解為一個計算的js指令碼
    在新增引數時,配置Name的值必須與.properties檔案中定義的引數名稱相同。




2. SVN 同步原始碼配置
原始碼管理:選擇具體的版本控制軟體,並填寫專案URL,如本人為svn,只需在Repository URL填具體專案svn地址,其它為預設。
會自動將svn程式碼下到jenkins 的workspace 目錄下 C:\Users\...\.jenkins\workspace


3. 設定專案名

進入專案配置找到→構建環境→勾選Set build Name 設定引數

注意和上面配置引數名一致 如我們使用了BUILD_NUMBER 自帶引數,以及 APPNAME、APP_VERSION、BUILD_TYPE 

${BUILD_NUMBER}${APP_VERSION}

4. gradle 配置

注意和上面配置引數一致

這邊對應設定gradle.properties檔案 ,給build.gradle動態賦值 管理

找到上面我們使用Gradle 外掛的 Invoke Gradle script
修改tasks命令,應用上面的引數,並勾選Pass job parameters as Gradle properties選項。

選擇 gradle 上面配置的名稱

task:clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE 

pass job parameters as gradle propertiers  checbox 打鉤

PRODUCT_FLAVORSBUILD_TYPE即我們上面配置的引數,務必保持一致。
點選儲存,回到專案首頁。
就可以看到,原先的立即構建已經變成了Build with Parameter
點選引數構建,就可以看到如下上面我們配置的引數。
等待構建完成,前往在.Gradle檔案中配置的路徑中即可找到我們配置的命名apk。

step.10 構建專案
立即構建 ----》Build with Parameter


step.11 控制檯檢視log
step.12 APK編譯到指定路徑
step.13 source 對應

gradle..properties檔案
APP_VERSION = 1.0.1
IS_JENKINS = false
BUILD_TYPE = debug
PRODUCT_FLAVORS = xiaomi
ALIAS_PASSWORD = android
STORE_PASSWORD = android
BUILD_PATH_JENKINS = E\:\\JenkinsApk
BUILD_PATH_LOCAL = D:\\AS_PROJECT\\TestJenkins
BUILD_TIME= 1970-1-1
APPNAME = JKApp
build.gradle 檔案
      apply plugin: 'com.android.application'

          def getDate() {
          def date = new Date()
          def formattedDate = date.format('yyyyMMddHHmm')
            return formattedDate
       }
        def verCode = 14
        android {
        //渠道Flavors
        productFlavors {
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE:    "wandoujia"]
        }
         }

        compileSdkVersion 23
         buildToolsVersion "25.0.0"
         signingConfigs {
        release {
            keyAlias 'androiddebugkey'
            keyPassword ALIAS_PASSWORD
            storeFile file('sinkkey.keystore')
            storePassword STORE_PASSWORD
            }
           }
            defaultConfig {
        applicationId "zsw.testjenkins"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode verCode
        versionName "1.0"
        versionName APP_VERSION
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
           }
          buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            signingConfig signingConfigs.release
        }
          }

//修改生成的apk名字及輸出資料夾
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            //新名字
            def newName
            //時間戳
            def timeNow
            //輸出資料夾
            def outDirectory
            //是否為Jenkins打包,輸出路徑不同
            if ("true".equals(IS_JENKINS)) {
                //BUILD_PATH為伺服器輸出路徑
                timeNow = BUILD_TIME
                outDirectory = BUILD_PATH_JENKINS
                //JKApp-v1.0.1-xiaomi-release.apk
                newName = APPNAME+"-v"+APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk'
            } else {
                //本機打包輸出在本機路徑
                timeNow = getDate()
                outDirectory = BUILD_PATH_LOCAL
                newName = APPNAME+"-v"+APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk'
            }
            output.outputFile = new File(outDirectory+"/"+timeNow, newName)
        }
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:23.0.0'
    testCompile 'junit:junit:4.12'
}
AndroidManifest.xml  檔案 <meta-data
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}" />
Application 檔案     @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        readMetaDataFromApplication();
    }
private void readMetaDataFromApplication() {

    try {
        ApplicationInfo appInfo = this.getPackageManager()
                .getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
Constants.UMENG_CHANNEL= appInfo.metaData.getString("UMENG_CHANNEL");
} catch (PackageManager.NameNotFoundException e) { e.printStackTrace();}
git 參考  http://www.jianshu.com/p/915c1ae69144 http://www.open-open.com/lib/view/open1482371829772.html