嘿,我用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中的定时索引

相关文章
相关标签/搜索