drone的简单使用

2023-10-26

(一)简介

Drone 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试、构建、发布。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。开发者只需在项目中包含 .drone.yml文件,将代码推送到 git 仓库,Drone就能够自动化的进行编译、测试、发布。可以与Docker完美集成。

drone官方文档

(二)持续部署概述

持续部署是能以自动化方式,频繁而且持续性的,将软件部署到生产环境。使软件产品能够快速迭代。

平常部署项目时,都是手动进行部署,流程如下

push代码到git
服务器上拉取代码
使用代码打包镜像
推送镜像仓库
服务器拉取新镜像
停止和移除旧容器
启动新容器

这一整套部署步骤枯燥又费时。持续部署就是使用工具自动处理整套步骤。代码在提交之后自动执行整套流程将项目部署到生产环境,省去繁琐的人工操作。

持续部署整套流程本质上是一个极其简单的东西。可以拆解为两个阶段

打包阶段: 拉取代码 —> 编译项目 —> 镜像打包 —> 推送镜像仓库
部署阶段: SSH 连接服务器 —> 拉取新镜像 —> 停止和移除旧容器 —> 启动新容器

未使用自动化部署工具时,也可以使用 shell脚本实现半自动化,下面就用drone实现上面的流程步骤

(三)drone的构成与安装

Drone 应用由 Server(服务器) 和 Runner(执行器) 两种服务构成。

Server(服务器) 主要负责管理和展示, Runner(执行器) 主要负责执行操作。Server服务,它是一个守护进程应用并且拥有Web管理界面。它通过Webhook对接Git Server。解析Git Repository根目录下的.drone.yml文件,并以轮询的形态查找需要执行的Pipelines,路由并管理Runners。Runner(执行器) 是真正执行持续部署操作服务

在安装drone前得先配置一下gitee仓库的权限 gitee配置示例,这里使用gitee仓库,你也可以使用gitlab,github等等,官方文档都有

在这里插入图片描述

