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
相关产品推荐
相关产品推荐

