基于Drone来做CI/CD,个人感觉真的很棒,相对于业界老大哥jekins,我更喜欢drone,相比较而言,我觉得它主要有以下优势
对于我们后端的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点
先看下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的基本流程了,需要注意的有以下几点
<plugin>
<groupId>org.jacocogroupId>
<artifactId>jacoco-maven-pluginartifactId>
<version>${jacoco.version}version>
<executions>
<execution>
<id>prepare-agentid>
<goals>
<goal>prepare-agentgoal>
goals>
execution>
<execution>
<id>default-reportid>
<phase>testphase>
<goals>
<goal>reportgoal>
goals>
<configuration>
<dataFile>target/jacoco.execdataFile>
<outputDirectory>target/jacocooutputDirectory>
configuration>
execution>
executions>
plugin>
其他可能遇到的问题:
答: drone提供了关于邮件和微信的插件
答: 没有p3c的插件,但是可以通过PMD来进行集成
集成p3c: https://www.jianshu.com/p/a3a58ac368be
自定义checkstyle: https://www.jianshu.com/p/a3a58ac368be
答: drone提供了webhooke的plugin,你只需要编写自己统计的程序就可以了,可以根据模板设置需要发送的信息
答: 可以自己写一个插件,官网有bash/go的示例,用你熟悉的语言也是可以的