升级Deployer至7.X后Gitlab CI部署Laravel应用失败
Deployer 7.X 升级后 GitLab CI 部署 Laravel 失败(deploy:update_code 错误)
问题背景
近期将 Deployer 从 6.X 版本升级到 7.X,遵循官方升级指南后,无法在 GitLab CI 上部署 Laravel 应用,错误触发在 deploy:update_code 命令环节。
错误信息
[dev-env] error in update_code.php on line 90: [dev-env] run export GIT_TERMINAL_PROMPT='0' GIT_SSH_COMMAND='ssh -o StrictHostKeyChecking=accept-new'; [ -f /web/.dep/repo/HEAD ] || /usr/bin/git clone --mirror /web/.dep/repo 2>&1 [dev-env] fatal: repository '/web/.dep/repo' does not exist [dev-env] exit code 128 (Invalid exit argument)
已尝试操作
尝试过社区相关讨论中的解决方案,但未解决问题。
当前 Deployer 配置代码
<?php namespace Deployer; /* |-------------------------------------------------------------------------- | 0. Import needed recipes, and make sure the environment is right |-------------------------------------------------------------------------- | */ require 'contrib/rsync.php'; require 'recipe/laravel.php'; /* |-------------------------------------------------------------------------- | 1. Load external dependencies |-------------------------------------------------------------------------- */ set('dotenv', '{{current_path}}/.env'); /* |-------------------------------------------------------------------------- | 2. Variables |-------------------------------------------------------------------------- */ set('$this->setRemoteUser()name', getenv('DEPLOYER_NAME', 'unknown')); set('application', 'priv'); set('http_$this->setRemoteUser()', 'www-data'); set('keep_releases', 3); /* |-------------------------------------------------------------------------- | 3. Shared & Writable files / folders |-------------------------------------------------------------------------- */ set('shared_dirs', [ 'storage' ]); set('shared_files', [ 'public/.htaccess', '.env', ]); add('writable_dirs', [ ]); /* |-------------------------------------------------------------------------- | 4. Hosts |-------------------------------------------------------------------------- */ /** PREPROD Priv1 */ host('priv-env') ->setHostname('10.95.1.1') ->setForwardAgent(false) ->setRemoteUser('priv') ->set('deploy_path', '/web') ->set('rsync_src', __DIR__) ->set('rsync_dest', '{{release_path}}') ->set('module', 'priv') ->setLabels([ 'group' => 'preProdHosts', 'name' => 'dev-env', ]); /* |-------------------------------------------------------------------------- | 5. Tasks |-------------------------------------------------------------------------- */ task('ca_cleanup', function() { run('cd {{release_path}}/ && php7.4 artisan ca:cl'); })->select('group=preProdHosts,group=prodHosts'); task('co_reload', function() { run('cd {{release_path}}/ && php7.4 artisan co:cl'); })->select('group=preProdHosts,group=prodHosts'); set('rsync', function () { $currentModule = get('module'); $modulePaths = [ 'priv' => [ 'Modules/Priv/*', 'public/modules/priv/*', ]; $exclude = [ 'node_modules/*', 'tests/*', '.git', 'deploy.php', ]; foreach ($modulePaths as $moduleName => $modulePath) { if (empty($currentModule) || $currentModule === $moduleName) { continue; } $exclude = array_merge($exclude, $modulePath); } return [ 'exclude' => $exclude, 'exclude-file' => '', 'include' => [], 'include-file' => false, 'filter' => [], 'filter-file' => false, 'filter-perdir' => false, 'flags' => 'avz', 'options' => ['delete', 'delete-after', 'force'], 'timeout' => 1200, ]; }); task('deploy:storage_link_hybride', function () { run('cd {{release_path}}/public && ln -s ../storage/app/public/hybride/ '); }); task('deploy:storage_link_elfinder', function () { run('cd {{release_path}}/public && ln -s ../storage/app/public/elfinder/ '); }); task('deploy:migrate_n_seed', function () { run('cd {{release_path}}/ && php7.4 artisan migrate --force'); run('cd {{release_path}}/ && php7.4 artisan db:seed --class=AdminRolesPermissionsUpdaterTableSeeder --force'); run('cd {{release_path}}/ && php7.4 artisan db:seed --class=CustomerRolesPermissionsUpdaterTableSeeder --force'); }); task('deploy:migrate_n_priv_seed', function () { run('cd {{release_path}}/ && php7.4 artisan module:seed Priv --class=PrivRolesPermissionsUpdaterTableSeeder --force'); })->select('name=priv-preprod,name=prod'); task('deploy:migrate_n_amundi_seed', function () { run('cd {{release_path}}/ && php7.4 artisan module:seed Amundi --class=AmundiRolesPermissionsUpdaterTableSeeder --force'); run('cd {{release_path}}/public/modules/amundi-catitre && ln -s ../amundi/fonts fonts'); run('cd {{release_path}}/public/modules/amundi-catitre && ln -s ../amundi/images images'); run('cd {{release_path}}/public/modules/amundi-catitre && ln -s ../amundi/documents documents'); })->select('name=priv2-preprod,name=priv2-prod'); task('sitemap:generate', function () { run('cd {{release_path}}/ && php artisan sitemap:generate'); })->select('name=priv-preprod,name=prod'); task('deploy', [ 'deploy:info', 'deploy:prepare', 'deploy:lock', 'deploy:release', 'rsync', 'deploy:shared', 'deploy:storage_link_elfinder', 'deploy:storage_link_hybride', 'deploy:migrate_n_seed', 'deploy:migrate_n_priv_seed', 'deploy:migrate_n_priv2_seed', 'sitemap:generate', 'deploy:symlink', 'deploy:unlock', 'ca_cleanup', 'co_reload', 'deploy:cleanup' ])->desc('Deploy your project'); after('deploy:failed', 'deploy:unlock');
解决方案
1. 解决 rsync 与默认 Git 流程的冲突
你的配置使用 rsync 传输代码,但 Deployer 7.X 的 laravel.php 配方默认会触发基于 Git 的 deploy:update_code 任务,两者冲突导致系统尝试克隆不存在的本地仓库路径。
在配置开头添加代码,移除默认的 Git 更新任务:
// 移除默认的 Git 代码更新任务 remove('deploy:update_code');
2. 修复 rsync 配置的语法错误
$modulePaths 数组缺少闭合括号,修正后:
$modulePaths = [ 'priv' => [ 'Modules/Priv/*', 'public/modules/priv/*', ] ];
语法错误可能导致 Deployer 逻辑异常,触发错误流程分支。
3. 清理远程服务器缓存目录
远程服务器上的 /web/.dep 目录可能残留旧版本缓存,执行以下命令清理:
ssh priv@10.95.1.1 "rm -rf /web/.dep"
之后重新执行部署,Deployer 会重新初始化部署环境。
4. 修正错误的变量命名
配置中存在无效变量名,替换为规范命名:
// 替换错误的变量名 set('deployer_name', getenv('DEPLOYER_NAME', 'unknown')); set('http_user', 'www-data');
无效变量名可能导致 Deployer 内部逻辑异常。
内容的提问来源于stack exchange,提问作者dolor3sh4ze
相关产品推荐
相关产品推荐

