From 14a479e8f6cff69fdf54eb66e5e5b7b111ec1620 Mon Sep 17 00:00:00 2001 From: Kathryn Anne S Tan Date: Fri, 29 Mar 2024 01:26:48 +0300 Subject: [PATCH 1/5] Detect octane availability in composer.json, flavors through binaries, include build --- app/Commands/GenerateCommand.php | 2 +- app/Services/File.php | 9 +++++++++ app/Services/Scanner.php | 26 ++++++++++++++++++++++++++ builds/dockerfile-laravel | Bin 19601832 -> 19601713 bytes tests/Feature/GenerateCommandTest.php | 3 +-- 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/app/Commands/GenerateCommand.php b/app/Commands/GenerateCommand.php index e5e310a..f2413ea 100644 --- a/app/Commands/GenerateCommand.php +++ b/app/Commands/GenerateCommand.php @@ -48,7 +48,7 @@ public function handle() // Define the options available to the templates. $options = [ - 'octane' => $this->option('octane'), + 'octane' => $scan->octaneFlavor( $this->options() ), 'build_assets' => ! $this->option('no-assets'), 'dev' => $this->option('dev'), 'laravel_version' => $scan->laravelVersion( $this->options() ), diff --git a/app/Services/File.php b/app/Services/File.php index f6d4b1b..a07e1ab 100644 --- a/app/Services/File.php +++ b/app/Services/File.php @@ -26,4 +26,13 @@ public function createFile( $output, $result ) // Create the file, finally! return file_put_contents($output, implode("\n", $result) . "\n"); } + + public function composerJsonContent( $directory ) + { + $path = $directory.'/composer.json'; + + if( !file_exists( $path ) ) return []; + + return json_decode( file_get_contents( $path ), 1 ); + } } \ No newline at end of file diff --git a/app/Services/Scanner.php b/app/Services/Scanner.php index 7a3443c..0d219e7 100644 --- a/app/Services/Scanner.php +++ b/app/Services/Scanner.php @@ -28,6 +28,32 @@ public function laravelVersion( $options ) return "11.0.0"; } + /** + * Detect octane setup and flavor + */ + public function octaneFlavor( array $options ) + { + // TODO: OCTANE which laravel versions are actually compatible? 11 + $composerContent = (new \App\Services\File())->composerJsonContent( '.' ); + $octane = false; + + if(isset($composerContent['require']) && isset( $composerContent['require']['laravel/octane'] ) ){ + + $require = $composerContent['require']; + + // Determine flavor + if( file_exists('frankenphp') ){ + return 'frankenphp'; + }else if( file_exists( 'rr' ) && file_exists( '.rr.yaml') ){ + return 'roadrunner'; + }else{ + return 'swoole'; + } + + } + return $options['octane']; + } + /** * Scan directory and check if applicable for Fly.io deployment */ diff --git a/builds/dockerfile-laravel b/builds/dockerfile-laravel index f510886d913225138692c78e530fdb33b20dcb2d..69957845dc4e247dfbe8cc27386aad255a5cd3af 100755 GIT binary patch delta 48501 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

