使用Laravel Airdrop加速您的CI构建

2023-06-01 00:00:00 构建 您的 加速

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

相关文章