如何配置AWS CodePipeline系列服务部署Laravel 8并解决权限报错
问题根本原因
Laravel运行artisan命令时会自动将当前服务器的绝对路径写入bootstrap/cache目录下的缓存文件中,你在CodeBuild环境构建时的工作路径为/codebuild/output/xxx/src,生成的缓存就会写死这个路径,部署到EB后实际运行路径为/var/app/current,Laravel读取旧的缓存路径自然找不到对应目录。
可行解决方案
方案1:构建阶段清理缓存,部署到EB后重新生成(最推荐)
这个方案适配性最强,后续修改路径也不需要调整构建配置:
- 修改CodeBuild的
buildspec.yml,在build阶段所有artisan命令执行完成后,新增一行清理缓存的命令:
build: commands: # 保留你原有的所有命令 - php artisan cache:clear # 新增:删除所有生成的路径/配置缓存文件 - rm -rf bootstrap/cache/*
同时删掉install阶段的chown -R www-data:www-data $CODEBUILD_SRC_DIR/storage和chmod -R 755 $CODEBUILD_SRC_DIR/storage两行,CodeBuild阶段修改权限无效,EB部署后会重置文件归属。
- 在你的Laravel项目根目录新增EB部署钩子:
- 新建目录结构
.platform/hooks/postdeploy/ - 在该目录下新建
01_laravel_init.sh文件,内容如下:
- 新建目录结构
#!/bin/bash # 进入EB上的应用实际运行目录 cd /var/app/current # 重新生成适配EB路径的缓存 php artisan config:cache php artisan route:cache php artisan view:cache # 修正权限,EB PHP平台的运行用户为webapp chown -R webapp:webapp storage bootstrap/cache chmod -R 755 storage bootstrap/cache
- 给这个脚本加可执行权限:
chmod +x .platform/hooks/postdeploy/01_laravel_init.sh,之后提交到代码库即可。
方案2:强制指定Laravel根路径
直接在代码层固定根路径,不需要调整构建和部署流程:
- 在你的
.env.staging文件中新增配置:
APP_BASE_PATH=/var/app/current
- 修改
bootstrap/app.php文件,在返回$app实例前新增一行代码:
$app->useBasePath(env('APP_BASE_PATH', __DIR__.'/../'));
之后Laravel会强制使用配置的根路径,不会读取构建时生成的路径缓存。
方案3:CodeBuild使用和EB一致的构建路径
直接在构建阶段切换到EB的路径下执行所有操作,缓存生成的路径和运行路径一致:
修改buildspec.yml的install阶段最开头新增两行命令:
install: commands: # 新增:将代码移动到和EB一致的路径下,切换工作目录 - mv $CODEBUILD_SRC_DIR /var/app/current - cd /var/app/current # 保留你原有的所有install阶段命令
额外注意事项
- 建议将
php artisan migrate和php artisan db:seed放到EB的predeploy钩子中执行,避免CodeBuild网络无法连接RDS导致构建失败。 - 生产环境不要开启调试模式,避免敏感信息泄露。
内容的提问来源于stack exchange,提问作者RDD Brian
相关产品推荐
相关产品推荐

