如果你不是机器人,为什么需要CI/CD?
\n\n想象一下:周五晚上,你刚刚完成了一个功能,通过FTP将代码上传到服务器(是的,这种情况仍然存在),然后……网站崩溃,出现白屏死机。熟悉吗?如果你有一个PHP的CI/CD流水线,一切都会自动发生:测试在推送阶段就会失败,代码不会进入生产环境,而你可以安心地去喝茶。
\n\n持续集成和持续交付(或部署)不仅仅是时髦的缩写。它们是你个人的助手,负责检查代码、运行测试、进行代码检查、构建工件并部署到服务器。在本文中,我将展示如何使用GitHub Actions从零开始为PHP配置CI/CD流水线。没有抽象概念——只有真实的代码和可用的示例。
\n\n什么是CI/CD流水线,为什么PHP开发者需要它
\n\nCI/CD流水线是一系列自动步骤,每次你将代码推送到仓库时都会执行。这对于PHP尤其重要,因为:
\n\n- \n
- PHP是一种动态语言,许多错误(拼写错误、类型错误)只在运行时才会出现。 \n
- 部署通常是通过临时方式完成的——通过SCP、rsync甚至FTP(令人心痛)。 \n
- 团队在成长,手动检查成为瓶颈。 \n
通过配置PHP的CI/CD,你将获得:
\n- \n
- 每次推送时的自动测试。 \n
- 代码风格检查(PSR-12,你的内部标准)。 \n
- 自动部署到staging/生产环境。 \n
- 通过Telegram/Slack接收构建状态通知。 \n
选择工具:为什么是GitHub Actions?
\n\n有很多选择:Jenkins、GitLab CI、Bitbucket Pipelines、CircleCI。但对于从零开始为PHP配置CI/CD流水线,我推荐GitHub Actions。为什么?
\n\n- \n
- 对公共仓库免费(私有仓库每月2000分钟——绰绰有余)。 \n
- 所有内容集中在一处——代码、issues、actions。 \n
- 庞大的现成actions生态系统——无需重复造轮子。 \n
但如果你使用GitLab——原理相同,只是YAML语法不同。我们开始吧。
\n\n步骤1:仓库结构和基础文件
\n\n为了演示,我们以一个典型的基于Laravel的PHP项目为例(但该方法适用于任何框架)。你的结构应该如下所示:
\n\nmy-php-app/\n├── .github/\n│ └── workflows/\n│ └── ci-cd.yml\n├── src/\n├── tests/\n├── composer.json\n├── phpunit.xml\n└── .php_cs.dist (如果你使用PHP-CS-Fixer)\n\n创建文件夹.github/workflows/和文件ci-cd.yml——这是你流水线的核心。
步骤2:基础YAML——持续集成(CI)
\n\n我们从简单的开始:每次推送到main或发起pull request时运行测试和代码检查。这是一个最小的PHP的CI/CD流水线:
\n\nname: PHP CI/CD Pipeline\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build-and-test:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n\n - name: Setup PHP\n uses: shivammathur/setup-php@v2\n with:\n php-version: '8.2'\n extensions: mbstring, pdo, sqlite, gd\n coverage: xdebug\n\n - name: Install dependencies\n run: composer install --prefer-dist --no-progress\n\n - name: Run PHP CS Fixer (Lint)\n run: vendor/bin/php-cs-fixer fix --dry-run --diff\n\n - name: Run PHPStan (Static Analysis)\n run: vendor/bin/phpstan analyse src --level=5\n\n - name: Run Tests\n run: vendor/bin/phpunit --coverage-text\n\n这里发生了什么?
\n- \n
- checkout — 获取代码。 \n
- setup-php —