• drone的简单使用


    (一)简介

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    –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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上面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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

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

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

    在这里插入图片描述

    (五)结语

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

  • 相关阅读:
    感知SOTA模型
    js常见面试题
    std::thread简单使用
    Facebook耐用号养成攻略!如何实现自动化高效养号
    医学影像归档与通讯系统(PACS)系统源码 PACS三维图像后处理技术
    JAVA基础算法(11)----- 最大二叉树
    山海鲸大屏:驱动医药零售智能化变革
    腾讯云网站备案详细流程_审核时间说明
    MyBatis Plus 实现获取自动生成主键值的方法
    matlab问题求解答
  • 原文地址:https://blog.csdn.net/weixin_43810267/article/details/132663009