无尘阁日记

无尘阁日记

我对ci/cd的概念十分模糊,我想达到什么效果呢?本地代码AI自动写,自动提交仓库,然后服务器那边自动拉取,请你详细解释。
2026-05-06

你想达到的效果,可以拆成一句话:

本地由 AI 辅助写代码 → 自动提交到 Git 仓库 → 仓库触发流水线 → 服务器自动更新代码并完成部署。

这就是典型的 CI/CD 自动化发布流程

但我要先给你一个很重要的判断:
不要把它理解成“服务器定时 git pull 一下”这么简单。
真正的 CI/CD,是把“写代码、检查代码、打包、上传、部署、回滚”变成一条可靠流水线。


一、CI/CD 到底是什么?

1. CI:持续集成

CI,英文是 Continuous Integration,中文叫持续集成

通俗讲就是:

你每次提交代码后,系统自动帮你检查:代码有没有语法错误?依赖能不能安装?测试能不能通过?项目能不能正常构建?

比如你本地改了一个 PHP 文件,然后提交到 GitHub、GitLab、Gitee。

仓库检测到你 push 代码后,自动执行:

composer install
php -l 某些PHP文件
phpunit
npm install
npm run build

如果这些都通过,说明代码基本健康。

所以 CI 的核心不是部署,而是:

防止有问题的代码进入主分支。


2. CD:持续交付 / 持续部署

CD 有两个意思。

持续交付

英文是 Continuous Delivery

意思是:

代码已经检查通过,随时可以发布,但最后上线需要人点一下确认。

比如:

代码提交 → 自动测试通过 → 等你手动点击“部署到生产环境”

这适合重要系统,比如 OA、支付、客户系统。


持续部署

英文是 Continuous Deployment

意思是:

代码检查通过后,系统自动上线,不需要人工确认。

比如:

代码提交 → 自动测试通过 → 自动部署到服务器

你现在想要的“服务器自动拉取”,更接近这个。


二、你想要的完整效果应该长这样

你现在脑子里的流程可能是:

本地 AI 写代码
↓
自动提交 Git 仓库
↓
服务器自动 git pull
↓
项目自动更新

这个想法没错,但实际落地时,我建议升级成:

AI 辅助写代码
↓
本地运行基础检查
↓
提交到 Git 仓库
↓
触发 CI 流水线
↓
自动安装依赖、检查语法、运行测试
↓
测试通过
↓
通过 SSH 登录服务器
↓
服务器执行部署脚本
↓
拉取最新代码
↓
安装生产依赖
↓
执行数据库迁移
↓
清理缓存
↓
重启 PHP-FPM / 队列 / Supervisor
↓
部署完成

用图表示就是:

┌──────────────┐
│ 本地 PhpStorm │
│ AI 自动写代码 │
└──────┬───────┘
       │
       ▼
┌──────────────┐
│ Git 提交代码  │
│ commit / push│
└──────┬───────┘
       │
       ▼
┌──────────────┐
│ Git 仓库      │
│ GitHub/Gitee │
└──────┬───────┘
       │ 触发
       ▼
┌──────────────┐
│ CI 流水线     │
│ 检查/测试/构建 │
└──────┬───────┘
       │ 通过
       ▼
┌──────────────┐
│ CD 部署       │
│ SSH 到服务器  │
└──────┬───────┘
       │
       ▼
┌──────────────┐
│ 服务器更新代码 │
│ git pull 等   │
└──────────────┘

三、这里面每个角色分别负责什么?

1. 本地 PhpStorm / 通义灵码 / AI 编码工具

它负责:

写代码
改 bug
生成接口
补 controller
写 service
写 SQL
写注释
生成测试

但是注意:

AI 写代码不是 CI/CD 的一部分。AI 是编码助手,CI/CD 是发布流水线。

AI 可以帮你写代码,但代码能不能上线,要交给 Git 和流水线判断。


2. Git 仓库

Git 仓库不是单纯的“代码备份盘”。

它在 CI/CD 里面是发布中枢

比如:

main 分支 = 线上正式代码
dev 分支 = 开发代码
test 分支 = 测试环境代码

常见规则是:

提交到 dev → 自动部署测试环境
合并到 main → 自动部署生产环境

这比“本地直接传服务器”稳定很多。


3. CI 流水线

CI 流水线是质检员。

它负责自动检查:

代码能不能安装依赖?
PHP 语法有没有错?
单元测试过不过?
前端资源能不能构建?
配置文件有没有缺?

如果 CI 失败,就不要部署。

