自定义 SCM
Capistrano 使用它称为“SCM 插件”(源代码管理)来从中央存储库部署您的源代码。开箱即用,Capistrano 有三个插件来处理 Git、Subversion 和 Mercurial 存储库。
大多数 Capistrano 用户都使用这些默认实现。要选择 SCM,用户将其添加到他们的 Capfile 中,如下所示
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
也可以提供自定义 SCM 插件,以更改 Capistrano 检查应用程序源代码的方式。SCM 插件可以打包为 Ruby gem 并分发给其他用户。
本文档是编写您自己的插件的简短指南。它适用于 Capistrano 3.7.0 及更高版本。
1. 编写一个扩展 Capistrano::SCM::Plugin 的 Ruby 类
假设您要创建一个“Foo”SCM。您需要编写一个插件类,如下所示
require "capistrano/scm/plugin"
# By convention, Capistrano plugins are placed in the
# Capistrano namespace. This is completely optional.
module Capistrano
class FooPlugin < ::Capistrano::SCM::Plugin
def set_defaults
# Define any variables needed to configure the plugin.
# set_if_empty :myvar, "my-default-value"
end
end
end
2. 实现 create_release 任务
当用户运行 cap deploy
时,您的 SCM 负责创建发布目录并将应用程序源代码复制到其中。您需要使用在 deploy:new_release_path
之后注册运行的任务来完成此操作。
按照惯例(不是必需的),此任务称为 create_release
。
在您的插件类中,使用 define_tasks
和 register_hooks
方法,如下所示
def define_tasks
# The namespace can be whatever you want, but its best
# to choose a name that matches your plugin name.
namespace :foo do
task :create_release do
# Your code to create the release directory and copy
# the source code into it goes here.
on release_roles :all do
execute :mkdir, "-p", release_path
# ...
end
end
end
end
def register_hooks
# Tell Capistrano to run the custom create_release task
# during deploy.
after "deploy:new_release_path", "foo:create_release"
end
3. 实现 set_current_revision 任务
与定义 create_release
类似,您还应该定义一个 set_current_revision
任务。此任务的目的是设置 Capistrano 用于写入部署日志的特殊变量。
# Your task should do something like this
set :current_revision, "..."
# Register this hook to ensure your task runs
before "deploy:set_current_revision", "foo:set_current_revision"
4. 使用插件
要使用您的插件,只需 require
定义插件类的文件,然后使用 install_plugin
。
# In Capfile
require_relative "path/to/foo_plugin.rb"
install_plugin Capistrano::FooPlugin
就是这样!
5. 将您的插件作为 gem 分发
打包和分发 Ruby gem 超出了本文档的范围。但是,这里没有需要执行的 Capistrano 特定操作;只需创建一个包含您的插件类的标准 gem。
然后,用户可以通过将 gem 添加到他们的 Gemfile 来安装您的插件
gem "your-gem-name", :group => :development
然后将其添加到 Capfile
require "your-gem-name"
install_plugin YourPluginClass
6. 获取帮助
有关更多技术和想法,请查看 GitHub 上官方 Capistrano 存储库 中的默认 Git、Subversion 和 Mercurial 插件的实现。所有三个都遵循本文档中描述的相同模式。
否则,请打开一个 GitHub 问题,提出您的问题或反馈。谢谢!