如何通过Github Actions让Laravel获取GOOGLE_APPLICATION_CREDENTIALS环境变量
核心原因
Github Actions中google-github-actions/auth导出的GOOGLE_APPLICATION_CREDENTIALS仅存在于CI运行容器的环境中,而Laravel Vapor部署的应用运行在AWS Lambda环境,两者完全隔离,所以这个变量不会自动同步到应用运行环境中。
解决方案
方案1:直接在Vapor控制台配置凭证并在Laravel中处理
在Vapor控制台添加环境变量
登录Vapor控制台,找到你的项目,进入对应环境的配置页面,添加GOOGLE_SERVICE_ACCOUNT_JSON变量,值填入你的谷歌服务账号完整JSON内容。在Laravel中临时生成凭证文件
在App\Providers\AppServiceProvider的boot方法中添加代码,将JSON内容写入临时文件,并设置GOOGLE_APPLICATION_CREDENTIALS环境变量:public function boot() { $serviceAccountJson = config('services.google.service_account_json'); if ($serviceAccountJson) { $tempFilePath = tempnam(sys_get_temp_dir(), 'google-creds'); file_put_contents($tempFilePath, $serviceAccountJson); putenv("GOOGLE_APPLICATION_CREDENTIALS=$tempFilePath"); } }配置Laravel配置文件
在config/services.php中添加配置项,避免直接使用env()函数(因Vapor会缓存环境变量):return [ // 其他配置... 'google' => [ 'service_account_json' => env('GOOGLE_SERVICE_ACCOUNT_JSON'), ], ];
方案2:通过Github Actions部署时传递凭证到Vapor
存储凭证到Github Secrets
在Github仓库的「Settings > Secrets and variables > Actions」中添加GOOGLE_SERVICE_ACCOUNT_JSON秘密,值为谷歌服务账号完整JSON内容。修改deploy.yml部署命令
在部署步骤中,通过Vapor的--env参数将凭证传递到应用环境:- name: Deploy to Vapor run: vapor deploy production --env="GOOGLE_SERVICE_ACCOUNT_JSON=${{ secrets.GOOGLE_SERVICE_ACCOUNT_JSON }}"同方案1的步骤2、3
同样在AppServiceProvider中处理凭证文件,配置config/services.php。
注意事项
- Vapor部署时会自动缓存环境变量和配置,所以不要在业务代码中直接使用
env()函数,务必通过config()读取配置。 - 临时文件在Lambda环境中仅在当前请求生命周期内有效,符合无服务器环境的特性。
内容的提问来源于stack exchange,提问作者Saumini Navaratnam

