1、環境 1. ubuntu14.04(64位) 2. jdk 1.7 3. ant 1.9 4. jenkins 1.606 5. tomcat 7.0.5 6. android sdk 7. gradle 8. nexus 9. sonarqubejava
2、安裝 1. JDK環境變量 vim ~/.bashrc export JAVA_HOME=/usr/local/lib/jvm/jdk1.7.0_60 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATHmysql
2. gradle環境變量 http://gradle.org/下載最新的包 vim ~/.bashrc export GRADLE_HOME=/usr/local/lib/gradle2.2 export PATH=$GRADLE_HOME/bin:$PATH 3. Jenkins環境變量 http://jenkins-ci.org/下載穩定版本 vim ~/.bashrc export JENKINS_HOME=/home/roy/jenkins_home export PATH=$JENKINS_HOME:$PATH 4. android sdk 環境變量 vim ~/.bashrc export ANDROID_HOME=/home/roy/soft/android-sdk export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH 5. Jenkins插件安裝 gradle plugin sonar plugin 6. 由於android sdk的文件都是在32位的庫裏編譯在,因此在64爲的操做系統上沒法找打對應的庫,須要安裝 sudo apt-get install lib32stdc++6 sudo apt-get install lib32z1 lib32z1-dev 7. nexus安裝配置 http://www.sonatype.org 下載最新的包 1. 解壓 2. 進入bin目錄執行./nexus start命令 3. http://localhost:8081/nexus 接口訪問用戶名和密碼是admin/admin123 8. sonarqube安裝 http://www.sonarqube.org 下載最新的包 1. 解壓 2. 安裝mysql數據庫 sudo apt-get install mysql-server 建立sonar數據庫和用戶 CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 'sonar' IDENTIFIED BY 'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar'; 2. 編輯配置文件conf/sonar.properties 修改mysql數據庫的配置和web端口及url的配置 sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance sonar.web.host=192.168.33.7 sonar.web.context= sonar.web.port=9000 3. sonar-runner配置conf/sonar-runner.properties sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8 sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.login=admin sonar.password=jstinno
3、 Jenkins配置android
4、工程配置 buildscript{ repositories{ mavenCentral(); }c++
dependencies{ classpath 'com.android.tools.build:gradle:0.14+' }git
tasks.withType(JavaCompile){ options.encoding = 'UTF-8' } }web
apply plugin:'android'sql
dependencies{ compile fileTree(dir: 'libs', include:"*.jar") }數據庫
android{ubuntu
applicationVariants.all { variant -> variant.outputs.each { output -> if(output.outputFile.name.indexOf('-debug.apk') > -1){ output.outputFile = new File( output.outputFile.parent, output.outputFile.name.replace(".apk", "mirror.apk")) } } }vim
signingConfigs{ myConfig{ storeFile file("/home/roy/jenkins_home/jobs/ApkKeyStore") storePassword "android" keyAlias "brilliance" keyPassword "android" } }
buildTypes{ release{ signingConfig signingConfigs.myConfig } }
compileSdkVersion 22 buildToolsVersion "22.0.1" enforceUniquePackageName=false
lintOptions{ abortOnError false }
sourceSets{ main{ manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } }
lintOptions{ abortOnError false } }
5、build.xml示例
6、apk自動安裝到手機中 1. 開啓手機開發者模式(經過單擊設置->關於手機->版本號, 連續單擊四次) 2. 在開發者選項中,開啓USB調試和USB調試受權 問題處理: 1. adb devices命令, 返回的結果是: List of devices attached ???????????? no permissions 由於adb server須要以root的權限啓動 在android-sdk/platform-tools目錄下,執行 $ ./adb kill-server $ sudo ./adb start-server 在手機上選擇Always allow from this computer? adb devices能夠看到了 安裝命令 gradle installRelease (gradle iR)
git clone git@192.168.33.6:jstinno/apps/CloudFile
git clone git@192.168.33.6:jstinno/apps/cloudclient git clone git@192.168.33.6:jstinno/apps/CommonUpgrade
gradle AndroidDependencies 檢查項目依賴關係 gradle clean uploadArchives 打包並上傳到maven倉庫 buildscript{ repositories{ mavenCentral(); }
dependencies{ classpath 'com.android.tools.build:gradle:0.14+' }
tasks.withType(JavaCompile){ options.encoding = 'UTF-8' } }
apply plugin: 'android-library' apply plugin: 'maven'
android{
signingConfigs{ myConfig{ storeFile file("/home/roy/jenkins_home/jobs/ApkKeyStore") storePassword "android" keyAlias "brilliance" keyPassword "android" } }
buildTypes{ release{ signingConfig signingConfigs.myConfig } }
compileSdkVersion 22 buildToolsVersion "22.0.1"
sourceSets{ main{ manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } }
lintOptions{ abortOnError false } }
dependencies{ compile fileTree(dir: 'libs', include:"*.jar") }
uploadArchives{ repositories.mavenDeployer{ name = 'mavenCentralReleaseDeployer' repository(url: "http://192.168.33.25:8081/nexus/content/repositories/releases"){ authentication(userName: 'admin', password: 'admin123') }
snapshotRepository(url: "http://192.168.33.25:8081/nexus/content/repositories/snapshots/"){ authentication(userName: 'admin', password: 'admin123') } pom.version = "1.0.0" pom.artifactId = "cloudclient" pom.groupId = "com.cloud" pom.name = "cloudclient" pom.packaging = "aar"
}
}
編譯jar包上傳本地maven倉庫 buildscript{ repositories{ mavenCentral(); }
dependencies{ classpath 'com.android.tools.build:gradle:0.14+' }
tasks.withType(JavaCompile){ options.encoding = 'UTF-8' } }
apply plugin: 'android-library' apply plugin: 'maven'
dependencies{ compile fileTree(dir: 'libs', include:"*.jar") }
android{
signingConfigs{ myConfig{ storeFile file("/home/roy/jenkins_home/jobs/ApkKeyStore") storePassword "android" keyAlias "brilliance" keyPassword "android" } }
buildTypes{ release{ signingConfig signingConfigs.myConfig } }
compileSdkVersion 22 buildToolsVersion "22.0.1"
sourceSets{ main{ manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } }
lintOptions{ abortOnError false }
android.libraryVariants.all { variant -> def name = variant.buildType.name if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) { return; // Skip debug builds. } def task = project.tasks.create "jar${name.capitalize()}", Jar task.dependsOn variant.javaCompile task.from variant.javaCompile.destinationDir artifacts.add('archives', task); }
uploadArchives{ repositories.mavenDeployer{ name = 'mavenCentralReleaseDeployer' repository(url: "http://192.168.33.25:8081/nexus/content/repositories/releases"){ authentication(userName: 'admin', password: 'admin123') }
snapshotRepository(url: "http://192.168.33.25:8081/nexus/content/repositories/snapshots/"){ authentication(userName: 'admin', password: 'admin123') } pom.version = "1.0.0" pom.artifactId = "cloudclient" pom.groupId = "com.cloud" pom.name = "cloudclient" pom.packaging = "jar" }
} }
依賴其餘apk的編譯並安裝 buildscript{ repositories{ mavenCentral() }
dependencies{ classpath 'com.android.tools.build:gradle:0.14+' }
tasks.withType(JavaCompile){ options.encoding = 'UTF-8' }
}
apply plugin:'android'
repositories{
maven{ url "http://192.168.33.25:8081/nexus/content/repositories/releases" } } dependencies{ compile fileTree(dir: 'libs', include:"*.jar") compile "com.common:upgrade:1.0.0" compile "com.cloud:cloudclient:1.0.0" }
android{
applicationVariants.all { variant -> variant.outputs.each { output -> String apk_name = output.outputFile.name; if(output.outputFile.name.indexOf('-debug.apk') > -1){ output.outputFile = new File( output.outputFile.parent, output.outputFile.name.replace(".apk", "mirror.apk")) }else if(output.outputFile.name.indexOf('-release.apk') > -1){ output.outputFile = new File( output.outputFile.parent, output.outputFile.name.replace(apk_name, "CloudFile-release.apk")) } } }
signingConfigs{ myConfig{ storeFile file("/home/roy/jenkins_home/jobs/ApkKeyStore") storePassword "android" keyAlias "brilliance" keyPassword "android" } }
buildTypes{ release{ signingConfig signingConfigs.myConfig } }
compileSdkVersion 22 buildToolsVersion "22.0.1" enforceUniquePackageName=false
lintOptions{ abortOnError false }
sourceSets{ main{ manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } }
lintOptions{ abortOnError false }
}