玩转 Drone CI

简介: 通过这篇文章总结一下目前我们对 drone 进行了一些定制化开发以及使用技巧,由于 drone 官方的文档不是很详细,所以也希望通过这种方法来和其他使用 drone 的用户分享和交流使用经验。

前言

使用 drone CI 已有小半年,在将原有项目的 CI 系统从 jenkins 向 drone 迁移的时候,也陆陆续续遇到了一些问题。在这段时间,也完成了使用官方插件到插件定制的转变,使得 drone CI 流程更贴合我们 devops 开发流程。通过这篇文章总结一下目前我们对 drone 进行的一些定制化开发以及使用技巧,由于 drone 官方的文档不是很详细,所以也希望通过这种方法来和其他使用 drone 的用户分享和交流使用经验。

并行构建

在默认情况下,drone 会按照步骤执行,但是有时会遇到前后端在同一个 repo 的情况,这时使用并行构建就可以省去很多的构建时间。

构建流程:

在下面的示例里会展示一个如下流程:repo 中包含一个由 Java 写的服务以及一个 vue 前端项目,maven 构建和 npm 构建同时进行,maven 构建成功后会镜像 docker 镜像构建并上传镜像仓库,docker 构建成功后会镜像 k8s 部署,部署成功后会进行 vue 项目前端发布,在 k8s 部署成功并且前端发布成功后,进行钉钉构建成功同时,否则进行钉钉构建失败通知。

前端构建 ————————————          前端发布
                    \      /        \
                     \    /       钉钉通知
                      \  /          /
后端构建 —— 镜像构建 —— k8s部署 ——————

.drone.yml 配置

kind: "pipeline"
name: "default"
steps:
  - name: "Maven编译"
    image: "guoxudongdocker/drone-maven"
    commands:
      - "mvn clean install"
    depends_on: [ "clone" ]
  - name: "构建镜像"
    image: "guoxudongdocker/drone-docker"
    settings:
      username:
        from_secret: "docker_user"
      password:
        from_secret: "docker_pass"
      dockerfile: "Dockerfile"
      repo: "registry-vpc.cn-shanghai.aliyuncs.com/guoxudong/test"
      registry: "registry-vpc.cn-shanghai.aliyuncs.com"
      tags: "${DRONE_BUILD_NUMBER}"
    depends_on: [ "Maven编译" ]
  - name: "Kubernetes 部署"
    image: "guoxudongdocker/kubectl"
    settings:
      config: "deploy/overlays/uat"
      timeout: 300
      check: false
    depends_on: [ "构建镜像" ]
  - name: "前端构建"
    image: "guoxudongdocker/node-drone"
    commands:
      - "npm install"
      - "npm run build"
    depends_on: [ "clone" ]
  - name: "前端上传"
    image: "guoxudongdocker/node-drone"
    commands:
      - "do something"
    depends_on: [ "前端构建","Kubernetes 部署" ]
  - name: "钉钉通知"
    image: "guoxudongdocker/drone-dingtalk"
    settings:
      token:
        from_secret: "dingding"
      type: "markdown"
      message_color: true
      message_pic: true
      sha_link: true
    depends_on: [ "前端上传","Kubernetes 部署" ]
    when:
      status:
        - "failure"
        - "success"

多子项目构建

在使用 drone 中遇到的最大问题就是,我们有很多项目都是在一个 repo 中有很多子项目,而每个子项目都是 k8s 中的一个服务,这时一个 .drone.yml 文件很难把所有的服务都囊括。而又不想每个子项目拉一个分支管理,当前的模式就很不合适。

插件开发

针对这个问题,我们对 drone 进行了定制化开发,会在每次提交代码后,对新提交的代码和老代码进行比较,筛选出做了修改的子项目,然后对有修改的子项目尽心 CI ,其余的子项目则不进行发布。

而以上的方式仅适用于测试环境的快速迭代,生产环境则采用 tag 的模式,针对不同的子项目,打不同前缀的 tag ,比如子项目为 test1 ,则打 test1-v0.0.1 的 tag,就会对该子项目进行生产发布。

构建效果

  • 有修改的子项目
    image
  • 无修改的子项目
    image

Kubernetes 发布状态检查

之前的 Kubernetes 发布只是将服务发布到 Kubernetes 集群,并不管服务是否正常启动。针对这个问题以及我们的 Kubernetes 应用管理模式,我们开发了 drone 的 Kubernetes 发布插件,该插件包括 kubectlkustomizekubedog ,来完善我们的 Kubernetes 发布 step 。

.drone.yml

steps:
- name: Kubernetes 部署
  image: guoxudongdocker/kubectl
  volumes:
  - name: kube
    path: /root/.kube
  settings:
    check: false                 # 该参数为是否开启子模块检查
    config: deploy/overlays/uat  # 这里使用 kustomize ,详细使用方法请见 https://github.com/kubernetes-sigs/kustomize
    timeout: 300                 # kubedog 的检测超时
    name: {your-deployment-name} # 如果开启子模块检查则需要填入子模块名称

