Drone与 Github整合

Drone

Drone CI/CD是一个开源的持续集成和持续交付/部署(CI/CD)平台,它使用Docker容器来运行构建和测试任务。Drone可以轻松地与GitHub,GitLab,Bitbucket等代码托管服务集成,以自动化构建,测试和部署应用程序。

Drone的工作流程基于pipeline(流水线),可以定义一系列任务(如编译,测试和部署),这些任务可以根据需求进行调整和组合。在任务完成之后,Drone可以自动地将应用程序部署到预定的环境中,例如开发环境、测试环境和生产环境。

Drone的另一个特点是它的可扩展性和灵活性。Drone的构建和测试任务使用Docker容器运行,这使得开发人员可以使用他们喜欢的任何工具和语言来构建应用程序。Drone还允许开发人员创建自定义插件,以实现对特定工具或服务的集成,从而提高平台的灵活性。

本文介绍如何为 GitHub 安装 Drone 服务器。Drone服务器被打包为一个最小的 Docker 镜像,分布在 DockerHub 上。

准备

提供一个实例

Drone 服务器应该安装在服务器或虚拟机(使用您选择的云提供商)上,并打开标准的 http 和 https 端口。 该实例必须可通过域名或IP地址公开访问,才能从 GitHub 接收 webhook。

在您的笔记本电脑上安装 Drone 服务器进行测试时,我们建议使用 ngrok等服务为您的 Drone 服务器提供可公开访问的域名。

创建一个 OAuth 应用程序

创建 GitHub OAuth 应用程序。Consumer Key 和 Consumer Secret 用于授权访问 GitHub 资源。

应用创建 应用程序视图

创建共享密钥

创建一个共享密钥来验证跑步者和您的中央无人机服务器之间的通信。

您可以使用 openssl 生成共享密钥:

$ openssl rand -hex 16 
bea26a2221fd8090ea38720fc445eca6 

下载

Drone 服务器作为轻量级 Docker 镜像分发。 该图像是独立的,没有任何外部依赖性。 最新的标签将确保最新版本的无人机。

$ docker pull drone/drone:2

配置

Drone 服务器是使用环境变量配置的。本文引用了配置选项的子集,定义如下。 请参阅 配置。有关配置选项的完整列表,

  • DRONE_GITHUB_CLIENT_ID`:必需的字符串值提供您在上一步中生成的 GitHub oauth 客户端 ID。
  • DRONE_GITHUB_CLIENT_SECRET:必需的字符串值提供您在上一步中生成的 GitHub oauth Client Secret。
  • DRONE_RPC_SECRET:必需的字符串值提供了在上一步中生成的共享密钥。 这用于验证服务器和运行器之间的 rpc 连接。 服务器和运行器必须提供相同的秘密值。
  • DRONE_SERVER_HOST:必需的字符串值提供您的外部主机名或 IP 地址。如果使用 IP 地址,您可以包括端口。例如 drone.company.com
  • DRONE_SERVER_PROTO:所需的字符串值提供您的外部协议方案。此值应设置为 http 或 https。如果您配置 ssl 或 acme,则此字段默认为 https。 则应将此值设置为 “https” 。如果您将 Drone 部署在负载均衡器或具有 SSL 终止的反向代理之后,
  • DRONE_USER_FILTER:可选的逗号分隔的 GitHub 用户或组织列表。注册仅限于此列表中的用户,或作为此列表中组织成员的用户。如果未设置此值,则注册向公众开放。

启动服务器

可以使用以下命令启动服务器容器。 容器是通过环境变量配置的。 有关配置参数的完整列表,请参阅配置参考。

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITHUB_CLIENT_ID=your-id \
  --env=DRONE_GITHUB_CLIENT_SECRET=super-duper-secret \
  --env=DRONE_RPC_SECRET=super-duper-secret \
  --env=DRONE_SERVER_HOST=drone.company.com \
  --env=DRONE_SERVER_PROTO=https \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:2

安装运行器

一旦您的服务器启动并运行,您将需要安装运行器来执行您的构建管道。 有关详细的安装说明,请参阅我们的运行器安装文档。

Docker runner 被打包为最小的 Docker 镜像,分布在 DockerHub 上,可用于以下架构:

  • amd64
  • arm
  • arm64

下载

拉取公共镜像:

$ docker pull drone/drone-runner-docker:1

配置

Docker 运行器是使用环境变量配置的。本文引用了以下配置选项。 有关配置选项的完整列表,请参阅Configuration

  • DRONE_RPC_HOST : 提供 Drone 服务器的主机名(和可选端口)。runner 连接到主机地址的服务器以接收执行的管道。

  • DRONE_RPC_PROTO : 提供用于连接到您的Drone服务器的协议。该值必须是 http 或 https。

  • DRONE_RPC_SECRET : 提供用于与您的Drone服务器进行身份验证的共享密钥。这必须与您的Drone服务器配置中定义的秘密相匹配。

安装

下面的命令创建一个容器并启动Docker运行器。 请记住用您的Drone服务器详细信息替换下面的环境变量。

docker run --detach \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--env=DRONE_RPC_PROTO=https \
--env=DRONE_RPC_HOST=drone.company.com \
--env=DRONE_RPC_SECRET=super-duper-secret \
--env=DRONE_RUNNER_CAPACITY=2 \
--env=DRONE_RUNNER_NAME=my-first-runner \
--publish=3000:3000 \
--restart=always \
--name=runner \
drone/drone-runner-docker:1

验证

使用 docker logs 命令查看日志并验证 runner 是否成功建立了与 Drone 服务器的连接。

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

docker-compose

docker-compose

version: "3.9"
networks:
    apps:
        driver: bridge
        ipam:
            driver: default
            config:
                -   subnet: 172.0.0.0/24
                    gateway: 172.0.0.254

services:
    drone:
        image: drone/drone:2
        container_name: drone
        restart: always
        volumes:
            - ./app/drone/:/data
        env_file:
            - drone-server.env
        networks:
            apps:
                ipv4_address: 172.0.0.1
    drone-runner:
        image: drone/drone-runner-docker:1
        container_name: drone-runner
        restart: always
        env_file:
            - drone-runner.env
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - /usr/bin/docker:/usr/bin/docker
        networks:
            apps:
                ipv4_address: 172.0.0.2

drone-runner.env

DRONE_RPC_PROTO=http
DRONE_RPC_HOST=172.0.0.1
DRONE_RPC_SECRET=drone-sc-123456
DRONE_RUNNER_CAPACITY=2
DRONE_RUNNER_NAME=runner001

drone-server.env

DRONE_AGENTS_ENABLED=true
DRONE_GITHUB_CLIENT_ID=your-id
DRONE_GITHUB_CLIENT_SECRET=super-duper-secret
DRONE_RPC_SECRET=super-duper-secret
DRONE_RPC_SECRET=drone-sc-123456
DRONE_SERVER_HOST=172.0.0.1
DRONE_SERVER_PROTO=http
DRONE_USER_CREATE=username:dronename,admin:true