Android Jenkins+Sonarqube搭建持續(xù)集成環(huán)境

準(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

jenkins_create_task_step1

配置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:

    1. 添加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分支代碼
      
      
    2. 添加Invoke Gradle script用于執(zhí)行Gradlew打包任務(wù)

      • 勾選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用于執(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做更多的事
    
  2. 配置完以后就可以運(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/, 步驟:

    1. 解壓下載的安裝包

    2. 進(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)

    3. 待服務(wù)啟動(dòng)后訪問(wèn)http:localhost:9000可以進(jìn)入到sonarqube網(wǎng)頁(yè)

    4. 安裝漢化插件首昔,進(jìn)入sonarqube頁(yè)面后 登錄(用戶名/密碼:admin/admin)-Administration-Marketplace在plugins搜索框搜索chinese安裝漢化插件(如果安裝完成重啟瀏覽器后還是顯示英語(yǔ)那么把瀏覽器語(yǔ)言設(shè)置為中文就ok了)


      jenkins_install_sonarqube_step4.png
    5. 安裝插件:CheckStyle寡喝,findbugs等等

    6. 創(chuàng)建規(guī)則(7.8已經(jīng)帶有很多默認(rèn)規(guī)則供我們使用),質(zhì)量配置->創(chuàng)建


      jenkins_install_sonarqube_step6.png
    7. 創(chuàng)建項(xiàng)目,項(xiàng)目->+


      jenkins_install_sonarqube_step7.png
    8. 生成token,點(diǎn)擊已創(chuàng)建的項(xiàng)目勒奇,點(diǎn)擊創(chuàng)建一個(gè)令牌下的創(chuàng)建按鈕會(huì)生成一個(gè)token预鬓。記下這個(gè)token下一步配置Android Studio插件時(shí)需要使用


      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,點(diǎn)擊+號(hào)創(chuàng)建一個(gè)配置


    jenkins_as_config_sonarqube_step2.png
  3. 輸入配置名稱赊颠,選擇右邊連接本地server格二,輸入本地sonarqube 服務(wù)地址然后下一步


    jenkins_as_config_sonarqube_step3.png
  4. 填入剛剛創(chuàng)建的項(xiàng)目中的token,如果token在認(rèn)證的時(shí)候不成功可以在第3步的時(shí)候選擇以用戶名密碼的方式認(rèn)證然后填入用戶名密碼


    jenkins_as_condif_sonarqube_step4.png
  5. 在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"
        }
    }
    
    
  6. 在jenkins->項(xiàng)目->config->build中添加sonarqube任務(wù)


    jenkins_as_config_sonarqube_step6.jpg
  7. 執(zhí)行build,我們就可以在localhost:9000中我們創(chuàng)建的項(xiàng)目中去查看sonarqube的執(zhí)行結(jié)果


    jenkins_as_config_sonarqube_step7.jpg
  8. 配置通過(guò)郵件發(fā)送編譯結(jié)果

    • 進(jìn)去sonarqube登錄痘括,然后點(diǎn)擊右上角自己的圖像進(jìn)入我的賬號(hào)然后點(diǎn)擊提醒长窄,把下面的提醒選項(xiàng)都勾選,然后在下面設(shè)置提醒搜索框里面搜索需要提醒的項(xiàng)目并勾選通知項(xiàng):


      jenkins_as_config_sonarqube_step8_1.png
    • 以管理員方式進(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è)試是否配置成功


      jenkins_as_config_sonarqube_step8_2.png

      jenkins_as_config_sonarqube_step8_3.png

設(shè)置Sonarqube host地址

  1. 默認(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)了

  2. 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即可

參考資料

  1. https://www.imooc.com/article/68635
  2. http://www.reibang.com/p/826c80805bb2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夜涕,一起剝皮案震驚了整個(gè)濱河市犯犁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌女器,老刑警劉巖酸役,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異驾胆,居然都是意外死亡涣澡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門丧诺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)入桂,“玉大人,你說(shuō)我怎么就攤上這事驳阎】钩睿” “怎么了馁蒂?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蜘腌。 經(jīng)常有香客問(wèn)我沫屡,道長(zhǎng),這世上最難降的妖魔是什么撮珠? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任沮脖,我火速辦了婚禮,結(jié)果婚禮上芯急,老公的妹妹穿的比我還像新娘勺届。我一直安慰自己,他們只是感情好志于,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布涮因。 她就那樣靜靜地躺著废睦,像睡著了一般伺绽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗜湃,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天奈应,我揣著相機(jī)與錄音,去河邊找鬼购披。 笑死杖挣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刚陡。 我是一名探鬼主播惩妇,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筐乳!你這毒婦竟也來(lái)了歌殃?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝙云,失蹤者是張志新(化名)和其女友劉穎氓皱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體勃刨,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡波材,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了身隐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廷区。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贾铝,靈堂內(nèi)的尸體忽然破棺而出躲因,到底是詐尸還是另有隱情早敬,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布大脉,位于F島的核電站搞监,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏镰矿。R本人自食惡果不足惜琐驴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秤标。 院中可真熱鬧绝淡,春花似錦、人聲如沸苍姜。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衙猪。三九已至馍乙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垫释,已是汗流浹背丝格。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棵譬,地道東北人显蝌。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像订咸,于是被迫代替她去往敵國(guó)和親曼尊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345