编程

使用 GitHub Action 实现 Laravel CI

589 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或更多。然而,作为一个介绍,我认为这涵盖了您需要的内容。