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
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
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_FLAVORS
和BUILD_TYPE
即我們上面配置的引數,務必保持一致。
點選儲存,回到專案首頁。
就可以看到,原先的立即構建已經變成了Build
with Parameter
點選引數構建,就可以看到如下上面我們配置的引數。
等待構建完成,前往在.Gradle檔案中配置的路徑中即可找到我們配置的命名apk。
step.10 構建專案
立即構建 ----》Build with Parameterstep.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-dataandroid: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