我对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 工作流。
发表评论: