嘿,我用Drone作CI

基於Drone來作CI/CD,我的感受真的很棒,相對於業界老大哥jekins,我更喜歡drone,相比較而言,我以爲它主要有如下優點java

  1. 插件不須要額外管理
  2. 基於yaml文件,易編寫,配置能夠進行版本管理
  3. 能夠根據不一樣的條件進行構建
  4. 更人性化的UI界面

對於咱們後端的java項目而言,咱們CI要作什麼呢?git

通常提交代碼流程以下github

  1. Clone 項目到本地,建立一個分支來完成新功能的開發, git checkout -b feature/sync-status。在這個分支修改一些代碼
  2. git add .,書寫符合規範的 Commit 並提交代碼, git commit -m "sync article status」
  3. 將代碼推送到代碼庫的對應分支, git push origin feature/sync-status
  4. 若是功能已經開發完畢,能夠向 Develop(或者Master) 分支發起一個 Pull Request,並讓項目的負責人 Code Review
  5. Review 經過後,項目負責人將分支合併入主幹分支

從上圖中能夠看到當咱們提交代碼時,會執行整個CI流程,須要注意的有如下2點web

  1. 執行build或者unit test的時候,若是失敗,會發送消息到Slack,這個時候開發人員就能注意到這個問題,固然也可使用發送郵件或者微信的方式
  2. 執行SonarQube check的時候,若是存在問題會將結果回寫到github中,開發人員就會去看這個問題

先看下SonarQube回寫到github中的的檢查結果是怎樣的面試

當sonar qube檢測完成以後,會將檢查結果經過oauth的方式發送給github,因此你須要在github中建立Personal access token(這個要記下來)後端

當你激活你的代碼倉庫時,Drone會自動將Webhooks添加到版本控制系統中,例如GitHub,而無需手動配置api

kind: pipeline
name: default

steps:
# build for push and pull_request
- name: build-pr
 image: maven:latest
 pull: if-not-exists
 commands:
 - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.skip=true -s settings.xml
 when:
 branch:
 - feature/*
 - issue/*
 - develop
 event:
 - push
 - pull_request

- name: unittest
 image: maven:latest
 pull: if-not-exists
 commands:
 - mvn test -s settings.xml
 when:
 branch:
 - develop
 event:
 include:
 - pull_request
 - push

# 這裏咱們使用命令來深度定製咱們的掃描,而不是使用drone sonar plugin
- name: sonar-scan
 image: newtmitch/sonar-scanner:4.0.0-alpine
 environment:
 SONAR_TOKEN:
 from_secret: sonar_token
 GITHUB_ACCESS_TOKEN_FOR_SONARQUBE:
 from_secret: github_access_token_for_sonarqube
 commands:
 - > sonar-scanner -Dsonar.host.url=https://sonarqube.company-beta.com/ -Dsonar.login=$$SONAR_TOKEN -Dsonar.projectKey=smcp-service-BE -Dsonar.projectName=smcp-service-BE -Dsonar.projectVersion=${DRONE_BUILD_NUMBER} -Dsonar.sources=src/main/java -Dsonar.tests=src/test/java -Dsonar.language=java -Dsonar.java.coveragePlugin=jacoco -Dsonar.modules=smcp-api,smcp-web -Dsonar.java.binaries=target -Dsonar.projectBaseDir=. -Dsonar.analysis.mode=preview -Dsonar.github.repository=Today_Group/SMCP-Service -Dsonar.github.oauth=$$GITHUB_ACCESS_TOKEN_FOR_SONARQUBE -Dsonar.github.pullRequest=${DRONE_PULL_REQUEST} -Dsonar.github.disableInlineComments=false  when:
 event:
 - pull_request
 branch:
 - develop

# post sonarscan result back to git PR (not in preview mode)
- name: sonar-scan-feedback
 image: newtmitch/sonar-scanner:4.0.0-alpine
 environment:
 SONAR_TOKEN:
 from_secret: sonar_token
 GITHUB_ACCESS_TOKEN_FOR_SONARQUBE:
 from_secret: github_access_token_for_sonarqube
 commands:
 - > sonar-scanner -Dsonar.host.url=https://sonarqube.company-beta.com/ -Dsonar.login=$$SONAR_TOKEN -Dsonar.projectKey=smcp-service-BE -Dsonar.projectName=smcp-service-BE -Dsonar.projectVersion=${DRONE_BUILD_NUMBER} -Dsonar.sources=src/main/java -Dsonar.tests=src/test/java -Dsonar.language=java -Dsonar.java.coveragePlugin=jacoco -Dsonar.modules=smcp-api,smcp-web -Dsonar.java.binaries=target -Dsonar.projectBaseDir=. -Dsonar.analysis.gitRepo=Today_Group/SMCP-Service -Dsonar.analysis.pullRequest=${DRONE_PULL_REQUEST}  when:
 event:
 - pull_request
 branch:
 - develop

複製代碼

上面drone的配置就是整個CI的基本流程了,須要注意的有如下幾點安全

  1. 只有當分支名稱以feature/,issue/,develop開頭的纔會觸發上面的執行步驟,對於unit test而言,只有develop分支才生效(能夠根據須要自行定製)
  2. sonar配置中的sonar.projectKey,sonar.projectName必定要和你在sonar服務器(sonar.host.url指定的地址)中建立project時的名稱同樣
  3. sonar_token的值是在sonar服務器上建立的,而後將這個值設置在了drone的secrets中(drone中點擊某一個倉庫,進入Settings能夠進行設置)
  4. github token和sonar_token是一樣的方式,都須要在drone中預設置(好處就是你不會暴露你的密碼在文件中,這樣更加安全)
  5. 因爲所用Java項目是個多模塊項目,因此能夠在sonar.modules中指定多個模塊名稱
  6. sonar scan feedback的內容到pr不要指定preview mode
  7. build的時候使用了jacoco(分析單元測試覆蓋率),因此須要在java項目中pom.xml引入這個plugin
<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>${jacoco.version}</version>
  <executions>
    <execution>
      <id>prepare-agent</id>
      <goals>
          <goal>prepare-agent</goal>
      </goals>
    </execution>
    <execution>
      <id>default-report</id>
      <phase>test</phase>
      <goals>
          <goal>report</goal>
      </goals>
      <configuration>
          <dataFile>target/jacoco.exec</dataFile>
          <outputDirectory>target/jacoco</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>
複製代碼

其餘可能遇到的問題:bash

  1. ci執行完成以後,如何發送郵件或者消息到微信羣

答: drone提供了關於郵件微信的插件服務器

  1. sonarqube可否集成阿里巴巴的p3c或者自定義checkstyle

答: 沒有p3c的插件,可是能夠經過PMD來進行集成

集成p3c: www.jianshu.com/p/a3a58ac36… 自定義checkstyle: www.jianshu.com/p/a3a58ac36…

  1. 我想根據build的信息(是否成功,時間等)本身作統計怎麼辦?

答: drone提供了webhooke的plugin,你只須要編寫本身統計的程序就能夠了,能夠根據模板設置須要發送的信息

  1. 沒有我想要的插件,怎麼辦?

答: 能夠本身寫一個插件,官網有bash/go的示例,用你熟悉的語言也是能夠的


往期推薦閱讀

和麪試官這樣吹MongoDB複製集

知道了這些 MongoDB設計技巧,提高效率50%

我花了一週讀了Kafka Producer的源碼

面試官:如何用LinkedHashMap實現LRU

我是如何理解Java8 Stream

不再怕面試官問我JDK8 HashMap了

MongoDB中的定時索引

相關文章
相關標籤/搜索