GitHub原生DevOps全链路实战:从代码提交到生产部署的自动化闭环

GitHub原生DevOps全链路实战:从代码提交到生产部署的自动化闭环

引言

在DevOps工具链百花齐放的今天,GitHub早已超越了单纯的代码托管平台,演变为一个覆盖"需求-开发-测试-构建-部署-监控"全生命周期的原生DevOps生态。对于大多数团队而言,无需搭建复杂的Jenkins集群,也无需维护多套工具之间的集成,仅依靠GitHub原生能力就能构建出一套高效、稳定、安全的自动化流水线。

本文将以一个前端全栈项目为例,完整还原从开发者提交代码到生产环境部署的全流程,深入讲解每个环节的最佳实践。特别地,我们将重点解析2024年最受关注的MCP(Model Context Protocol)协议 如何将AI能力无缝融入DevOps流水线,以及GitHub Skills如何实现团队流水线能力的沉淀与复用。

一、GitHub DevOps生态全景:为什么选择原生工具链

1.1 GitHub原生DevOps工具链图谱

GitHub DevOps生态是一个高度协同的整体,各个工具之间天然打通,无需复杂的第三方集成:

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                        GitHub DevOps 生态                        │
├─────────────┬─────────────┬─────────────┬─────────────────────┤
│  需求管理   │  代码管理   │  自动化     │  部署与运维         │
│             │             │             │                     │
│ Issues      │ Git         │ Actions     │ Pages               │
│ Projects    │ PR/MR       │ Runners     │ Vercel/Netlify集成  │
│ Discussions │ Code Review │ Workflows   │ GitHub Packages     │
│ Milestones  │ CodeQL      │ Artifacts   │ Kubernetes集成      │
│             │ Dependabot  │ Secrets     │ Environments        │
├─────────────┴─────────────┴─────────────┤                     │
│  开发环境   │ Codespaces                │                     │
│  安全       │ Advanced Security         │                     │
│  监控       │ Insights                  │                     │
└─────────────────────────────────────────┴─────────────────────┘

1.2 与主流CI/CD工具对比

特性 GitHub Actions GitLab CI Jenkins CircleCI
与代码托管集成 原生无缝 原生无缝 需插件 良好
配置复杂度
维护成本 0(托管版) 中(自托管) 0(托管版)
生态丰富度 极高(10万+Actions) 极高(插件)
免费额度 2000分钟/月 400分钟/月 2500分钟/月
企业级功能 丰富 更丰富 最丰富 一般
AI集成 原生支持Copilot+MCP 一般 需插件 一般

最佳实践:

  • 开源项目:优先选择GitHub原生生态,免费额度充足,社区生态最好
  • 中小型企业:GitHub Team版完全满足需求,无需自托管任何工具
  • 大型企业:可采用GitHub Enterprise+自托管Runner的混合模式,兼顾安全性与灵活性

1.3 完整自动化闭环流程

一个标准的GitHub DevOps工作流如下:

复制代码
开发者提交代码 → 自动触发PR检查 → 代码审查通过 → 合并到main分支
    ↓
自动触发CI流水线 → 运行测试 → 构建产物 → 质量门禁检查
    ↓
自动部署到测试环境 → 自动化验收测试
    ↓
人工审批 → 部署到生产环境 → 自动监控告警

二、代码提交阶段:把问题拦截在最早期

代码提交阶段是质量管控的第一道防线,通过"本地预检查+云端自动校验"的双重机制,可以将80%以上的低级问题拦截在代码合并之前。

2.1 本地预检查:Git Hooks + Husky

本地预检查在开发者提交代码时自动运行,能够在问题产生的第一时间发现并修复,避免将问题代码推送到远程仓库。

完整配置示例:

  1. 安装依赖
bash 复制代码
npm install husky lint-staged prettier eslint @commitlint/cli @commitlint/config-conventional --save-dev
  1. 初始化Husky
bash 复制代码
npx husky install
npx husky add .husky/pre-commit "npx lint-staged"
npx husky add .husky/commit-msg "npx commitlint --edit $1"
  1. 配置package.json
json 复制代码
{
  "lint-staged": {
    "*.{js,ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{json,md}": ["prettier --write"]
  },
  "commitlint": {
    "extends": ["@commitlint/config-conventional"]
  }
}

2.2 PR自动校验:GitHub Actions预提交检查

即使开发者绕过了本地检查,云端的PR自动校验也会作为第二道防线。当开发者创建PR时,GitHub Actions会自动运行代码检查、类型检查和单元测试,只有所有检查通过才能合并。

