使用Laravel Airdrop加速您的CI构建
Laravel Airdrop是一个存储你构建的静态资产的工具。当您进行 CI 运行时,Airdrop 会检查您的静态资产是否已更改。
如果资产没有更改,Airdrop 会从存储中下载它们并放置在正确的位置 - 允许您跳过构建资产。
如果它们发生了变化,那么您可以像往常一样使用 Node 来构建您的静态资产。
这对于节省 CI 和部署时间非常有用。
https://laravel-news.com/airdrop
https://hammerstone.dev/airdrop/docs/main/installation
以下是如何使用Airdrop。
安装
安装Airdrop很简单:
composer require hammerstone/airdrop
# Add config/airdrop.php to your project
php artisan airdrop:install
配置Airdrop
在 Airdrop 中只需要配置一些东西 - 其中一些可以保留为默认值。
触发器
您可以告诉 Airdrop 何时决定重新构建静态资产。
触发器特定于环境( APP_ENV) - 每个环境都有自己的文件集。这称为配置触发器。
另一个触发器是FileTrigger. 如果文件已更改,这将跟踪配置的文件并重建资产。
将FileTrigger检查:
resources(CSS、JS 等)中的文件
如果 Webpack/Vite 配置文件发生变化
我还添加了package-lock.jsonNPM 生成的文件。
<?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 的默认设置非常好,当然您可以根据需要配置这些。
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/Webpack
public/css/*
public/js/**
# Vite
public/build/*
整合Airdrop
当您在 CI 或部署脚本中构建应用程序 Airdrop 时(这对于 Forge 快速部署非常有用!),
您可以运行以下命令:
# Download files, only if needed
php artisan airdrop:download
# Airdrop creates .airdrop_skip if
# it downloaded files
if [ ! -f ".airdrop_skip" ]; then
npm ci --no-audit
npm run dev
fi
# Upload the files if needed
php artisan airdrop:upload
相关文章