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

How can I deploy code via Capistrano 3 using a different username on the server from the command line?

我最近升级到 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 有助于简化部署工作流程。

我不想回滚到 Capistrano 2.x。那么我怎样才能使这些用户和 Capistrano 脚本与 Capistrano 3.x 设置保持一致,同时仍然允许每个人通过他们自己的个人用户帐户独立部署代码?

So how can I keep these users and Capistrano scripts in line with Capistrano 3.x settings but still allow users to independently deploy code via their own individual user accounts?

虽然不如 Capistrano 2.x 使用 -s user=remote_user 的方法干净,但可以通过在 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 就可以按原样使用而无需必须记住复合命令的语法。