使用 GitHub Actions 与 Docker 实现 CaptchaVision API 持续集成

使用 GitHub Actions 与 Docker 实现 CaptchaVision API 持续集成

本文详细讲解如何利用 GitHub Actions 自动化工作流,配合 Docker 容器化技术,将基于 CaptchaVision 项目的 AI 验证码识别服务持续集成并推送到 阿里云容器镜像服务(ACR)

前言

持续集成(CI)是现代软件开发的关键实践。通过 GitHub Actions,我们可以在代码推送到仓库时,自动完成 构建镜像、登录仓库、推送镜像 等繁琐步骤。

  • 项目基础: 本文以 github.com/abining/Cap... 开源项目为例,该项目通常包含一个用于 AI 识别和图像预处理的 Python 服务。
  • 目标工作流: 提交代码到 main 分支 → GitHub Actions 自动构建 Docker 镜像 → 镜像推送至阿里云 ACR。

第一步:环境与机密信息配置

为了让 GitHub Actions 能够自动登录阿里云 ACR 并使用您的仓库信息,我们需要在 GitHub 中配置机密信息(Secrets)。

1. 存储阿里云凭证和仓库信息

我们将机密信息分为两类:

  • 存储库机密 (Repository Secrets): 适用于整个仓库。

    • REPO_NAME: 镜像仓库名称,例如 captcha_vision
  • 环境机密 (Environment Secrets): 专用于部署环境,安全性更高。

在 GitHub 仓库中,进入 SettingsSecuritySecrets and variablesActions

密钥名称 类型 存储值示例 用途
ALI_DOCKER_HUB_REGISTRY 环境机密 crpi-<hashstring>.cn-hangzhou.personal.cr.aliyuncs.com 阿里云 ACR 区域 Registry 地址。
ALI_DOCKER_HUB_USN 环境机密 您的阿里云用户名 登录阿里云 ACR 的用户名。
ALI_DOCKER_HUB_PWD 环境机密 您的阿里云密码或访问令牌 登录阿里云 ACR 的密码/令牌。
REPO_NAME 存储库机密 captcha_vision 用于构建 tags 的镜像仓库名称。

⚠️ 注意: 您的机密信息(如 ALI_DOCKER_HUB_PWDALI_DOCKER_HUB_USN)被关联到名为 ALI_DOCKER_HUB_REGISTRY环境 。因此,在 YAML 中我们必须指定 environment: ALI_DOCKER_HUB_REGISTRY 才能解锁这些机密。

2. 创建阿里云镜像仓库

在阿里云控制台cr.console.aliyun.com/cn-hangzhou... 进行以下操作:

  • 访问 容器镜像服务 (Container Registry)。
  • 进入 实例/仓库管理 ,创建新的镜像仓库(例如,命名为 chouvelgis/captchavision)。
  • 将代码源设置为手动上传 ,并记录您的 Registry 地址

💻 第二步:编写 GitHub Actions 工作流文件

在项目根目录下创建 .github/workflows/deploy.yml 文件。以下是您的部署脚本,它将实现自动构建、登录、推送的完整 CI 过程。

YAML 复制代码
# 工作流程名称
name: Docker 部署 CaptchaVision API

# 触发条件:当代码推送到 main 分支时触发工作流
on:
  push:
    branches:
      - main