...

volumes:
- name: kube
  host:
    path: /tmp/cache/.kube  # kubeconfig 挂载位置

trigger:
  branch:
  - master  # 触发 CI 的分支

使用该插件会如果为测试构建,则会自动设置 docker 镜像 tag 为 DRONE_BUILD_NUMBER ;如果为生产构建(git tag),则叫自动设置 docker 镜像 tag 为 DRONE_TAG ,然后通过 kubectl apply -k . 进行部署,同时使用 kubedog 进行部署状态检查,如果服务正常启动则该 step 通过,如果超时或者部署报错则该 step 失败。

结语

根据我们目前的开发模式,对 drone 插件进行了全方位的开发。由于 dockerhub 的镜像拉取经常超时,则将镜像推送到了我们自己的镜像仓库;对钉钉通知也进行了优化;同时也根据我们目前的开发语言进行了插件的开发,提供了基于 Java 、Python 以及 Node.js 的 drone 插件,基本可以满足我们现在的 CI 需求,但随着 drone 的深入使用,越来越多的问题将会暴露出来。后续将会不断解决遇到的问题,持续优化。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Cloud Native 关系型数据库 程序员
使用Docker部署自动化CI/CD平台Drone
[Drone](https://drone.io) 是一个现代化的持续集成平台,能够使用强大的云原生管道引擎自动化他们的构建、测试和发布工作流程,让我们不再关注程序如何发布而是如何去实现,去更好的实现。
使用Docker部署自动化CI/CD平台Drone
|
4月前
|
存储 人工智能 Linux
阿里云/本地部署 OpenClaw +Ontology知识图谱配置,构建永久记忆AI助手,让AI真正记住你的一切
传统AI助手最大的短板是**失忆**,重启即忘、会话隔离、无法关联信息,只能做一次性应答。而OpenClaw通过Ontology知识图谱技能,实现了结构化、持久化、可关联、可查询的长期记忆,让AI从“被动聊天工具”升级为“懂你的私人智能助理”。知识图谱可以记录人物、项目、任务、事件、文档,并建立它们之间的关联,支持复杂检索、状态追踪、关系推理,彻底解决AI记不住、不会联、不能问的问题。本文完整讲解知识图谱的核心概念、安装配置、实体建模、指令语法、实战场景,并提供2026年阿里云部署、MacOS/Linux/Windows11本地部署流程,以及阿里云千问大模型API与免费Coding Plan
1358 0
|
9月前
|
缓存 前端开发 API
登录校验---Filter过滤器
Filter是JavaWeb三大组件之一,用于拦截请求并实现登录校验、编码处理等功能。通过`doFilter()`方法实现过滤逻辑,支持配置拦截路径与过滤器链。常用于JWT令牌验证、跨域处理等场景。
565 10
登录校验---Filter过滤器
|
SQL JavaScript 前端开发
Vue实现动态数据透视表(交叉表)
Vue实现动态数据透视表(交叉表)
618 13
|
存储 人工智能 Serverless
人生剧本模拟器?一键穿越,动画片里也有你!
通过AI技术,只需一张图片和几个关键词,即可生成以自己为主角的剧本并制作成动画片。这项技术简化了创作流程,降低了技术门槛,使每个人都能成为创作者。无论是创意故事、珍贵瞬间还是专属动画,所有人物和故事都由你定义。借助函数计算FC构建Web服务,结合百炼模型服务和ComfyUI工具,实现从剧本撰写到视频合成的一站式自动化流程。点击“阅读原文”参与活动,免费生成你的专属动画,还有礼物和互动奖励等你来拿!
651 11
|
JSON Java Shell
Dockerfile中RUN、CMD、ENTRYPOINT、SHELL命令的区别
理解这些指令的差异和应用场景,有助于构建高效、灵活且易于管理的Docker镜像。在实际应用中,根据需要选择合适的指令,可以有效地控制镜像构建和容器运行的行为。
1029 0
|
存储 SQL 关系型数据库
SELECT INTO
【11月更文挑战第08天】
721 2
|
运维 前端开发 中间件
Go 项目分层下的最佳 error 处理方式
本文对 Go 项目分层下的最佳 `error` 处理方式进行介绍,并通过使用 github.com/pkg/errors 库中的一些实用函数来提供实现示例。
385 1
Go 项目分层下的最佳 error 处理方式
|
vr&ar
AR和VR的光学结构分别是什么?
【6月更文挑战第25天】AR和VR的光学结构分别是什么?
1182 5
|
Ubuntu 关系型数据库 MySQL
Ubuntu系统本地搭建WordPress网站并发布公网实现远程访问
Ubuntu系统本地搭建WordPress网站并发布公网实现远程访问