如何用Airdrop加快你的CI构建速度

142 阅读3分钟

幸运的是, Airdrop的存在.

[Laravel Airdrop]是一个工具,可以存储你构建的静态资产。当你做CI运行时, Airdrop会检查你的静态资产是否有变化。

如果资产没有改变, Airdrop会从存储区下载它们并放置在正确的位置 - 让你跳过构建你的资产.

如果它们已经改变了,那么你就可以像往常一样使用Node来构建你的静态资产。

这对于节省CI和部署的时间非常好。

下面是如何使用Airdrop的方法。

安装

安装[Airdrop]很简单。

composer require hammerstone/airdrop
 
# Add config/airdrop.php to your project
php artisan airdrop:install

配置Airdrop

在Airdrop中只有几样东西需要配置--而且其中有一堆可以保留为默认值。

触发器

你可以告诉Airdrop何时决定重新构建静态资产。

触发器是特定于环境的(APP_ENV)--每个环境都有自己的一组文件。这就是所谓的配置触发器。

另一个触发器是FileTrigger 。它跟踪配置的文件,并在文件发生变化时重新构建资产。

FileTrigger 会检查。

  1. resources 中的文件(CSS、JS等)。
  2. 如果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 Driver可以让你把文件保存到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/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

归入。