2l4t~pKZo(ZVKQg)V(jlO#I0oD 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 diff --git a/tests/Feature/GenerateCommandTest.php b/tests/Feature/GenerateCommandTest.php index 7f58f15..9ce686f 100644 --- a/tests/Feature/GenerateCommandTest.php +++ b/tests/Feature/GenerateCommandTest.php @@ -1,8 +1,7 @@ composerJsonContent( $directory ); $composerConfig = $composerContent['require']; // Matches with options for in App\Commands\GenerateCommand::generate() command From 7f77237d330ac657e96da564230f3519d62cba27 Mon Sep 17 00:00:00 2001 From: Kathryn Anne S Tan Date: Mon, 1 Apr 2024 20:32:10 +0300 Subject: [PATCH 2/5] Disable octane detection for laravel versions below 8 --- app/Commands/GenerateCommand.php | 5 +++-- app/Services/Scanner.php | 11 +++++++---- storage/logs/laravel.log | 4 ++++ 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 storage/logs/laravel.log diff --git a/app/Commands/GenerateCommand.php b/app/Commands/GenerateCommand.php index f2413ea..b2cc320 100644 --- a/app/Commands/GenerateCommand.php +++ b/app/Commands/GenerateCommand.php @@ -48,13 +48,14 @@ public function handle() // Define the options available to the templates. $options = [ - 'octane' => $scan->octaneFlavor( $this->options() ), 'build_assets' => ! $this->option('no-assets'), 'dev' => $this->option('dev'), + 'octane' => $this->option('octane'), 'laravel_version' => $scan->laravelVersion( $this->options() ), 'fly' => $scan->isForFly(), ]; - + $options['octane'] = $scan->octaneFlavor( $options ); + // Define the list of templates to render. // The key is the template name, and the value is the output file name. $templates = $scan->templates( $options ); diff --git a/app/Services/Scanner.php b/app/Services/Scanner.php index 0d219e7..e5e8dbe 100644 --- a/app/Services/Scanner.php +++ b/app/Services/Scanner.php @@ -33,12 +33,16 @@ public function laravelVersion( $options ) */ public function octaneFlavor( array $options ) { - // TODO: OCTANE which laravel versions are actually compatible? 11 + // Octane is not supported for laravel versions below v8 + if( intval($options['laravel_version']) < 8 ){ + return null; + } + $composerContent = (new \App\Services\File())->composerJsonContent( '.' ); $octane = false; - if(isset($composerContent['require']) && isset( $composerContent['require']['laravel/octane'] ) ){ - + // Detect octane from composer.json + if( isset($composerContent['require']) && isset( $composerContent['require']['laravel/octane'] ) ){ $require = $composerContent['require']; // Determine flavor @@ -49,7 +53,6 @@ public function octaneFlavor( array $options ) }else{ return 'swoole'; } - } return $options['octane']; } diff --git a/storage/logs/laravel.log b/storage/logs/laravel.log new file mode 100644 index 0000000..78bb062 --- /dev/null +++ b/storage/logs/laravel.log @@ -0,0 +1,4 @@ +[2024-04-01 17:29:21] development.ERROR: Declaration of LaravelZero\Framework\Commands\BuildCommand::handleSignal(int $signal): int|false must be compatible with Symfony\Component\Console\Command\SignalableCommandInterface::handleSignal(int $signal, int|false $previousExitCode = 0): int|false {"exception":"[object] (Symfony\\Component\\ErrorHandler\\Error\\FatalError(code: 0): Declaration of LaravelZero\\Framework\\Commands\\BuildCommand::handleSignal(int $signal): int|false must be compatible with Symfony\\Component\\Console\\Command\\SignalableCommandInterface::handleSignal(int $signal, int|false $previousExitCode = 0): int|false at /home/admin_kath/development/projects/dockerfile-laravel/vendor/laravel-zero/framework/src/Commands/BuildCommand.php:84) +[stacktrace] +#0 {main} +"} From d71fd3bb2dbf5eb5048ad9708652085eb5e727b9 Mon Sep 17 00:00:00 2001 From: Kathryn Anne S Tan Date: Tue, 2 Apr 2024 00:36:03 +0300 Subject: [PATCH 3/5] Include --path flag to allow detection of files in --path w/c is important in detecting options that rely on existence of file i.e octane flavors; Create test folders for 10 and 11 octane flavors; Include octane-flavor-files(used in detecting the flavors) in the list of files to ignore for matching during test --- app/Commands/GenerateCommand.php | 7 +- app/Services/Scanner.php | 13 +-- tests/Feature/GenerateCommandTest.php | 14 +++- .../Supported/10_octane_frankenphp/Dockerfile | 80 ++++++++++++++++++ .../10_octane_frankenphp/composer.json | 6 ++ .../Supported/10_octane_frankenphp/frankenphp | 1 + tests/Feature/Supported/10_octane_rr/.rr.yaml | 1 + .../Feature/Supported/10_octane_rr/Dockerfile | 80 ++++++++++++++++++ .../Supported/10_octane_rr/composer.json | 6 ++ tests/Feature/Supported/10_octane_rr/rr | 1 + .../Supported/10_octane_swoole/Dockerfile | 78 ++++++++++++++++++ .../Supported/10_octane_swoole/composer.json | 6 ++ .../Supported/11_octane_frankenphp/Dockerfile | 82 +++++++++++++++++++ .../11_octane_frankenphp/composer.json | 6 ++ .../Supported/11_octane_frankenphp/frankenphp | 1 + tests/Feature/Supported/11_octane_rr/.rr.yaml | 1 + .../Feature/Supported/11_octane_rr/Dockerfile | 82 +++++++++++++++++++ .../Supported/11_octane_rr/composer.json | 6 ++ tests/Feature/Supported/11_octane_rr/rr | 1 + .../Supported/11_octane_swoole/Dockerfile | 80 ++++++++++++++++++ .../Supported/11_octane_swoole/composer.json | 6 ++ 21 files changed, 544 insertions(+), 14 deletions(-) create mode 100644 tests/Feature/Supported/10_octane_frankenphp/Dockerfile create mode 100644 tests/Feature/Supported/10_octane_frankenphp/composer.json create mode 100644 tests/Feature/Supported/10_octane_frankenphp/frankenphp create mode 100644 tests/Feature/Supported/10_octane_rr/.rr.yaml create mode 100644 tests/Feature/Supported/10_octane_rr/Dockerfile create mode 100644 tests/Feature/Supported/10_octane_rr/composer.json create mode 100644 tests/Feature/Supported/10_octane_rr/rr create mode 100644 tests/Feature/Supported/10_octane_swoole/Dockerfile create mode 100644 tests/Feature/Supported/10_octane_swoole/composer.json create mode 100644 tests/Feature/Supported/11_octane_frankenphp/Dockerfile create mode 100644 tests/Feature/Supported/11_octane_frankenphp/composer.json create mode 100644 tests/Feature/Supported/11_octane_frankenphp/frankenphp create mode 100644 tests/Feature/Supported/11_octane_rr/.rr.yaml create mode 100644 tests/Feature/Supported/11_octane_rr/Dockerfile create mode 100644 tests/Feature/Supported/11_octane_rr/composer.json create mode 100644 tests/Feature/Supported/11_octane_rr/rr create mode 100644 tests/Feature/Supported/11_octane_swoole/Dockerfile create mode 100644 tests/Feature/Supported/11_octane_swoole/composer.json diff --git a/app/Commands/GenerateCommand.php b/app/Commands/GenerateCommand.php index b2cc320..4695bba 100644 --- a/app/Commands/GenerateCommand.php +++ b/app/Commands/GenerateCommand.php @@ -18,7 +18,8 @@ class GenerateCommand extends Command {--force : Overwrite existing files} {--skip : Keep existing files} {--dev : Include dev dependencies like the local .env file} - {--laravel-version= : Set the laravel version}'; + {--laravel-version= : Set the laravel version} + {--path=. : Set the directory to check files in.}'; /** * The description of the command. @@ -53,8 +54,8 @@ public function handle() 'octane' => $this->option('octane'), 'laravel_version' => $scan->laravelVersion( $this->options() ), 'fly' => $scan->isForFly(), - ]; - $options['octane'] = $scan->octaneFlavor( $options ); + 'octane' => $scan->octaneFlavor( $this->options() ) + ]; // Define the list of templates to render. // The key is the template name, and the value is the output file name. diff --git a/app/Services/Scanner.php b/app/Services/Scanner.php index e5e8dbe..16fcc14 100644 --- a/app/Services/Scanner.php +++ b/app/Services/Scanner.php @@ -33,22 +33,17 @@ public function laravelVersion( $options ) */ public function octaneFlavor( array $options ) { - // Octane is not supported for laravel versions below v8 - if( intval($options['laravel_version']) < 8 ){ - return null; - } - - $composerContent = (new \App\Services\File())->composerJsonContent( '.' ); + $composerContent = (new \App\Services\File())->composerJsonContent( $options['path'] ); $octane = false; // Detect octane from composer.json if( isset($composerContent['require']) && isset( $composerContent['require']['laravel/octane'] ) ){ $require = $composerContent['require']; - + // Determine flavor - if( file_exists('frankenphp') ){ + if( file_exists( $options['path'].'/frankenphp') ){ return 'frankenphp'; - }else if( file_exists( 'rr' ) && file_exists( '.rr.yaml') ){ + }else if( file_exists( $options['path'].'/rr' ) && file_exists( $options['path'].'/.rr.yaml') ){ return 'roadrunner'; }else{ return 'swoole'; diff --git a/tests/Feature/GenerateCommandTest.php b/tests/Feature/GenerateCommandTest.php index 9ce686f..8e97e63 100644 --- a/tests/Feature/GenerateCommandTest.php +++ b/tests/Feature/GenerateCommandTest.php @@ -1,4 +1,10 @@ composerJsonContent( $directory ); @@ -6,7 +12,7 @@ function getTestOptions( string $directory ): string // Matches with options for in App\Commands\GenerateCommand::generate() command $optionsToCheck = [ - 'laravel/framework' => 'laravel-version' + 'laravel/framework' => 'laravel-version', ]; // Gather options @@ -16,6 +22,10 @@ function getTestOptions( string $directory ): string $optionsFound .= '--'.$option.'="'.$composerConfig[$key].'" '; } } + + // Set directory to check files in + $optionsFound .= '--path="'.$directory.'"'; + return $optionsFound; } @@ -36,7 +46,7 @@ function getTestOptions( string $directory ): string foreach( $referenceFiles as $reference ){ $failedForMsg = 'Failed for: "'.$reference->getPathName().'"'; - if( $reference->getFileName() == 'composer.json' ) continue; + if( in_array( $reference->getFileName(), ignoreFiles()) ) continue; // Second assert: a new file with the reference file's name was created-it should exist! $this->assertFileExists( $reference->getFileName(), $failedForMsg ); diff --git a/tests/Feature/Supported/10_octane_frankenphp/Dockerfile b/tests/Feature/Supported/10_octane_frankenphp/Dockerfile new file mode 100644 index 0000000..dcf8d67 --- /dev/null +++ b/tests/Feature/Supported/10_octane_frankenphp/Dockerfile @@ -0,0 +1,80 @@ +# syntax = docker/dockerfile:experimental + +ARG PHP_VERSION=8.2 +ARG NODE_VERSION=18 +FROM fideloper/fly-laravel:${PHP_VERSION} as base + +# PHP_VERSION needs to be repeated here +# See https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +ARG PHP_VERSION + +LABEL fly_launch_runtime="laravel" + +# copy application code, skipping files based on .dockerignore +COPY . /var/www/html + +RUN composer install --optimize-autoloader --no-dev \ + && mkdir -p storage/logs \ + && php artisan optimize:clear \ + && chown -R www-data:www-data /var/www/html \ + && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ + && sed -i 's/protected \$proxies/protected \$proxies = "*"/g' app/Http/Middleware/TrustProxies.php;\ + if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; + + +RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ + mv /etc/supervisor/octane-franken.conf /etc/supervisor/conf.d/octane-franken.conf; \ + rm -f frankenphp; \ + php artisan octane:install --no-interaction --server=frankenphp; \ + rm /etc/nginx/sites-enabled/default; \ + ln -sf /etc/nginx/sites-available/default-octane /etc/nginx/sites-enabled/default; + +# Multi-stage build: Build static assets +# This allows us to not include Node within the final container +FROM node:${NODE_VERSION} as node_modules_go_brrr + +RUN mkdir /app + +RUN mkdir -p /app +WORKDIR /app +COPY . . +COPY --from=base /var/www/html/vendor /app/vendor + +# Use yarn or npm depending on what type of +# lock file we might find. Defaults to +# NPM if no lock file is found. +# Note: We run "production" for Mix and "build" for Vite +RUN if [ -f "vite.config.js" ]; then \ + ASSET_CMD="build"; \ + else \ + ASSET_CMD="production"; \ + fi; \ + if [ -f "yarn.lock" ]; then \ + yarn install --frozen-lockfile; \ + yarn $ASSET_CMD; \ + elif [ -f "pnpm-lock.yaml" ]; then \ + corepack enable && corepack prepare pnpm@latest-8 --activate; \ + pnpm install --frozen-lockfile; \ + pnpm run $ASSET_CMD; \ + elif [ -f "package-lock.json" ]; then \ + npm ci --no-audit; \ + npm run $ASSET_CMD; \ + else \ + npm install; \ + npm run $ASSET_CMD; \ + fi; + +# From our base container created above, we +# create our final image, adding in static +# assets that we generated above +FROM base + +# Packages like Laravel Nova may have added assets to the public directory +# or maybe some custom assets were added manually! Either way, we merge +# in the assets we generated above rather than overwrite them +COPY --from=node_modules_go_brrr /app/public /var/www/html/public-npm +RUN rsync -ar /var/www/html/public-npm/ /var/www/html/public/ \ + && rm -rf /var/www/html/public-npm \ + && chown -R www-data:www-data /var/www/html/public + +EXPOSE 8080 diff --git a/tests/Feature/Supported/10_octane_frankenphp/composer.json b/tests/Feature/Supported/10_octane_frankenphp/composer.json new file mode 100644 index 0000000..fe8cfff --- /dev/null +++ b/tests/Feature/Supported/10_octane_frankenphp/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "laravel/framework": "^10.0.0", + "laravel/octane" : "*" + } +} \ No newline at end of file diff --git a/tests/Feature/Supported/10_octane_frankenphp/frankenphp b/tests/Feature/Supported/10_octane_frankenphp/frankenphp new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/tests/Feature/Supported/10_octane_frankenphp/frankenphp @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/tests/Feature/Supported/10_octane_rr/.rr.yaml b/tests/Feature/Supported/10_octane_rr/.rr.yaml new file mode 100644 index 0000000..474e5c7 --- /dev/null +++ b/tests/Feature/Supported/10_octane_rr/.rr.yaml @@ -0,0 +1 @@ +rryaml \ No newline at end of file diff --git a/tests/Feature/Supported/10_octane_rr/Dockerfile b/tests/Feature/Supported/10_octane_rr/Dockerfile new file mode 100644 index 0000000..6e1d71c --- /dev/null +++ b/tests/Feature/Supported/10_octane_rr/Dockerfile @@ -0,0 +1,80 @@ +# syntax = docker/dockerfile:experimental + +ARG PHP_VERSION=8.2 +ARG NODE_VERSION=18 +FROM fideloper/fly-laravel:${PHP_VERSION} as base + +# PHP_VERSION needs to be repeated here +# See https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +ARG PHP_VERSION + +LABEL fly_launch_runtime="laravel" + +# copy application code, skipping files based on .dockerignore +COPY . /var/www/html + +RUN composer install --optimize-autoloader --no-dev \ + && mkdir -p storage/logs \ + && php artisan optimize:clear \ + && chown -R www-data:www-data /var/www/html \ + && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ + && sed -i 's/protected \$proxies/protected \$proxies = "*"/g' app/Http/Middleware/TrustProxies.php;\ + if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; + + +RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ + mv /etc/supervisor/octane-rr.conf /etc/supervisor/conf.d/octane-rr.conf; \ + if [ -f ./vendor/bin/rr ]; then ./vendor/bin/rr get-binary; fi; \ + rm -f .rr.yaml; \ + rm /etc/nginx/sites-enabled/default; \ + ln -sf /etc/nginx/sites-available/default-octane /etc/nginx/sites-enabled/default; + +# Multi-stage build: Build static assets +# This allows us to not include Node within the final container +FROM node:${NODE_VERSION} as node_modules_go_brrr + +RUN mkdir /app + +RUN mkdir -p /app +WORKDIR /app +COPY . . +COPY --from=base /var/www/html/vendor /app/vendor + +# Use yarn or npm depending on what type of +# lock file we might find. Defaults to +# NPM if no lock file is found. +# Note: We run "production" for Mix and "build" for Vite +RUN if [ -f "vite.config.js" ]; then \ + ASSET_CMD="build"; \ + else \ + ASSET_CMD="production"; \ + fi; \ + if [ -f "yarn.lock" ]; then \ + yarn install --frozen-lockfile; \ + yarn $ASSET_CMD; \ + elif [ -f "pnpm-lock.yaml" ]; then \ + corepack enable && corepack prepare pnpm@latest-8 --activate; \ + pnpm install --frozen-lockfile; \ + pnpm run $ASSET_CMD; \ + elif [ -f "package-lock.json" ]; then \ + npm ci --no-audit; \ + npm run $ASSET_CMD; \ + else \ + npm install; \ + npm run $ASSET_CMD; \ + fi; + +# From our base container created above, we +# create our final image, adding in static +# assets that we generated above +FROM base + +# Packages like Laravel Nova may have added assets to the public directory +# or maybe some custom assets were added manually! Either way, we merge +# in the assets we generated above rather than overwrite them +COPY --from=node_modules_go_brrr /app/public /var/www/html/public-npm +RUN rsync -ar /var/www/html/public-npm/ /var/www/html/public/ \ + && rm -rf /var/www/html/public-npm \ + && chown -R www-data:www-data /var/www/html/public + +EXPOSE 8080 diff --git a/tests/Feature/Supported/10_octane_rr/composer.json b/tests/Feature/Supported/10_octane_rr/composer.json new file mode 100644 index 0000000..fe8cfff --- /dev/null +++ b/tests/Feature/Supported/10_octane_rr/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "laravel/framework": "^10.0.0", + "laravel/octane" : "*" + } +} \ No newline at end of file diff --git a/tests/Feature/Supported/10_octane_rr/rr b/tests/Feature/Supported/10_octane_rr/rr new file mode 100644 index 0000000..7481d32 --- /dev/null +++ b/tests/Feature/Supported/10_octane_rr/rr @@ -0,0 +1 @@ +rr \ No newline at end of file diff --git a/tests/Feature/Supported/10_octane_swoole/Dockerfile b/tests/Feature/Supported/10_octane_swoole/Dockerfile new file mode 100644 index 0000000..3711237 --- /dev/null +++ b/tests/Feature/Supported/10_octane_swoole/Dockerfile @@ -0,0 +1,78 @@ +# syntax = docker/dockerfile:experimental + +ARG PHP_VERSION=8.2 +ARG NODE_VERSION=18 +FROM fideloper/fly-laravel:${PHP_VERSION} as base + +# PHP_VERSION needs to be repeated here +# See https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +ARG PHP_VERSION + +LABEL fly_launch_runtime="laravel" + +# copy application code, skipping files based on .dockerignore +COPY . /var/www/html + +RUN composer install --optimize-autoloader --no-dev \ + && mkdir -p storage/logs \ + && php artisan optimize:clear \ + && chown -R www-data:www-data /var/www/html \ + && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ + && sed -i 's/protected \$proxies/protected \$proxies = "*"/g' app/Http/Middleware/TrustProxies.php;\ + if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; + + +RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ + mv /etc/supervisor/octane-swoole.conf /etc/supervisor/conf.d/octane-swoole.conf; \ + rm /etc/nginx/sites-enabled/default; \ + ln -sf /etc/nginx/sites-available/default-octane /etc/nginx/sites-enabled/default; + +# Multi-stage build: Build static assets +# This allows us to not include Node within the final container +FROM node:${NODE_VERSION} as node_modules_go_brrr + +RUN mkdir /app + +RUN mkdir -p /app +WORKDIR /app +COPY . . +COPY --from=base /var/www/html/vendor /app/vendor + +# Use yarn or npm depending on what type of +# lock file we might find. Defaults to +# NPM if no lock file is found. +# Note: We run "production" for Mix and "build" for Vite +RUN if [ -f "vite.config.js" ]; then \ + ASSET_CMD="build"; \ + else \ + ASSET_CMD="production"; \ + fi; \ + if [ -f "yarn.lock" ]; then \ + yarn install --frozen-lockfile; \ + yarn $ASSET_CMD; \ + elif [ -f "pnpm-lock.yaml" ]; then \ + corepack enable && corepack prepare pnpm@latest-8 --activate; \ + pnpm install --frozen-lockfile; \ + pnpm run $ASSET_CMD; \ + elif [ -f "package-lock.json" ]; then \ + npm ci --no-audit; \ + npm run $ASSET_CMD; \ + else \ + npm install; \ + npm run $ASSET_CMD; \ + fi; + +# From our base container created above, we +# create our final image, adding in static +# assets that we generated above +FROM base + +# Packages like Laravel Nova may have added assets to the public directory +# or maybe some custom assets were added manually! Either way, we merge +# in the assets we generated above rather than overwrite them +COPY --from=node_modules_go_brrr /app/public /var/www/html/public-npm +RUN rsync -ar /var/www/html/public-npm/ /var/www/html/public/ \ + && rm -rf /var/www/html/public-npm \ + && chown -R www-data:www-data /var/www/html/public + +EXPOSE 8080 diff --git a/tests/Feature/Supported/10_octane_swoole/composer.json b/tests/Feature/Supported/10_octane_swoole/composer.json new file mode 100644 index 0000000..fe8cfff --- /dev/null +++ b/tests/Feature/Supported/10_octane_swoole/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "laravel/framework": "^10.0.0", + "laravel/octane" : "*" + } +} \ No newline at end of file diff --git a/tests/Feature/Supported/11_octane_frankenphp/Dockerfile b/tests/Feature/Supported/11_octane_frankenphp/Dockerfile new file mode 100644 index 0000000..d9f5c7d --- /dev/null +++ b/tests/Feature/Supported/11_octane_frankenphp/Dockerfile @@ -0,0 +1,82 @@ +# syntax = docker/dockerfile:experimental + +ARG PHP_VERSION=8.2 +ARG NODE_VERSION=18 +FROM fideloper/fly-laravel:${PHP_VERSION} as base + +# PHP_VERSION needs to be repeated here +# See https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +ARG PHP_VERSION + +LABEL fly_launch_runtime="laravel" + +# copy application code, skipping files based on .dockerignore +COPY . /var/www/html + +RUN composer install --optimize-autoloader --no-dev \ + && mkdir -p storage/logs \ + && php artisan optimize:clear \ + && chown -R www-data:www-data /var/www/html \ + && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ + && sed -i='' '/->withMiddleware(function (Middleware \$middleware) {/a\ + \$middleware->trustProxies(at: "*");\ + ' bootstrap/app.php; \ + if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; + + +RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ + mv /etc/supervisor/octane-franken.conf /etc/supervisor/conf.d/octane-franken.conf; \ + rm -f frankenphp; \ + php artisan octane:install --no-interaction --server=frankenphp; \ + rm /etc/nginx/sites-enabled/default; \ + ln -sf /etc/nginx/sites-available/default-octane /etc/nginx/sites-enabled/default; + +# Multi-stage build: Build static assets +# This allows us to not include Node within the final container +FROM node:${NODE_VERSION} as node_modules_go_brrr + +RUN mkdir /app + +RUN mkdir -p /app +WORKDIR /app +COPY . . +COPY --from=base /var/www/html/vendor /app/vendor + +# Use yarn or npm depending on what type of +# lock file we might find. Defaults to +# NPM if no lock file is found. +# Note: We run "production" for Mix and "build" for Vite +RUN if [ -f "vite.config.js" ]; then \ + ASSET_CMD="build"; \ + else \ + ASSET_CMD="production"; \ + fi; \ + if [ -f "yarn.lock" ]; then \ + yarn install --frozen-lockfile; \ + yarn $ASSET_CMD; \ + elif [ -f "pnpm-lock.yaml" ]; then \ + corepack enable && corepack prepare pnpm@latest-8 --activate; \ + pnpm install --frozen-lockfile; \ + pnpm run $ASSET_CMD; \ + elif [ -f "package-lock.json" ]; then \ + npm ci --no-audit; \ + npm run $ASSET_CMD; \ + else \ + npm install; \ + npm run $ASSET_CMD; \ + fi; + +# From our base container created above, we +# create our final image, adding in static +# assets that we generated above +FROM base + +# Packages like Laravel Nova may have added assets to the public directory +# or maybe some custom assets were added manually! Either way, we merge +# in the assets we generated above rather than overwrite them +COPY --from=node_modules_go_brrr /app/public /var/www/html/public-npm +RUN rsync -ar /var/www/html/public-npm/ /var/www/html/public/ \ + && rm -rf /var/www/html/public-npm \ + && chown -R www-data:www-data /var/www/html/public + +EXPOSE 8080 diff --git a/tests/Feature/Supported/11_octane_frankenphp/composer.json b/tests/Feature/Supported/11_octane_frankenphp/composer.json new file mode 100644 index 0000000..1c0265b --- /dev/null +++ b/tests/Feature/Supported/11_octane_frankenphp/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "laravel/framework": "^11.0.0", + "laravel/octane" : "*" + } +} \ No newline at end of file diff --git a/tests/Feature/Supported/11_octane_frankenphp/frankenphp b/tests/Feature/Supported/11_octane_frankenphp/frankenphp new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/tests/Feature/Supported/11_octane_frankenphp/frankenphp @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/tests/Feature/Supported/11_octane_rr/.rr.yaml b/tests/Feature/Supported/11_octane_rr/.rr.yaml new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/tests/Feature/Supported/11_octane_rr/.rr.yaml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/tests/Feature/Supported/11_octane_rr/Dockerfile b/tests/Feature/Supported/11_octane_rr/Dockerfile new file mode 100644 index 0000000..23a89cc --- /dev/null +++ b/tests/Feature/Supported/11_octane_rr/Dockerfile @@ -0,0 +1,82 @@ +# syntax = docker/dockerfile:experimental + +ARG PHP_VERSION=8.2 +ARG NODE_VERSION=18 +FROM fideloper/fly-laravel:${PHP_VERSION} as base + +# PHP_VERSION needs to be repeated here +# See https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +ARG PHP_VERSION + +LABEL fly_launch_runtime="laravel" + +# copy application code, skipping files based on .dockerignore +COPY . /var/www/html + +RUN composer install --optimize-autoloader --no-dev \ + && mkdir -p storage/logs \ + && php artisan optimize:clear \ + && chown -R www-data:www-data /var/www/html \ + && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ + && sed -i='' '/->withMiddleware(function (Middleware \$middleware) {/a\ + \$middleware->trustProxies(at: "*");\ + ' bootstrap/app.php; \ + if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; + + +RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ + mv /etc/supervisor/octane-rr.conf /etc/supervisor/conf.d/octane-rr.conf; \ + if [ -f ./vendor/bin/rr ]; then ./vendor/bin/rr get-binary; fi; \ + rm -f .rr.yaml; \ + rm /etc/nginx/sites-enabled/default; \ + ln -sf /etc/nginx/sites-available/default-octane /etc/nginx/sites-enabled/default; + +# Multi-stage build: Build static assets +# This allows us to not include Node within the final container +FROM node:${NODE_VERSION} as node_modules_go_brrr + +RUN mkdir /app + +RUN mkdir -p /app +WORKDIR /app +COPY . . +COPY --from=base /var/www/html/vendor /app/vendor + +# Use yarn or npm depending on what type of +# lock file we might find. Defaults to +# NPM if no lock file is found. +# Note: We run "production" for Mix and "build" for Vite +RUN if [ -f "vite.config.js" ]; then \ + ASSET_CMD="build"; \ + else \ + ASSET_CMD="production"; \ + fi; \ + if [ -f "yarn.lock" ]; then \ + yarn install --frozen-lockfile; \ + yarn $ASSET_CMD; \ + elif [ -f "pnpm-lock.yaml" ]; then \ + corepack enable && corepack prepare pnpm@latest-8 --activate; \ + pnpm install --frozen-lockfile; \ + pnpm run $ASSET_CMD; \ + elif [ -f "package-lock.json" ]; then \ + npm ci --no-audit; \ + npm run $ASSET_CMD; \ + else \ + npm install; \ + npm run $ASSET_CMD; \ + fi; + +# From our base container created above, we +# create our final image, adding in static +# assets that we generated above +FROM base + +# Packages like Laravel Nova may have added assets to the public directory +# or maybe some custom assets were added manually! Either way, we merge +# in the assets we generated above rather than overwrite them +COPY --from=node_modules_go_brrr /app/public /var/www/html/public-npm +RUN rsync -ar /var/www/html/public-npm/ /var/www/html/public/ \ + && rm -rf /var/www/html/public-npm \ + && chown -R www-data:www-data /var/www/html/public + +EXPOSE 8080 diff --git a/tests/Feature/Supported/11_octane_rr/composer.json b/tests/Feature/Supported/11_octane_rr/composer.json new file mode 100644 index 0000000..1c0265b --- /dev/null +++ b/tests/Feature/Supported/11_octane_rr/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "laravel/framework": "^11.0.0", + "laravel/octane" : "*" + } +} \ No newline at end of file diff --git a/tests/Feature/Supported/11_octane_rr/rr b/tests/Feature/Supported/11_octane_rr/rr new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/tests/Feature/Supported/11_octane_rr/rr @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/tests/Feature/Supported/11_octane_swoole/Dockerfile b/tests/Feature/Supported/11_octane_swoole/Dockerfile new file mode 100644 index 0000000..426ede4 --- /dev/null +++ b/tests/Feature/Supported/11_octane_swoole/Dockerfile @@ -0,0 +1,80 @@ +# syntax = docker/dockerfile:experimental + +ARG PHP_VERSION=8.2 +ARG NODE_VERSION=18 +FROM fideloper/fly-laravel:${PHP_VERSION} as base + +# PHP_VERSION needs to be repeated here +# See https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact +ARG PHP_VERSION + +LABEL fly_launch_runtime="laravel" + +# copy application code, skipping files based on .dockerignore +COPY . /var/www/html + +RUN composer install --optimize-autoloader --no-dev \ + && mkdir -p storage/logs \ + && php artisan optimize:clear \ + && chown -R www-data:www-data /var/www/html \ + && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ + && sed -i='' '/->withMiddleware(function (Middleware \$middleware) {/a\ + \$middleware->trustProxies(at: "*");\ + ' bootstrap/app.php; \ + if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; + + +RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ + mv /etc/supervisor/octane-swoole.conf /etc/supervisor/conf.d/octane-swoole.conf; \ + rm /etc/nginx/sites-enabled/default; \ + ln -sf /etc/nginx/sites-available/default-octane /etc/nginx/sites-enabled/default; + +# Multi-stage build: Build static assets +# This allows us to not include Node within the final container +FROM node:${NODE_VERSION} as node_modules_go_brrr + +RUN mkdir /app + +RUN mkdir -p /app +WORKDIR /app +COPY . . +COPY --from=base /var/www/html/vendor /app/vendor + +# Use yarn or npm depending on what type of +# lock file we might find. Defaults to +# NPM if no lock file is found. +# Note: We run "production" for Mix and "build" for Vite +RUN if [ -f "vite.config.js" ]; then \ + ASSET_CMD="build"; \ + else \ + ASSET_CMD="production"; \ + fi; \ + if [ -f "yarn.lock" ]; then \ + yarn install --frozen-lockfile; \ + yarn $ASSET_CMD; \ + elif [ -f "pnpm-lock.yaml" ]; then \ + corepack enable && corepack prepare pnpm@latest-8 --activate; \ + pnpm install --frozen-lockfile; \ + pnpm run $ASSET_CMD; \ + elif [ -f "package-lock.json" ]; then \ + npm ci --no-audit; \ + npm run $ASSET_CMD; \ + else \ + npm install; \ + npm run $ASSET_CMD; \ + fi; + +# From our base container created above, we +# create our final image, adding in static +# assets that we generated above +FROM base + +# Packages like Laravel Nova may have added assets to the public directory +# or maybe some custom assets were added manually! Either way, we merge +# in the assets we generated above rather than overwrite them +COPY --from=node_modules_go_brrr /app/public /var/www/html/public-npm +RUN rsync -ar /var/www/html/public-npm/ /var/www/html/public/ \ + && rm -rf /var/www/html/public-npm \ + && chown -R www-data:www-data /var/www/html/public + +EXPOSE 8080 diff --git a/tests/Feature/Supported/11_octane_swoole/composer.json b/tests/Feature/Supported/11_octane_swoole/composer.json new file mode 100644 index 0000000..1c0265b --- /dev/null +++ b/tests/Feature/Supported/11_octane_swoole/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "laravel/framework": "^11.0.0", + "laravel/octane" : "*" + } +} \ No newline at end of file From 06b39fba3ed663c99603db356788b53eb5c0c0e5 Mon Sep 17 00:00:00 2001 From: Kathryn Anne S Tan Date: Tue, 2 Apr 2024 00:54:21 +0300 Subject: [PATCH 4/5] Prioritize laravel-version option passed instead of scanned version --- app/Commands/GenerateCommand.php | 1 - app/Services/Scanner.php | 20 +++++++++++--------- builds/dockerfile-laravel | Bin 19601713 -> 19601744 bytes 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/Commands/GenerateCommand.php b/app/Commands/GenerateCommand.php index 4695bba..80393c9 100644 --- a/app/Commands/GenerateCommand.php +++ b/app/Commands/GenerateCommand.php @@ -51,7 +51,6 @@ public function handle() $options = [ 'build_assets' => ! $this->option('no-assets'), 'dev' => $this->option('dev'), - 'octane' => $this->option('octane'), 'laravel_version' => $scan->laravelVersion( $this->options() ), 'fly' => $scan->isForFly(), 'octane' => $scan->octaneFlavor( $this->options() ) diff --git a/app/Services/Scanner.php b/app/Services/Scanner.php index 16fcc14..52ed8ac 100644 --- a/app/Services/Scanner.php +++ b/app/Services/Scanner.php @@ -13,17 +13,20 @@ class Scanner */ public function laravelVersion( $options ) { - $run = Process::run( 'php artisan --version' ); - $version = $run->output(); - $version = explode('Laravel Framework', $version); - if( count($version) >1 ){ - // From artisan command - return trim($version[1]); - }else if( isset( $options['laravel-version']) && !empty($options['laravel-version']) ){ + if( isset( $options['laravel-version']) && !empty($options['laravel-version']) ){ // From options return trim( $options['laravel-version'], '^' ); + }else{ + // From detection + $run = Process::run( 'php artisan --version' ); + $version = $run->output(); + $version = explode('Laravel Framework', $version); + if( count($version) >1 ){ + // From artisan command + return trim($version[1]); + } } - + // Default Latest Version return "11.0.0"; } @@ -38,7 +41,6 @@ public function octaneFlavor( array $options ) // Detect octane from composer.json if( isset($composerContent['require']) && isset( $composerContent['require']['laravel/octane'] ) ){ - $require = $composerContent['require']; // Determine flavor if( file_exists( $options['path'].'/frankenphp') ){ diff --git a/builds/dockerfile-laravel b/builds/dockerfile-laravel index 69957845dc4e247dfbe8cc27386aad255a5cd3af..81bfd8b2f3c938c8d8b54f2fa4ad57bcc47cfe7d 100755 GIT binary patch delta 8748 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 n$Y+J^^Q4dcfiO=sYv|?cXO_O delta 8738 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 Date: Tue, 2 Apr 2024 01:26:58 +0300 Subject: [PATCH 5/5] Update dockerfile test references for 10,11 octane flavor; clean up files only when successful, since file generated will help as reference when a test fails --- tests/Feature/GenerateCommandTest.php | 7 ++++--- tests/Feature/Supported/10_octane_frankenphp/Dockerfile | 1 - tests/Feature/Supported/10_octane_rr/Dockerfile | 1 - tests/Feature/Supported/10_octane_swoole/Dockerfile | 1 - tests/Feature/Supported/11_octane_frankenphp/Dockerfile | 1 - tests/Feature/Supported/11_octane_rr/Dockerfile | 1 - tests/Feature/Supported/11_octane_swoole/Dockerfile | 1 - 7 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tests/Feature/GenerateCommandTest.php b/tests/Feature/GenerateCommandTest.php index 8e97e63..225bcdc 100644 --- a/tests/Feature/GenerateCommandTest.php +++ b/tests/Feature/GenerateCommandTest.php @@ -55,12 +55,13 @@ function getTestOptions( string $directory ): string $expected = file_get_contents( $reference->getPathName() ); // expected content from reference file $generated = file_get_contents( $reference->getFileName() ); // new file content - // Clean UP: Delete generated file, no longer needed - unlink( $reference->getFileName() ); - // Third assert: contents are the same // TODO: ignore different ARG VALUES $this->assertEquals( $expected, $generated, $failedForMsg); + + // Clean UP: Delete generated file, no longer needed + unlink( $reference->getFileName() ); + } } }); diff --git a/tests/Feature/Supported/10_octane_frankenphp/Dockerfile b/tests/Feature/Supported/10_octane_frankenphp/Dockerfile index dcf8d67..bc95692 100644 --- a/tests/Feature/Supported/10_octane_frankenphp/Dockerfile +++ b/tests/Feature/Supported/10_octane_frankenphp/Dockerfile @@ -20,7 +20,6 @@ RUN composer install --optimize-autoloader --no-dev \ && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ && sed -i 's/protected \$proxies/protected \$proxies = "*"/g' app/Http/Middleware/TrustProxies.php;\ if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; - RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ mv /etc/supervisor/octane-franken.conf /etc/supervisor/conf.d/octane-franken.conf; \ diff --git a/tests/Feature/Supported/10_octane_rr/Dockerfile b/tests/Feature/Supported/10_octane_rr/Dockerfile index 6e1d71c..84fc57e 100644 --- a/tests/Feature/Supported/10_octane_rr/Dockerfile +++ b/tests/Feature/Supported/10_octane_rr/Dockerfile @@ -20,7 +20,6 @@ RUN composer install --optimize-autoloader --no-dev \ && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ && sed -i 's/protected \$proxies/protected \$proxies = "*"/g' app/Http/Middleware/TrustProxies.php;\ if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; - RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ mv /etc/supervisor/octane-rr.conf /etc/supervisor/conf.d/octane-rr.conf; \ diff --git a/tests/Feature/Supported/10_octane_swoole/Dockerfile b/tests/Feature/Supported/10_octane_swoole/Dockerfile index 3711237..9a6c73b 100644 --- a/tests/Feature/Supported/10_octane_swoole/Dockerfile +++ b/tests/Feature/Supported/10_octane_swoole/Dockerfile @@ -20,7 +20,6 @@ RUN composer install --optimize-autoloader --no-dev \ && echo "MAILTO=\"\"\n* * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run" > /etc/cron.d/laravel \ && sed -i 's/protected \$proxies/protected \$proxies = "*"/g' app/Http/Middleware/TrustProxies.php;\ if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; - RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ mv /etc/supervisor/octane-swoole.conf /etc/supervisor/conf.d/octane-swoole.conf; \ diff --git a/tests/Feature/Supported/11_octane_frankenphp/Dockerfile b/tests/Feature/Supported/11_octane_frankenphp/Dockerfile index d9f5c7d..80f2307 100644 --- a/tests/Feature/Supported/11_octane_frankenphp/Dockerfile +++ b/tests/Feature/Supported/11_octane_frankenphp/Dockerfile @@ -22,7 +22,6 @@ RUN composer install --optimize-autoloader --no-dev \ \$middleware->trustProxies(at: "*");\ ' bootstrap/app.php; \ if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; - RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ mv /etc/supervisor/octane-franken.conf /etc/supervisor/conf.d/octane-franken.conf; \ diff --git a/tests/Feature/Supported/11_octane_rr/Dockerfile b/tests/Feature/Supported/11_octane_rr/Dockerfile index 23a89cc..d273b7a 100644 --- a/tests/Feature/Supported/11_octane_rr/Dockerfile +++ b/tests/Feature/Supported/11_octane_rr/Dockerfile @@ -22,7 +22,6 @@ RUN composer install --optimize-autoloader --no-dev \ \$middleware->trustProxies(at: "*");\ ' bootstrap/app.php; \ if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; - RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ mv /etc/supervisor/octane-rr.conf /etc/supervisor/conf.d/octane-rr.conf; \ diff --git a/tests/Feature/Supported/11_octane_swoole/Dockerfile b/tests/Feature/Supported/11_octane_swoole/Dockerfile index 426ede4..ef0d507 100644 --- a/tests/Feature/Supported/11_octane_swoole/Dockerfile +++ b/tests/Feature/Supported/11_octane_swoole/Dockerfile @@ -22,7 +22,6 @@ RUN composer install --optimize-autoloader --no-dev \ \$middleware->trustProxies(at: "*");\ ' bootstrap/app.php; \ if [ -d .fly ]; then cp .fly/entrypoint.sh /entrypoint; chmod +x /entrypoint; fi; - RUN rm -rf /etc/supervisor/conf.d/fpm.conf; \ mv /etc/supervisor/octane-swoole.conf /etc/supervisor/conf.d/octane-swoole.conf; \