pr-check.yml工作流示例:

yaml 复制代码
name: PR Check

on:
  pull_request:
    branches: [main]
    types: [opened, synchronize, reopened]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm run lint
      - run: npm run type-check

  test:
    runs-on: ubuntu-latest
    needs: lint
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm run test:unit

2.3 代码安全与依赖管理

GitHub提供了原生的安全扫描工具,可以自动发现代码中的安全漏洞和过时依赖:

  • CodeQL:静态代码分析工具,支持20+编程语言,能发现SQL注入、XSS等常见安全漏洞
  • Dependabot:自动监控依赖更新,发现漏洞时自动创建PR升级依赖
  • Secret Scanning:扫描代码中意外提交的密钥、令牌等敏感信息

实战踩坑:

  • 不要在CI中运行耗时过长的任务,PR检查应该在5分钟内完成,否则会严重影响开发效率
  • 避免将lint错误设置为警告,所有不符合规范的代码都应该被阻止合并
  • 不要禁用Dependabot,过时依赖是最大的安全隐患之一

最佳实践:

  • 配置分支保护规则,要求所有PR必须通过CI检查和至少1个代码审查才能合并
  • 开启自动合并功能,当所有检查通过后自动合并PR
  • 定期运行CodeQL全量扫描,至少每周一次

三、自动化测试体系:在GitHub Actions中落地测试金字塔

测试是CI/CD流水线的核心,没有可靠的测试,自动化部署就是一句空话。我们将按照测试金字塔的理念,在GitHub Actions中构建一个分层的自动化测试体系。

3.1 测试金字塔在GitHub中的实现

复制代码
          /\
         /  \
        /    \    E2E测试(Playwright):核心用户流程,10-20个用例
       /      \
      /--------\
     /          \   集成测试:API接口测试,覆盖主要业务场景
    /------------\
   /              \  单元测试:核心业务逻辑,覆盖率≥80%
  /----------------\
 /                  \
----------------------

3.2 单元测试:Vitest + Codecov

单元测试是测试金字塔的基础,运行速度快,能够快速发现代码中的逻辑错误。

完整工作流配置:

yaml 复制代码
name: Unit Test

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  unit-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm run test:unit -- --coverage
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          fail_ci_if_error: true

3.3 E2E测试:Playwright最佳实践

E2E测试模拟真实用户的操作,能够发现单元测试和集成测试无法发现的问题。Playwright是目前最优秀的E2E测试框架,支持多浏览器、自动等待、截图录制等功能。

GitHub Actions中Playwright配置:

yaml 复制代码
e2e-test:
  runs-on: ubuntu-latest
  needs: unit-test
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: '20'
        cache: 'npm'
    - run: npm ci
    - name: Install Playwright browsers
      run: npx playwright install --with-deps
    - name: Run Playwright tests
      run: npm run test:e2e
    - name: Upload test results
      if: always()
      uses: actions/upload-artifact@v4
      with:
        name: playwright-report
        path: playwright-report/
        retention-days: 30

性能优化技巧:

  • 开启测试并行执行:npx playwright test --workers 4
  • 缓存Playwright浏览器二进制文件
  • 只运行变更相关的测试用例
  • 将E2E测试拆分为多个Job并行运行

3.4 质量门禁:SonarQube集成

SonarQube是最流行的代码质量分析平台,可以对代码质量进行全面的评估,包括代码重复率、复杂度、测试覆盖率、安全漏洞等。

SonarQube与GitHub PR集成:

yaml 复制代码
sonar-scan:
  runs-on: ubuntu-latest
  needs: unit-test
  steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - uses: actions/setup-node@v4
      with:
        node-version: '20'
    - name: SonarQube Scan
      uses: SonarSource/sonarcloud-github-action@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

实战踩坑:

  • 不要追求100%的测试覆盖率,核心业务逻辑达到80%以上即可
  • 避免编写脆弱的E2E测试,不要依赖页面元素的具体位置
  • 定期清理Flaky Test,不稳定的测试比没有测试更糟糕

最佳实践:

  • 将测试结果直接展示在PR中,方便审查者查看
  • 配置质量门禁,当测试覆盖率低于阈值或存在严重漏洞时阻止合并
  • 每天晚上运行全量测试,包括耗时较长的E2E测试

四、构建与制品管理:速度与安全的平衡

构建阶段将源代码转换为可部署的产物,构建速度直接影响整个流水线的效率。我们将重点讲解前端构建优化、GitHub Packages制品管理和Docker镜像构建最佳实践。

