使用 Drone CI 部署私有 DevOps 环境

Drone CI 是一款开源持续集成工具,相较 Jenkins 提供了简易的部署方法和轻量级的功能,结合 Git 服务器可以在性能较低的单机环境下部署私有 DevOps 环境,支持公有云自动缩放(Amazon EC2,Google Cloud,Digital Ocean 等),对于小型团队或个人来说是一种不错的选择。

Drone CI 的官方文档中指出,基于网络复杂性的考虑,在单机运行 Drone CI 与 Gitea 是不受支持的,而实际上 Gitea、Drone CI、Drone Runner 是可以部署在同一台机器上。

本文以 Docker 的方式部署 Drone:

  • 部署 Drone CI
  • 部署 Drone Runner
  • 构建 Docker 镜像并上传到 Docker 仓库

需要你提前配置好坏境或对此有所了解,本文不包含以下步骤:

  • 安装 Docker
  • 安装 Gitea
  • 配置 HTTPS 反向代理服务器

最终你将得到:

部署 Drone CI

首先,需要一个已经安装好的并配备 HTTPS 反向代理的 Gitea 服务器。

  1. 打开 Gitea 服务器中的 设置 -> 应用 -> 创建新的 OAuth2 应用程序
  2. 在应用名称中填写 Drone
  3. 在重定向 URI 中填写 https://drone.example.com/login

此后你将得到:

  • 客户端 ID(DRONE_GITEA_CLIENT_ID)
  • 客户端密钥(DRONE_GITEA_CLIENT_SECRET)

还需要一个用于 Drone CI 与 Drone Runner 的通信密钥 DRONE_RPC_SECRET,通过 OpenSSL 生成 16 位长的随机文本:

openssl rand -hex 16

当然,你也可以随意设置这个密钥。

得到这些基本信息后,就可以开始部署 Drone CI 的 Docker 镜像,需要注意的是 Drone_GITEA_CLIENT_SERET 一般情况下是以等号(=)结尾的,在 Shell 环境下部署需要在其前面加上用以转义的反斜杠(\),并使用 DRONE_TLS_AUTOCERT 禁用容器内的自动 Lets Encrypt 证书申请。

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_AGENTS_ENABLED=true \
  --env=DRONE_TLS_AUTOCERT=false \
  --env=DRONE_GITEA_SERVER=https://git.example.com \
  --env=DRONE_GITEA_CLIENT_ID=d1dcee0d-a6dc-42e0-bd14-6c8e2182491b \
  --env=DRONE_GITEA_CLIENT_SECRET=Uq_bCRulazf48BGdkk7Xectm7GbI0g64SMqc9m1gYV0\= \
  --env=DRONE_RPC_SECRET=9c2a555969e7866edb8e4f237c30eae6 \
  --env=DRONE_SERVER_HOST=drone.example.com \
  --env=DRONE_SERVER_PROTO=https \
  --publish=3001:80 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:latest

在这里将容器提供 HTTP 服务的 80 端口映射到主机的 3001 端口,或者将 3001 替换为其他自定义端口,随后可以通过配置 HTTPS 反向代理服务器来公开这个地址。

部署 Drone Runner

Drone Docker Runner 的部署极为简单,允许部署在多台机器上,调整两个参数即可。

  • DRONE_RPC_HOST
  • DRONE_RPC_SECRET

默认情况下,单个 Drone Runner 的 Piplines 并发数是 2,你可以根据服务器的配置情况调整 DRONE_RUNNER_CAPACITY 参数。

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=https \
  -e DRONE_RPC_HOST=drone.example.com \
  -e DRONE_RPC_SECRET=9c2a555969e7866edb8e4f237c30eae6 \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=${HOSTNAME} \
  -p 3000:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:latest

构建 Docker 镜像并上传到 Docker 仓库

登录 Drone 的控制界面后会跳转到 Gitea 申请授权,在 Drone 的界面中启用项目。

首先构思一个希望达成的自动化功能:

  • pypy 环境
  • 安装 Pipenv
  • 通过 Pipenv 安装项目依赖
  • 自动上传到私有 Registry

Dockerfile:

FROM pypy:latest

WORKDIR /app

COPY Pipfile .
COPY Pipfile.lock .

RUN pip install pipenv
RUN pipenv install --skip-lock

COPY . .

CMD ["pipenv", "run", "python", "app.py"]

Drone 的 plugins/docker 插件提供了 Docker 构建功能,构建出的镜像上传到 Docker Hub 或私有 Docker Registry,例如阿里云提供免费的 Docker Registry 托管。

Drone 的项目默认配置文件名是 .drone.yml。

.drone.yml:

kind: pipeline
name: default

steps:
  - name: docker
    image: plugins/docker
    settings:
      repo: registry.cn-beijing.aliyuncs.com/example/example
      registry: registry.cn-beijing.aliyuncs.com
      username:
        from_secret: docker_username
      password:
        from_secret: docker_password

使用 Drone Secrets 功能,可以避免在日志中输出密码,在 Drone 的仓库界面中添加 docker_username 与 docker_password。

向项目提交代码后即可查看自动化构建日志。

已有 4 条评论
    地瓜
    2019 年 12 月 31 日 14:23 回复

    赞啊,牛逼

    地瓜
    2019 年 12 月 31 日 14:29 回复

    为啥打游戏一年被删了

    jelly
    2020 年 12 月 17 日 13:57 回复

    doker 的存储路径我修改为/data 下了,但是plugins/docker默认 去找 /var/lib/docker,这个有什么办法嘛

      2020 年 12 月 19 日 05:20 回复

      文档里似乎没有提到这种修改的解决办法,可能不支持。

发表评论