否则就会出现这种情况:

AI 写了一个语法错误
↓
你自动提交了
↓
服务器自动拉取了
↓
线上直接炸了

这就不是自动化,这是自动翻车。


4. CD 部署脚本

CD 是发布员。

它负责让服务器更新代码。

典型动作是:

cd /www/wwwroot/your-project
git fetch origin
git reset --hard origin/main
composer install --no-dev --prefer-dist --optimize-autoloader
php yii migrate --interactive=0
php yii cache/flush-all
systemctl reload php-fpm

如果是 Laravel,可能是:

php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan queue:restart

如果是 Yii2 / Yii3,就换成对应命令。


四、服务器“自动拉取”有几种做法?

方案一:服务器定时 git pull

这是最粗糙的方案。

比如服务器每分钟执行一次:

cd /www/wwwroot/project
git pull origin main

优点:

简单
容易理解
不依赖复杂平台

缺点:

不知道代码有没有问题
不知道什么时候该拉
容易把错误代码拉到线上
不好回滚
不好记录部署日志

我不建议你正式项目用这个。

它适合个人测试,不适合生产环境。


方案二:Git 仓库 Webhook 通知服务器

流程是:

你 push 代码
↓
GitHub/Gitee/GitLab 发送 Webhook 请求到你的服务器
↓
服务器收到请求
↓
执行 deploy.sh
↓
自动 git pull

优点:

比定时 pull 好
push 后立即部署
实现不算难

缺点:

服务器要暴露一个 webhook 接口
安全校验要做好
否则别人可能伪造请求触发部署

这个适合中小项目。


方案三:GitHub Actions / GitLab CI / Gitee 流水线通过 SSH 部署

这是我最推荐你先学的方案。

流程是:

你 push 代码到仓库
↓
仓库平台启动流水线
↓
流水线先测试代码
↓
测试通过后
↓
流水线通过 SSH 登录服务器
↓
执行服务器上的 deploy.sh

这个方案的好处是:

服务器不用暴露 webhook 接口
部署日志在仓库平台可见
可以加测试
可以加人工审批
可以加失败通知
可以控制只有 main 分支才能上线

对于你现在这种 PHP 项目、宝塔服务器、Yii/Laravel 项目,比较适合。


方案四:Docker 镜像部署

更高级一点的方案是:

代码提交
↓
CI 构建 Docker 镜像
↓
推送到镜像仓库
↓
服务器拉取新镜像
↓
重启容器

这更适合团队化、标准化、多服务项目。

但你现在如果刚理解 CI/CD,可以先别上 Docker。
先把 Git + SSH 自动部署跑通,收益最大。


五、我建议你当前采用的流程

结合你现在经常做 PHP、Yii、Laravel、服务器项目,我建议先用这个结构:

本地 PhpStorm + 通义灵码
↓
Git 提交
↓
GitHub / Gitee / GitLab 仓库
↓
流水线自动检查
↓
SSH 到服务器
↓
执行 deploy.sh

也就是:

AI 负责写,Git 负责存,CI 负责验,CD 负责发。


六、一个最小可行版本怎么搭?

第一步:本地代码纳入 Git

在项目目录执行:

git init
git add .
git commit -m "init project"

关联远程仓库:

git remote add origin git@github.com:你的账号/你的项目.git
git branch -M main
git push -u origin main

如果你用 Gitee,就是换成 Gitee 的地址。


第二步:服务器上先手动拉一次代码

比如你的项目在:

/www/wwwroot/workflow.jiangtian.top/auto-workflow

服务器执行:

cd /www/wwwroot/workflow.jiangtian.top
git clone git@github.com:你的账号/你的项目.git auto-workflow

如果已经有项目,可以进入项目目录:

cd /www/wwwroot/workflow.jiangtian.top/auto-workflow
git remote -v

确认它已经绑定仓库。


第三步:服务器写一个部署脚本

比如创建:

/www/wwwroot/workflow.jiangtian.top/deploy.sh

内容可以是:

#!/bin/bash
set -e

PROJECT_DIR="/www/wwwroot/workflow.jiangtian.top/auto-workflow"
BRANCH="main"

echo "进入项目目录"
cd $PROJECT_DIR

echo "拉取最新代码"
git fetch origin
git reset --hard origin/$BRANCH

echo "安装 PHP 依赖"
composer install --no-dev --prefer-dist --optimize-autoloader

echo "执行数据库迁移,如果项目没有迁移命令,可以先注释掉"
# php yii migrate --interactive=0
# php artisan migrate --force