需要注意的是按照官方文档里 应用回调地址 后面应该还要加上login(https://drone.example.com/login),点击创建成功后可以得到Client ID和Client Secret这个在创建drone server服务的时候需要

创建drone server服务

docker run \
  --volume=/root/docker/drone:/data \
  --env=DRONE_GITEE_CLIENT_ID=******* \
  --env=DRONE_GITEE_CLIENT_SECRET=*******\
  --env=DRONE_RPC_SECRET=5648b4b6160f75a1bf7b455ae8457be0 \
  --env=DRONE_SERVER_HOST=ip:port \
  --env=DRONE_SERVER_PROTO=http \
  --env=DRONE_USER_CREATE=username:你的gitee用户名,admin:true  \
  --publish=8888:80 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:2

DRONE_GITEE_CLIENT_ID :你的gitee Client ID
DRONE_GITEE_CLIENT_SECRET :你的gitee Client Secret
DRONE_RPC_SECRET:server与runner身份验证的共享密钥,用(openssl rand -hex 16)命令创建的一个密钥
DRONE_SERVER_HOST:drone server的ip和端口,域名也可以
DRONE_USER_CREATE:为drone创建管理员用户,这样在使用gitee第三方登陆时,用户就有了管理员的权限

创建runner服务

docker run --detach \
  --volume=/var/run/docker.sock:/var/run/docker.sock \
  --env=DRONE_RPC_PROTO=http \
  --env=DRONE_RPC_HOST=ip:port    \
  --env=DRONE_RPC_SECRET=5648b4b6160f75a1bf7b455ae8457be0 \
  --env=DRONE_RUNNER_CAPACITY=2   \
  --env=DRONE_RUNNER_NAME=my-first-runner \
  --publish=3000:3000 \
  --restart=always \
  --name=drone-runner \
  drone/drone-runner-docker:1

–volume=/var/run/docker.sock:/var/run/docker.sock 将docker守护进程的socket挂载到runner里,runnner既可以使用宿主机的docker资源了
DRONE_RPC_HOST:drone的server服务的ip和端口
DRONE_RUNNER_CAPACITY:runner可同时执行pipeline的数量,默认好像就是2
DRONE_RUNNER_NAME:docker runner 名称
–publish=3000:3000 这里映射这个端口的作用暂时还不清楚

创建完成后访问drone server的服务
在这里插入图片描述
点击登陆跳转到gitee登陆授权的页面
在这里插入图片描述
点击同意授权就会以gitee的用户名登陆drone,然后就可以看见自己在gitee上托管的仓库了
在这里插入图片描述
找到自己想自动化构建的仓库,然后点击激活
在这里插入图片描述
勾选Trusted选项,如果没有该选项可能是在创建drone server 服务是没有创建管理员用户导致的,该选项如果没有勾选的话可能会有权限问题
在这里插入图片描述

现在仓库就已经激活了,如果想取消drone自动构建,可以点击左下角的disable

(四)自动化构建逻辑编写

要实现docker runner帮我们自动化构建还有一个核心的步骤就是我们的git仓库的根目录下必须有一个.drone.yml文件,可以简单的理解为, .drone.yml 配置文件相当于一个 .sh 文件,自动化构建和部署的操作配置在这个文件中,交给 Drone runner执行。
gitee仓库链接

所以最核心的就是.drone.yml文件的编写,可以先整一个简单的yml文件

kind: pipeline  # kind 属性定义了对象的种类。此示例定义了一个管道对象。
type: docker    # type 属性定义管道的类型。此示例定义了一个 Docker 管道,其中每个管道步骤都在 Docker 容器内执行。
name: default   # name 属性定义了管道的名称。您可以为您的项目定义一个或多个管道

steps: # 步骤部分定义了一系列串行执行的管道步骤。如果管道中的任何步骤失败,管道将立即退出
  - name: greeting # name 属性定义管道步骤的名称
    image: alpine # image 属性定义了一个执行 shell 命令的 Docker 镜像。可以使用来自任何 DockerHub 中的任何 Docker镜像。
    commands: # commands 属性将在 Docker 容器内执行的 shell 命令列表定义为容器入口点。如果任何命令返回非零退出代码,则管道步骤将失败。
      - echo hello
      - echo world

上面kind定义了该文件是一个pipeline对象,也有其他类型,但自动化构建流程这里选择pipeline即可,type除了docker类型,还有ssh类型,就是使用ssh远程其他主机执行一些编译配置命令,还有exec类型,就是在当前runner主机上执行一些命令,上面文件只定义了一个pipeline流程,一个.drone.yml文件里可以定义多个pipeline它们相互独立,同时执行,但也可以绑定依赖关系,比如有a b两个pipeline,可以使用
depends_on配置参数让b pipeline在a pipeline后执行,并且pipeline还可以用trigger参数设置触发条件,比如说只有git tag改变时才执行某个pipeline等等 ,具体可以参考官方pipeline文档

回到上面的配置文件,每一个pipeline 可以有多个steps,steps之间按照顺序执行,有一个出错就会中断整个pipeline的执行流程,这里的流程是先拉取 git仓库里最新代码(这一步是默认的),然后拉取对应的docker镜像,然后运行docker镜像,并以commands里的命令覆盖docker images的entrypoint,当下一次push代码时,就可以看到如下构建过程

在这里插入图片描述
在这里插入图片描述

下面的配置文件先构建docker镜像推送到docker仓库,然后使用webhook通知,通知过后部署docker服务,然后再使用webhook进行通知
这里使用webhook通知将信息发送到钉钉群组里,webhook本质上就是发送post请求,所以这里使用一个curl的docker镜像发送webhook通知

kind: pipeline  # kind 属性定义了对象的种类。此示例定义了一个管道对象。
type: docker    # type 属性定义管道的类型。此示例定义了一个 Docker 管道,其中每个管道步骤都在 Docker 容器内执行。
name: default   # name 属性定义了管道的名称。您可以为您的项目定义一个或多个管道

steps: # 步骤部分定义了一系列串行执行的管道步骤。如果管道中的任何步骤失败,管道将立即退出
  - name: 构建docker镜像
    image: plugins/docker
    settings:
      repo: bocai123/nginx_demo
      auto_tag: true
      dockerfile: ./Dockerfile
      username:
        from_secret: docker_username
      password:
        from_secret: docker_password
  - name: 镜像构建完成通知 # name 属性定义管道步骤的名称
    image: curlimages/curl # image 属性定义了一个执行 shell 命令的 Docker 镜像。您可以使用来自任何 DockerHub 中的任何 Docker镜像。
    environment:
      message: 镜像构建完成通知
      webhook_url:
         from_secret: webhook_url
    commands: # commands 属性将在 Docker 容器内执行的 shell 命令列表定义为容器入口点。如果任何命令返回非零退出代码,则管道步骤将失败。
      - ./notify.sh #通知脚本
    when:
      status: #成功与失败都会执行该步骤
        - success
        - failure
  - name: 部署
    image: appleboy/drone-ssh
    settings:
      host: #远程连接的host ip
        from_secret: host
      username: #用户名
        from_secret: username
      password: #密码
        from_secret: password
      port: 22
      script: #部署执行动的命令
        - echo ====开始部署=======
        - docker rm -f nginx_demo
        - docker pull bocai123/nginx_demo
        - docker run --rm -d --name nginx_demo -p 7777:80  bocai123/nginx_demo
        - echo ====部署成功======
  - name: 部署完成通知 # name 属性定义管道步骤的名称
    image: curlimages/curl # image 属性定义了一个执行 shell 命令的 Docker 镜像。您可以使用来自任何 DockerHub 中的任何 Docker镜像。
    environment:
      message: 部署完成通知
      webhook_url:
        from_secret: webhook_url
    commands: # commands 属性将在 Docker 容器内执行的 shell 命令列表定义为容器入口点。如果任何命令返回非零退出代码,则管道步骤将失败。
      - ./notify.sh #通知脚本
    when:
      status: #成功与失败都会执行该步骤
        - success
        - failure

配置文件中from_secret就是在web管理页面配置的键值
在这里插入图片描述

下面是该配置文件对应的构建过程
在这里插入图片描述
钉钉也获取到了通知

(五)结语

至此一个简单的自动化构流程就完成了,drone还有很多酷炫的操作,比如多pipeline配置以trigger的使用等等,如果有什么错误的地方,还请大家批评指正。最后,希望小伙伴们都能有所收获。写这些,仅记录自己学习使用drone的过程
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

drone的简单使用 的相关文章

随机推荐

  • ipv6 socket bind 失败 - accept_dad

    file proc sys net ipv6 conf interface accept dad variable net ipv6 conf interface accept dad Official reference Whether
  • 阿里一面:讲一讲 Spring、SpringMVC、SpringBoot、SpringCloud 之间的关系?

    大家好 我是Tom哥 搞后端开发的同学 对 Spring 家族一定不陌生 Spring 全家桶了为了解决不同场景的问题 逐渐演化出多套生态环框 如 Spring SpringMVC SpringBoot SpringCloud 它们之间的关
  • 区块链原理与应用(一)

    1 什么是区块链 mermaid svg z62l3eavYilXMK3m label font family trebuchet ms verdana arial font family var mermaid font family f
  • 【ML】2023 年面向初学者的十大机器学习项目

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • elementUI 的 table 表格改变数据不更新问题

    预期效果 点击输入框旁边的图标 输入框变为可输入状态 这里控制输入的 editable 字段不是 data 原有的属性 也不是 data 赋值时就存在的字段 问题原因 在 Vue 实例创建时 以及 data 赋值时 editable 并未声
  • 随机从数组或集合中抽取一个值或 从list集合中随机抽几个值 或算权重

    直接上代码 package cn itcast jk util import java util Arrays import java util HashSet import java util Map import java util S
  • Xilinx-FPGA关于BUFFER(时钟/普通IO信号)的使用总结

    目录 前言 一 时钟BUFFER使用总结 二 普通IO输出时钟信号时的推荐方法 使用ODDR 前言 Xilinx FPGA开发过程中 关于时钟信号和普通IO信号引入FPGA内部需要遵循一定的使用方法 现在自己一年多使用过的内容做一个总结 也
  • springmvc request与response获取

    request与response是Tomcat服务器在收到客户端请求后自己生成的 无需我们自己创建 但是在使用的时候可以有以下三种方式去获取 1 Controller直接使用 方法上直接使用 通过DispatcherServlet将参数传到
  • linux 查看当前系统时间,并实时刷新

    使用watch命令 周期性的执行一个命令 并全屏显示 watch n 1 date即可 每1秒刷新date命令 格式 watch option command watch n 1 date n interval 表示每n秒执行date n最
  • nodejs中使用数据库逆向映射字段

    安装依赖 在搭建项目时 一般都是先创建数据库 在使用服务去访问数据 但是由于数据库的映射非常麻烦 导致需要书写大量的映射文件 对于nodejs 这里提出一个逆向工程 本文使用的是mysql数据库 首先安装 npm init 先初始化项目 n
  • java实现具有修饰的完美圣诞树

    A 有咋样的实力可以写出这个代码 B 会for循环就好 A 只要会for就好 B 还有一点点逻辑能力和算法 package 海绵hong import java util Scanner public class text9 public
  • Linux下errno所代表的含义

    errno记录系统的最后一次错误代码 是一个int型 在errno h中定义 以下程序用于输出errno所代表的含义 0 133有意义 其余的属于未定义 include
  • 向ftp上传文件失败的可能原因

    1 文件编码问题引起 现象 上传含有中文符号的文件会上传失败 解决方法 将文件名中的中文符号修改为英文符号即可上传成功 如果上传的文件名中没有中文符号也失败 可以试试将文件名修改为短一点的 如 11 待上传成功后再修改文件名称 2 ftp服
  • 油猴脚本编写教程

    油猴脚本 Tampermonkey 是一个非常流行的浏览器扩展 它可以运行由广大社区编写的扩展脚本 来实现各式各样的功能 常见的去广告 修改样式文件 甚至是下载视频 今天我们就来看看如何编写自己的油猴脚本 当然为了运行油猴脚本 你应该在浏览
  • 在web项目启动时,执行某个方法

    在web项目启动时 执行某个方法 在web项目中有很多时候需要在项目启动时就执行一些方法 而且只需要执行一次 比如 加载解析自定义的配置文件 初始化数据库信息等等 在项目启动时就直接执行一些方法 可以减少很多繁琐的操作 在工作中遇到了项目初
  • 【计算机网络】物理层:数据通信系统模型

    一个数据通信系统可划分三大部分 发送方 源系统 发送端 传输系统 传输网络 接受方 接受端 目的系统 发送方包括 源点 源点设备产生要传输的数据 发送器 源点生成的数字比特流要通过发送器编码后才能够在传输系统中传输 典型的发送器是调制器 接
  • 文档在线预览解决方案——openoffice转换

    文档在线预览是一个复杂功能 文档格式的繁复更加增加了难度 虽然office给出了在线预览功能 https products office com en us office online view office documents onlin
  • C++基础——运算符重载函数讲解与练习

    目录 前言 一 运算符重载 1 定义 2 函数名字为 3 函数原型 练习 对比两个日期类对象是否相等 函数重载 练习 对比两个日期类对象 gt gt 的运算符重载函数 对于小于 小于等于 不等于的函数重载如下 练习 日期类对象 天数的重载函
  • 图像的读取,显示与保存(基于skimage模块)

    一 skiamge模块 skimage包的全称是scikit image SciKit toolkit for SciPy 它对scipy ndimage进行了扩展 提供了更多的图片处理功能 它是由python语言编写的 由scipy 社区
  • drone的简单使用

    一 简介 Drone 是一个基于Docker容器技术的可扩展的持续集成引擎 用于自动化测试 构建 发布 每个构建都在一个临时的Docker容器中执行 使开发人员能够完全控制其构建环境并保证隔离 开发者只需在项目中包含 drone yml文件