编程

使用 GitHub Action 实现 Laravel CI

1117 2023-03-17 03:08:00

Github Action 是运行持续集成(CI)工作流的绝佳方式,不论是运行测试还是静态分析检查等。

在 Laravel 应用中,运行工作流以确保代码符合某个特定标准极其重要。在拥有 CI 管道之前,我们会在本地运行所有工作流 - 如果有人忘记运行,可能会出现问题。

在本教程中,我将介绍如何为你的 Laravel 应用设置 GitHub Action,以便你可以愉快地坐下来的同时,确保代码顺利上线。

首先,在项目的根目录中添加一个目录 .github/workflows。在这个目录中添加工作流文件,以便 Github 可以逐个获取这些文件并分别运行。从这一点开始,你可以根据需要设计工作流流程,从每个部分的单独工作流到将所有工作流合并为一个工作流。

我将从测试工作流开始,因为这是最有可能最开始的工作流。即使你只实现了这一工作流,也朝着正确的方向迈出了一步。

我不会详细介绍如何构建 GitHub Action,因为这是一个非常复杂的主题,具体取决于你希望如何实现它们。工作流程将逐步建立,让我们了解这是如何工作的。

name: Run testson: [push]

首先,我们需要为工作流命名,GitHub 将用它来显示正在发生的事情。然后我们添加一个入口,告诉 GitHub 应该在哪些事件上运行此工作流。你可以在此处添加多个事件,并且可以使用大量事件。

我们的下一步是定义我们希望能够运行的作业。每个工作流中可以有多个作业。但是,通常我坚持每个工作流一个作业以保持简单。

name: Run tests
 
on: [push]
 
jobs:
  tests:
    name: Run tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
 
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv
          coverage: none
 
      - name: Run composer install
        run: composer install -n --prefer-dist
 
      - name: Prepare Laravel Application
        run: |
          cp .env.ci .env
          php artisan key:generate
 
      - name: Run tests
        run: php artisan test

我们的作业有一个 GitHub 的名称,可以用作标签,显示正在发生的事情时。我们需要定义这个作业将运行在什么系统上。这里我使用的是 ubuntu-latest,因为这通常是我的目标部署环境。这里有很多选项,针对特定版本的操作系统,甚至不同的操作系统。然后,我们的作业有多个步骤需要执行,从签出代码到执行需要执行的操作。

大多数工作将从 checkout action 开始,这是 GitHub 团队的官方 action。我在这里使用的是版本3 ,因为它支持我项目中任何 JavaScript 的最新 node 版本。如果你需要特定的 node 版本,请查看每个版本的发行说明,以确保符合你的要求。

接下来,我们使用了 shivammathur/setup-php@v2 action,该 action 用来准备 PHP 环境。传入我们的 PHP 版本和需要安装的所有 PHP 扩展。

然后,我们安装 PHP 依赖项,以便在以后进行部署时确保安装顺利。在每个步骤中,你都可以运行打包的 action 或可运行的 CLI 命令。然后我们安装了 Laravel 应用,运行 artisan 命令或其他我们可能需要做的事情。在我的项目中,我使用一个在内存中运行的 SQLite 数据库作为测试数据库。如果你使用的是不同的东西,文档中有很多可用的选项。我项目中所做的就是复制指定的 .env.ci 文件到应用使用到的 .env 文件中。然后使用 artisan 命令生成应用加密密钥。

最后一步是运行测试套件,此处我使用的是 artisan test 命令。你自己的话可以调用测试可执行文件或者使用 artisan 命令都行。你还可以向该命令添加调试 CI 中潜在测试失败所需的任何其他选项。

现在,我们的初始工作流可以运行了,我们可以查看另一个工作流。这次我们将使用我最喜欢的工作流之一,运行静态分析。

对于下一部分,我将不再重复所有步骤。相反,我们将关注最后一部分。

name: Static Analysis
 
on: [push]
 
jobs:
  phpstan:
    name: phpstan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
 
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.2'
          coverage: none
 
      - name: Install composer dependencies
        run: composer install -n --prefer-dist
 
      - name: Run Static Analysis
        run: ./vendor/bin/phpstan --error-format=github

因为我们不需要运行这个应用,所以这次不需要担心所有的 PHP 依赖关系。我们的最后一步是运行静态分析本身。就我个人而言,我使用 PHPStan 进行选择的静态分析。但是,这将适用于任何可用的静态分析库。我将传入 error-format 标志,以便任何潜在的错误都是 GitHub 能够理解的格式,并且是为 CI 环境设计的。

你可以更进一步,比如运行 Laravel Pint 或更多。然而,作为一个介绍,我认为这涵盖了你需要的内容。