Android Jenkins+Sonarqube搭建持续集成环境

准备工作

1.安装Ubuntu系统
2.安装Android Studio、SDK
3.安装Jenkins CI
4.Sonarqube

安装Android Studio

1.下载Android Studio Linux版本
2.解压压缩包
3.运行解压之后的bin文件夹中bin/.studio.sh
比如:压缩包解压到android_studio文件中,那么进入android_stuido/bin目录,运行./studio.sh命令,会在图形界面中启动AndroidStudio然后按照引导创建一个project这样AS会下载gradle.
4.如果要给AS创建快捷方式,按照步骤3启动AS之后点击菜单tools-Create Desktop Entity就可以创建快捷方式

安装Jenkins

一.安装JDK

  • 下载JDK:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  • 解压下载的压缩包:tar zxvf jdk-8u211-linux-i586.tar.gz

  • 配置环境变量 sudo vim /etc/bash.bashrc 添加如下内容:

    export JAVA_HOME=/home/mi/java/jdk1.8.0_231
    export JRE_HOME=${JAVA_HOME}/jre
    export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
    export PATH=$PATH:${JAVA_PATH}
    
    其中JAVA_HOME为jdk解压路径
    
  • 查看环境变量: java -version

二.下载Jenkins

  • 1.编辑 sources.list: sudo vim /etc/apt/sources.list,添加以下代码:

    #Jenkin Stabledeb https://pkg.jenkins.io/debian-stable binary/
    deb https://pkg.jenkins.io/debian-stable binary/
    
  • 2.运行

    wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
    
  • 3.然后安装

    sudo apt-get update
    sudo apt-get install jenkins
    
  • 4.在用户组中添加jenkins: sudo usermod -a -G 你的用户组 jenkins

  • 5.运行sudo service jenkins start启动jenkins,如果没有问题就会启动jenkins服务在浏览器中输入http://localhost:8080就可以访问jenkins服务

  • 6.如果启动失败大概率是没有找到JDK的原因,编辑jenkins文件: sudo vim /etc/init.d/jenkins 在PATH=/bin:/usr/bin:/sbin:/usr/sbin后面加上JDK路径即可(别忘了':')

  • 7.访问http://localhost:8080如果出现的是please wait while jenkins is getting ready to work那么需要更改 /var/lib/jenkins/hudson.model.UpdateCenter.xml文件,将其中的url改为http://mirror.xmission.com/jenkins/updates/update-center.json然后重启服务即可(sudo /etc/init.d/jenkins restart )

  • 8.进入http://localhost:8080后页面会有预警信息,按照引导输入密码(页面会有提示密码位置一般在/var/lib/jenkins/initialAdminPassword文件中)进行下一步安装插件

  • 9.步骤8操作之后会进入到安装插件页面,我可可以自己选择安装所需要的插件

    • JUnit插件
    • JaCoCo插件
    • EnvInject插件
    • GitHub、Git、Gitlab
  • 10.安装完插件创建管理员账户(没有安装完后面可以继续安装)

  • 11.配置环境变量进入http://localhost:8080/configure点击Manage Jenkins然后点击Configure System找到环境变量进行配置(Global Properties - Environment variables),添加JAVA_HOME和ANDROID_HOME环境变量

  • 12.安装插件 Manage Jenkins - Manage Plugins

三.创建Jenkins任务

说明:这里以Gitlab作为代码仓库,因此需要安装Gitlab和Gitlab Authentication插件并在jenkins上配置gitlab信息

准备1->配置Gitlab Access token:
  1. 登录gitlab
  2. 个人头像-settings-左侧工具栏Access token
  3. 输入Name(随便取),Expries at(过期时间),勾选api
  4. 点击“Create personal access token”,生成access token记录下来. access token在页面顶部Your New Personal Access Token下

准备2->配置gitlab:
  1. http://localhost:8080/configure - Manage Jenkins
  2. 找到Gitlab选项添加以下信息:
    - Connection name: 随便填
    - Gitlab host URL: gitlab 地址
    - Credentials: 选择Gitlab API token(jenkins)
    - 利用准备1中的token创建认证凭据
下面开始正式创建一个Jenkins任务

点击NewItem,输入项目名称(最好不要包含空格),选择Freestyle project,点击OK

jenkins_create_task_step1

配置Git ssh key,因为Jenkins在杆状的时候会默认创建一个jenkins用户且jenkins在clone git上面代码的时候以jenkins用户进行,所以我们在生成ssh key的时候必须在jenkins用户下创建。(巨坑,最开始没有意识到这个问题,导致编译拉取代码的时候总是提示没有权限):

git config --global user.name "xxx"
git config --global user.name "xxx@xxx.com"
ssh-keygen -t rsa -C "xxx@xxx.com"

