準(zhǔn)備工作
1.安裝Ubuntu系統(tǒng)
2.安裝Android Studio、SDK
3.安裝Jenkins CI
4.Sonarqube
安裝Android Studio
1.下載Android Studio Linux版本
2.解壓壓縮包
3.運(yùn)行解壓之后的bin文件夾中bin/.studio.sh
比如:壓縮包解壓到android_studio文件中,那么進(jìn)入android_stuido/bin目錄漆诽,運(yùn)行./studio.sh命令,會(huì)在圖形界面中啟動(dòng)AndroidStudio然后按照引導(dǎo)創(chuàng)建一個(gè)project這樣AS會(huì)下載gradle.
4.如果要給AS創(chuàng)建快捷方式倦沧,按照步驟3啟動(dòng)AS之后點(diǎn)擊菜單tools-Create Desktop Entity就可以創(chuàng)建快捷方式
安裝Jenkins
一.安裝JDK
下載JDK:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
解壓下載的壓縮包:
tar zxvf jdk-8u211-linux-i586.tar.gz
-
配置環(huán)境變量
sudo vim /etc/bash.bashrc
添加如下內(nèi)容: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解壓路徑
查看環(huán)境變量: 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.運(yùn)行
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.運(yùn)行sudo service jenkins start啟動(dòng)jenkins,如果沒(méi)有問(wèn)題就會(huì)啟動(dòng)jenkins服務(wù)在瀏覽器中輸入http://localhost:8080就可以訪問(wèn)jenkins服務(wù)
6.如果啟動(dòng)失敗大概率是沒(méi)有找到JDK的原因它匕,編輯jenkins文件:
sudo vim /etc/init.d/jenkins
在PATH=/bin:/usr/bin:/sbin:/usr/sbin后面加上JDK路徑即可(別忘了':')7.訪問(wèn)http://localhost:8080如果出現(xiàn)的是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然后重啟服務(wù)即可(sudo /etc/init.d/jenkins restart )
8.進(jìn)入http://localhost:8080后頁(yè)面會(huì)有預(yù)警信息,按照引導(dǎo)輸入密碼(頁(yè)面會(huì)有提示密碼位置一般在/var/lib/jenkins/initialAdminPassword文件中)進(jìn)行下一步安裝插件
-
9.步驟8操作之后會(huì)進(jìn)入到安裝插件頁(yè)面豫柬,我可可以自己選擇安裝所需要的插件
- JUnit插件
- JaCoCo插件
- EnvInject插件
- GitHub告希、Git、Gitlab
10.安裝完插件創(chuàng)建管理員賬戶(沒(méi)有安裝完后面可以繼續(xù)安裝)
11.配置環(huán)境變量進(jìn)入http://localhost:8080/configure點(diǎn)擊Manage Jenkins然后點(diǎn)擊Configure System找到環(huán)境變量進(jìn)行配置(Global Properties - Environment variables)烧给,添加JAVA_HOME和ANDROID_HOME環(huán)境變量
12.安裝插件 Manage Jenkins - Manage Plugins
三.創(chuàng)建Jenkins任務(wù)
說(shuō)明:這里以Gitlab作為代碼倉(cāng)庫(kù)燕偶,因此需要安裝Gitlab和Gitlab Authentication插件并在jenkins上配置gitlab信息
準(zhǔn)備1->配置Gitlab Access token:
1. 登錄gitlab
2. 個(gè)人頭像-settings-左側(cè)工具欄Access token
3. 輸入Name(隨便取),Expries at(過(guò)期時(shí)間)础嫡,勾選api
4. 點(diǎn)擊“Create personal access token”指么,生成access token記錄下來(lái). access token在頁(yè)面頂部Your New Personal Access Token下
準(zhǔn)備2->配置gitlab:
1. http://localhost:8080/configure - Manage Jenkins
2. 找到Gitlab選項(xiàng)添加以下信息:
- Connection name: 隨便填
- Gitlab host URL: gitlab 地址
- Credentials: 選擇Gitlab API token(jenkins)
- 利用準(zhǔn)備1中的token創(chuàng)建認(rèn)證憑據(jù)
下面開(kāi)始正式創(chuàng)建一個(gè)Jenkins任務(wù)
點(diǎn)擊NewItem,輸入項(xiàng)目名稱(最好不要包含空格),選擇Freestyle project伯诬,點(diǎn)擊OK
配置Git ssh key晚唇,因?yàn)镴enkins在桿狀的時(shí)候會(huì)默認(rèn)創(chuàng)建一個(gè)jenkins用戶且jenkins在clone git上面代碼的時(shí)候以jenkins用戶進(jìn)行,所以我們?cè)谏蓅sh key的時(shí)候必須在jenkins用戶下創(chuàng)建姑廉。(巨坑,最開(kāi)始沒(méi)有意識(shí)到這個(gè)問(wèn)題翁涤,導(dǎo)致編譯拉取代碼的時(shí)候總是提示沒(méi)有權(quán)限):
git config --global user.name "xxx"
git config --global user.name "xxx@xxx.com"
ssh-keygen -t rsa -C "xxx@xxx.com"
配置任務(wù)屬性桥言,進(jìn)入到項(xiàng)目configure
General: 上面已經(jīng)配置Gitlab,所以GitHub選項(xiàng)下會(huì)多出GitLab Connection 且已經(jīng)自動(dòng)填充之前配置的gitlab
Source Code Management: 我們已經(jīng)給jenkins用戶創(chuàng)建了ssh key葵礼,所以我們利用下面shell腳本的方式拉取代碼号阿,這里不用填
Build Triggers: 用于指定定時(shí)任務(wù)遠(yuǎn)程任務(wù)等等
-
Build Enviroment:
- Abort the Build it's stuck: 在下面填一個(gè)超時(shí)時(shí)間,超時(shí)就停止本次構(gòu)建
-
Build:
-
添加Excute shell用于執(zhí)行shell腳本(拉取代碼)
if [ -d "Test" ]; then rm -r Test fi git xxxxx/Test.git cd Test git checkout master 解釋:如果存在Test目錄那么刪除該目錄鸳粉,使用git命令從gitlab倉(cāng)庫(kù)上拉取Test代碼扔涧,進(jìn)入Test文件目錄,檢出master分支代碼
-
添加Invoke Gradle script用于執(zhí)行Gradlew打包任務(wù)
勾選Use Gradlew Wrapper
Wrapper location: Test(clone代碼后的文件夾名稱)
Root Build script: Jointly/app(主module文件路徑)
Build File: build.gradle(gradle配置文件)
-
-
添加Excute Python script用于執(zhí)行python腳本
說(shuō)明:這里有個(gè)大坑届谈,因?yàn)閡buntu系統(tǒng)自帶安裝的是python3枯夜,而jenkins還是以python2的方式在運(yùn)行,所以執(zhí)行下面的python腳本會(huì)報(bào)錯(cuò)艰山。有兩種解決辦法:一是安裝python2湖雹,二是通過(guò)添加軟鏈的方式將python指向python3:打開(kāi)命令行執(zhí)行下命令 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) #這里只是簡(jiǎn)單的把編譯出來(lái)的apk以日期命名了下,實(shí)際上可以用python做更多的事
配置完以后就可以運(yùn)行我們的項(xiàng)目了曙搬,在Jenkins首頁(yè)點(diǎn)擊我們剛剛創(chuàng)建的項(xiàng)目進(jìn)入項(xiàng)目頁(yè)面點(diǎn)擊Build Now運(yùn)行
配置Jenkins定時(shí)執(zhí)行
1. 進(jìn)入項(xiàng)目configure頁(yè)面
2. 選擇到Build Triggers選項(xiàng)
* Trigger buidls remotely(e.g, from scripts): 遠(yuǎn)程觸發(fā)(例如:腳本)
* Build after other project are build:在其他項(xiàng)目構(gòu)建之后構(gòu)建
* Build periodically: 定期構(gòu)建
* Build when a change is pushed to Gitlab...:將更改推送到Gitlab時(shí)進(jìn)行構(gòu)建
* GitHub hook trigger for GITScm polling:Github鉤子觸發(fā)GITScm輪詢
* Poll SCM:輪詢SCM即定時(shí)檢查代碼變更(根據(jù)SCM軟件的版本號(hào))摔吏,如果有更新就checkout最新code然后構(gòu)建
3. 本次我們?cè)O(shè)置一個(gè)定時(shí)構(gòu)建,假設(shè)設(shè)置為2分鐘構(gòu)建一次纵装,那么我們需要勾選上述的Build periodically選項(xiàng)征讲,在下方的輸入框內(nèi)輸入H/2 * * * * 即可.(輸入框內(nèi)的內(nèi)容類似CRON語(yǔ)法,不清楚的點(diǎn)擊輸入框后面的橡娄?會(huì)有文檔)
![jenkins_periodically_task_step3.png](https://upload-images.jianshu.io/upload_images/2005016-92341deb1c7e429e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4. 本次我們創(chuàng)建一個(gè)每天8點(diǎn)執(zhí)行的任務(wù)就需要輸入:H 8 * * *
四.SonarQube
這部分我會(huì)講講如何安裝诗箍、配置 SonarQube ,并配以使用 Docker 作為容器的 MySQL 數(shù)據(jù)庫(kù)挽唉。SonarQube 是個(gè)代碼靜態(tài)分析工具扳还,它可以幫助開(kāi)發(fā)者寫出干凈的代碼、檢測(cè)錯(cuò)誤和學(xué)習(xí)最佳體驗(yàn)橱夭。它還可以跟蹤代碼覆蓋氨距、測(cè)試結(jié)果、功能需求等等棘劣。SonarQube 檢測(cè)到的問(wèn)題可以使用插件十分容易的導(dǎo)入到 Android Studion/IntelliJ 中去俏让。
安裝Sonarqube
下載Sonarqube: https://www.sonarqube.org/downloads/
-
安裝Sonarqube: https://docs.sonarqube.org/latest/setup/get-started-2-minutes/, 步驟:
解壓下載的安裝包
進(jìn)入sonarqube/bin/[os]目錄,運(yùn)行sonar.sh(由于我是在Linux上安裝sonarqube7.8,所以需要進(jìn)入sonarqube-7.8/bin/linux-x86-64目錄并且運(yùn)行:
./sonar.sh console
)待服務(wù)啟動(dòng)后訪問(wèn)http:localhost:9000可以進(jìn)入到sonarqube網(wǎng)頁(yè)
-
安裝漢化插件首昔,進(jìn)入sonarqube頁(yè)面后 登錄(用戶名/密碼:admin/admin)-Administration-Marketplace在plugins搜索框搜索chinese安裝漢化插件(如果安裝完成重啟瀏覽器后還是顯示英語(yǔ)那么把瀏覽器語(yǔ)言設(shè)置為中文就ok了)
安裝插件:CheckStyle寡喝,findbugs等等
-
創(chuàng)建規(guī)則(7.8已經(jīng)帶有很多默認(rèn)規(guī)則供我們使用),質(zhì)量配置->創(chuàng)建
-
創(chuàng)建項(xiàng)目,項(xiàng)目->+
-
生成token,點(diǎn)擊已創(chuàng)建的項(xiàng)目勒奇,點(diǎn)擊創(chuàng)建一個(gè)令牌下的創(chuàng)建按鈕會(huì)生成一個(gè)token预鬓。記下這個(gè)token下一步配置Android Studio插件時(shí)需要使用
Android Studio配置Sonarqube
-
在Android Studio中安裝SonarqubeLint插件:File->Settings->Plugins,然后搜索SonarqubeLint,然后安裝
-
然后配置sonarqube:File->Settings->Other Settings-> SonarLint General Settings,點(diǎn)擊+號(hào)創(chuàng)建一個(gè)配置
-
輸入配置名稱赊颠,選擇右邊連接本地server格二,輸入本地sonarqube 服務(wù)地址然后下一步
-
填入剛剛創(chuàng)建的項(xiàng)目中的token,如果token在認(rèn)證的時(shí)候不成功可以在第3步的時(shí)候選擇以用戶名密碼的方式認(rèn)證然后填入用戶名密碼
-
在Android Studio中配置sonarqube任務(wù)
- 在項(xiàng)目build.gradle中加入以下內(nèi)容
dependencies { classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.8' } repositories { maven { url "https://plugins.gradle.org/m2/" } }
- 在module的build.gradle中添加下面的內(nèi)容竣蹦,task中就會(huì)多出sonarqube顶猜,右側(cè)工具欄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->項(xiàng)目->config->build中添加sonarqube任務(wù)
-
執(zhí)行build,我們就可以在localhost:9000中我們創(chuàng)建的項(xiàng)目中去查看sonarqube的執(zhí)行結(jié)果
-
配置通過(guò)郵件發(fā)送編譯結(jié)果
-
進(jìn)去sonarqube登錄痘括,然后點(diǎn)擊右上角自己的圖像進(jìn)入我的賬號(hào)然后點(diǎn)擊提醒长窄,把下面的提醒選項(xiàng)都勾選,然后在下面設(shè)置提醒搜索框里面搜索需要提醒的項(xiàng)目并勾選通知項(xiàng):
-
以管理員方式進(jìn)入sonarqube點(diǎn)擊配置-通用配置往下拉,進(jìn)入郵件配置,然后配置相應(yīng)的項(xiàng)目,這里是用gmail來(lái)發(fā)送郵件實(shí)際上可以使用其他郵箱配置(smtp和端口會(huì)有所不同纲菌,可以去相應(yīng)的郵箱中設(shè)置)挠日,配置完成了可以用下面的測(cè)試按鈕來(lái)測(cè)試是否配置成功
-
設(shè)置Sonarqube host地址
默認(rèn)情況下sonarqube是通過(guò)<localhost:9000>訪問(wèn),那么sonarqube發(fā)出的郵件鏈接也是<localhost:9000>翰舌,如果接收人和sonarqube服務(wù)器在同一臺(tái)主機(jī)上訪問(wèn)沒(méi)有任何問(wèn)題肆资,如果接收人與sonarqube服務(wù)不在統(tǒng)一主機(jī)下則不行,所以需要更改sonarqube地址為本機(jī)ip:9000,這樣只要都處于同一內(nèi)網(wǎng)中就可以直接訪問(wèn)了
sonarqube配置文件在/sonarqube/conf/sonar.properties文件中灶芝,而host的配置則是sonar.web.host,所以我們只需要更改/添加sonar.web.host=本地ip即可,這里我們可以寫一個(gè)shell腳本自動(dòng)獲取本機(jī)ip郑原,然后在sonarqube啟動(dòng)的時(shí)候自動(dòng)執(zhí)行該腳本
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
#腳本第一行獲取本機(jī)ip(不同的機(jī)器系統(tǒng)可能有略有差別)
#第二行打印提示會(huì)更改sonarqube host
#第三行通過(guò)sed命令將sonar.properties中host動(dòng)態(tài)替換
#由于sonarqube是通過(guò)sonar.sh運(yùn)行,所以我們將上述代碼保存為ip.sh然后在sonar.sh第一行加入./ip.sh即可