嘿,我用Drone做CI
阿新 • • 發佈:2020-06-24
基於Drone來做CI/CD,個人感覺真的很棒,相對於業界老大哥jekins,我更喜歡drone,相比較而言,我覺得它主要有以下優勢
- 外掛不需要額外管理
- 基於yaml檔案,易編寫,配置可以進行版本管理
- 可以根據不同的條件進行構建
- 更人性化的UI介面
對於我們後端的java專案而言,我們CI要做什麼呢?
一般提交程式碼流程如下
- Clone 專案到本地,建立一個分支來完成新功能的開發,git checkout -b feature/sync-status。在這個分支修改一些程式碼
- git add .,書寫符合規範的 Commit 並提交程式碼, git commit -m "sync article status”
- 將程式碼推送到程式碼庫的對應分支, git push origin feature/sync-status
- 如果功能已經開發完畢,可以向 Develop(或者Master) 分支發起一個 Pull Request,並讓專案的負責人 Code Review
- Review 通過後,專案負責人將分支合併入主幹分支
從上圖中可以看到當我們提交程式碼時,會執行整個CI流程,需要注意的有以下2點
- 執行build或者unit test的時候,如果失敗,會傳送訊息到Slack,這個時候開發人員就能注意到這個問題,當然也可以使用傳送郵件或者微信的方式
- 執行SonarQube check的時候,如果存在問題會將結果回寫到github中,開發人員就會去看這個問題
先看下SonarQube回寫到github中的的檢查結果是怎樣的
當sonar qube檢測完成之後,會將檢查結果通過oauth的方式傳送給github,所以你需要在github中建立Personal access token(這個要記下來)
當你啟用你的程式碼倉庫時,Drone會自動將Webhooks新增到版本控制系統中,例如GitHub,而無需手動配置
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的基本流程了,需要注意的有以下幾點
- 只有當分支名稱以feature/,issue/,develop開頭的才會觸發上面的執行步驟,對於unit test而言,只有develop分支才生效(可以根據需要自行定製)
- sonar配置中的sonar.projectKey,sonar.projectName一定要和你在sonar伺服器(sonar.host.url指定的地址)中建立project時的名稱一樣
- sonar_token的值是在sonar伺服器上建立的,然後將這個值設定在了drone的secrets中(drone中點選某一個倉庫,進入Settings可以進行設定)
- github token和sonar_token是同樣的方式,都需要在drone中預設定(好處就是你不會暴露你的密碼在檔案中,這樣更加安全)
- 由於所用Java專案是個多模組專案,所以可以在sonar.modules中指定多個模組名稱
- sonar scan feedback的內容到pr不要指定preview mode
- 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>
複製程式碼
其他可能遇到的問題:
- ci執行完成之後,如何傳送郵件或者訊息到微信群
- sonarqube能否整合阿里巴巴的p3c或者自定義checkstyle
答: 沒有p3c的外掛,但是可以通過PMD來進行整合
整合p3c: www.jianshu.com/p/a3a58ac36… 自定義checkstyle: www.jianshu.com/p/a3a58ac36…
- 我想根據build的資訊(是否成功,時間等)自己做統計怎麼辦?
答: drone提供了webhooke的plugin,你只需要編寫自己統計的程式就可以了,可以根據模板設定需要傳送的資訊
- 沒有我想要的外掛,怎麼辦?
答: 可以自己寫一個外掛,官網有bash/go的示例,用你熟悉的語言也是可以的
往期推薦閱讀