【问题标题】:Rails .env with gitlab CI/CD带有 gitlab CI/CD 的 Rails .env
【发布时间】:2021-07-22 12:55:40
【问题描述】:

遇到Rails项目通过gitlab CI的环境变量问题。目前,我正在使用 dotenv gem 来存储我的项目的凭据。另外,我已经在 gitlab CI 环境中分配了环境变量。比如database.yml:

host: <%= ENV['DATABASE_HOST'] %>

.env 文件:

DATABASE_HOST=somehost

gitlab CI 变量:

DATABASE_HOST=somehost

我将 .env 文件放在 .gitignore 中,猜测 Rails 会使用来自 gitlab CI 的变量。但是对数据库的访问错误。找到了一种方法,按照 dotenv gem 的建议创建本地 .env 文件和共享文件。然后将本地文件放在 .gitignore 中,并将带有 gitlab CI/CD 凭据的共享文件推送到存储库。

但是难以理解这种方法的安全性?而且,一般来说,为 Rails 项目和 gitlab CI/CD 使用环境变量/凭据的最佳实践是什么?

【问题讨论】:

  • Rails 加密的机密确实解决了 Dotenv 所做的大部分问题,并且没有明文文件的风险(例如被意外提交)。

标签: ruby-on-rails gitlab environment-variables gitlab-ci credentials


【解决方案1】:

理想情况下,.env 在大多数情况下都会包含敏感信息。所以将这些提交到任何版本控制系统中都不是一个好习惯。

https://dev.to/somedood/please-dont-commit-env-3o9h - .env 文件所涉及风险的详细指南

【讨论】:

    【解决方案2】:

    我通常会尽量避免 CI 使用 dotenv,因为它可能代表设置的开销。您可以仅针对某些环境有条件地加载 dotenv,但将其从 CI/CD 中排除。这可以使用自定义 ENV 变量来完成,如下所示:

    Dotenv::Railtie.load unless ENV['GITLAB_CI']
    

    并在 Gitlab 环境中设置它,例如 GITLAB_CI = true

    关于你最初的问题,如果你真的想要一个.env 文件,你可以按照这个帖子答案https://stackoverflow.com/a/55581164/992000 的建议,出于文档原因,我也会在这里发布它们:

    1. 在 gitlab 存储库配置中创建环境变量
    2. 创建setup_env.sh:
    #!/bin/bash
    echo DATABASE_HOST=$DATABASE_HOST >> .env
    
    1. 修改您的.gitlab-ci.yml。在下方更新到您的before_script: 部分
    - chmod +x ./setup_env.sh
    - ./setup_env.sh
    

    【讨论】:

    • 非常感谢您的回复!如果我要从 CI/CD 中排除 ENV,我是否需要在 .gitlab-ci.yml 文件中为每个阶段设置变量,例如 DATABASE_HOST=$DATABASE_HOST,然后通过 Gitlab 变量设置值以使一切正常?对不起,如果这是一个愚蠢的问题,感觉完全被这些变量淹没了
    • 您需要将 ENV 变量保留在 CI/CD 中,并且来自 setup_env.sh 的文件将拥有您的变量,因为它在 CI/CD 上运行。
    猜你喜欢
    • 2021-04-16
    • 2019-10-26
    • 2020-08-12
    • 2021-08-17
    • 2020-07-03
    • 2022-08-10
    • 2019-08-07
    • 2020-10-30
    • 2021-10-14
    相关资源
    最近更新 更多