7.3 CI/CD实训一

本节目标
本实训将指导你完成一个完整的 CI (持续集成) 基础流程。你将学习如何将一个现有的项目迁移到自己的 Gitea 仓库,然后配置 Drone,让它在每次代码提交时自动为你构建一个 Docker 镜像。这是自动化软件开发流程的第一步,也是 DevOps 的核心实践之一。

在开启自动化构建前,我们首先要做好准备工作。这包括将别人的项目“搬”到我们自己的地盘,并在自动化工具中“激活”它。

在团队协作中,我们常常需要在现有项目的基础上进行二次开发。第一步,就是将项目迁移到自己的代码仓库,这样可以自由修改,而不用担心影响到原始项目。

现在,打开你的 Gitea 平台,将 https://git.seahi.me/docker/pacman 这个项目迁移到你自己的账户下。

什么是项目迁移?
项目迁移就像是给别人的代码仓库拍了张完整的“快照”,不仅复制了所有文件,还保留了完整的提交历史(每一次修改记录)。迁移后,你就拥有了一个完全独立的副本,可以随心所欲地进行修改和实验。

项目迁移完成后,我们需要告诉持续集成工具 Drone 开始关注这个项目,这样,每当代码有更新,Drone 就能自动开始构建。

  1. 打开 Drone 平台。
  2. 在项目列表中找到你刚刚迁移的 pacman 项目。
  3. 点击 ACTIVATE (激活) 按钮。
在 Drone 中找不到项目?
如果在列表中没有看到 pacman 项目,别担心。点击页面右上角的 SYNC (同步) 按钮,Drone 就会从 Gitea 重新获取你的项目列表。

要在本地修改代码,我们得先把它从 Gitea 服务器上下载下来。这个过程叫做“克隆 (Clone)”。这里我们使用图形化 Git 工具 Sublime Merge 来完成操作。

  1. 在 Gitea 的 pacman 项目页面,复制项目的 URL 地址。
  2. 打开 Sublime Merge,在 Source URL (源地址) 栏中粘贴你复制的 URL。

复制这个网址填写到 Seblime Merge 中

将项目克隆到本地

技巧
Destination Path (目标路径) 是指项目文件夹在你电脑上的存放位置。你可以选择一个方便查找的目录,比如桌面 (Desktop) 或专门的项目文件夹。

克隆完成后,Sublime Merge 会自动打开这个项目,你可以清晰地看到项目的每一次提交记录、所有分支等信息。

pacman 项目

现在,代码已经在你的本地电脑上了。这个原始的 pacman 项目是一个纯前端游戏,我们的任务是让它“容器化”,也就是为它添加 Docker 支持。

在 Sublime Text 编辑器中,选择 File > Open Folder,然后找到并打开刚才克隆的 pacman 项目文件夹。

Dockerfile 告诉 Docker 如何一步步地构建我们的应用镜像。在项目根目录创建一个名为 Dockerfile 的文件。

Dockerfile文件

创建好 Dockerfile 后,我们需要将这个改动上传回 Gitea 服务器。在 Sublime Merge 中,遵循 Git 的标准三步曲:

  1. Stage (暂存):在 Unstaged Files 区域,点击 Dockerfile 文件旁的 Stage 按钮,表示“我准备提交这个文件的改动”。
  2. Commit (提交):在下方的提交信息框中,填写本次修改的说明,比如“feat: 添加 Dockerfile”,然后点击 Commit 按钮。
  3. Push (推送):点击工具栏上的 Push 按钮,将本地的提交上传到 Gitea 服务器。

代码推送了,然后呢?
代码上传到 Gitea 后,理论上 Drone 应该会立刻检测到代码变动,并自动开始构建。但你会发现,什么都没有发生。这是因为我们还没有告诉 Drone 如何去构建这个项目。别急,继续往下看!

现在,让我们回到 Gitea 和 Drone 的网页,你会发现推送代码后,Drone 并没有像我们预期的那样开始工作。这是因为它缺少一份“行动指南”——.drone.yml 配置文件。

在你的项目根目录(与 Dockerfile 同级)创建一个名为 .drone.yml 的文件。注意,文件名以一个点 . 开头。然后,将以下内容复制进去:

yaml

kind: pipeline # 定义这是一个流水线任务
type: docker   # 指定在 Docker 环境中执行
name: build    # 给这条流水线起个名字,比如 'build'

steps: # 定义具体的构建步骤
  # 步骤 1: 构建 Docker 镜像
  - name: 构建镜像
    image: plugins/docker # 使用官方提供的 Docker 插件
    settings:
      dockerfile: Dockerfile  # 指定 Dockerfile 的位置
      repo: stu/pacman        # 定义镜像的仓库名和名称
      tags: latest            # 为镜像打上 'latest' 标签
      # 开启 dry_run (演习) 模式,只构建,不推送到镜像仓库
      dry_run: true
配置文件解读
  • kind: pipeline: 定义这是一个流水线配置。
  • type: docker: 表示每个步骤都在一个临时的 Docker 容器中执行。
  • steps: 这里是构建的核心,可以包含一个或多个步骤,它们会按顺序执行。
  • image: plugins/docker: 这是 Drone 社区提供的插件,专门用来构建和推送 Docker 镜像。
  • settings: 针对这个插件的详细设置。
  • dry_run: true: 这是一个非常有用的“演习”模式。它会完整地执行构建过程,但不会在最后将镜像推送到仓库。这在调试配置文件时非常方便。

和之前一样,使用 Sublime Merge 将新创建的 .drone.yml 文件通过 StageCommitPush三步曲上传到 Gitea。

当你把 .drone.yml 推送上去后,Drone 会立刻开始构建。但你很可能会看到一个红色的失败标志。

构建状态

为什么会失败呢?

这是因为 Drone 在构建时,需要从网上下载基础镜像,但它无法使用我们为宿主机配置的国内镜像加速器 (Registry Mirror)。为了解决这个问题,我们需要在 .drone.yml 中明确告诉 Drone 使用哪个加速器。

修改 .drone.yml 文件,添加 mirror 配置:

yaml

kind: pipeline
type: docker
name: build

steps: 
  - name: 构建镜像
    image: plugins/docker 
    settings:
      dockerfile: Dockerfile
      repo: stu/pacman 
      tags: latest
      mirror: https://docker.seahi.me # 指定使用国内镜像加速器
      dry_run: true

再次提交并推送修改后的 .drone.yml 文件。这次,Drone 会再次自动触发构建,稍等片刻,你就会看到一个绿色的成功标志!

构建成功

至此,你已经成功搭建了一个基础的 CI (持续集成) 流程!每当你向 Gitea 推送新的代码,Drone 都会自动为你构建 Docker 镜像。

相关内容