如何防止GitHub Actions在Laravel项目部署时替换.env文件
Laravel CI/CD 部署时.env被替换的解决方案
问题根因
你当前配置触发.env被覆盖的核心原因有3个:
actions/checkout@v2默认会清理工作区所有未提交到Git的文件,服务器本地的.env一般不会入Git,每次执行workflow都会被直接删除,后续的Copy .env步骤就会自动用.env.example生成新的空白.envphp artisan key:generate步骤每次运行都会重写.env里的APP_KEY,就算.env没被删除,这一步也会覆盖原有密钥,导致站点的加密会话、Cookie等全部失效- 当前workflow把测试和部署逻辑混在一起,测试环节用的测试配置(比如sqlite数据库配置)会直接写入.env,如果你跑完测试直接同步代码到站点目录,用的就是测试用的错误配置
具体修改方案
如果你是在部署服务器上用自托管runner,且已经提前在工作区配置好了正式.env:
- 修改checkout步骤,关闭清理未追踪文件的逻辑:
- uses: actions/checkout@v2 with: clean: false- 直接删除
Copy .env、Generate key这两个会修改.env的步骤,这两个是测试环境初始化用的,正式部署不需要执行 - 拆分测试和部署为两个独立job,测试job可以单独初始化测试用的.env,测试通过后再执行部署job,不要复用测试环节的工作区文件
如果你用的是临时自托管runner,或者想更安全的管理敏感配置:
把所有敏感配置存到GitHub仓库的Secrets里,部署环节动态生成.env,完全不依赖本地存储的.env文件,示例配置:- name: 生成正式环境.env run: | cat > .env << EOF APP_NAME=你的项目名称 APP_ENV=production APP_KEY=${{ secrets.APP_KEY }} APP_DEBUG=false APP_URL=${{ secrets.APP_URL }} DB_CONNECTION=mysql DB_HOST=${{ secrets.DB_HOST }} DB_PORT=3306 DB_DATABASE=${{ secrets.DB_DATABASE }} DB_USERNAME=${{ secrets.DB_USERNAME }} DB_PASSWORD=${{ secrets.DB_PASSWORD }} # 其他.env配置项按你的需求补充 EOF
注意:如果需要在workflow里跑单元测试,可以单独给测试步骤设置环境变量,或者在测试环节单独生成临时的.env文件,测试跑完就销毁,不要和正式部署的配置混用。
内容的提问来源于stack exchange,提问作者iamafasha
相关产品推荐
相关产品推荐