echo "清理缓存,如果项目没有这些命令,可以先注释掉"
# php yii cache/flush-all
# php artisan config:cache
# php artisan route:cache

echo "重载 PHP-FPM,可按你的服务器版本调整"
# systemctl reload php-fpm
# systemctl reload php74-php-fpm

echo "部署完成"

然后赋权:

chmod +x /www/wwwroot/workflow.jiangtian.top/deploy.sh

你可以先手动跑一次:

bash /www/wwwroot/workflow.jiangtian.top/deploy.sh

确认没问题,再接入流水线。


七、GitHub Actions 示例

如果你用 GitHub,可以在项目里新建:

.github/workflows/deploy.yml

内容大概是:

name: Deploy PHP Project

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.4'

      - name: Validate composer
        run: composer validate --no-check-publish || true

      - name: Install dependencies for check
        run: composer install --no-interaction --prefer-dist

      - name: PHP syntax check
        run: find . -name "*.php" -not -path "./vendor/*" -print0 | xargs -0 -n1 php -l

      - name: Deploy to server
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          port: ${{ secrets.SERVER_PORT }}
          script: |
            bash /www/wwwroot/workflow.jiangtian.top/deploy.sh

然后你需要在 GitHub 仓库里面配置 Secrets:

SERVER_HOST       服务器 IP
SERVER_USER       SSH 用户名,比如 root
SERVER_PORT       SSH 端口,比如 22
SERVER_SSH_KEY    私钥内容

这个流程就是:

push main
↓
GitHub Actions 启动
↓
检查 PHP 代码
↓
通过 SSH 进入服务器
↓
执行 deploy.sh

八、Gitee / GitLab 也类似

如果你用 Gitee,它叫:

Gitee Go

如果你用 GitLab,它叫:

GitLab CI/CD

核心思想都一样:

监听代码提交
↓
执行流水线
↓
检查代码
↓
远程部署

区别只是配置文件名字不同。

GitLab 一般是:

.gitlab-ci.yml

GitHub 是:

.github/workflows/deploy.yml

九、“AI 自动写、自动提交”要谨慎

你说的“本地代码 AI 自动写,自动提交仓库”,这里要分清楚。

可以自动化的部分

AI 可以帮你:

生成代码
修改 bug
生成 commit message
解释 diff
生成测试
补文档

你也可以写脚本自动提交:

git add .
git commit -m "feat: update by ai"
git push origin main

甚至可以封装成:

./ai-push.sh

内容:

#!/bin/bash
set -e

git status
git add .
git commit -m "${1:-chore: update code}"
git push origin main

使用:

bash ai-push.sh "fix: 修复登录接口数据库配置问题"

不建议完全自动的部分

我不建议你一开始就让 AI:

自动写代码
↓
自动 commit
↓
自动 push main
↓
自动上线生产环境

这很危险。

因为 AI 有可能:

改错文件
删掉关键逻辑
引入安全漏洞
把测试代码提交上去
把 .env 密钥提交上去
破坏数据库字段

更稳的方式是:

AI 写代码
↓
提交到 dev 分支
↓
自动部署测试环境
↓
你确认没问题
↓
合并到 main
↓
自动部署生产环境

十、推荐你采用的分支策略

你可以先用简单版。

简单版

main = 正式环境

每次 push 到 main,就自动部署。

适合:

个人项目
内部工具
测试项目
低风险系统

稳妥版

dev  = 开发环境
main = 生产环境

流程:

AI 写代码
↓
提交到 dev
↓
自动部署测试环境
↓
测试没问题
↓
合并到 main
↓
自动部署生产环境

这个更适合你做 OA、工作流、客户系统。


十一、CI/CD 里面最容易出问题的地方

1. .env 不应该提交到仓库

比如:

数据库账号
数据库密码
API Key
JWT 密钥
第三方接口密钥

这些都不要提交。

应该放在服务器本地:

.env
config/local.php
params-local.php

仓库里只放模板:

.env.example

2. 服务器部署用户权限要控制

不要让流水线拥有过大的权限。

比如尽量只允许它执行:

bash /www/wwwroot/project/deploy.sh

不要让它随便执行任意 root 命令。


3. 数据库迁移要谨慎

代码回滚容易,数据库回滚不容易。

比如:

php yii migrate

或者:

php artisan migrate --force

这类命令上线前要确认。

如果是生产环境,最好先备份数据库。


4. composer install 可能失败

服务器上要确保:

php -v
composer -V
git --version

都正常。

