我最近升级到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设置保持一致,但仍然允许每个人通过自己的单个用户帐户独立部署代码?
因此,如何将这些用户和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
可以用作IS,而无需记住复合命令的语法。