Capistrano 3 deploy WordPress with GIT available i

2019-06-13 03:51发布

I use Capistrano 3 to deploy my WordPress projects (as implemented in the Bedrock WP stack: https://github.com/roots/bedrock).

WordPress specifically supports a number of features that update the actual code of the production/staging sites (plugin updates, settings files for certain plugins etc) and there are various scenarios where I might want to commit these code changes to the project GIT repo directly from a server.

So, the question is, is there a way configure Capistrano Deploy to keep the .git repo in the relase dir?

I gather this was doable with the 'copy strategy' settings in Cap 2, but I can't find any info about this for Cap 3.

1条回答
相关推荐>>
2楼-- · 2019-06-13 04:42

I've solved this by modifying the custom deployment strategy that's implemented by https://github.com/Mixd/wp-deploy project.

Note the changed context.execute line.

# Usage:
# 1. Drop this file into lib/capistrano/submodule_strategy.rb
# 2. Add the following to your Capfile:
#   require 'capistrano/git'
#   require './lib/capistrano/submodule_strategy'
# 3. Add the following to your config/deploy.rb
#   set :git_strategy, SubmoduleStrategy

module SubmoduleStrategy
  # do all the things a normal capistrano git session would do
  include Capistrano::Git::DefaultStrategy

  # check for a .git directory
  def test
    test! " [ -d #{repo_path}/.git ] "
  end

  # same as in Capistrano::Git::DefaultStrategy
  def check
    test! :git, :'ls-remote', repo_url
  end

  def clone
    git :clone, '-b', fetch(:branch), '--recursive', repo_url, repo_path
  end

  # same as in Capistrano::Git::DefaultStrategy
  def update
    git :remote, :update
  end

  # put the working tree in a release-branch,
  # make sure the submodules are up-to-date
  # and copy everything to the release path
  def release
    release_branch = fetch(:release_branch, File.basename(release_path))
    git :checkout, '-B', release_branch,
      fetch(:remote_branch, "origin/#{fetch(:branch)}")
    git :submodule, :update, '--init'
    # context.execute "rsync -ar --exclude=.git\* #{repo_path}/ #{release_path}"
    context.execute "rsync -ar #{repo_path}/ #{release_path}"
  end
end

This solution now deploys the release as a GIT repo set to a custom branch based on the release id.

This can then be committed and pushed up to the master repo for merging as required.

All credit goes to Aaron Thomas, the creator of the WP-Deploy project.

查看更多
登录 后发表回答