自定义 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_tasksregister_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 问题,提出您的问题或反馈。谢谢!

Fork me on GitHub