准备工作
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
配置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:
-
添加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分支代码
-
添加Invoke Gradle script用于执行Gradlew打包任务
勾选Use Gradlew Wrapper
Wrapper location: Test(clone代码后的文件夹名称)
Root Build script: Jointly/app(主module文件路径)
Build File: build.gradle(gradle配置文件)
-
-
添加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做更多的事
配置完以后就可以运行我们的项目了,在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/, 步骤:
解压下载的安装包
进入sonarqube/bin/[os]目录,运行sonar.sh(由于我是在Linux上安装sonarqube7.8,所以需要进入sonarqube-7.8/bin/linux-x86-64目录并且运行:
./sonar.sh console
)待服务启动后访问http:localhost:9000可以进入到sonarqube网页
-
安装汉化插件,进入sonarqube页面后 登录(用户名/密码:admin/admin)-Administration-Marketplace在plugins搜索框搜索chinese安装汉化插件(如果安装完成重启浏览器后还是显示英语那么把浏览器语言设置为中文就ok了)
安装插件:CheckStyle,findbugs等等
-
创建规则(7.8已经带有很多默认规则供我们使用),质量配置->创建
-
创建项目,项目->+
-
生成token,点击已创建的项目,点击创建一个令牌下的创建按钮会生成一个token。记下这个token下一步配置Android Studio插件时需要使用
Android Studio配置Sonarqube
-
在Android Studio中安装SonarqubeLint插件:File->Settings->Plugins,然后搜索SonarqubeLint,然后安装
-
然后配置sonarqube:File->Settings->Other Settings-> SonarLint General Settings,点击+号创建一个配置
-
输入配置名称,选择右边连接本地server,输入本地sonarqube 服务地址然后下一步
-
填入刚刚创建的项目中的token,如果token在认证的时候不成功可以在第3步的时候选择以用户名密码的方式认证然后填入用户名密码
-
在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" } }
-
在jenkins->项目->config->build中添加sonarqube任务
-
执行build,我们就可以在localhost:9000中我们创建的项目中去查看sonarqube的执行结果
-
配置通过邮件发送编译结果
-
进去sonarqube登录,然后点击右上角自己的图像进入我的账号然后点击提醒,把下面的提醒选项都勾选,然后在下面设置提醒搜索框里面搜索需要提醒的项目并勾选通知项:
-
以管理员方式进入sonarqube点击配置-通用配置往下拉,进入邮件配置,然后配置相应的项目,这里是用gmail来发送邮件实际上可以使用其他邮箱配置(smtp和端口会有所不同,可以去相应的邮箱中设置),配置完成了可以用下面的测试按钮来测试是否配置成功
-
设置Sonarqube host地址
默认情况下sonarqube是通过<localhost:9000>访问,那么sonarqube发出的邮件链接也是<localhost:9000>,如果接收人和sonarqube服务器在同一台主机上访问没有任何问题,如果接收人与sonarqube服务不在统一主机下则不行,所以需要更改sonarqube地址为本机ip:9000,这样只要都处于同一内网中就可以直接访问了
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即可