Linux+jenkins+gradle配置Android自动编译环境

安装Android环境请自行百度

安装Jenkins

官网地址: http://jenkins-ci.org/

根据不同的Linux系统可以在官网找到对应的安装。

如:我的系统是Centos使用

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
yum install jenkins

安装完成后默认访问 http://localhost:8080/ , 可进入jenkins配置页面。

安装Jenkins相关插件

点击系统管理>管理插件>可选插件,可搜索以下插件安装

git插件(GIT plugin)

ssh插件(SSH Credentials Plugin)

Gradle插件(Gradle plugin)

也可以在配置选择安装插件的时候都装上

Repositories -> https://git地址 , 如果是ssh还要配置Credentials。

Branch -> */master,选定一个要编译的分支代码。

如下:

git01

如果是私有的仓库(比如git://xxxxx.git),点击Credentials – Add,弹出对话框,配置sshkey最简单了:

git02

配置自动拉取最新代码

在构建触发器中,有两种自动拉取代码并编译的策略:

  1. 设置Poll SCM,设置定时器,定时检查代码更新,有更新则编译,否则不编译(我暂时用的是这个)。
    git03
  2. 也可以设置Build periodically,周期性的执行编译任务。git04

关于定时器的格式,可以点击后面的问号有详细的说明

如果安装gradle插件成功的话,应该会出现下图的Invoke Gradle script,配置一下:

git05

我的配置是打包Beta渠道的包,所有渠道的为assembleRelease

当然你也可以使用gradle命令编译,使用上面的Invoke Gradle

git06

这种方式需要先在 系统管理=>Global Tool Configuration中设置Gradle的目录

这样,就能自动在project下的app的build/outputs/apk下生成相应的apk.

不过为了之后对APK包的操作最好把apk直接打包到一个特定的文件夹

我的做法是在local.properties中配置一个apk.dir,然后在build.gradle中读取(另:一般local.properties不会上传到git上,需要自己创建一个配置好sdk.dir)

然后在app的build.gradle中

android.applicationVariants.all { variant ->

variant.outputs.get(0).processManifest.doLast {

}

} 中设置输出目录

def apkFileName = "hello_v${android.defaultConfig.versionName}_${channel}.apk";
// gt apkDir and is run redex
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def apkDir = properties.getProperty('apk.dir')

if(apkDir != null && !apkDir.equals("")) {
   outPutDir = "${apkDir}/${android.defaultConfig.versionName}/";
} else {
   outPutDir = "${project.buildDir}/outputs/apk/";
}
variant.outputs.get(0).outputFile = file(outPutDir + apkFileName);

这样就可以直接输出到指定的文件夹中。

编译过程中的坑:

由于是使用命令直接安装的jenkins,安装完成后直接创建了jenkins帐号,这个帐号由于没有权限,会导致执行命令或删除创建文件都失败。

解决办法:

1、修改jenkins执行用户

vi /etc/sysconfig/jenkins

修改JENKINS_USER值:

## Type:        string
## Default:     "jenkins"
## ServiceRestart: jenkins
#
# Unix user account that runs the Jenkins daemon
# Be careful when you change this, as you need to update
# permissions of $JENKINS_HOME and /var/log/jenkins.
#
JENKINS_USER="root"

这里我们把JENKINS_USER值改为root用户。

注意:这里不一定就要修改为root用户,可以根据实际情况分配一个可执行相应命令的用户即可。

2、修改目录的相应权限:

sudo chown -R root /var/log/jenkins 
sudo chgrp -R root /var/log/jenkins

sudo chown -R root /var/lib/jenkins  
sudo chgrp -R root /var/lib/jenkins

sudo chown -R root /var/cache/jenkins 
sudo chgrp -R root /var/cache/jenkins

修改完成后,当我们再次构建项目时就会发现相应命令被执行了。

将打包的APK上传到SVN

首先Linux安装SVN  yum install svn

本来想使用SVN Publisher插件,发现没有办法成功,也许是因为我们的SVN没有帐号密码的原因,就换了中方式,使用Execute shell 插件直接执行命令上传。

首先在上面想要放置APK包的文件夹中使用 SVN co svn://地址 checkout一下

比如:我想把apk包输出到/var/lib/jenkins/android下面的/Package/Beta就在SVN上创建/Package/Beta目录,然后在/var/lib/jenkins/android中使用svn co svn://地址/Package/Beta 去 checkout下文件夹来,然后在local.properties中apk.dir=/var/lib/jenkins/android/Package/Beta

在下面增加构建步骤(一定要在gradle下面)

git07

这样就可以在编译完成后检查如果有新的东西去上传到SVN。

 

 

配置邮件通知

众所周知,Jenkins默认提供了一个邮件通知,能在构建失败、构建不稳定等状态后发送邮件。但是它本身有很多局限性,比如它的邮件通知无法提供详细的邮件内容、无法定义发送邮件的格式、无法定义灵活的邮件接收配置等等。在这样的情况下,我们找到了Jenkins Email Extension Plugin。该插件能允许你自定义邮件通知的方方面面,比如在发送邮件时你可以自定义发送给谁,发送具体什么内容等等。

它主要包含两个部分:全局配置和项目配置。

全局配置

当然,在一个项目中应用email-ext插件之前,您必须做一些全局的配置。现在先跳转到Jenkins的“系统设置”页面,如下图:

mail01

找到标题为“Extended E-mail Notification”的片段,你就能配置一些全局的email-ext属性。这些属性必须匹配你SMTP邮件服务器的设置。这一节不仅能配置成Jenkins原有邮件通知的镜像(虽然有很多配置是一样的,但这是个不同的扩展点),而且还增加了一些额外的功能。输入框中名为 Default Subject 和 Default Content 的项允许你在全局级别配置邮件的内容。这样做的话,可以使您为所有的项目按您的需求做更好的、更简单的配置。如下图。

mail02

释放个我的配置:

Default Subject:构建通知:$PROJECT_NAME – Build # $BUILD_NUMBER – $BUILD_STATUS!

Default Content:

<hr/>

(本邮件是程序自动下发的,请勿回复!)<br/><hr/>

项目名称:$PROJECT_NAME<br/><hr/>

构建编号:$BUILD_NUMBER<br/><hr/>

svn版本号:${SVN_REVISION}<br/><hr/>

构建状态:$BUILD_STATUS<br/><hr/>

触发原因:${CAUSE}<br/><hr/>

构建日志地址:<a href=”${BUILD_URL}console”>${BUILD_URL}console</a><br/><hr/>

构建地址:<a href=”$BUILD_URL”>$BUILD_URL</a><br/><hr/>

变更集:${JELLY_SCRIPT,template=”html”}<br/><hr/>

下面解释一下常用的属性。

1. Override Global Settings:如果不选,该插件将使用默认的E-mail Notification通知选项。反之,您可以通过指定不同于( 默认选项)的设置来进行覆盖。

2. Default Content Type:指定构建后发送邮件内容的类型,有Text和HTML两种.

3. Use List-ID Email Header:为所有的邮件设置一个List-ID的邮件信头,这样你就可以在邮件客户端使用过滤。它也能阻止邮件发件人大部分的自动回复(诸如离开办公室、休假等等)。你可以使用你习惯的任何名称或者ID号,但是他们必须符合如下其中一种格式(真实的ID必须要包含在<和>标记里):
<ci-notifications.company.org>
Build Notifications <ci-notifications.company.org>
“Build Notifications” <ci-notifications.company.org>
关于更详细的List-ID说明请参阅RFC-2919.

4. Add ‘Precedence: bulk’ Email Header:设置优先级,更详细说明请参阅RFC-3834.

5. Default Recipients:自定义默认电子邮件收件人列表。如果没有被项目配置覆盖,该插件会使用这个列表。您可以在项目配置使用$ DEFAULT_RECIPIENTS参数包括此默认列表,以及添加新的地址在项目级别。添加抄送:cc:电子邮件地址例如,CC:someone@somewhere.com

6. Reply To List:回复列表, A comma separated list of e-mail addresses to use in the Reply-To header of the email. This value will be available as $DEFAULT_REPLYTO in the project configuration.

7. Emergency reroute:如果这个字段不为空,所有的电子邮件将被单独发送到该地址(或地址列表)。

8. Excluded Committers:防止邮件被邮件系统认为是垃圾邮件,邮件列表应该没有扩展的账户名(如:@domain.com),并且使用逗号分隔

9. Default Subject:自定义邮件通知的默认主题名称。该选项能在邮件的主题字段中替换一些参数,这样你就可以在构建中包含指定的输出信息。

10. Maximum Attachment Size:邮件最大附件大小。

11. Default Content:自定义邮件通知的默认内容主体。该选项能在邮件的内容中替换一些参数,这样你就可以在构建中包含指定的输出信息。

12. Default Pre-send Script:默认发送前执行的脚本(注:grooy脚本,这是我在某篇文章上看到的,不一定准确)。

13. Enable Debug Mode:启用插件的调试模式。这将增加额外的日志输出,构建日志以及Jenkins的日志。在调试时是有用的,但不能用于生产。

14. Enable Security:启用时,会禁用发送脚本的能力,直接进入Jenkins实例。如果用户试图访问Jenkins管理对象实例,将抛出一个安全异常。

15. Content Token Reference:邮件中可以使用的变量,所有的变量都是可选的。

email-ext插件允许使用变量来动态插入数据到邮件的主题和内容主体中。变量是一个以$(美元符号)开始,并以空格结束的字符串。当一个邮件触发时,主题和内容主体字段的所有变量都会通过真实的值动态地替换。同样,变量中的“值”能包含其它的变量,都将被替换成真实的内容。

比如,项目配置页的默认主题和内容分别对应的是全局配置页面的DEFAULT_SUBJECT和DEFAULT_CONTENT,因此它会自动地使用全局的配置。同理,触发器中的Subject和Content分别对应的是项目配置页面的DEFAULT_SUBJECT和DEFAULT_CONTENT,所以它也会自动地使用项目的配置。由于变量中的“值”能包含其它的变量,所以就能为变量快速地创建不同的切入点:全局级别(所有项目),专属级别(单一项目),触发器级别(构建结果)。

如果你要查看所有可用的变量,你可以点击配置页的Content Token Reference的问号获取详细的信息。

所有的变量都是可选的,每个变量可以如下表示,字符串类型使用name=“value”,而布尔型和数字型使用name=value。如果{和}标记里面没有变量,则不会被解析。示例:$TOKEN,${TOKEN},${TOKEN,count=100},${ENV,var=”PATH”}

提示:用英文逗号分隔变量的参数。

下面我解释一下常用的属性。

  •  ${FILE,path=”PATH”} 包括指定文件(路径)的含量相对于工作空间根目录。
    • path文件路径,注意:是工作区目录的相对路径。
  •  ${BUILD_NUMBER} 显示当前构建的编号。
  •  ${JOB_DESCRIPTION} 显示项目描述。
  •  ${SVN_REVISION} 显示svn版本号。还支持Subversion插件出口的SVN_REVISION_n版本。
  •  ${CAUSE} 显示谁、通过什么渠道触发这次构建。
  •  ${CHANGES } -显示上一次构建之后的变化。
    • showPaths 如果为 true,显示提交修改后的地址。默认false。
    • showDependencies 如果为true,显示项目构建依赖。默认为false
    • format 遍历提交信息,一个包含%X的字符串,其中%a表示作者,%d表示日期,%m表示消息,%p表示路径,%r表示版本。注意,并不是所有的版本系统都支持%d和%r。如果指定showPaths将被忽略。默认“[%a] %m\\n”。
    • pathFormat 一个包含“%p”的字符串,用来标示怎么打印路径。
  •  ${BUILD_ID}显示当前构建生成的ID。
  •  ${PROJECT_NAME} 显示项目的全名。(见AbstractProject.getFullDisplayName)
  •  ${PROJECT_DISPLAY_NAME} 显示项目的显示名称。(见AbstractProject.getDisplayName)
  •  ${SCRIPT} 从一个脚本生成自定义消息内容。自定义脚本应该放在”$JENKINS_HOME/email-templates”。当使用自定义脚本时会默认搜索$JENKINS_HOME/email-templatesdirectory目录。其他的目录将不会被搜索。
    •  script 当其使用的时候,仅仅只有最后一个值会被脚本使用(不能同时使用script和template)。
    •  template常规的simpletemplateengine格式模板。
  •  ${JENKINS_URL} 显示Jenkins服务器的url地址(你可以再系统配置页更改)。
  •  ${BUILD_LOG_MULTILINE_REGEX}按正则表达式匹配并显示构建日志。
    •  regex java.util.regex.Pattern 生成正则表达式匹配的构建日志。无默认值,可为空。
    •  maxMatches 匹配的最大数量。如果为0,将匹配所有。默认为0。
    •  showTruncatedLines 如果为true,包含[…truncated ### lines…]行。默认为true。
    •  substText 如果非空,就把这部分文字(而不是整行)插入该邮件。默认为空。
    • escapeHtml 如果为true,格式化HTML。默认为false。
    •  matchedSegmentHtmlStyle 如果非空,输出HTML。匹配的行数将变为<b style=”your-style-value”> html escaped matched line </b>格式。默认为空。
  •  ${BUILD_LOG} 显示最终构建日志。
    •  maxLines 日志最多显示的行数,默认250行。
    •  escapeHtml 如果为true,格式化HTML。默认false。
  •  ${PROJECT_URL} 显示项目的URL地址。
  •  ${BUILD_STATUS} -显示当前构建的状态(失败、成功等等)
  •  ${BUILD_URL} -显示当前构建的URL地址。
  •  ${CHANGES_SINCE_LAST_SUCCESS} -显示上一次成功构建之后的变化。
    •  reverse在顶部标示新近的构建。默认false。
    •  format遍历构建信息,一个包含%X的字符串,其中%c为所有的改变,%n为构建编号。默认”Changes for Build #%n\n%c\n”。
    •  showPaths,changesFormat,pathFormat分别定义如${CHANGES}的showPaths、format和pathFormat参数。
  •  ${CHANGES_SINCE_LAST_UNSTABLE} -显示显示上一次不稳固或者成功的构建之后的变化。
    • reverse在顶部标示新近的构建。默认false。
    •  format遍历构建信息,一个包含%X的字符串,其中%c为所有的改变,%n为构建编号。默认”Changes for Build #%n\n%c\n”。
    •  showPaths,changesFormat,pathFormat分别定义如${CHANGES}的showPaths、format和pathFormat参数。
  •  ${ENV} –显示一个环境变量。
    •  var– 显示该环境变量的名称。如果为空,显示所有,默认为空。
  •  ${FAILED_TESTS} -如果有失败的测试,显示这些失败的单元测试信息。
  •  ${JENKINS_URL} -显示Jenkins服务器的地址。(你能在“系统配置”页改变它)。
  •  ${HUDSON_URL} -不推荐,请使用$JENKINS_URL
  •  ${PROJECT_URL} -显示项目的URL。
  •  ${SVN_REVISION} -显示SVN的版本号。
  •  ${JELLY_SCRIPT} -从一个Jelly脚本模板中自定义消息内容。有两种模板可供配置:HTML和TEXT。你可以在$JENKINS_HOME/email-templates下自定义替换它。当使用自动义模板时,”template”参数的名称不包含“.jelly”。
    •  template模板名称,默认”html”。
  •  ${TEST_COUNTS} -显示测试的数量。
    • var– 默认“total”。
      • total -所有测试的数量。
      •  fail -失败测试的数量。
      •  skip -跳过测试的数量。

项目配置

要想在一个项目中使用email-ext插件,你首先必须在项目配置页激活它。在构建后操作——”Add Post-build Actions”选项中勾选”Editable Email Notification”标签。

mail03

当插件激活后你就能编辑如下字段(只列出常用的字段):

  •  Project Recipient List:这是一个以逗号(或者空格)分隔的收件人邮件的邮箱地址列表。允许您为每封邮件指定单独的列表。Ps:如果你想在默认收件人的基础上添加收件人:$DEFAULT_RECIPIENTS,<新的收件人>
  •  Default Subject:允许你配置此项目邮件的主题。
  •  Default Content:跟Default Subject的作用一样,但是是替换邮件内容。
  •  Attach Build Log:附件构建日志。
    •  Compress Build Log before sending:发送前压缩生成日志(zip格式)。

要查看插件的高级配置,请点击”高级”按钮。该选项允许您各种类型的邮件触发器指定接收者。默认情况下,是没有配置的触发器,所以默认情况下不会发送邮件。要增加更多的触发器,选择“Add a Trigger”旁边下拉列表中的类型,它会增加到控件上面的列表中。一旦你增加了一个触发器,你就可以对它做一些选择。如果你点击一个触发器旁边的”?”号,它将告诉你在什么条件下会触发邮件发送。如下图。

mail04

  •  Send to Recipient List:如果勾选,邮件将发送到”Project Recipient List”中的所有邮件地址。
  •  Send to Committers:该邮件会发给上次构建时检查过代码的人员,该插件会基于提交者的ID和追加Jenkins配置页面的(default email suffix)默认邮件后缀来生成一个邮件地址。譬如,上次提交代码的人是”first.last”, 默认的电子邮件后缀为“@somewhere.com”,那么电子邮件将被发送到“first.last@ somewhere.com”。
  •  Send To Requester:如果勾选,邮件将发送给构建触发者。
  •  Include Culprits:如果勾选,而且 “Send To Committers”勾选,邮件将包含最后成功构建的提交者。
  •  More Configuration:通过单击”+(expand)”链接您能为每个邮件触发器作更多单独的设置。
    • Recipient List:这是一个以逗号(或者空格)分隔的可接受邮件的邮箱地址列表。如果触发就发送邮件到该列表。该列表会追加在”Global Recipient List”里。
    • Subject:指定选择邮件的主题。注意:高级选项中的邮件触发器类型可覆盖对它的配置。
    • Content:指定选择邮件的内容主体。注意:高级选项中的邮件触发器类型可覆盖对它的配置。
  •  Remove通过单击指定触发器当前行的”Delete”按钮,你可以删除该触发器。

注意:所有的触发器都只能配置一次。

  • Failure:即时发送构建失败的邮件。如果”Still Failing”触发器已配置,而上一次构建的状态是”Failure”,那么”Still Failing”触发器将发送一封邮件来替代(它)。
  • Unstable:即时发送构建不稳固的邮件。如果”Still Unstable”触发器已配置,而上一次构建的状态是”Unstable”,那么”Still Unstable”触发器将发送一封邮件来替代(它)。
  • Still Failing:如果两次或两次以上连续构建的状态为”Failure”,发送该邮件。
  • Success:如果构建的状态为”Successful”发送邮件。如果”Fixed”已配置,而上次构建的状态为“Failure”或“Unstable”,那么”Fixed”触发器将发送一封邮件来替代(它)。
  • Fixed:当构建状态从“Failure”或“Unstable”变为”Successful”时发送邮件。
  • Still Unstable:如果两次或两次以上连续构建的状态为” Unstable “,发送该邮件。
  • Before Build:当构建开始时发送邮件。

注意:这里只解释全局配置页面中缺少的变量。

  • ${DEFAULT_SUBJECT}:这是Jenkins系统配置页面默认配置的邮件主题
  • ${DEFAULT_CONTENT}:这是Jenkins系统配置页面默认配置的邮件内容主体
  • ${PROJECT_DEFAULT_SUBJECT}:这是项目的默认邮件主题。高级配置中使用该令牌的结果要优先于Default Subject字段。警告:不要在Default Subject 或者Default Content中使用该令牌,它会产生一个未知的结果。
  • ${PROJECT_DEFAULT_CONTENT}:这是项目的默认邮件内容主体。高级配置中使用该令牌的结果要优先于Default Content字段。警告:不要在Default Subject 或者Default Content中使用该令牌,它会产生一个未知的结果。

CentOS 安装 EPEL 第三方软件源

Extra Packages for Enterprise Linux (EPEL)是一个由特别兴趣小组创建、维护并管理的,针对 红帽企业版 Linux (RHEL)及其衍生发行版(比如 CentOS )的一个高质量附加软件包项目。

EPEL 的软件包通常不会与企业版 Linux 官方源中的软件包发生冲突,或者互相替换文件。 EPEL 与 Fedora 项目基本一致,包含完整的构建系统、升级管理器、镜像管理器等等。

EPEL 包含一个叫做 epel-release 的包,这个包包含了 EPEL 源的 gpg 密钥和软件源信息。您可以通过 yum 安装到您的企业版 Linux 发行版上。除了 epel-release 源,还有一个叫做 epel-testing 的源,这个源包含最新的测试软件包,其版本很新但是安装有风险,请自行斟酌。

通过 yum 命令安装源

yum install epel-release

RHEL 5.x / CentOS 5.x

$ rpm -Uvh http://download.fedoraproject.org/pub/epel/epel-release-latest-5.noarch.rpm

RHEL 6.x / CentOS 6.x

$ rpm -Uvh http://download.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

RHEL 7.x / CentOS 7.x

$ rpm -Uvh http://download.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

这样, 我们就可以非常方便的安装一些常用的软件, 比如Nginx, 即可以通过如下命令来安装, 而无需自行编译安装.

$ yum -y install nginx

解决WordPress重定向次数过多的问题

出现的302重定向的解决方法:

解决方法一:

修改wp-include下的/template-loader.php文件,修改起来并不复杂,缺点是内核文件改动,以后升级务必注意。官方没有给出解决办法,于是只好采用这个办法。

找到wp-include文件夹下的template-loader.php文件,使用//注释掉第六行和第七行。

if ( defined(‘WP_USE_THEMES’) && WP_USE_THEMES )

do_action(‘template_redirect’);

修改为:

//if ( defined(‘WP_USE_THEMES’) && WP_USE_THEMES )

//do_action(‘template_redirect’);

解决方法二:

通过给do_redirect赋值解决wordpress循环重定向

找到wp-include文件夹下的canonical.php文件,使用//注释掉第37行。另起一行加入下面代码。其实也就是把变量$do_redirect的值修改为false。

将canonical.php文件,第37行

function redirect_canonical( $requested_url = null, $do_redirect = true ) {

修改为:

//function redirect_canonical( $requested_url = null, $do_redirect = true ) {

增加:

function redirect_canonical( $requested_url = null,$do_redirect = false) {

修改后截图:

解决方法三:

插件办法,下载Permalink Fix & Disable Canonical Redirects Pack安装上就ok。

使用nginx搭建http代理服务器

公司残忍的把QQ封掉了,但作为程序猿怎么能罢休呢,正好有个vps,就用它搭建一个http代理服务器吧^^

其实很简单,只要简单配置即可

    server {
        listen 8080;
        resolver 8.8.8.8;
        location /{
            proxy_pass http://$http_host$request_uri;
            #allow 127.0.0.1;
            #deny all;
        }
    }

注意:必须加上resolver 8.8.8.8;给nginx指定dns,否则会报告“nginx 502 bad gateway”错误,也可以通过allow和deny来设置只有指定IP能够访问,修改后重启nginx,在QQ登陆的时候设置代理服务器类型是HTTP,端口8080即可登陆^^

Android开发必看知识,不看后悔

打包为大家奉上最实用最给力的资源,不看你绝对后悔。


最强大的UI特效


奇艺高清UI界面源代码
搜索关键字飞入飞出效果
水波纹效果,附工程源码【效果很好很逼真】
特效!超牛X~Launcher特效
仿360一键优化动画效果
功能强大的拼图人生源码


最火爆的精品实例&实用技巧


精品收藏汇总
Android游戏索引帖】各种游戏源码
eoeAndroid索引帖】各种高仿主流APP汇总
【eoeandroid索引帖】Android面试题&面试技巧索引帖


爱学习,Android大百科
http://android.eoe.cn/topic


http://android.eoe.cn/topic/device

http://android.eoe.cn/topic/location

http://android.eoe.cn/topic/debug

http://android.eoe.cn/topic/graphics

http://android.eoe.cn/topic/media