带有 gitlab CI/CD 的 Rails .env

Posted

技术标签:

【中文标题】带有 gitlab CI/CD 的 Rails .env【英文标题】:Rails .env with gitlab CI/CD 【发布时间】: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 所做的大部分问题,并且没有明文文件的风险(例如被意外提交)。 【参考方案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://***.com/a/55581164/992000 的建议,出于文档原因,我也会在这里发布它们:

    在 gitlab 存储库配置中创建环境变量 创建setup_env.sh:
#!/bin/bash
echo DATABASE_HOST=$DATABASE_HOST >> .env
    修改您的.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 上运行。

以上是关于带有 gitlab CI/CD 的 Rails .env的主要内容,如果未能解决你的问题,请参考以下文章

GitLab CI/CD 运行程序无法执行

如何正确设置环境变量 Gitlab CI/CD 和 Docker

DevOps实战-基于Docker的CI/CD

无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是不是正在运行?带有自托管运行器的 Gitlab Cloud CI/CD 错误

基于GitLab的CI/CD系统重点记要

gitlab 的 CI/CD 配置管理