# 工作流程作业
jobs:
  deploy:
    runs-on: ubuntu-latest
    # 关键步骤:指定环境,以解锁环境机密(ALI_DOCKER_HUB_USN/PWD)
    environment: ALI_DOCKER_HUB_REGISTRY
    
    steps:
      # 1. 迁出代码
      - name: 迁出代码
        uses: actions/checkout@v4

      # 2. 设置 Docker Buildx (用于高效构建和缓存)
      - name: 设置 Docker Buildx
        uses: docker/setup-buildx-action@v3

      # 3. 登录到阿里云容器镜像服务 (使用环境机密)
      - name: 登录到阿里云容器镜像服务
        uses: docker/login-action@v3
        with:
          registry: ${{ secrets.ALI_DOCKER_HUB_REGISTRY }}
          username: ${{ secrets.ALI_DOCKER_HUB_USN }}
          password: ${{ secrets.ALI_DOCKER_HUB_PWD }}

      # 4.构建并推送 Docker 镜像
      - name: 构建并推送 Docker 镜像
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: |
            ${{ secrets.ALI_DOCKER_HUB_REGISTRY }}/chouvelgis/${{ secrets.REPO_NAME }}:latest
            ${{ secrets.ALI_DOCKER_HUB_REGISTRY }}/chouvelgis/${{ secrets.REPO_NAME }}:${{ github.sha }}
            ${{ secrets.ALI_DOCKER_HUB_REGISTRY }}/chouvelgis/${{ secrets.REPO_NAME }}:v${{ github.run_number }}
          cache-from: type=gha # 从 GHA 缓存中拉取历史构建层
          cache-to: type=gha,mode=max # 推送新的构建层到 GHA 缓存

      # 5. 部署完成通知
      - name: 部署完成
        run: echo "Docker 部署完成,镜像已推送到 Aliyun ACR!"

📈 第三步:查看工作流日志与后续部署

1. 查看工作流日志

代码提交到 main 分支后:

  1. 进入 GitHub 仓库的 Actions 菜单。
  2. 找到名为 Docker 部署 CaptchaVision API 的工作流。
  3. 点击查看日志,所有步骤(如"登录到阿里云容器镜像服务"、"构建并推送 Docker 镜像")都应显示绿色勾选(✅)。

2. 部署到服务器(CD)

一旦镜像推送成功,您的 CI 任务就完成了。接下来的 CD(持续部署)需要在您的目标服务器上执行。

在服务器终端,使用以下命令拉取并启动最新的容器:

直接去cr.console.aliyun.com/cn-hangzhou... 控制台,找到对应镜像仓库,查看相关文档即可拉取镜像。如果使用阿里云的ECS,可以使用镜像仓库内网地址,加快速度。

bash 复制代码
# 假设您已登录阿里云 ACR

# 停止并移除旧容器 (如果存在)
docker stop captchavision-api
docker rm captchavision-api

# 拉取最新的镜像 (使用 latest 标签)
docker pull ${{ secrets.ALI_DOCKER_HUB_REGISTRY }}/chouvelgis/${{ secrets.REPO_NAME }}:latest

# 启动容器 (注意:如果应用需要 API Key,请在运行时注入 -e 参数)
docker run -d \
  -p 8011:8011 \
  --name=captchavision-api \
  -e GEMINI_API_KEY="您的Gemini API Key" \
  ${{ secrets.ALI_DOCKER_HUB_REGISTRY }}/chouvelgis/${{ secrets.REPO_NAME }}:latest

总结

通过这一套流程,您实现了从代码提交到镜像推送的完全自动化,极大地提高了开发效率和部署一致性。

相关推荐
智慧物业老杨39 分钟前
物业绿化数智化权责管控方案:基于工单平台的双层权限追溯模块落地实践
python
Metaphor6921 小时前
使用 Python 在 Word 文档中添加批注
python·word
FreakStudio1 小时前
WIZnet 开源方案分享:W55MH32 开发板 + 小智 AI实现以太网版本的小智机器人
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
会周易的程序员2 小时前
使用 pybind11 封装 C++ 日志库 microLog 为 Python 模块
java·c++·python·物联网·架构·日志·aiot
一只专注api接口开发的技术猿2 小时前
电商评论自动化监控与情感数据分析完整落地教程(附可直接运行 Python 代码)
大数据·数据库·python·数据分析·自动化
HAPPY酷2 小时前
【ROS2】 Conda 环境搭建(命令行版)
linux·运维·python·ubuntu·机器人·conda
柒和远方3 小时前
LeetCode 4. 寻找两个正序数组的中位数 —— 二分划分的艺术
javascript·python·算法
学也学不废4 小时前
Flask问答系统与LAUR模型
人工智能·python·机器学习·分类·数据挖掘
lewis_lk4 小时前
uv: Python 新一代极速包管理工具
python
promising_xxx5 小时前
深度学习个人开源知识库 深度筑基 | DeepBase
人工智能·python·深度学习·计算机视觉·ai·语言模型·nlp