SonarQube 8.9 與 GitLab CI完全集成

本文所要達(dá)到的效果: 在push時自動觸發(fā)GitLab CI/CD pipeline job, 自動掃描所提交的代碼, 并將結(jié)果上報到sonarqube

名詞解釋:

SonarQube? - 是一個檢測bug, 漏洞及代碼異味的自動化工具. 它可以整合到現(xiàn)有的工作流中去啟用持續(xù)的代碼審查在項目的多分支及PR中.

SonarScanner for Maven - 通過常規(guī)的Maven命令執(zhí)行SonarQube分析的工具.

GitLab CI/CD 是一個內(nèi)置在GitLab中的工具瞭亮,用于通過持續(xù)方法進(jìn)行軟件開發(fā):

  • Continuous Integration (CI) 持續(xù)集成
  • Continuous Delivery (CD) 持續(xù)交付
  • Continuous Deployment (CD) 持續(xù)部署

持續(xù)集成的工作原理是將小的代碼塊推送到Git倉庫中托管的應(yīng)用程序代碼庫中猬腰,并且每次推送時,都要運行一系列腳本來構(gòu)建、測試和驗證代碼更改贾节,然后再將其合并到主分支中。

持續(xù)交付和部署相當(dāng)于更進(jìn)一步的CI吟税,可以在每次推送到倉庫默認(rèn)分支的同時將應(yīng)用程序部署到生產(chǎn)環(huán)境犬辰。

這些方法使得可以在開發(fā)周期的早期發(fā)現(xiàn)bugs和errors,從而確保部署到生產(chǎn)環(huán)境的所有代碼都符合為應(yīng)用程序建立的代碼標(biāo)準(zhǔn)填物。

GitLab CI/CD 由一個名為 .gitlab-ci.yml 的文件進(jìn)行配置全庸,改文件位于倉庫的根目錄下。文件中指定的腳本由GitLab Runner執(zhí)行融痛。

軟件版本:

SonarQube: 8.9.2 lts-community

SonarScanner for Maven: 3.9

GitLab Runner: gitlab/gitlab-runner:alpine

Docker安裝SonarQube

docker-compose.yml

version: "3"

services:
  sonarqube:
    image: sonarqube:lts-community #8.9.2社區(qū)長期支持版
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000" #暴露端口9000
  db:
    image: postgres:12
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

安裝好后設(shè)置管理員密碼, 在 administration - marketplace中搜索并下載中文插件, 重啟

多分支插件

GitHub - mc1arke/sonarqube-community-branch-plugin: A plugin that allows branch analysis and pull request decoration in the Community version of Sonarqube

安裝步驟:

  1. 將下載的jar文件拷貝到sonar安裝目錄下extensions/plugins/ 及 lib/common下, 并將權(quán)限設(shè)為775

  2. 在sonar安裝目錄下的config/sonar.properties中添加 sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=web 配置項

  3. 在sonar安裝目錄下的config/sonar.properties中添加 sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=ce 配置項

  4. 重啟SonarQube(在docker容器重啟, 如果使用儀表板的重啟服務(wù)器會導(dǎo)致插件不生效), 然后忽略使用第三方插件的警告

注意一定要將jar包權(quán)限設(shè)置為775, 并且要同時復(fù)制到 lib/common 下

GitLab-Runner 安裝及配置

docker安裝GitLab-Runner

docker pull gitlab/gitlab-runner

注冊一個Runner

Registering runners | GitLab

以下是安裝GitLab Runner完之后的步驟.

以下的步驟描述了啟動并注冊一個短期gitlab-runner容器. 注冊后, 容器的配置會寫入你配置掛載的volume(例如/srv/gitlab-runner/config), 并且會被runner載入.

