7.2 自动化构建(Drone)

系列 - 自动化构建与持续集成
摘要
本实验将带你学习如何使用 Drone 实现自动化构建和持续集成。Drone 是一个基于容器的持续集成平台,可以帮助开发团队自动化构建、测试和部署应用程序。通过本实验,你将学会如何配置 Drone 与 Gitea 集成,实现代码提交后的自动构建、部署和通知。

在开始配置 Drone 之前,我们需要先在 Gitea 中创建一个 OAuth 应用,以便 Drone 能够通过 Gitea 进行身份验证。

1、打开上节课部署的 Gitea,默认网址是 ip:3000

技巧
如果你忘记了 Gitea 的地址,可以通过 docker ps 命令查看 Gitea 容器的端口映射情况。

2、点击右上角头像,进入设置页面

Gitea设置入口

3、在选项卡中进入【应用】,划到最下方,填写信息:

应用名称:drone
重定向URL:http://ip:7929/login

警告
请将 ip 替换为你自己服务器的 IP 地址,这非常重要!否则 Drone 将无法正常工作。

创建Gitea应用

4、点击【创建应用】,在新页面中复制并保存好客户端ID和客户端密钥

保存客户端ID和密钥

危险
客户端ID和密钥是敏感信息,请妥善保管!这些信息将在后续配置 Drone 时使用,一旦泄露可能导致安全风险。

现在我们开始部署 Drone 服务。Drone 由三个主要组件组成:数据库、服务器和运行器。

1、创建项目目录

bash

mkdir /srv/drone

2、创建 Docker Compose 配置文件

bash

cd /srv/drone
vim docker-compose.yml

文件内容如下:

yml

version: '3.9'

networks:
  drone:

volumes:
  drone:
  
services:
  # 共有三个服务,分别是db、server和runner
  db:
    image: postgres:latest
    restart: always
    networks:
      - drone 
    ports:
      - '7931:5432'
    environment:
      # 下面这三个环境变量用来控制数据库初始化时:创建用户和密码、创建数据库
      - POSTGRES_USER=drone # 用户
      - POSTGRES_PASSWORD=drone # 密码
      - POSTGRES_DB=drone # 数据库
    volumes:
      - drone/db:/var/lib/postgresql/data

  server:
    image: drone/drone:2
    restart: always
    networks:
      - drone 
    ports:
      - '7929:80'
    environment:
      # 访问协议 
      - DRONE_SERVER_PROTO=http  
      # 主机名称(域名或IP),改成自己的IP地址(需要修改)
      - DRONE_SERVER_HOST=10.0.0.225:7929 
      # 与runner通讯的密钥, 可以用openssl生成
      - DRONE_RPC_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009 
      # 创建管理员账户,用户名和Gitea用户名需要一致(需要修改)
      - DRONE_USER_CREATE=username:password,admin:true 
      - DRONE_DATABASE_DRIVER=postgres # 数据库类型
      - DRONE_DATABASE_DATASOURCE=postgres://drone:drone@db/drone?sslmode=disable # 数据库连接
      - DRONE_GIT_ALWAYS_AUTH=true # 使用oauth身份验证信息拉取代码
      - DRONE_GITEA_SERVER=http://10.0.0.225:3000 # gitea服务器地址(需要修改)
      - DRONE_GITEA_CLIENT_ID=c0790745-9db8-4ba8-80f6-c1f60d48b3db # gitea 客户端ID(需要修改)
      - DRONE_GITEA_CLIENT_SECRET=gto_gflojyryvu6v5fujaj6nqfa6gd44i4msh3xgwvgmg7dpuqesga5a # gitea 客户端密钥(需要修改)
      - DRONE_GITEA_SKIP_VERIFY=false 

    volumes:
      - drone/data:/data
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - db
      
  runner:
    image: drone/drone-runner-docker:1.8.3 
    restart: always
    networks:
      - drone 
    ports:
      - '7930:3000'
    environment:
      # 名称
      - DRONE_RUNNER_NAME=docker-runner
      - DRONE_RUNNER_CAPACITY=10 # 限制runner可执行的并发管道数量 默认为2
      - DRONE_RPC_PROTO=http # 访问drone server 协议
      - DRONE_RPC_HOST=10.0.0.225:7929 # 访问drone server 服务器地址(需要修改)
      # 与 drone server 通讯的密钥, 需与上面Server的 DRONE_RPC_SECRET 值相同
      - DRONE_RPC_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009 
      - DRONE_UI_USERNAME=username # Drone Runner 的 UI 用户账号(需要修改)
      - DRONE_UI_PASSWORD=password # Drone Runner 的 UI 用户密码(需要修改)
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
    depends_on:
      - server

3、启动 Drone 服务

使用 Docker Compose 启动所有服务:

bash

docker compose up -d

验证服务是否运行成功:

bash

docker compose ps

如果所有服务都显示为 running 状态,说明部署成功:

Drone服务运行状态

技巧
如果服务没有正常启动,可以使用 docker compose logs 命令查看详细日志,找出问题所在。

4、登录 Drone 并进行配置

打开浏览器,访问 http://你的IP地址:7929

Drone登录界面

信息
首次访问 Drone 时,会自动跳转到 Gitea 进行授权。授权成功后,会返回到 Drone 界面,并显示你在 Gitea 上的仓库列表。

点击 Continue 自动跳转到 gitea 的授权页面,点击【应用授权】

出现以下页面的话,填写一些用户信息:

1、安装完成后,出现以下页面

点击右上角的SYNC(同步),页面中会出现我们托管到 gitea 的项目。

项目列表

点击该项目的名称,出现Active(激活)页面,点击按钮进行激活

激活项目

2、回到 gitea 的项目页面,点击右侧的【设置】

从左侧菜单找到【Web钩子】,可以发现 drone 已经做好了相应设置:

安全警告

Gitea 出于安全考虑,默认情况下不允许随意调用其他位置的 Web Hooks,因为这些调用过程中会向目标位置发送大量敏感信息。

以下配置仅适用于教学环境,绝对不要在生产环境中使用这样的配置

如果在使用过程中遇到 Webhook 调用失败的问题,可以通过以下步骤临时调整 Gitea 的安全设置:

1、打开 Gitea 的配置文件:

bash

vim /etc/gitea/app.ini

2、在文件末尾添加以下内容,允许所有主机接收 Webhook:

ini

[webhook]  
ALLOWED_HOST_LIST = *

3、重启 Gitea 服务使配置生效:

bash

# 重启服务
systemctl restart gitea
# 检查服务状态
systemctl status gitea

Gitea服务状态

生产环境建议

在生产环境中,应该明确指定允许接收 Webhook 的主机列表,而不是使用通配符。例如:

ini

[webhook]
ALLOWED_HOST_LIST = 192.168.1.100,drone.example.com

这样可以大大降低安全风险。

相关内容