雨停江南 發表於 2022-9-21 16:19:00

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

<p>Drone 是一个使用 Go 语言编写的自助式的持续集成平台,和 Gitea 一样可以完全基于容器部署,轻松扩展流水线规模。开发者只需要将持续集成过程通过简单的 YAML 语法写入 Gitea 仓库目录下的描述文件 <code>.drone.yml</code> 就可以完成 CI/CD 配置。</p>
<p>下面,我们以 <code>gitea.com</code> 服务器为例,搭建一套使用 Gitea 与 Drone 的 CI/CD 系统。</p>
<h2 id="系统结构">系统结构</h2>
<p>Drone 由两部分构成:</p>
<ul>
<li>
<dl>
<dt>Server</dt>
<dd>负责任务调度</dd>
</dl>
</li>
<li>
<dl>
<dt>Runner</dt>
<dd>执行 Pipeline 的具体任务</dd>
</dl>
</li>
</ul>
<p>用户将代码推送到 Gitea 时触发 Webhook,调动 Drone 从 Gitea 拉取最新的代码并根据 .drone.yml 描述文件执行 CI/CD 流水线。<br>
<img src="https://img2022.cnblogs.com/blog/2956540/202209/2956540-20220920131322349-395401470.png" alt="" loading="lazy"></p>
<h3 id="网络结构">网络结构</h3>
<p>由于 CI/CD 任务的特殊性,工作繁忙时会占用较多的系统资源,因此为了提高系统整体可靠性,不建议将 Gitea、Drone Server、Drone Runner 安装在同一台服务器上。</p>
<ul>
<li>在本地局域网搭建时应该确保以上服务可以通过域名、IP互相访问。例如:<pre><code>gitea.example.com-&gt;192.168.3.10
drone.example.com-&gt;192.168.3.20
runner.example.com -&gt;192.168.3.30
</code></pre>
</li>
<li>
<dl>
<dt>如需使用 <code>docker compose</code> 在本地开发环境搭建高可用结构系统,请参考官方文档:</dt>
<dd>https://docs.drone.io/server/ha/developer-setup/</dd>
</dl>
</li>
</ul>
<h2 id="准备工作">准备工作</h2>
<h3 id="在-gitea-上创建-oauth2-应用程序">在 Gitea 上创建 OAuth2 应用程序</h3>
<p>在本例中,Drone 基于 OAuth2 认证授权访问您的 Gitea API。您可以创建一个专用于 CI/CD 的账号,并将该账号添加为代码仓库协作者或者组织管理员。</p>
<p>首先,登录一个您要用于集成 Drone 的 Gitea 账号,进入 <strong>设置 - 应用</strong>,创建一个 Gitea OAuth2 应用程序。</p>
<ul>
<li>
<dl>
<dt><strong>应用名称</strong></dt>
<dd>您可以任取一个名字,此案例中我们填写 Drone</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>重定向 URL</strong></dt>
<dd>授权回调 URL 形如 <code>http(s)://&lt;YOUR_DRONE_SERVER&gt;:&lt;PORT&gt;/login</code>,必须使用您设定的 Drone 服务器协议和主机地址。如果使用非标准的HTTP(S)端口,还应该指定准确的端口。</dd>
<dd>例如 <code>https://drone.gitea.io/login</code></dd>
</dl>
</li>
</ul>
<p><img src="https://img2022.cnblogs.com/blog/2956540/202209/2956540-20220920110905494-239199575.jpg" alt="创建 OAuth2 应用" loading="lazy"></p>
<p><img src="https://img2022.cnblogs.com/blog/2956540/202209/2956540-20220920111046641-974560620.jpg" alt="编辑 OAuth2 应用" loading="lazy"></p>
<h3 id="修改-gitea-服务器的-webhook-白名单">修改 Gitea 服务器的 Webhook 白名单</h3>
<p>出于安全考虑,Gitea 默认禁止触发外部主机的 Webhook。您可以将外部主机添加到 <code>webhook.ALLOWED_HOST_LIST</code> 白名单来解除这一限制。具体信息参考文档 Webhook。</p>
<p>修改配置时,打开 <code>conf/app.ini</code>,添加 <code>ALLOWED_HOST_LIST = *</code> 到 <code></code> 栏目中,并重启 Gitea 服务器。例如:</p>
<pre><code class="language-ini">
ALLOWED_HOST_LIST = *
</code></pre>
<h3 id="创建共享密钥">创建共享密钥</h3>
<p>共享密钥用于 Drone Server 和 Drone Runner 之间的通信认证。记录下您创建的共享密钥,稍后在安装 Drone Server 和 Drone Runner 时将使用此密钥填充环境变量 <code>DRONE_RPC_SECRET</code>。</p>
<p>您可以使用 OpenSSL 生成随机的十六进制共享密钥:</p>
<pre><code class="language-bash">$ openssl rand -hex 16
c5704bc389f1e3d47f1c4751d1295c86
</code></pre>
<h2 id="使用-docker-安装-drone-服务器">使用 Docker 安装 Drone 服务器</h2>
<blockquote>
<p>关于 Docker Engine 的安装,请参考官方文档 Install Docker Engine。</p>
</blockquote>
<p>Drone 服务器是一个轻量级的 Docker 容器,使用 SQLite 作为默认数据库,支持通过环境变量动态设定运行参数。有关配置参数的完整列表,请参阅 Drone Server 文档。</p>
<h3 id="环境变量">环境变量</h3>
<ul>
<li>
<dl>
<dt><strong>DRONE_GITEA_CLIENT_ID</strong></dt>
<dd>(必填)您的 Gitea OAuth 客户端ID</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_GITEA_CLIENT_SECRET</strong></dt>
<dd>(必填)您的 Gitea OAuth 客户端密钥</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_GITEA_SERVER</strong></dt>
<dd>(必填)您的 Gitea 服务器地址,例如 <code>https://gitea.com</code>。注意填写准确的 <code>http(s)</code> 协议,否则您会看到来自 Gitea 的错误报告:<code>unsupported protocol scheme</code>。</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_RPC_SECRET</strong></dt>
<dd>(必填)在准备工作中使用 <code>openssl rand -hex 16</code> 生成的共享密钥。这个密钥用于验证 Drone Server 和 Runner 之间的 RPC 连接。因此,在 Server 和 Runner 上都必须使用相同的密钥。</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_SERVER_HOST</strong></dt>
<dd>(必填)您访问 Drone 时所用的域名或 IP 地址。如果使用 IP 地址,还应该包含端口。 例如 <code>drone.gitea.io</code>。</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_SERVER_PROTO</strong></dt>
<dd>(必填)设置服务器的协议,使用:<code>http</code> 或 <code>https</code>。 如果您已经配置 ssl 或 acme,此字段默认为 <code>https</code>。</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_USER_CREATE</strong></dt>
<dd>(可选)指定某个用户为管理员,例如:<code>username:john,admin:true</code>。参考文档 Administrators,管理员有权管理其他帐户、编辑仓库库详细信息、编辑仓库信任标志、访问受限制的 API。</dd>
</dl>
</li>
</ul>
<h3 id="启动服务器">启动服务器</h3>
<p>为了便于修改容器参数,我们创建一个 <code>docker-compose.yml</code> 模板来配置 Drone 服务器容器。</p>
<p>根据下面的 Docker Compose 模板,使用命令 <code>docker compose up -d</code> 启动 Drone 服务器。</p>
<pre><code class="language-yml"># 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
</code></pre>
<h2 id="使用-docker-安装-drone-runner">使用 Docker 安装 Drone Runner</h2>
<p>Drone 服务器管理 CI/CD 系统的调度,而 Drone Runner 则是 CI/CD 流水线的执行者。</p>
<h3 id="环境准备">环境准备</h3>
<p>Drone Runner 支持多种运行环境:Doceker、K8s、Windows/Linux/MacOS客户端、SSH 等。</p>
<p>使用 Docker 作为 Drone Runner 的好处是可以将流水线执行过程完全以容器化的方式执行,不对容器的宿主服务器环境造成破坏。在本实践中,我们依然使用 Docker 在 Linux 服务器上安装 Drone Runner。Docker 容器支持的架构包括:</p>
<ul>
<li>amd64</li>
<li>arm</li>
<li>arm64</li>
</ul>
<h3 id="环境变量-1">环境变量</h3>
<p>Docker Runner 使用环境变量动态设定运行参数。有关参数的完整列表,请参阅 Drone Runner 文档。</p>
<ul>
<li>
<dl>
<dt><strong>DRONE_RPC_HOST</strong></dt>
<dd>填写 Drone Server 的主机名(以及可选填的端口号)。基于 PRC 协议连接 Runner 与 Server,接收流水线任务</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_RPC_PROTO</strong></dt>
<dd>传输协议:<code>http</code> 或 <code>https</code></dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_RPC_SECRET</strong></dt>
<dd>与 Drone Server 共享的密钥</dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_RUNNER_CAPACITY</strong></dt>
<dd>Runner 可以并发执行的流水线数量,默认:<code>2</code></dd>
</dl>
</li>
<li>
<dl>
<dt><strong>DRONE_RUNNER_NAME</strong></dt>
<dd>自定义 Runner 名称</dd>
</dl>
</li>
</ul>
<h3 id="启动-runner">启动 Runner</h3>
<p>根据下面的 Docker Compose 模板,使用命令 <code>docker compose up -d</code> 启动 Drone Runner。</p>
<pre><code class="language-yml">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
</code></pre>
<h3 id="验证安装">验证安装</h3>
<p>使用 <code>docker logs</code> 命令查看日志,并验证 Runner 程序是否与 Drone Server 建立连接。</p>
<pre><code class="language-bash">$ docker logs runner