配置任务属性,进入到项目configure

  • General: 上面已经配置Gitlab,所以GitHub选项下会多出GitLab Connection 且已经自动填充之前配置的gitlab

  • Source Code Management: 我们已经给jenkins用户创建了ssh key,所以我们利用下面shell脚本的方式拉取代码,这里不用填

  • Build Triggers: 用于指定定时任务远程任务等等

  • Build Enviroment:

    • Abort the Build it's stuck: 在下面填一个超时时间,超时就停止本次构建
  • Build:

    1. 添加Excute shell用于执行shell脚本(拉取代码)

      
      if [ -d "Test" ]; then
      rm -r Test
      fi
      
      git xxxxx/Test.git
      cd Test
      git checkout master
      
      解释:如果存在Test目录那么删除该目录,使用git命令从gitlab仓库上拉取Test代码,进入Test文件目录,检出master分支代码
      
      
    2. 添加Invoke Gradle script用于执行Gradlew打包任务

      • 勾选Use Gradlew Wrapper

      • Wrapper location: Test(clone代码后的文件夹名称)

      • Root Build script: Jointly/app(主module文件路径)

      • Build File: build.gradle(gradle配置文件)

      jenkins_create_task_step1_build.png
  1. 添加Excute Python script用于执行python脚本
    说明:这里有个大坑,因为ubuntu系统自带安装的是python3,而jenkins还是以python2的方式在运行,所以执行下面的python脚本会报错。有两种解决办法:一是安装python2,二是通过添加软链的方式将python指向python3:打开命令行执行下命令 ln -s /usr/bin/python3 /user/bin/python

    
    #-*- coding: UTF-8 -*-
    
    import os
    import re
    import datetime
    
    print('execute python')
    
    current_path = os.getcwd()
    project_name = 'app'
    apk_dir ='{0}/Test/{1}/build/outputs/apk/release/'.format(current_path, project_name)
    apk_name = '{0}-release.apk'.format(project_name)
    
    nowTime = datetime.datetime.now().strftime('%Y.%m.%d-%H:%M:%S')
    apk_new_name = 'sharesave-{0}-release.apk'.format(nowTime)
    
    os.rename(apk_dir + apk_name, apk_dir + apk_new_name)
    
    #这里只是简单的把编译出来的apk以日期命名了下,实际上可以用python做更多的事
    
  2. 配置完以后就可以运行我们的项目了,在Jenkins首页点击我们刚刚创建的项目进入项目页面点击Build Now运行

配置Jenkins定时执行

1. 进入项目configure页面
2. 选择到Build Triggers选项
  * Trigger buidls remotely(e.g, from scripts): 远程触发(例如:脚本)
  * Build after other project are build:在其他项目构建之后构建
  * Build periodically: 定期构建
  * Build when a change is pushed to Gitlab...:将更改推送到Gitlab时进行构建
  * GitHub hook trigger for GITScm polling:Github钩子触发GITScm轮询
  * Poll SCM:轮询SCM即定时检查代码变更(根据SCM软件的版本号),如果有更新就checkout最新code然后构建
