• Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统


    Drone 是一个使用 Go 语言编写的自助式的持续集成平台,和 Gitea 一样可以完全基于容器部署,轻松扩展流水线规模。开发者只需要将持续集成过程通过简单的 YAML 语法写入 Gitea 仓库目录下的描述文件 .drone.yml 就可以完成 CI/CD 配置。

    下面,我们以 gitea.com 服务器为例,搭建一套使用 Gitea 与 Drone 的 CI/CD 系统。

    系统结构

    Drone 由两部分构成:

    • Server
      负责任务调度
    • Runner
      执行 Pipeline 的具体任务

    用户将代码推送到 Gitea 时触发 Webhook,调动 Drone 从 Gitea 拉取最新的代码并根据 .drone.yml 描述文件执行 CI/CD 流水线。

    网络结构

    由于 CI/CD 任务的特殊性,工作繁忙时会占用较多的系统资源,因此为了提高系统整体可靠性,不建议将 Gitea、Drone Server、Drone Runner 安装在同一台服务器上。

    • 在本地局域网搭建时应该确保以上服务可以通过域名、IP互相访问。例如:
      gitea.example.com  ->  192.168.3.10
      drone.example.com  ->  192.168.3.20
      runner.example.com ->  192.168.3.30
      
    • 如需使用 docker compose 在本地开发环境搭建高可用结构系统,请参考官方文档:
      https://docs.drone.io/server/ha/developer-setup/

    准备工作

    在 Gitea 上创建 OAuth2 应用程序

    在本例中,Drone 基于 OAuth2 认证授权访问您的 Gitea API。您可以创建一个专用于 CI/CD 的账号,并将该账号添加为代码仓库协作者或者组织管理员。

    首先,登录一个您要用于集成 Drone 的 Gitea 账号,进入 设置 - 应用,创建一个 Gitea OAuth2 应用程序。

    • 应用名称
      您可以任取一个名字,此案例中我们填写 Drone
    • 重定向 URL
      授权回调 URL 形如 http(s)://:/login,必须使用您设定的 Drone 服务器协议和主机地址。如果使用非标准的HTTP(S)端口,还应该指定准确的端口。
      例如 https://drone.gitea.io/login

    创建 OAuth2 应用

    编辑 OAuth2 应用

    修改 Gitea 服务器的 Webhook 白名单

    出于安全考虑,Gitea 默认禁止触发外部主机的 Webhook。您可以将外部主机添加到 webhook.ALLOWED_HOST_LIST 白名单来解除这一限制。具体信息参考文档 Webhook

    修改配置时,打开 conf/app.ini,添加 ALLOWED_HOST_LIST = *[webhook] 栏目中,并重启 Gitea 服务器。例如:

    [webhook]
    ALLOWED_HOST_LIST = *
    

    创建共享密钥

    共享密钥用于 Drone Server 和 Drone Runner 之间的通信认证。记录下您创建的共享密钥,稍后在安装 Drone Server 和 Drone Runner 时将使用此密钥填充环境变量 DRONE_RPC_SECRET

    您可以使用 OpenSSL 生成随机的十六进制共享密钥:

    $ openssl rand -hex 16
    c5704bc389f1e3d47f1c4751d1295c86
    

    使用 Docker 安装 Drone 服务器

    关于 Docker Engine 的安装,请参考官方文档 Install Docker Engine

    Drone 服务器是一个轻量级的 Docker 容器,使用 SQLite 作为默认数据库,支持通过环境变量动态设定运行参数。有关配置参数的完整列表,请参阅 Drone Server 文档

    环境变量

    • DRONE_GITEA_CLIENT_ID
      (必填)您的 Gitea OAuth 客户端ID
    • DRONE_GITEA_CLIENT_SECRET
      (必填)您的 Gitea OAuth 客户端密钥
    • DRONE_GITEA_SERVER
      (必填)您的 Gitea 服务器地址,例如 https://gitea.com。注意填写准确的 http(s) 协议,否则您会看到来自 Gitea 的错误报告:unsupported protocol scheme
    • DRONE_RPC_SECRET
      (必填)在准备工作中使用 openssl rand -hex 16 生成的共享密钥。这个密钥用于验证 Drone Server 和 Runner 之间的 RPC 连接。因此,在 Server 和 Runner 上都必须使用相同的密钥。
    • DRONE_SERVER_HOST
      (必填)您访问 Drone 时所用的域名或 IP 地址。如果使用 IP 地址,还应该包含端口。 例如 drone.gitea.io
    • DRONE_SERVER_PROTO
      (必填)设置服务器的协议,使用:httphttps。 如果您已经配置 ssl 或 acme,此字段默认为 https
    • DRONE_USER_CREATE
      (可选)指定某个用户为管理员,例如:username:john,admin:true。参考文档 Administrators,管理员有权管理其他帐户、编辑仓库库详细信息、编辑仓库信任标志、访问受限制的 API。

    启动服务器

    为了便于修改容器参数,我们创建一个 docker-compose.yml 模板来配置 Drone 服务器容器。

    根据下面的 Docker Compose 模板,使用命令 docker compose up -d 启动 Drone 服务器。

    # docker-compose.yml
    version: "3"
    
    services:
      drone:
        image: drone/drone:2
        container_name: drone
        environment:
          - DRONE_GITEA_SERVER=https://gitea.com
          - DRONE_GITEA_CLIENT_ID=change-to-your-gitea-client-id
          - DRONE_GITEA_CLIENT_SECRET=change-to-your-gitea-client-secret
          - DRONE_RPC_SECRET=change-to-your-shared-secret
          - DRONE_SERVER_HOST=drone.gitea.io
          - DRONE_SERVER_PROTO=https
        restart: always
        volumes:
          - ./drone:/data
        ports:
          - 80:80
          - 443:443
    

    使用 Docker 安装 Drone Runner

    Drone 服务器管理 CI/CD 系统的调度,而 Drone Runner 则是 CI/CD 流水线的执行者。

    环境准备

    Drone Runner 支持多种运行环境:Doceker、K8s、Windows/Linux/MacOS客户端、SSH 等。

    使用 Docker 作为 Drone Runner 的好处是可以将流水线执行过程完全以容器化的方式执行,不对容器的宿主服务器环境造成破坏。在本实践中,我们依然使用 Docker 在 Linux 服务器上安装 Drone Runner。Docker 容器支持的架构包括:

    • amd64
    • arm
    • arm64

    环境变量

    Docker Runner 使用环境变量动态设定运行参数。有关参数的完整列表,请参阅 Drone Runner 文档

    • DRONE_RPC_HOST
      填写 Drone Server 的主机名(以及可选填的端口号)。基于 PRC 协议连接 Runner 与 Server,接收流水线任务
    • DRONE_RPC_PROTO
      传输协议:httphttps
    • DRONE_RPC_SECRET
      与 Drone Server 共享的密钥
    • DRONE_RUNNER_CAPACITY
      Runner 可以并发执行的流水线数量,默认:2
    • DRONE_RUNNER_NAME
      自定义 Runner 名称

    启动 Runner

    根据下面的 Docker Compose 模板,使用命令 docker compose up -d 启动 Drone Runner。

    version: "3"
    
    services:
      runner:
        image: drone/drone-runner-docker:1
        container_name: runner
        environment:
          - DRONE_RPC_PROTO=https
          - DRONE_RPC_HOST=drone.gitea.io
          - DRONE_RPC_SECRET=change-to-your-shared-secret
          - DRONE_RUNNER_CAPACITY=2
          - DRONE_RUNNER_NAME=my-first-runner
        restart: always
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        ports:
          - 3000:3000
    

    验证安装

    使用 docker logs 命令查看日志,并验证 Runner 程序是否与 Drone Server 建立连接。

    $ docker logs runner
    
    INFO[0000] starting the server
    INFO[0000] successfully pinged the remote server 
    

    初始化 Drone

    登录 Drone 网页面板,例如 https://drone.gitea.io,点击 continue 跳转到 Gitea 授权页面,点击应用授权

    如果出现 Unregistered Redirect URI,表示您设置的重定向 URI与 Drone 不匹配,请重新检查。


    CI/CD 实操:创建 .drone.yml 验证 Pipeline

    Drone 文档为各种编程语言和包管理工具提供了流水线模板。

    https://docs.drone.io/pipeline/docker/examples/

    这里我们以 Go 语言为例,在 Gitea 仓库根目录创建一个 .drone.yml 作为我们自定义的流水线。

    .drone.yml

    示范:

    # .drone.yml
    kind: pipeline
    name: default
    
    steps:
    - name: test
      image: golang
      commands:
      - go test
    
    - name: build
      image: golang
      commands:
      - go build
    

    在 Drone 面板上激活仓库后提交代码到 Gitea 仓库,随即触发 Pipeline 任务。

    回到 Gitea 可以看到构建完成后显示的消息:

    ✔ continuous-integration/drone/push Build is passing
    

    Ok,这样我们就为 Gitea 搭建好了一个 Drone CI/CD 系统。

    原文链接 :https://www.cnblogs.com/Gitea/p/drone.html

  • 相关阅读:
    Java 进阶多线程(二)
    企业工程项目管理系统源码-专注项目数字化管理-Java工程管理
    86.(cesium之家)cesium叠加面接收阴影效果(gltf模型)
    java毕业设计仓库管理系统mybatis+源码+调试部署+系统+数据库+lw
    【Linux开发基础知识】Makefile语法
    Leetcode刷题——单链表2
    用Calendar代替SimpleDateFormat
    【web-解析目标】(1.1.2)解析内容和功能:页面与功能路径逻辑图
    安装docker版elasticsearch和kibana
    数学建模学习笔记(10):因子分析法
  • 原文地址:https://www.cnblogs.com/Gitea/p/drone.html