使用 Airdrop 加速你的 CI 构建
发布日期:作者: Chris Fidao
我正在努力尽可能少地使用 NodeJS。为什么?因为这会减慢人们在 Chipper CI 上的构建速度!
幸运的是,Airdrop 存在。
Laravel Airdrop 是一种存储已构建静态资产的工具。当您执行 CI 运行时,Airdrop 会检查您的静态资产是否已更改。
如果资产没有更改,Airdrop 会从存储中下载它们并放置在正确的位置 - 允许您跳过构建资产。
如果它们已更改,则照常使用 Node 构建静态资产。
这对节省 CI 和部署时间非常有用。
以下是使用 Airdrop 的方法。
安装
安装 Airdrop 很容易
composer require hammerstone/airdrop # Add config/airdrop.php to your projectphp artisan airdrop:install
配置 Airdrop
在 Airdrop 中只需要配置几件事 - 其中许多可以保留默认值。
触发器
您可以告诉 Airdrop 何时决定重新构建静态资产。
触发器特定于 **环境** (APP_ENV
) - 每个环境都有自己的文件集。这称为配置触发器。
另一个触发器是 FileTrigger
。这会跟踪配置的文件,并在文件更改时重建资产。
FileTrigger
将检查
resources
中的文件 (CSS、JS 等)- 如果 Webpack/Vite 配置文件发生变化
我还添加了 NPM 生成的 package-lock.json
文件。
<?php use Hammerstone\Airdrop\Drivers\FilesystemDriver;use Hammerstone\Airdrop\Drivers\GithubActionsDriver;use Hammerstone\Airdrop\Triggers\ConfigTrigger;use Hammerstone\Airdrop\Triggers\FileTrigger; return [ 'driver' => env('AIRDROP_DRIVER', 'default'), 'drivers' => [ 'default' => [...], 'github' => [...], ], 'triggers' => [ ConfigTrigger::class => [ 'env' => env('APP_ENV') ], FileTrigger::class => [ 'include' => [ resource_path(), // default base_path('webpack.mix.js'), // mix default base_path('vite.config.js'), // vite default base_path('package-lock.json'), // my addition here ], ], ], 'outputs' => [...],];
驱动程序
您可以决定 Airdrop 将静态资产存储在何处。通常你只需要使用 FilesystemDriver
,并使用 Laravel 的 Storage
机制来告诉 Airdrop 将文件放在哪里。
disk
设置与使用的 Laravel “磁盘”存储有关。建议使用一些远程存储,例如 s3
。
GitHub Actions 驱动程序允许您将文件保存到 GH Actions 缓存中,这非常方便!
return [ // The driver you wish to use to stash and restore your files. 'driver' => env('AIRDROP_DRIVER', 'default'), 'drivers' => [ 'default' => [ // The class responsible for implementing the stash and restore // logic. Must extend BaseDriver. 'class' => FilesystemDriver::class, // The disk on which to store the built files. 'disk' => env('AIRDROP_REMOTE_DISK', 's3'), // The folder (if any) where you'd like your stashed assets to reside. 'remote_directory' => env('AIRDROP_REMOTE_DIR', 'airdrop'), // A writeable directory on the machine that builds the assets. // Used to build up the ZIP file before stashing it. 'local_tmp_directory' => env('AIRDROP_LOCAL_TMP_DIR', storage_path('framework')), // The skip file is an empty file that will be created to // indicate that asset building can be skipped. 'skip_file' => env('AIRDROP_SKIP_FILE', base_path('.airdrop_skip')), ], ], // ...];
输出
输出是 Airdrop 将为您存储和检索的文件。您通过触发器“监视”的文件不一定需要与您让 Airdrop 为您保存/存储的文件相同!
Airdrop 的默认值相当不错,当然您可以根据需要对其进行配置。
return [ // ... 'outputs' => [ /* * Files or folders that should be included. */ 'include' => [ // Mix/Webpack public_path('mix-manifest.json'), public_path('css'), public_path('js'), // Vite public_path('build/manifest.json'), public_path('build/assets'), ], // ... ],];
注意:使用 Airdrop 时,您可能不希望将静态资产提交到您的存储库。为了避免这种情况,并完成 Airdrop 的配置,请将以下内容添加到您的 .gitignore 文件中
/.airdrop_skip # Mix/Webpackpublic/css/*public/js/** # Vitepublic/build/*
集成 Airdrop
当您构建应用程序 Airdrop 在 CI 中,或在部署脚本中(这非常适合 Forge 快速部署!),您可以运行以下命令
# Download files, only if neededphp artisan airdrop:download # Airdrop creates .airdrop_skip if# it downloaded filesif [ ! -f ".airdrop_skip" ]; then npm ci --no-audit npm run devfi # Upload the files if neededphp artisan airdrop:upload