你的项目如果是 PHP 7.4,就不要在 CI 里用 PHP 8.3 检查,否则可能出现兼容问题。


5. 前端构建要不要放服务器上?

如果项目有前端资源,比如:

npm install
npm run build

有两种方式:

方案 A:CI 平台构建好,把 dist 上传服务器
方案 B:服务器自己 npm run build

个人项目可以先用 B。
正式项目建议用 A。


十二、你的目标可以分三个阶段实现

阶段一:手动提交,服务器自动部署

这是第一阶段,最应该先做。

你本地写代码
↓
手动 git push
↓
自动部署服务器

先不要追求 AI 自动提交。

先把“提交后自动部署”跑通。


阶段二:AI 写代码,人工确认提交

第二阶段:

通义灵码 / Cursor / Copilot 写代码
↓
你看 diff
↓
你确认
↓
git push
↓
自动部署

这是目前最适合你的状态。


阶段三:AI 自动生成分支和提交

第三阶段再做:

AI 接收任务
↓
自动建分支
↓
自动改代码
↓
自动提交
↓
自动发 Pull Request
↓
CI 检查
↓
你确认合并
↓
自动部署

这才是比较成熟的 AI 编码流水线。

它不是让 AI 直接往生产环境怼,而是让 AI 先提交一个“候选版本”。


十三、最推荐你的最终形态

我建议你最终搭成这个样子:

需求
↓
AI 生成代码
↓
AI 生成测试
↓
本地检查
↓
提交 dev 分支
↓
自动部署测试环境
↓
测试通过
↓
合并 main
↓
自动部署生产环境
↓
失败可回滚

更完整一点:

┌────────────┐
│ 需求描述    │
└─────┬──────┘
      ▼
┌────────────┐
│ AI 编码     │
│ 通义灵码等   │
└─────┬──────┘
      ▼
┌────────────┐
│ 本地检查    │
│ 语法/测试    │
└─────┬──────┘
      ▼
┌────────────┐
│ Git 提交    │
│ dev 分支     │
└─────┬──────┘
      ▼
┌────────────┐
│ CI 检查     │
│ install/test│
└─────┬──────┘
      ▼
┌────────────┐
│ 测试环境部署 │
└─────┬──────┘
      ▼
┌────────────┐
│ 人工确认    │
└─────┬──────┘
      ▼
┌────────────┐
│ 合并 main   │
└─────┬──────┘
      ▼
┌────────────┐
│ 生产环境部署 │
└────────────┘

十四、你真正要掌握的几个核心概念

1. 仓库是中枢

不是本地直接传服务器,而是:

本地 → 仓库 → 服务器

仓库是中间的权威版本。


2. 分支是环境

可以简单理解:

dev 分支对应测试环境
main 分支对应生产环境

3. 流水线是自动工人

你以前手动做的事:

登录服务器
cd 项目目录
git pull
composer install
清缓存
重启服务

现在都交给流水线。


4. Secrets 是密钥保险柜

SSH 密钥、服务器 IP、数据库密码,不要写死在代码里。

应该放在:

GitHub Secrets
GitLab Variables
Gitee 环境变量

5. deploy.sh 是部署说明书

不要把复杂命令都塞在流水线配置里。
更好的方式是服务器上放一个:

deploy.sh

流水线只负责调用:

bash /path/to/deploy.sh

这样好维护。


十五、你可以先这样开始

你现在不用一下子搞复杂。

先做这个最小闭环:

1. 本地项目接入 Git
2. 推送到 GitHub / Gitee / GitLab
3. 服务器配置 SSH 拉代码
4. 写 deploy.sh
5. 配置 push main 自动执行 deploy.sh

暂时不要一开始就做:

AI 自动 commit
AI 自动 push
自动数据库迁移
Docker
Kubernetes
多环境审批
灰度发布
蓝绿部署

这些后面再加。


十六、一句话总结

你要的不是简单的“服务器自动拉取代码”,而是:

把 AI 写代码之后的提交、检查、部署,做成一条可追踪、可回滚、可自动执行的发布流水线。

最适合你的第一版方案是:

PhpStorm + 通义灵码写代码
↓
你确认后 git push
↓
GitHub/Gitee/GitLab 自动触发流水线
↓
流水线 SSH 到服务器
↓
执行 deploy.sh
↓
服务器自动更新

等这个跑通之后,再升级到:

AI 自动建分支
AI 自动提交
AI 自动发 PR
CI 自动检查
你确认合并
自动上线

这才是安全、稳定、可长期复用的 AI + CI/CD 工作流。