4.1 前端构建优化:Vite在GitHub Actions中的加速技巧

Vite已经成为现代前端项目的首选构建工具,但在CI环境中,构建速度仍然是一个常见的痛点。以下是几个关键的优化技巧:

  1. 依赖缓存:这是最有效的优化手段,可以将构建时间缩短70%以上
yaml 复制代码
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'
  1. Vite构建缓存:缓存Vite的构建产物
yaml 复制代码
- name: Cache Vite build
  uses: actions/cache@v4
  with:
    path: node_modules/.vite
    key: ${{ runner.os }}-vite-${{ hashFiles('package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-vite-
  1. 禁用不必要的插件:在CI环境中禁用sourcemap、代码压缩等耗时插件
javascript 复制代码
// vite.config.ts
export default defineConfig(({ mode }) => ({
  build: {
    sourcemap: mode !== 'production',
    minify: mode === 'production'
  }
}))

4.2 GitHub Packages:统一制品管理

GitHub Packages是GitHub原生的制品仓库,支持npm、Maven、Docker、NuGet等多种包格式,与GitHub Actions深度集成。

自动发布npm包示例:

yaml 复制代码
publish-npm:
  runs-on: ubuntu-latest
  needs: build
  if: startsWith(github.ref, 'refs/tags/')
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: '20'
        registry-url: 'https://npm.pkg.github.com'
    - run: npm ci
    - run: npm run build
    - run: npm publish
      env:
        NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

4.3 Docker镜像构建最佳实践

Docker是现代应用部署的标准,在GitHub Actions中构建Docker镜像有几个关键的最佳实践:

  1. 使用多阶段构建:减小镜像体积
dockerfile 复制代码
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  1. 使用Docker层缓存:加速镜像构建
yaml 复制代码
- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v3

- name: Build and push
  uses: docker/build-push-action@v5
  with:
    context: .
    push: true
    tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
    cache-from: type=gha
    cache-to: type=gha,mode=max

实战踩坑:

  • 不要在Docker镜像中包含源代码和构建工具
  • 不要使用latest标签,始终使用具体的版本号或Git SHA
  • 不要将敏感信息硬编码在Dockerfile中

最佳实践:

  • 使用官方的alpine基础镜像,减小镜像体积
  • 开启Docker BuildKit,提升构建速度
  • 定期扫描Docker镜像的安全漏洞

五、全场景自动化部署:从静态页面到Kubernetes

GitHub支持多种部署方式,从最简单的GitHub Pages到复杂的Kubernetes集群,都可以通过GitHub Actions实现自动化部署。

5.1 静态站点部署:GitHub Pages

GitHub Pages是托管静态网站的最佳选择,完全免费,支持自定义域名和HTTPS。

自动部署到GitHub Pages:

yaml 复制代码
deploy-pages:
  runs-on: ubuntu-latest
  needs: build
  if: github.ref == 'refs/heads/main'
  permissions:
    contents: read
    pages: write
    id-token: write
  environment:
    name: github-pages
    url: ${{ steps.deployment.outputs.page_url }}
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: '20'
        cache: 'npm'
    - run: npm ci
    - run: npm run build
    - uses: actions/configure-pages@v4
    - uses: actions/upload-pages-artifact@v3
      with:
        path: dist
    - id: deployment
      uses: actions/deploy-pages@v4

5.2 前端应用部署:Vercel深度集成

Vercel是Next.js的官方部署平台,与GitHub深度集成,支持自动部署、预览部署、边缘函数等功能。

GitHub Actions部署到Vercel:

yaml 复制代码
deploy-vercel:
  runs-on: ubuntu-latest
  needs: build
  if: github.ref == 'refs/heads/main'
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: '20'
        cache: 'npm'
    - run: npm ci
    - run: npm run build
    - uses: amondnet/vercel-action@v20
      with:
        vercel-token: ${{ secrets.VERCEL_TOKEN }}
        vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
        vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
        vercel-args: '--prod'

5.3 容器化部署:GitHub Actions + Kubernetes

对于复杂的后端应用和微服务架构,Kubernetes是目前的标准部署平台。

部署到Kubernetes集群:

yaml 复制代码
deploy-k8s:
  runs-on: ubuntu-latest
  needs: build-and-push-docker
  if: github.ref == 'refs/heads/main'
  environment: production
  steps:
    - uses: actions/checkout@v4
    - name: Set up kubectl
      uses: azure/setup-kubectl@v3
    - name: Set Kubernetes context
      uses: azure/k8s-set-context@v3
      with:
        kubeconfig: ${{ secrets.KUBE_CONFIG }}
    - name: Deploy to Kubernetes
      run: |
        kubectl set image deployment/myapp myapp=ghcr.io/${{ github.repository }}:${{ github.sha }}
        kubectl rollout status deployment/myapp

5.4 发布策略:降低部署风险

GitHub Environments支持多种发布策略,可以显著降低部署风险:

  • 滚动更新:逐步替换旧版本的Pod,Kubernetes默认策略
  • 蓝绿部署:同时运行两个版本,测试通过后切换流量
  • 金丝雀发布:先将少量流量切换到新版本,观察无误后逐步扩大

实战踩坑:

  • 不要在周五下午部署生产环境
  • 所有生产环境部署都必须有回滚机制
  • 部署前必须进行自动化验收测试

最佳实践:

  • 配置环境保护规则,生产环境部署需要人工审批
  • 使用GitHub Environments隔离不同环境的配置和Secrets
  • 开启部署通知,将部署状态发送到Slack或企业微信

六、高级能力:MCP协议与GitHub Skills

2024年,DevOps领域最重要的两个趋势是AI赋能和可复用流水线。MCP协议让AI能够无缝接入DevOps工具链,而GitHub Skills则实现了流水线能力的沉淀与复用。

6.1 MCP协议:AI驱动的DevOps

MCP(Model Context Protocol) 是Anthropic推出的开放协议,它允许大模型安全地与外部工具和服务进行交互。通过MCP,我们可以将AI能力无缝融入GitHub Actions流水线,实现代码审查自动化、Release Notes自动生成、问题自动分类等功能。

6.1.1 MCP核心工作原理
6.1.2 实战:用MCP实现AI辅助代码审查

以下是一个完整的示例,展示如何在GitHub Actions中使用MCP服务器实现AI辅助代码审查:

  1. 首先,创建一个简单的MCP服务器(使用Node.js)
javascript 复制代码
// mcp-server.js
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
import { Octokit } from '@octokit/rest';

const server = new Server(
  { name: 'github-mcp-server', version: '1.0.0' },
  { capabilities: { tools: {} } }
);

const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;
  
  if (name === 'review-pr') {
    const { owner, repo, pull_number } = args;
    const { data: files } = await octokit.pulls.listFiles({ owner, repo, pull_number });
    const { data: pr } = await octokit.pulls.get({ owner, repo, pull_number });
    
    return {
      content: [{
        type: 'text',
        text: `PR标题:${pr.title}\nPR描述:${pr.body}\n变更文件:\n${files.map(f => `- ${f.filename}: ${f.additions} additions, ${f.deletions} deletions\n${f.patch}`).join('\n')}`
      }]
    };
  }
  
  throw new Error(`Unknown tool: ${name}`);
});

async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
}

