中文
[CI/CD] 基于 Docker + Jenkins + Git Webhook 的 FastAPI 服务器自动部署总结

[CI/CD] 基于 Docker + Jenkins + Git Webhook 的 FastAPI 服务器自动部署总结

实现实战中的压缩与自动部署

内容整理中 > 截至 2023 年 5 月、第 1 次更新完成 关于部署的内容,建议参考整理得更好的第 2 篇。

序言

在当前进行的项目中,我正在构建一个利用 AI 模型提供输出的服务。

我原本想用 Firebase Cloud Function 来构建这一功能,但加载模型时由于使用 nodeJS + tensorflow.js 不得不转换模型,且其本身就比较重,导致不断超时等,被各种方式卡住,于是决定构建一个简单的服务器来返回 AI 模型的结果。

因此服务器的构建与部署便落到我身上,第一阶段目标是实现自动部署,之后的追加目标是用自己的手实现零停机部署。

本文仅涉及基于 AWS 等实例构建系统并实现自动部署为止的内容。

前置概念学习

CI: Continuous Integration (持续集成)

这是面向开发者的自动化流程,代码变更经过构建和测试后定期合并到共享仓库的过程,把这个过程自动化能够减少开发过程中的风险,因此被广泛采用

由 CI Server, Source Control Management, Build Tool, Test Tool 等组成

CD: Continuous Delivery / Deployment (持续交付 / 持续部署)

指部署自动化流程,通过对管线后续阶段的自动化,变更可以无须人工干预自动部署到 product。需要持续集成的支撑,构建可信赖的环境后甚至每天都能进行多次发布

由此可见,通过这种 CI/CD 过程,可以缩短产品上市的时间、提升人力效率,且都是渐进而持续的过程,因此能够降低出现重大问题的概率。

Docker 环境配置

  • 实例信息

没有使用 EC2 免费层,而是选择条件相对更好的 Oracle Cloud 免费层 分配并使用基于 arm64 的 Ampere A1 Compute 2 核与 12GB RAM

此外它也免费提供一定程度的备份等选项,可以参考!

我整理了自己参考过的资料,关于 Docker 安装过程和实例配置的文章很多,可以一边查阅一边配置 Docker。

Docker in Docker 配置 (失败 > 改用通过 API 的 Docker out of Docker 进行)

使用理由

在 Docker 之上再操作 Docker 的理由是为了通过容器来控制容器,从而让该容器拥有非常强的权限,虽然会带来安全风险,但本身仍然很有吸引力。

曾尝试的配置方法

1. 在 Docker 上构建 Jenkins 容器

首先在 Docker 中构建 Jenkins 容器。 使用 Docker Compose 可以更轻松地构建,可以参考。

docker pull jenkins/jenkins:lts

首先拉取 Jenkins LTS 版本的容器。

vim docker-compose.yml

通过此命令创建或打开 yml 文件。

version: "2.5.0" # 输入 compose 版本

services:

  jenkins:
    container_name: jenkins
    image: jenkins/jenkins:lts # 使用 Jenkins LTS 版本
    restart: always # 自动重启选项

    ports:
      - "8181:8080" # 把 host 的 8181 端口映射到 Jenkins 的 8080 端口

    volumes: # 通过此选项可以共享 host 的 volume
      - /home/opendocs/jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock

    user: root
    privileged: true # 实现 Docker In Docker 的关键选项

按示例代码所示在 yml 文件中写入所需内容。

docker-compose -f {文件名} up

通过此命令可以基于 docker-compose.yml 进行配置;若沿用 docker-compose.yml 作为文件名,则无需 -f 选项。具体内容请参考 Docker Compose Docs!

Docker Compose Documents

+ 不使用 sudo 操作 docker 的方法 → 把当前用户加入 Docker 组

# 通过此命令把当前用户加入 Docker 组
sudo usermod -aG docker $USER
2. Jenkins Container 配置
  1. 通过浏览器访问已配置 IP 上 Docker 分配的 Port Number
  2. 把 Jenkins 安装日志中的 key 输入到页面中
# 通过此命令可以查看容器日志
docker logs jenkins
  1. 安装推荐插件

可能会出现问题,但先把安装收尾,再处理后续问题。 不收尾的话,未安装插件造成的依赖错误会持续出现…

插件安装 Time Out 解决方法

  1. 安装 GitHub API Plugin

这是协助 Webhook 触发器工作的插件。安装吧。安装后把 Git ID/PW 注册为 Secret。

3. Github 配置
  1. 在 Settings 的 Developer Settings 中创建 Token。截至撰写本文,使用 Classic token,权限只需 repo, admin:repo_hook 即可。

  2. 在自动部署 Repo 的设置中向 Webhooks 添加 Webhook。大致设置为 http://{jenkins_url}/github-webhook/ 即可。去掉最后的 / 可能会有问题,老实地保留它吧。

4. Jenkins 项目配置
  1. 添加项目。

  2. 构建配置 - 在源代码管理选 Git 并选择已经注册的 Secret,就可以接收 webhook 信号。

  3. 必须选择 GitHub hook trigger for GITScm polling 选项,触发器才会工作。

  4. 视情况进行分支选定后完成配置并进行测试。

댓글 작성

게시글에 대한 의견을 남겨 주세요.

댓글 0