deployer: deploy:vendors step is very slow (take up to 2 mins)
Q | A |
---|---|
Issue Type | Bug |
Deployer Version | N/A |
Local Machine OS | N/A |
Remote Machine OS | N/A |
Description
If I type dep deploy
, the step deploy:vendors
is terribly slow. This step only can take up to 2 minutes.
However, if I only type dep deploy:vendors
, it is very fast (2 s)
Steps to reproduced
dep deploy-vvv
Content of deploy.php
<?php
namespace Deployer;
require 'recipe/symfony.php';
require 'vendor/deployer/recipes/cachetool.php';
//------------------------------
// Configuration
//------------------------------
set('ssh_type', 'native');
set('ssh_multiplexing', true);
set('repository', '***');
set('default_stage', '****-stage');
set('shared_files', ['app/config/parameters.yml.dist']);
add('shared_dirs', ['/web/uploads']);
add('writable_dirs', ['/web/uploads']);
//------------------------------
// Servers
//------------------------------
server('****-stage', '*.*.*.*')
->stage('stage')
->set('env', 'dev')
->set('composer_options', '{{composer_action}} --verbose --prefer-dist --no-progress --no-interaction --optimize-autoloader')
->set('clear_paths', ['web/config.php'])
->set('deploy_path', '/home/****/stage')
->set('cachetool', '/var/run/php/php7.1-fpm.sock')
->user('***')
->forwardAgent()
->set('branch', 'master');
server('****', '*.*.*.*')
->stage('prod')
->set('deploy_path', '/home/****/prod')
->user('***')
->forwardAgent()
->set('branch', 'master');
//------------------------------
// Tasks
//------------------------------
// If deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');
// Migrate database before symlink new release.
before('deploy:symlink', 'database:migrate');
// Clear opcache
after('deploy:symlink', 'cachetool:clear:opcache');
task('upload-stage-files', function () {
$deployPath = get('deploy_path');
upload("web/uploads/", "/home/****/stage/shared/web/uploads/");
});
Output log
$ dep deploy -vvv
➤ Executing task deploy:prepare
[project-stage] > echo $0
SSH multiplexing initialization
[project-stage] < bash
[project-stage] > if [ ! -d /home/project/stage ]; then mkdir -p /home/project/stage; fi
[project-stage] > if [ ! -L /home/project/stage/current ] && [ -d /home/project/stage/current ]; then echo true; fi
[project-stage] > cd /home/project/stage && if [ ! -d .dep ]; then mkdir .dep; fi
[project-stage] > cd /home/project/stage && if [ ! -d releases ]; then mkdir releases; fi
[project-stage] > cd /home/project/stage && if [ ! -d shared ]; then mkdir shared; fi
• done on [project-stage]
✔ Ok [1s 669ms]
➤ Executing task deploy:lock
[project-stage] > if [ -f /home/project/stage/.dep/deploy.lock ]; then echo ‘true’; fi
[project-stage] > touch /home/project/stage/.dep/deploy.lock
• done on [project-stage]
✔ Ok [323ms]
➤ Executing task deploy:release
[project-stage] > cd /home/project/stage && (if [ -h release ]; then echo ‘true’; fi)
[project-stage] > cd /home/project/stage && ([ -d releases ] && [ “$(ls -A releases)” ] && echo “true” || echo “false”)
[project-stage] < true
[project-stage] > cd /home/project/stage && (cd releases && ls -t -1 -d */)
[project-stage] < 47/
[project-stage] < 46/
[project-stage] < 45/
[project-stage] < 44/
[project-stage] < 43/
[project-stage] > cd /home/project/stage && (if [ -f .dep/releases ]; then echo “true”; fi)
[project-stage] < true
[project-stage] > cd /home/project/stage && (tail -n 15 .dep/releases)
[project-stage] < 20170517034610,34
[project-stage] < 20170518103746,35
[project-stage] < 20170522094409,36
[project-stage] < 20170524005420,37
[project-stage] < 20170526150548,38
[project-stage] < 20170526151306,38
[project-stage] < 20170526151918,39
[project-stage] < 20170526160749,40
[project-stage] < 20170526173000,41
[project-stage] < 20170526174846,42
[project-stage] < 20170529093817,43
[project-stage] < 20170529100016,44
[project-stage] < 20170529150528,45
[project-stage] < 20170529151617,46
[project-stage] < 20170529152042,47
[project-stage] > cd /home/project/stage && (if [ -d /home/project/stage/releases/48 ]; then echo ‘true’; fi)
[project-stage] > cd /home/project/stage && (date +“%Y%m%d%H%M%S”)
[project-stage] < 20170529153205
[project-stage] > cd /home/project/stage && (echo ‘20170529153205,48’ >> .dep/releases)
[project-stage] > cd /home/project/stage && (mkdir /home/project/stage/releases/48)
[project-stage] > cd /home/project/stage && (if [[ “$(man ln)” =~ “–relative” ]]; then echo “true”; fi)
[project-stage] < true
[project-stage] > cd /home/project/stage && (ln -nfs --relative /home/project/stage/releases/48 /home/project/stage/release)
• done on [project-stage]
✔ Ok [1s 932ms]
➤ Executing task deploy:update_code
[project-stage] > which git
[project-stage] < /usr/bin/git
[project-stage] > /usr/bin/git version
[project-stage] < git version 2.1.4
[project-stage] > if [ -h /home/project/stage/release ]; then echo ‘true’; fi
[project-stage] < true
[project-stage] > readlink /home/project/stage/release
[project-stage] < releases/48
[project-stage] > /usr/bin/git clone -b master --depth 1 --recursive -q git@github.com:project/project.git /home/project/stage/releases/48 2>&1
• done on [project-stage]
✔ Ok [3s 308ms]
➤ Executing task deploy:clear_paths
[project-stage] > rm -rf /home/project/stage/releases/48/web/config.php
• done on [project-stage]
✔ Ok [165ms]
➤ Executing task deploy:create_cache_dir
[project-stage] > if [ -d “/home/project/stage/releases/48/app/cache” ]; then rm -rf /home/project/stage/releases/48/app/cache; fi
[project-stage] > mkdir -p /home/project/stage/releases/48/app/cache
[project-stage] > chmod -R g+w /home/project/stage/releases/48/app/cache
• done on [project-stage]
✔ Ok [533ms]
➤ Executing task deploy:shared
[project-stage] > if [ -d /home/project/stage/shared/app/logs ]; then echo ‘true’; fi
[project-stage] < true
[project-stage] > rm -rf /home/project/stage/releases/48/app/logs
[project-stage] > mkdir -p dirname /home/project/stage/releases/48/app/logs
[project-stage] > ln -nfs --relative /home/project/stage/shared/app/logs /home/project/stage/releases/48/app/logs
[project-stage] > if [ -d /home/project/stage/shared//web/uploads ]; then echo ‘true’; fi
[project-stage] < true
[project-stage] > rm -rf /home/project/stage/releases/48//web/uploads
[project-stage] > mkdir -p dirname /home/project/stage/releases/48//web/uploads
[project-stage] > ln -nfs --relative /home/project/stage/shared//web/uploads /home/project/stage/releases/48//web/uploads
[project-stage] > if [ -f $(echo /home/project/stage/releases/48/app/config/parameters.yml.dist) ]; then rm -rf /home/project/stage/releases/48/app/config/parameters.yml.dist; fi
[project-stage] > if [ ! -d $(echo /home/project/stage/releases/48/app/config) ]; then mkdir -p /home/project/stage/releases/48/app/config;fi
[project-stage] > mkdir -p /home/project/stage/shared/app/config
[project-stage] > touch /home/project/stage/shared/app/config/parameters.yml.dist
[project-stage] > ln -nfs --relative /home/project/stage/shared/app/config/parameters.yml.dist /home/project/stage/releases/48/app/config/parameters.yml.dist
• done on [project-stage]
✔ Ok [2s 287ms]
➤ Executing task deploy:assets
[project-stage] > find /home/project/stage/releases/48/web/css /home/project/stage/releases/48/web/images /home/project/stage/releases/48/web/js -exec touch -t 201705290132.12 {} ‘;’ &> /dev/null || true
• done on [project-stage]
✔ Ok [215ms]
➤ Executing task deploy:vendors
[project-stage] > if hash composer 2>/dev/null; then echo ‘true’; fi
[project-stage] < true
[project-stage] > which composer
[project-stage] < /usr/local/bin/composer
[project-stage] > which php
[project-stage] < /usr/bin/php
[project-stage] > cd /home/project/stage/releases/48 && SYMFONY_ENV=dev /usr/bin/php /usr/local/bin/composer install --verbose --prefer-dist --no-progress --no-interaction --optimize-autoloader
[project-stage] < ocramius/package-versions: Generating version class…
[project-stage] < ocramius/package-versions: …done generating version class
[project-stage] < Creating the “app/config/parameters.yml” file
[project-stage] <
[project-stage] < // Clearing the cache for the dev environment with debug true
[project-stage] <
[project-stage] < [OK] Cache for the “dev” environment (debug=true) was successfully cleared.
[project-stage] <
[project-stage] <
[project-stage] < Trying to install assets as relative symbolic links.
[project-stage] <
[project-stage] < — --------------------- ------------------
[project-stage] < Bundle Method / Error
[project-stage] < — --------------------- ------------------
[project-stage] < ✔ FrameworkBundle relative symlink
[project-stage] < ✔ MopaBootstrapBundle relative symlink
[project-stage] < — --------------------- ------------------
[project-stage] <
[project-stage] < [OK] All assets were successfully installed.
• done on [project-stage]
✔ Ok [112s 930ms]
➤ Executing task deploy:assets:install
[project-stage] > SYMFONY_ENV=dev /usr/bin/php /home/project/stage/releases/48/app/console assets:install --no-interaction --env=dev /home/project/stage/releases/48/web
[project-stage] <
[project-stage] < Installing assets as hard copies.
[project-stage] <
[project-stage] < — --------------------- ----------------
[project-stage] < Bundle Method / Error
[project-stage] < — --------------------- ----------------
[project-stage] < ✔ FrameworkBundle copy
[project-stage] < ✔ MopaBootstrapBundle copy
[project-stage] < — --------------------- ----------------
[project-stage] <
[project-stage] < ! [NOTE] Some assets were installed via copy. If you make changes to these assets you have to run this command again.
[project-stage] <
[project-stage] < [OK] All assets were successfully installed.
• done on [project-stage]
✔ Ok [407ms]
➤ Executing task deploy:assetic:dump
• done on [project-stage]
✔ Ok [0ms]
➤ Executing task deploy:cache:warmup
[project-stage] > SYMFONY_ENV=dev /usr/bin/php /home/project/stage/releases/48/app/console cache:warmup --no-interaction --env=dev
[project-stage] <
[project-stage] < // Warming up the cache for the dev environment with debug true
[project-stage] <
[project-stage] < [OK] Cache for the “dev” environment (debug=true) was successfully warmed.
• done on [project-stage]
✔ Ok [3s 97ms]
➤ Executing task deploy:writable
[project-stage] > ps axo user,comm | grep -E ‘[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx’ | grep -v root | head -1 | cut -d\ -f1
[project-stage] < www-data
[project-stage] > cd /home/project/stage/releases/48 && (mkdir -p app/cache app/logs /web/uploads)
[project-stage] > cd /home/project/stage/releases/48 && (chmod 2>&1; true)
[project-stage] < chmod: missing operand
[project-stage] < Try ‘chmod --help’ for more information.
[project-stage] > cd /home/project/stage/releases/48 && (if hash setfacl 2>/dev/null; then echo ‘true’; fi)
[project-stage] < true
[project-stage] > cd /home/project/stage/releases/48 && (getfacl -p app/cache | grep “^user:www-data:.*w” | wc -l)
[project-stage] < 0
[project-stage] > cd /home/project/stage/releases/48 && (setfacl -RL -m u:“www-data”:rwX -m u:whoami
:rwX app/cache)
[project-stage] > cd /home/project/stage/releases/48 && (setfacl -dRL -m u:“www-data”:rwX -m u:whoami
:rwX app/cache)
[project-stage] > cd /home/project/stage/releases/48 && (getfacl -p app/logs | grep “^user:www-data:.*w” | wc -l)
[project-stage] < 1
[project-stage] > cd /home/project/stage/releases/48 && (getfacl -p /web/uploads | grep “^user:www-data:.*w” | wc -l)
[project-stage] < 1
• done on [project-stage]
✔ Ok [1s 500ms]
➤ Executing task database:migrate
[project-stage] > SYMFONY_ENV=dev /usr/bin/php /home/project/stage/releases/48/app/console doctrine:migrations:migrate --no-interaction --env=dev --allow-no-migration
[project-stage] <
[project-stage] < Application Migrations
[project-stage] <
[project-stage] <
[project-stage] < No migrations to execute.
• done on [project-stage]
✔ Ok [549ms]
➤ Executing task deploy:symlink
[project-stage] > if [[ “$(man mv)” =~ “–no-target-directory” ]]; then echo “true”; fi
[project-stage] < true
[project-stage] > mv -T /home/project/stage/release /home/project/stage/current
• done on [project-stage]
✔ Ok [356ms]
➤ Executing task cachetool:clear:opcache
[project-stage] > cd /home/project/stage/releases/48 && (if [ -e /home/project/stage/releases/48/cachetool.phar ]; then echo ‘true’; fi)
[project-stage] > cd /home/project/stage/releases/48 && (curl -sO https://gordalina.github.io/cachetool/downloads/cachetool.phar)
[project-stage] > cd /home/project/stage/releases/48 && (/usr/bin/php cachetool.phar opcache:reset --fcgi=/var/run/php/php7.1-fpm.sock)
• done on [project-stage]
✔ Ok [1s 363ms]
➤ Executing task deploy:unlock
[project-stage] > rm -f /home/project/stage/.dep/deploy.lock
• done on [project-stage]
✔ Ok [160ms]
➤ Executing task cleanup
[project-stage] > rm -rf /home/project/stage/releases/43
[project-stage] > cd /home/project/stage && if [ -e release ]; then rm release; fi
[project-stage] > cd /home/project/stage && if [ -h release ]; then rm release; fi
• done on [project-stage]
✔ Ok [1s 326ms]
➤ Executing task success
✔ Ok [0ms]
Successfully deployed!
*
About this issue
- Original URL
- State: closed
- Created 7 years ago
- Comments: 15 (8 by maintainers)
Ok, I got the point.
This happens when there is no uzip command (@jolipixel, are you using clean DO droplet by any chance?) and / or zip PHP extension.
Vendors pass on such server always takes around 3-4 minutes as composer fallbacks to
git clone
. Installingunzip
and adding:reduced times for
copy_dirs
to ~5s andvendors
to ~4s.Added check in
deploy:vendors
task for unzip command.Composer always uses it’s cache. There isn’t even an option to turn the composer cache off. See this discussion.
So composer is already caching right? You should try to deploy again with a filled cache and not clear the cache afterwards. This time composer should use your cached packages and not download them again. This should result in a faster
deploy:vendor
step.