main();
  1. 在GitHub Actions中使用MCP服务器进行代码审查
yaml 复制代码
ai-code-review:
  runs-on: ubuntu-latest
  if: github.event_name == 'pull_request'
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: '20'
    - run: npm install @modelcontextprotocol/sdk @octokit/rest
    - name: Run AI Code Review
      uses: anthropics/mcp-action@v1
      with:
        model: claude-3-5-sonnet-20240620
        api-key: ${{ secrets.ANTHROPIC_API_KEY }}
        server-command: node mcp-server.js
        prompt: |
          请审查以下PR的代码变更,重点关注:
          1. 代码逻辑是否正确
          2. 是否有潜在的bug或安全漏洞
          3. 代码是否符合最佳实践
          4. 有没有可以优化的地方
          
          请使用工具review-pr获取PR的详细信息,然后给出你的审查意见。
        github-token: ${{ secrets.GITHUB_TOKEN }}

6.2 GitHub Skills:可复用流水线建设

GitHub Skills(也称为GitHub Actions)是可复用的代码单元,可以将复杂的流水线逻辑封装为一个简单的Action,供团队内甚至整个社区复用。

6.2.1 创建自定义JavaScript Action

以下是一个简单的自定义Action示例,用于自动生成Release Notes:

javascript 复制代码
// index.js
const core = require('@actions/core');
const github = require('@actions/github');

async function run() {
  try {
    const token = core.getInput('github-token');
    const octokit = github.getOctokit(token);
    const { owner, repo } = github.context.repo;
    
    const { data: commits } = await octokit.repos.listCommits({
      owner,
      repo,
      per_page: 100
    });
    
    const releaseNotes = commits
      .filter(commit => commit.commit.message.startsWith('feat:') || commit.commit.message.startsWith('fix:'))
      .map(commit => `- ${commit.commit.message.split('\n')[0]} (${commit.sha.substring(0, 7)})`)
      .join('\n');
    
    core.setOutput('release-notes', releaseNotes);
  } catch (error) {
    core.setFailed(error.message);
  }
}

