使用阿里云服务器搭建Android自动构建平台Jenkins

  欢迎转载,但是不要忘记写明出处哟~
  
  阿里云服务器推出了一个15天试用计划,以前从来没玩过云服务器这么先进的东西,于是申请了一个玩玩,之前在树莓派上有搭过一次CI的平台,结果因为Android SDK没有ARM版的,最终无奈终止了尝试。现在正好在云服务器上搭一个玩玩。
  万事开头难,搭建和配置环境大概是最麻烦最容易出各种稀奇古怪的问题的时候了。

注意:如果是按照我的方案来搭建平台的童鞋,强烈建议你看完整篇文章再搭建,因为我是按我试水的过程来写的,里面有很多我遇到的坑,看完文章很多坑你就不用再去跳了。

一、Subversion

为了保证仓库资源最新,先更新一下

sudo apt-get update
sudo apt-get upgrade

然后下载Subversion和Apache2服务器

sudo apt-get subversion apache2 libapache2-svn

随便找个地儿来创建一个svn的版本库

sudo mkdir /var/svn
sudo svnadmin create /var/svn/repos

创建并导入一个测试项目

sudo mkdir /opt/MyTest
sudo mkdir /opt/MyTest/branches
sudo mkdir /opt/MyTest/tags
sudo mkdir /opt/MyTest/trunk

导入到版本库:

sudo svn import /opt/MyTest file:///var/svn/repos/MyTest -m “Initial Import”

配置svn的web访问方式:

sudo vim /etc/apache2/mods_enabled/dav_svn.conf

添加如下内容:

<Location /svn>
    DAV svn
    SVNPath /var/svn/repos

    AuthType Basic
    AuthName "Subversion Repository"
    AuthUserFile /etc/apache2/dav_svn.passwd

    <LimitExcept GET PROPFIND OPTIONS REPORT>
        Require valid-user
    </LimitExcept>
</Location>

保存之后,重启apache服务器:

/etc/init.d/apache2 restart

注意这个时候你有可能会遇到一个错误:

*Restarting web server apache2
apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName

解决这个问题很简单,就是要编辑一下/etc/apache2/httpd.conf文件,你或许会发现并没有这个文件呀,遇到这种情况没关系,那是因为现在所有的apache2的配置都被放到了apache2.conf文件里,你可以自己创建一个httpd.conf文件,然后在apache2.conf里面把它导入进去就可以了。

vim /etc/apache2/httpd.conf

添加如下内容:

ServerName 127.0.0.1:80

保存,然后将其导入apache2.conf:

vim /etc/apache2/apache2.conf

找到InClude ports.conf那一行,在后面添加如下内容:

Include httpd.conf

保存,重启apache服务器即可。

这个时候你访问http://<你的云服务器ip地址>/svn就可以访问到svn上的内容啦!

在Windows上使用TortoiseSVN测试一下:



Checkout成功!随便修改点什么,commit一下……咦?怎么出错了?别着急,这是因为你的apache2服务器使用的是www-data用户,而刚才我们那个仓库的目录是用root用户创建的,www-data属于其他用户,默认是没有写入权限的,所以修改仓库目录的所有者信息就可以了:

sudo chown –R www-data:www-data /var/svn/repo

在此commit,提交成功!
至此,svn的设置可以告一段落了。

二、Gradle

云服务器默认没有安装JDK,所以要先解决JDK的问题,这里我选用java 8。
本来是想从官网去下载的,但是官网的那个链接没办法直接wget。所以想到用apt-get来曲线救国。

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

漫长的等待后安装成功。
下面安装gradle

apt-get install gradle

装完运行一下试试,结果发现提示:

JAVA_HOME is set to an invalid directory: /usr/lib/jvm/default-java

这要重新设置JAVA_HOME呀,真是难办,并不知道它把jdk给安装到哪儿去了呀,早知道还是自己下载jdk的好,网上查,发现是安装在/usr/lib/jvm/java-8-oracle中,难怪之前找不到……


Stackoverflow上有人提供了方案

add a symbolic link

sudo ln -s /usr/lib/jvm/java-8-oracle /usr/lib/jvm/default-java

我觉得这个不错,不用改Gradle的配置文件。


终于成功,喜大普奔!

三、Tomcat和Jenkins

wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.28/bin/apache-tomcat-8.0.28.tar.gz
wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

把jenkins.war放到tomcat的webapps目录下,然后再在tomcat的bin目录中执行startup.sh脚本,启动tomcat。浏览器输入:

http://<服务器ip>:8080/jenkins/

成功进入Jenkins页面


设置一下Jenkins,包括安全策略和邮件服务器。还要安装Gradle Plugin。

①系统管理–>管理插件–>可选插件–>搜索“gradle”–>勾选gradle plugin–>点直接安装


②设置安全策略,按照下图配置就是了,用户名你可以自己起。


创建的用户是用来做管理员的,所以最好把所有的权限都选上。

③系统配置

主要是设置邮件通知:


设置电子邮件的时候,一定不要忘记设置这个,不然肯定会报错!

四、Android SDK

下载Android的SDK工具,然后下载Android SDK。

wget http://dl.google.com/android/android-sdk_r24.4-linux.tgz

进入Android SDK的目录

tools/android update sdk --no-ui

