嘿,我用Drone做CI

基于Drone来做CI/CD,个人感觉真的很棒,相对于业界老大哥jekins,我更喜欢drone,相比较而言,我觉得它主要有以下优势

  1. 插件不需要额外管理
  2. 基于yaml文件,易编写,配置可以进行版本管理
  3. 可以根据不同的条件进行构建
  4. 更人性化的UI界面

对于我们后端的java项目而言,我们CI要做什么呢?

image

一般提交代码流程如下

  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点

  1. 执行build或者unit test的时候,如果失败,会发送消息到Slack,这个时候开发人员就能注意到这个问题,当然也可以使用发送邮件或者微信的方式
  2. 执行SonarQube check的时候,如果存在问题会将结果回写到github中,开发人员就会去看这个问题

先看下SonarQube回写到github中的的检查结果是怎样的

image

当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的基本流程了,需要注意的有以下几点

  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>

其他可能遇到的问题:

  1. ci执行完成之后,如何发送邮件或者消息到微信群

答: drone提供了关于邮件微信的插件

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

答: 没有p3c的插件,但是可以通过PMD来进行集成

集成p3c: https://www.jianshu.com/p/a3a58ac368be
自定义checkstyle: https://www.jianshu.com/p/a3a58ac368be

  1. 我想根据build的信息(是否成功,时间等)自己做统计怎么办?

答: drone提供了webhooke的plugin,你只需要编写自己统计的程序就可以了,可以根据模板设置需要发送的信息

  1. 没有我想要的插件,怎么办?

答: 可以自己写一个插件,官网有bash/go的示例,用你熟悉的语言也是可以的

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • 背景介绍 我们知道使用 SonarQube 可以在日常开发中检测代码质量,除了使用 IDE 上集成 SonarLi...
    dennyhong阅读 6,376评论 1 8
  • 将使用 docker + docker compose + drone + git 实现项目自动部署 使用dock...
    StephenXP阅读 1,651评论 0 1
  • 一. Linux服务器搭建sonar https://www.digitalocean.com/community...
    hehetc阅读 1,988评论 4 3
  • 一、sonar 基础概念? a. 是一个代码质量分析平台。b. 通过插件机制,集成不同的测试工具。 (和jenki...
    凯天阅读 10,208评论 0 2
  • 是他潜意识地预感到了什么呢? “乌鸦叫,祸患到。”这是老人们的传说。这种鸟儿现在本地方上很少见了,它们怎么选择今天...
    欣荣Y阅读 564评论 2 10