如何通过Capistrano 3使用服务器上的其他用户名从命令行部署代码?

时间:2015-05-15 18:52:08

标签: deployment capistrano capistrano3

我最近升级到Capistrano 2.x到3.x,这个过程相当简单。但是,让我感到困惑的是失去了Capistrano 2.x中曾经存在的命令行功能。具体来说,如果我想通过与系统当前登录用户不同的用户部署到远程服务器,我可以运行如下命令:

cap -s user=remote_user staging deploy

Capistrano 3.x允许通过这样的配置设置在部署脚本中设置特定用户;请注意user:选项:

server 'example.com', user: 'remote_user', roles: %w{app db web}, my_property: :my_value

哪个非常好!但我在设置上进行系统管理,其中多个用户 - 不仅仅是通用deploy用户 - 可以部署由服务器上的组权限管理的代码。意味着用户,linussnoopylucy都在同一代码上工作,然后在他们自己唯一的用户名下部署,一切正常。不,现在至少可以说,将此设置切换为使用通用deploy并不是一个简单的选择。代码库是相当简单的PHP代码 - 从部署的角度来看 - 而Capistrano有助于简化部署工作流程。

我不想回到C​​apistrano 2.x.那么如何让这些用户和Capistrano脚本与Capistrano 3.x设置保持一致,但仍允许每个人通过他们自己的个人帐户独立部署代码?

1 个答案:

答案 0 :(得分:0)

  

那么如何让这些用户和Capistrano脚本保持一致   Capistrano 3.x设置但仍允许用户独立部署   代码通过他们自己的个人帐户?

虽然不像使用-s user=remote_user的Capistrano 2.x方法那样干净,但是通过在Capistrano 3.x中使用环境变量,可以实现设置自定义用户名的类似目标。这已经过测试,并且在Capistrano 3.4.0中运行良好。

首先要做的是调整服务器设置以允许环境变量。所以server行如上所示:

server 'example.com', user: 'remote_user', roles: %w{app db web}, my_property: :my_value

现在更改为添加ENV["CAP_USER"]变量,如下所示:

server 'example.com', user: ENV["CAP_USER"] || 'remote_user', roles: %w{app db web}, my_property: :my_value

逻辑基本归结为:如果设置了ENV["CAP_USER"],请使用它。如果没有,请使用remote_user

现在要从命令行中利用它,可以像这样部署:

export CAP_USER=remote_user && cap staging deploy

注意export CAP_USER=remote_user是设置名为CAP_USER的环境变量的内容,然后在Capistrano 3.x脚本中将其作为ENV["CAP_USER"]进行访问。 &&只是一个Bash命令,用于将该命令连接到下一个cap staging deploy

如果有人愿意,可以调整他们的~/.bash_profile以永久性地将CAP_USER设置为remote_user,以便基本的cap staging deploy可以按原样使用,而无需记住复合命令的语法。