通過Docker注冊一個Runner:

  1. 根據(jù)不同的掛載類型運行相應(yīng)的注冊命令:

    掛在到本地文件系統(tǒng):

    docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
    

    如果你在安裝期間配置了其他位置的volume, 替換/srv/gitlab-runner/config成你配置的volume.

    掛載到docker volume:

    docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register
    
  2. 輸入GitLab地址.

  3. 輸入從GitLab獲取的token.

  4. 輸入這個Runner的詳情描述. 你可以到GitLab的用戶界面修改該詳情.

  5. 輸入 runner所關(guān)聯(lián)的tag, 多個tag用逗號隔開. 你可以在GitLab的用戶界面修改該值.

  6. runner需要的 執(zhí)行器. 對于大多數(shù)情形來說, 輸入docker. 執(zhí)行器選取可以參考Executors | GitLab.

  7. 如果你使用docker作為執(zhí)行器, 需要提供默認(rèn)的運行鏡像, 假如 .gitlab-ci.yml`文件沒有指定的話會在默認(rèn)鏡像中運行.

注冊sonar-scanner-maven Runner

  1. 運行命令

    docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:alpine register
    
  2. 填寫所需要的信息, GitLab地址和token可以在 GitLab項目設(shè)置 - CI/CD - Runner中找到

  1. 注冊完后, 會在GitLab 項目設(shè)置 - CI/CD - Runner中看到注冊的Runner
  1. 因為我們選擇了使用docker執(zhí)行器來運行maven鏡像, sonar-scanner-maven掃描器在掃描項目時會下載所需要的所有依賴, 并且有可能會找不到我們自己所打包的依賴, 為了防止掃描器下載時間過長及找不到我們自定義的依賴, 需要將本地依賴倉庫放入服務(wù)器上, 將倉庫目錄掛載到runner的volume.

    ① 將本地依賴拷入到服務(wù)器/root/gitlab-runner-temp/maven-repository

② 進(jìn)入gitlab-runner容器修改config.toml

找到我們剛配置的 runner

在volumes后添加"/root/gitlab-runner-temp/maven-repository:/root/.m2/repository:rw", 將宿主機(jī)的/root/gitlab-runner-temp/maven-repository掛載到 runner啟動時maven容器中的默認(rèn)repository位置

掃描分析項目

參考GitLab Integration | SonarQube Docs

設(shè)置禁用淺克隆

具體原因為確保掃描器可以訪問GitLab執(zhí)行CI/CD時的所有歷史

項目設(shè)置 - CI/CD - 流水線通用設(shè)置 - Git 淺克隆

設(shè)置為0

定義一些公共變量

項目設(shè)置 - CI/CD - 變量

變量可以參考https://docs.sonarqube.org/8.9/analysis/analysis-parameters/

其中sonar_login和sonar_token參數(shù)可以在sonarqube中 點擊右上角頭像 - 我的賬號 - 安全 - 生成令牌中獲取

創(chuàng)建.gitlab-ci.yml文件

創(chuàng)建.gitlab-ci.yml文件到項目根目錄, .gitlab-ci.yml配置項可參考Keyword reference for the .gitlab-ci.yml file | GitLab

.gitlab-ci.yml

stages: # 定義gitlab pipeline執(zhí)行步驟
  - sonarqube-check

sonarqube-check:
  stage: sonarqube-check
  tags: # 指定gitlab runner tag
    - sonar-scanner-maven
  image: maven:3.6.3-jdk-11 # 指定運行鏡像, 如果docker沒有會自動pull
  variables: # 變量, 有些變量像SONAR_HOST_URL, SONAR_TOKEN, SONAR_LOGIN在gitlab CI/CD 變量中配置過, 所以可以不用重復(fù)配置
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"  # 聲明分析任務(wù)緩存文件夾
    GIT_DEPTH: "0"  # 告訴git獲取所有的分支, 分析任務(wù)強(qiáng)制要求
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script:
    # 此位置配置新的服務(wù) 配置參數(shù)參考 https://docs.sonarqube.org/8.9/analysis/analysis-parameters/
    # 一定要指定sonar.projectKey和sonar.projectName兩個參數(shù)
    - mvn verify sonar:sonar -X -Dmaven.test.skip=true -Dsonar.qualitygate.wait=true  -am -Dsonar.projectKey=com.company.project:projectName -Dsonar.projectName=projectName
  allow_failure: true

BTW

可以在IDEA中安裝sonarlint插件來獲取sonarqube配置的規(guī)則, 并實時在編碼時掃描

plugin:SonarLint - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)

另外需要安裝 Node.js

下載安裝好后, 切換到sonarlint選項卡, 點擊右邊的設(shè)置

配置連接

點擊 + 號

配置好后, 點擊Search in list, 會將所有項目列入左邊方框, 選中相應(yīng)項目即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壶笼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子雁刷,更是在濱河造成了極大的恐慌覆劈,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沛励,死亡現(xiàn)場離奇詭異责语,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)目派,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門坤候,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人企蹭,你說我怎么就攤上這事白筹。” “怎么了谅摄?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵徒河,是天一觀的道長。 經(jīng)常有香客問我送漠,道長顽照,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任闽寡,我火速辦了婚禮代兵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爷狈。我一直安慰自己植影,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布淆院。 她就那樣靜靜地躺著何乎,像睡著了一般句惯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上支救,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天抢野,我揣著相機(jī)與錄音,去河邊找鬼各墨。 笑死指孤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贬堵。 我是一名探鬼主播恃轩,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼黎做!你這毒婦竟也來了叉跛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蒸殿,失蹤者是張志新(化名)和其女友劉穎筷厘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宏所,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡酥艳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爬骤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片充石。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖霞玄,靈堂內(nèi)的尸體忽然破棺而出骤铃,到底是詐尸還是另有隱情,我是刑警寧澤溃列,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布劲厌,位于F島的核電站,受9級特大地震影響听隐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哄啄,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一雅任、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咨跌,春花似錦沪么、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春殉摔,著一層夾襖步出監(jiān)牢的瞬間州胳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工逸月, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留栓撞,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓碗硬,卻偏偏與公主長得像瓤湘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恩尾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容