run();
6.2.2 企业级Skills仓库建设最佳实践
  • 建立一个统一的企业级Actions仓库,存放所有自定义Action
  • 每个Action都要有详细的文档和使用示例
  • 为Action添加自动化测试,保证质量
  • 遵循语义化版本规范,方便用户升级

实战踩坑:

  • 不要在Action中硬编码敏感信息,所有配置都应该通过输入参数传递
  • 不要使用过于复杂的依赖,保持Action轻量
  • 不要在Action中执行耗时过长的操作

最佳实践:

  • 优先使用官方和社区维护的Action,不要重复造轮子
  • 将常用的流水线模式封装为可复用的Workflow模板
  • 定期更新Action的依赖,修复安全漏洞

七、流水线最佳实践与踩坑指南

7.1 流水线性能优化

  1. 并行化任务:将可以并行执行的任务拆分为多个Job
  2. 合理使用缓存:缓存依赖、构建产物和Docker层
  3. 按需触发:只在相关文件变更时触发对应的任务
yaml 复制代码
on:
  push:
    branches: [main]
    paths:
      - 'src/**'
      - 'package*.json'
  1. 使用自托管Runner:对于大型项目,自托管Runner的速度通常比GitHub托管的更快

7.2 安全最佳实践

  1. 最小权限原则:为每个Workflow分配最小必要的权限
yaml 复制代码
permissions:
  contents: read
  pull-requests: write
  1. 安全管理Secrets:不要将Secrets打印到日志中,使用GitHub Secrets存储敏感信息
  2. 开启依赖扫描:定期扫描依赖的安全漏洞
  3. 审查第三方Action:在使用第三方Action之前,仔细审查其代码

7.3 常见踩坑与解决方案

问题 原因 解决方案
缓存失效 缓存key不正确 使用hashFiles生成基于依赖文件的缓存key
Flaky Test 测试依赖外部服务或时间 使用mock隔离外部依赖,避免使用绝对时间
部署失败回滚困难 没有版本化部署 始终使用Git SHA作为镜像标签,保留历史版本
流水线运行时间过长 任务没有并行化,缓存使用不当 拆分任务并行执行,优化缓存策略

结语

GitHub原生DevOps生态为我们提供了一个开箱即用、功能强大的自动化解决方案。从代码提交到生产部署,从测试到监控,所有环节都可以在GitHub平台内完成,无需复杂的第三方集成。

随着MCP协议的兴起和AI技术的发展,DevOps正在进入一个全新的时代。AI不再只是一个辅助工具,而是将深度融入DevOps的每个环节,帮助我们自动化完成代码审查、问题定位、故障修复等复杂任务。而GitHub Skills则让我们能够将最佳实践沉淀为可复用的组件,提升整个团队的研发效率。

工程化不是一蹴而就的,它是一个持续改进的过程。希望本文能够帮助你构建出一套适合自己团队的GitHub DevOps流水线,让开发更高效,部署更安全。

相关推荐
阿里嘎多学长1 小时前
2026-05-08 GitHub 热点项目精选
开发语言·程序员·github·代码托管
spencer_tseng2 小时前
DevOps 2026.05.06
devops
XD7429716362 小时前
科技早报晚报|2026年5月8日:Agent 后端、文档索引与 token 控制层,今天更值得跟进的 3 个开源机会
运维·深度学习·自动化·开源项目·模型训练·科技新闻·ai工程化
GISer_Jing2 小时前
全栈实战:分支管理到CI/CD全流程
运维·前端·ci/cd·github·devops
GISer_Jing3 小时前
GitHub Actions 完整 Token/Secret 配置详解(Vercel + Docker 2026最新版)
docker·容器·github
白狐_7983 小时前
软考软件设计师英语题怎么做:低代码、DevOps、软件工程高频词汇总结
低代码·软件工程·devops
weixin_408099673 小时前
按键精灵如何调用身份证OCR接口做实名录入自动化(带完整脚本代码)
自动化·ocr·按键精灵·身份证ocr·石榴智能·ocr api·脚本自动化
jiayi_19993 小时前
[github] 上传本地repo
大数据·elasticsearch·github
Mzyh3 小时前
通过蓝印RPA获取到飞书聊天中的信息图片-自动化
windows·python·ai·自动化·飞书·rpa