3. 本次我们设置一个定时构建,假设设置为2分钟构建一次,那么我们需要勾选上述的Build periodically选项,在下方的输入框内输入H/2 * * * * 即可.(输入框内的内容类似CRON语法,不清楚的点击输入框后面的?会有文档)
![jenkins_periodically_task_step3.png](https://upload-images.jianshu.io/upload_images/2005016-92341deb1c7e429e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

4. 本次我们创建一个每天8点执行的任务就需要输入:H 8 * * *

四.SonarQube

这部分我会讲讲如何安装、配置 SonarQube ,并配以使用 Docker 作为容器的 MySQL 数据库。SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净的代码、检测错误和学习最佳体验。它还可以跟踪代码覆盖、测试结果、功能需求等等。SonarQube 检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去。

安装Sonarqube

  • 下载Sonarqube: https://www.sonarqube.org/downloads/

  • 安装Sonarqube: https://docs.sonarqube.org/latest/setup/get-started-2-minutes/, 步骤:

    1. 解压下载的安装包

    2. 进入sonarqube/bin/[os]目录,运行sonar.sh(由于我是在Linux上安装sonarqube7.8,所以需要进入sonarqube-7.8/bin/linux-x86-64目录并且运行: ./sonar.sh console)

    3. 待服务启动后访问http:localhost:9000可以进入到sonarqube网页

    4. 安装汉化插件,进入sonarqube页面后 登录(用户名/密码:admin/admin)-Administration-Marketplace在plugins搜索框搜索chinese安装汉化插件(如果安装完成重启浏览器后还是显示英语那么把浏览器语言设置为中文就ok了)


      jenkins_install_sonarqube_step4.png
    5. 安装插件:CheckStyle,findbugs等等

    6. 创建规则(7.8已经带有很多默认规则供我们使用),质量配置->创建


      jenkins_install_sonarqube_step6.png
    7. 创建项目,项目->+


      jenkins_install_sonarqube_step7.png
    8. 生成token,点击已创建的项目,点击创建一个令牌下的创建按钮会生成一个token。记下这个token下一步配置Android Studio插件时需要使用


      jenkins_install_sonarqube_step8_1.png

      jenkins_install_sonarqube_step8_2.png

Android Studio配置Sonarqube

  1. 在Android Studio中安装SonarqubeLint插件:File->Settings->Plugins,然后搜索SonarqubeLint,然后安装


    jenkins_as_config_sonarqube_step1.png
  2. 然后配置sonarqube:File->Settings->Other Settings-> SonarLint General Settings,点击+号创建一个配置


    jenkins_as_config_sonarqube_step2.png
  3. 输入配置名称,选择右边连接本地server,输入本地sonarqube 服务地址然后下一步


    jenkins_as_config_sonarqube_step3.png
  4. 填入刚刚创建的项目中的token,如果token在认证的时候不成功可以在第3步的时候选择以用户名密码的方式认证然后填入用户名密码


    jenkins_as_condif_sonarqube_step4.png
  5. 在Android Studio中配置sonarqube任务

    • 在项目build.gradle中加入以下内容
    dependencies {
        classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.8'
    }
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    
    • 在module的build.gradle中添加下面的内容,task中就会多出sonarqube,右侧工具栏gradle->app->tasks->other->sonarqube
    apply plugin: "org.sonarqube"
    sonarqube {
        properties {
            //property "sonar.projectName", "MyProject"
            //property "sonar.projectKey", "com.example.myproject"
            property "sonar.host.url", "http://90.114.12.23:9000"
            //property "sonar.language", "java"
            //property "sonar.sources", "src/main/"
            //property "sonar.login", "username"
            //property "sonar.password", "password"
        }
    }
    
    
  6. 在jenkins->项目->config->build中添加sonarqube任务


    jenkins_as_config_sonarqube_step6.jpg
  7. 执行build,我们就可以在localhost:9000中我们创建的项目中去查看sonarqube的执行结果


    jenkins_as_config_sonarqube_step7.jpg
  8. 配置通过邮件发送编译结果

    • 进去sonarqube登录,然后点击右上角自己的图像进入我的账号然后点击提醒,把下面的提醒选项都勾选,然后在下面设置提醒搜索框里面搜索需要提醒的项目并勾选通知项:


      jenkins_as_config_sonarqube_step8_1.png
    • 以管理员方式进入sonarqube点击配置-通用配置往下拉,进入邮件配置,然后配置相应的项目,这里是用gmail来发送邮件实际上可以使用其他邮箱配置(smtp和端口会有所不同,可以去相应的邮箱中设置),配置完成了可以用下面的测试按钮来测试是否配置成功


      jenkins_as_config_sonarqube_step8_2.png

      jenkins_as_config_sonarqube_step8_3.png

设置Sonarqube host地址

  1. 默认情况下sonarqube是通过<localhost:9000>访问,那么sonarqube发出的邮件链接也是<localhost:9000>,如果接收人和sonarqube服务器在同一台主机上访问没有任何问题,如果接收人与sonarqube服务不在统一主机下则不行,所以需要更改sonarqube地址为本机ip:9000,这样只要都处于同一内网中就可以直接访问了

  2. sonarqube配置文件在/sonarqube/conf/sonar.properties文件中,而host的配置则是sonar.web.host,所以我们只需要更改/添加sonar.web.host=本地ip即可,这里我们可以写一个shell脚本自动获取本机ip,然后在sonarqube启动的时候自动执行该脚本

arg=`ifconfig enp0s31f6 |grep "inet" |grep -v 'inet6' |awk '{print $2}'`
echo change sonarqube host to $arg:9000
sed -i 's/^sonar.web.host=.*$/sonar.web.host='$arg'/g' /var/lib/jenkins/sonarqube/conf/sonar.properties

#脚本第一行获取本机ip(不同的机器系统可能有略有差别)
#第二行打印提示会更改sonarqube host
#第三行通过sed命令将sonar.properties中host动态替换
#由于sonarqube是通过sonar.sh运行,所以我们将上述代码保存为ip.sh然后在sonar.sh第一行加入./ip.sh即可

参考资料

  1. https://www.imooc.com/article/68635
  2. https://www.jianshu.com/p/826c80805bb2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270