如何从命令行在服务器上使用不同的用户名通过 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
用户)可以部署由服务器上的组权限管理的代码的设置上进行系统管理。意思是用户 linus
、snoopy
和 lucy
都在相同的代码上工作,然后在他们自己唯一的用户名下部署,一切正常。不,将此设置切换为使用通用 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
就可以按原样使用而无需必须记住复合命令的语法。
我最近升级到 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
用户)可以部署由服务器上的组权限管理的代码的设置上进行系统管理。意思是用户 linus
、snoopy
和 lucy
都在相同的代码上工作,然后在他们自己唯一的用户名下部署,一切正常。不,将此设置切换为使用通用 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
就可以按原样使用而无需必须记住复合命令的语法。