INFO starting the server
INFO successfully pinged the remote server
</code></pre>
<h2 id="初始化-drone">初始化 Drone</h2>
<p>登录 Drone 网页面板,例如 <code>https://drone.gitea.io</code>,点击 <code>continue</code> 跳转到 Gitea 授权页面,点击<strong>应用授权</strong>。</p>
<blockquote>
<p>如果出现 <strong>Unregistered Redirect URI</strong>,表示您设置的<strong>重定向 URI</strong>与 Drone 不匹配,请重新检查。</p>
</blockquote>
<p><img src="https://img2022.cnblogs.com/blog/2956540/202209/2956540-20220920115519753-1146614566.png" alt="" loading="lazy"><br>
<img src="https://img2022.cnblogs.com/blog/2956540/202209/2956540-20220920115532205-1539030682.png" alt="" loading="lazy"></p>
<h2 id="cicd-实操创建-droneyml-验证-pipeline">CI/CD 实操:创建 .drone.yml 验证 Pipeline</h2>
<p>Drone 文档为各种编程语言和包管理工具提供了流水线模板。</p>
<blockquote>
<p>https://docs.drone.io/pipeline/docker/examples/</p>
</blockquote>
<p>这里我们以 Go 语言为例,在 Gitea 仓库根目录创建一个 <code>.drone.yml</code> 作为我们自定义的流水线。</p>
<p><img src="https://img2022.cnblogs.com/blog/2956540/202209/2956540-20220920120840880-915347598.png" alt=".drone.yml" loading="lazy"></p>
<p>示范:</p>
<pre><code class="language-yml"># .drone.yml
kind: pipeline
name: default

steps:
- name: test
image: golang
commands:
- go test

- name: build
image: golang
commands:
- go build
</code></pre>
<p>在 Drone 面板上激活仓库后提交代码到 Gitea 仓库,随即触发 Pipeline 任务。</p>
<p><img src="https://img2022.cnblogs.com/blog/2956540/202209/2956540-20220920120609519-1075082240.jpg" alt="" loading="lazy"></p>
<p>回到 Gitea 可以看到构建完成后显示的消息:</p>
<pre><code>✔ continuous-integration/drone/push Build is passing
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2956540/202209/2956540-20220920120011729-849477881.png" alt="" loading="lazy"></p>
<p>Ok,这样我们就为 Gitea 搭建好了一个 Drone CI/CD 系统。</p>
<p>原文链接 :https://www.cnblogs.com/Gitea/p/drone.html</p><br><br>
来源:https://www.cnblogs.com/Gitea/p/drone.html
頁: [1]
查看完整版本: Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统