You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止GitHub Actions在Laravel项目部署时替换.env文件

Laravel CI/CD 部署时.env被替换的解决方案

问题根因

你当前配置触发.env被覆盖的核心原因有3个:

  1. actions/checkout@v2 默认会清理工作区所有未提交到Git的文件,服务器本地的.env一般不会入Git,每次执行workflow都会被直接删除,后续的Copy .env步骤就会自动用.env.example生成新的空白.env
  2. php artisan key:generate 步骤每次运行都会重写.env里的APP_KEY,就算.env没被删除,这一步也会覆盖原有密钥,导致站点的加密会话、Cookie等全部失效
  3. 当前workflow把测试和部署逻辑混在一起,测试环节用的测试配置(比如sqlite数据库配置)会直接写入.env,如果你跑完测试直接同步代码到站点目录,用的就是测试用的错误配置

具体修改方案

  • 如果你是在部署服务器上用自托管runner,且已经提前在工作区配置好了正式.env:

    1. 修改checkout步骤,关闭清理未追踪文件的逻辑:
    - uses: actions/checkout@v2
      with:
        clean: false
    
    1. 直接删除Copy .env、Generate key这两个会修改.env的步骤,这两个是测试环境初始化用的,正式部署不需要执行
    2. 拆分测试和部署为两个独立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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:27:02