基於Drone來作CI/CD,我的感受真的很棒,相對於業界老大哥jekins,我更喜歡drone,相比較而言,我以爲它主要有如下優點java
對於咱們後端的java項目而言,咱們CI要作什麼呢?git
通常提交代碼流程以下github
- 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點web
先看下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的基本流程了,須要注意的有如下幾點安全
<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
答: 沒有p3c的插件,可是能夠經過PMD來進行集成
集成p3c: www.jianshu.com/p/a3a58ac36… 自定義checkstyle: www.jianshu.com/p/a3a58ac36…
答: drone提供了webhooke的plugin,你只須要編寫本身統計的程序就能夠了,能夠根據模板設置須要發送的信息
答: 能夠本身寫一個插件,官網有bash/go的示例,用你熟悉的語言也是能夠的
往期推薦閱讀