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

CI/CD中.env文件与GitHub Action Secrets无法生效的求助

问题原因及解决方案

核心原因

  • 你在GitHub Action的env块中定义的环境变量,仅作用于GitHub Runner本地环境,并不会自动传递到你通过SSH连接的生产服务器上。当远程服务器执行docker-compose命令时,shell环境中没有这些变量,因此出现APP_KEY未设置的警告,导致部署失败。
  • appleboy/ssh-action的env字段是为Action自身运行时提供变量,而非用于传递变量到远程主机。

解决方案

方法一:在远程脚本中直接导出变量

修改deploy.yml的script部分,在执行docker-compose前,用export命令将GitHub Secrets注入远程服务器的shell环境:

script: |
  export APP_KEY=${{ secrets.APP_KEY }}
  export MYSQL_CONNECTION=${{ secrets.DB_CONNECTION }}
  export MYSQL_HOST=${{ secrets.DB_HOST }}
  export MYSQL_DATABASE=${{ secrets.DB_DATABASE }}
  export MYSQL_USER=${{ secrets.DB_USERNAME }}
  export MYSQL_PASSWORD=${{ secrets.DB_PASSWORD }}
  export MYSQL_ROOT_PASSWORD=${{ secrets.DB_ROOT_PASSWORD }}
  export RABBITMQ_DEFAULT_USER=${{ secrets.RABBITMQ_USER }}
  export RABBITMQ_DEFAULT_PASS=${{ secrets.RABBITMQ_PASSWORD }}
  export SLACK_ALERT_WEBHOOK=${{ secrets.SLACK_ALERT_WEBHOOK }}
  
  docker pull <docker-hub-repo>/<image>:latest
  cd ~/<project>
  docker-compose down
  docker-compose up -d
  docker-compose exec app php artisan migrate --force

方法二:使用ssh-action的envs参数传递变量

appleboy/ssh-action提供了envs参数,可以直接指定需要传递到远程主机的环境变量名。只需在with块中添加该参数,并保留原env块:

deploy:
  runs-on: ubuntu-latest
  needs: build
  steps:
    - name: SSH into Production Server and Deploy
      uses: appleboy/ssh-action@v1.0.3
      env:
        APP_KEY: ${{ secrets.APP_KEY }}
        MYSQL_CONNECTION: ${{ secrets.DB_CONNECTION }}
        MYSQL_HOST: ${{ secrets.DB_HOST }}
        MYSQL_DATABASE: ${{ secrets.DB_DATABASE }}
        MYSQL_USER: ${{ secrets.DB_USERNAME }}
        MYSQL_PASSWORD: ${{ secrets.DB_PASSWORD }}
        MYSQL_ROOT_PASSWORD: ${{ secrets.DB_ROOT_PASSWORD }}
        RABBITMQ_DEFAULT_USER: ${{ secrets.RABBITMQ_USER }}
        RABBITMQ_DEFAULT_PASS: ${{ secrets.RABBITMQ_PASSWORD }}
        SLACK_ALERT_WEBHOOK: ${{ secrets.SLACK_ALERT_WEBHOOK }}
      with:
        host: ${{ secrets.PRODUCTION_SERVER }}
        key: ${{ secrets.SSH_KEY }}
        username: ubuntu
        envs: APP_KEY,MYSQL_CONNECTION,MYSQL_HOST,MYSQL_DATABASE,MYSQL_USER,MYSQL_PASSWORD,MYSQL_ROOT_PASSWORD,RABBITMQ_DEFAULT_USER,RABBITMQ_DEFAULT_PASS,SLACK_ALERT_WEBHOOK
        script: |
          docker pull <docker-hub-repo>/<image>:latest
          cd ~/<project>
          docker-compose down
          docker-compose up -d
          docker-compose exec app php artisan migrate --force

方法三:动态生成/更新prod.env文件(适合持久化变量场景)

如果需要将敏感变量写入远程服务器的prod.env文件,可以在脚本中动态生成该文件:

script: |
  docker pull <docker-hub-repo>/<image>:latest
  cd ~/<project>
  
  # 将敏感变量写入prod.env(若文件已存在会覆盖,可先备份)
  cat > prod.env << EOF
  APP_KEY=${{ secrets.APP_KEY }}
  MYSQL_CONNECTION=${{ secrets.DB_CONNECTION }}
  MYSQL_HOST=${{ secrets.DB_HOST }}
  MYSQL_DATABASE=${{ secrets.DB_DATABASE }}
  MYSQL_USER=${{ secrets.DB_USERNAME }}
  MYSQL_PASSWORD=${{ secrets.DB_PASSWORD }}
  MYSQL_ROOT_PASSWORD=${{ secrets.DB_ROOT_PASSWORD }}
  RABBITMQ_DEFAULT_USER=${{ secrets.RABBITMQ_USER }}
  RABBITMQ_DEFAULT_PASS=${{ secrets.RABBITMQ_PASSWORD }}
  SLACK_ALERT_WEBHOOK=${{ secrets.SLACK_ALERT_WEBHOOK }}
  EOF
  
  docker-compose down
  docker-compose up -d
  docker-compose exec app php artisan migrate --force

额外注意事项

  • 确认GitHub仓库的Secrets中已正确创建所有所需变量,名称拼写、大小写完全匹配。
  • 检查远程服务器的docker-compose.yml中变量引用是否和传递的变量名一致(比如你用${MYSQL_CONNECTION},对应传递的变量名就是MYSQL_CONNECTION,无错误)。
  • 若使用方法二,确保appleboy/ssh-action@v1.0.3版本支持envs参数(该版本已支持)。

内容的提问来源于stack exchange,提问作者Vivek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:14:53