漫长的等待,而且我十分惊恐的发现,它竟然把所有的SDK Platform全部都要下载下来的意思,太可怕了,服务器硬盘一共才20G,它这是要我命啊,赶紧Ctrl+D强行断掉了下载,看看貌似也载好了我需要的那个SDK Platform了,应该没问题了吧?

安装好之后还要设置好ANDROID_HOME

五、创建一个测试项目

打开jenkins,新建项目,构建一个自由风格的项目
填上Subversion的项目地址
构建触发器选poll SCM 填上:

H/30 * * * *

意思是每三十分钟检查一次版本库更新。

构建选gradle script,配置如下:


clean build 是gradle执行时的参数。开始构建!出了问题!


Ubuntu官方源的Gradle太陈旧了。。。陈旧到不支持Android Studio的 jcenter方法,如果强行编译,会出现如下错误:

Could not find method jcenter() for arguments [] on repository container.

所以,起码到现在, 不要用$ sudo apt-get install gradle来安装 gradle,如果安装了,要用$ sudo apt-get remove gradle卸载掉。

我去,又一次被apt-get 给坑了。现在最好是使用Gradle 2,4的版本,别说我没提醒你,网上可不太好找下载地址,这里给你个,赶紧wget吧!

wget http://services.gradle.org/distributions/gradle-2.4-all.zip

可能会有些慢,毕竟100多M。但是总胜过你自己用scp传上去啊,100M光纤的同志目测可以无视,因为我是4M小水管。

什么?要别的版本?

http://services.gradle.org/distributions 这里自己找吧……支持最好的大概就是gradle 2.4了,也没必要盲目追求最新版哟~

经过漫长的等待(下载真的好慢),这次因为是自己下载的压缩包,不要忘记了设置环境变量。


这回2.4了总该编译过了吧?再试一次!


扯的吧?不应该啊!重启一下服务器试试!


又开始构建了,想在等待审判一样不安啊!现在应该是在jcenter下载需要的jar,要耐心等待。

这玩意在国外网站下东西真是慢慢慢慢慢啊,不等了,明儿个再说吧。到时候会发邮件给我,嘿~

==============我是华丽的分割线==================
10月18日,早上起来发现还是没能编译成功,原因是没有找到ANDROID_HOME,唉我去我明明制定了嘛不是。打开.bashrc发现没有加export命令。修改为:

ANDROID_HOME=/usr/software/android-sdk-linux
export ANDROID_HOME

保存,退出,执行:

source .bashrc

执行更改。
再次构建,仍然出错:

* What went wrong:
A problem occurred configuring project ':app'.
> failed to find Build Tools revision 23.0.0

这次很明显已经找到了ANDROID_HOME了,但是缺少了构建工具。看来是我之前强制停止了下载导致的。但是我不能一下子安装那么多东西啊,能不能只安装指定的组件呢?在stackoverflow上找相关的问题,发现了这样一条:

By default, the SDK Manager from the command line does not include the build tools in the list. They're in the "obsolete" category. To see all available downloads available, use
android list sdk --all
And then to get one of the packages in that list from the command line, use:
android update sdk -u -a -t <package no.>
Where -u stands for --no-ui, -a stands for --all and -t stands for --filter.
If you need to install multiple packages do:
android update sdk -u -a -t 1,2,3,4,..,n 
Where 1,2,..,n is the package number listed with the list command above

好吧,选择了对应版本的Build Tools之后又是漫长地等待,凡是dl-ssl.google.com的URL,都访问不了,大概买一个在美国的服务器会好很多吧。兴高采烈地看着Build Tools被载完,心里那个美啊,赶紧再次构建!又报错!

A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugCompile'.
   > Could not find com.android.support:appcompat-v7:23.0.0.
     Searched in the following locations:
         https://jcenter.bintray.com/com/android/support/appcompat-v7/23.0.0/appcompat-v7-23.0.0.pom
         https://jcenter.bintray.com/com/android/support/appcompat-v7/23.0.0/appcompat-v7-23.0.0.jar
     Required by:
         test:app:unspecified

这是没找到appcompat兼容包???好吧,又折腾了一遍,漫长等待,下载Android Support Library和Android Support Repository,为了防止意外,把Google Repository也载下来了。
构建,还是出错:

:app:mergeDebugResourcesjava.io.IOException: Cannot run program "/usr/software/android-sdk-linux/build-tools/23.0.0/aapt": error=2, No such file or directory

原因在于我的服务器是64位的Ubuntu,安装以下软件:

apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

再次编译:

:app:mergeDebugResourcesAAPT err(1030317179): /usr/software/android-sdk-linux/build-tools/23.0.0/aapt: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory

这个嘛,stackoverflow的大神给出了解决方案,原来是我之前安装的库文件还少了那么几个:

sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

再次构建,终于成功!!!终于成功!!!终于成功!!!

BUILD SUCCESSFUL

Total time: 1 mins 11.789 secs

This build could be faster, please consider using the Gradle Daemon: http://gradle.org/docs/2.4/userguide/gradle_daemon.html
Build step 'Invoke Gradle script' changed build result to SUCCESS
Sending e-mails to: wjc133@elt-group.com
Finished: SUCCESS

在工作空间中找到生成的apk包,安装到手机上

功夫不负有心人,希望大家没有像我一样遇到这么多坑。下一篇打算研究一下jenkins的配置,让e-mail通知更有价值。that’s over!