laravel - 如何使用 GitlabCI 在远程主机上导出环境变量
问题描述
我正在使用 GitlabCI 来部署我的 Laravel 应用程序。我想知道我应该如何管理.env
文件。据我了解,我只需要将.env.example
版本控制置于版本控制之下,而不是具有实际值的版本控制。
我已经在 Gitlab 中设置了我的应用程序需要的所有密钥Settings -> CI/CD -> Environment Variables
,我可以在运行器上使用它们,例如检索 SSH 私钥以连接到远程主机,但我应该如何将这些变量也部署到远程主机?我应该在“运行时生成”.env
文件中用 bash 编写它们然后复制它吗?我应该通过远程主机上的 ssh 导出它们吗?哪种管理方法是正确的?
解决方案
如果你打开另一个解决方案,我建议使用 fabric(fabfile) 我给你一个例子:
使用变量创建 .env.default,如:
DB_CONNECTION=mysql
DB_HOST=%(HOST)s
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=%(USER)s
DB_PASSWORD=%(PASSWORD)s
在您的项目目录上安装结构添加 fabfile 后:
from fabric.api import env , run , put
prod_env = {
'name' : 'prod' ,
'user' : 'user_ssh',
'deploy_to' : '/path_to_project',
'hosts' : ['ip_server'],
}
def set_config(env_config):
for key in env_config:
env[key] = env_config[key]
def prod():
set_config(prod_env)
def deploy(password,host,user):
run("cd %s && git pull -r",env.deploy_to)
process_template(".env.default",".env" , { 'PASSWORD' : password , 'HOST' : host,'USER': user } )
put( ".env" , "/path_to_projet/.env" )
def process_template(template , output , context ):
import os
basename = os.path.basename(template)
output = open(output, "w+b")
text = None
with open(template) as inputfile:
text = inputfile.read()
if context:
text = text % context
#print " processed \n : %s" % text
output.write(text)
output.close()
现在您可以从本地运行到测试脚本:
fab prod deploy:password="pass",user="user",host="host"
它将在您的服务器上部署项目并检查它是否处理 .env
如果它现在可以工作,那么是 gitlab ci 的时候了,这是一个示例文件:
image: python:2.7
before_script:
- pip install 'fabric<2.0'
# Setup SSH deploy keys
- 'which ssh-agent || ( apt-get install -qq openssh-client )'
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
deploy_staging:
type: deploy
script:
- fab prod deploy:password="$PASSWORD",user="$USER",host="$HOST"
only:
- master
$SSH_PRIVATE_KEY,$PASSWORD,$USER,$HOST 是环境变量 gitlab,你应该添加一个可以访问服务器的 $SSH_PRIVATE_KEY 私钥。
希望我不会错过任何一步。
推荐阅读
- go - Golang rpc 调用解决意外的 EOF
- javascript - 有人可以解释一下 ECMAScript 规范中提到运算符优先级和运算符关联性的地方吗
- javascript - 获取匹配 xpath 的属性值
- java - 在 Java 中创建包含数组的泛型类
- javascript - 无法在订阅函数时迭代 res
- git - 从 GIT 检索发布分支的详细信息所需的建议
- firebase - Firebase Cordova vs Firebase JS SDK?
- php - 从 Mysql 数据库获取数组并以数组形式从用户获取数据,如何将数据数组插入到获取的数组 Php
- rust - 为什么我不能为迭代器特征的下一个方法指定生命周期
- regex - vim 正则表达式替换 if 条件