【问题标题】:How do I prevent GitHub actions from replacing some files如何防止 GitHub 操作替换某些文件
【发布时间】:2021-11-07 00:54:37
【问题描述】:

我想做一个简单的 CD/CD 来为我的 Laravel 项目进行自动部署,但结果我的 .env 文件总是被替换。我如何确保它不会总是被替换

这是我的动作文件

name: Laravel

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  laravel-tests:

    runs-on: self-hosted

    steps:
    - uses: shivammathur/setup-php@b7d1d9c9a92d8d8463ce36d7f60da34d461724f8
      with:
        php-version: '7.4'
    - uses: actions/checkout@v2
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: vendor/bin/phpunit

【问题讨论】:

  • 看起来Copy .env 步骤会这样做...如果您不想修改您的.env,请跳过该步骤?
  • 现在当我删除该行时它会以file_get_contents(/.../.../../.env): failed to open stream: No such file or directory 失败
  • 对我来说,当计算机从 GitHub 拉取数据时,它实际上会删除文件夹并创建另一个文件夹
  • 你可以在你的 .env.example 文件中添加你想要的配置,然后每次创建 .env 它都会有你想要的内容。

标签: laravel github github-actions


【解决方案1】:

每次您的工作流程运行时,您都会获得一台新机器。因此,没有您在上次运行时创建的文件。因为如果你需要在运行时创建一些文件,你需要每次都重复这个步骤。

请查看here 以更好地了解 github ations 基础知识。

您没有太多选择来共享此文件 accros run,因为在工件中保留秘密是不好的选择。因此,您需要根据您可能保留在秘密上下文中的秘密,在每次需要时重新创建此文件。请查看link:

- name: Create env file
        run: |
          cat << EOF >> .env
          API_ENDPOINT="https://xxx.execute-api.us-west-2.amazonaws.com"
          API_KEY=${{ secrets.API_KEY }}
          EOF

【讨论】:

  • 所以这是否意味着我不能使用 GitHub 操作完成完整的 cd?
  • 当然可以。但是这个文件应该是你的 repo 的一部分,或者是你以后用于部署的工件的一部分。请检查此docs.github.com/en/actions/guides/…
  • 好吧,假设我在 gitignore 中有很多文件?如何确保它们始终不被替换?
  • 如果文件不包含秘密,它应该是你的回购的一部分。如果文件包含机密,您应该考虑两件事 - 在托管应用程序的位置保留配置(如果可能)或在部署之前替换此文件中的令牌(但不要将替换的令牌保留为工件的一部分)。
  • @KrzysztofMadej .env 文件永远不应成为 GIT 存储库的一部分。
【解决方案2】:

github 操作适用于 您的 git 存储库中的文件

您的.env 不是并且不应在 repo 中,因为它包含您的凭据/秘密。

您可能在本地计算机上拥有它,但它包含在 gitignore 中,因此 git(因此是一个 github)不会跟踪它。

因此,您在每次操作运行时都没有 .env 文件。最直接的方法是:

  • 创建一个 .env.production 文件,该文件是 gitted 并提交的。将非机密/不敏感的主要 .env 变量放在那里,例如:
APP_NAME=YourAppName
APP_ENV=production

APP_DEBUG=false
APP_LOG_LEVEL=warning
APP_URL=https://your-url.com

CACHE_DRIVER=redis
SESSION_DRIVER=file
QUEUE_CONNECTION=redis

... etc ...

不要包含密钥、密码或秘密。

现在在您的一个步骤中将该文件复制为默认的.env 文件:

- name: Copy .env
  run: php -r "file_exists('.env') || copy('.env.production', '.env');"

现在是处理您的秘密的时候了。您应该将它们添加为您的 repo 的 github 机密,并使用您的 github 操作的 env 指令包括在内:

env:
    APP_KEY: ${{ secrets.APP_KEY }}
    DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
    ....

这最后一步可能需要根据您进行实际部署的方式/位置而有所不同,但这应该是它的要点:您从 github 机密空间中提取它们并将它们添加到生产环境中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多