Last active
July 12, 2019 23:50
-
-
Save stevenscg/8176735 to your computer and use it in GitHub Desktop.
Capistrano deploy strategy that supports git submodules (requires Capistrano v3.1.0 or later)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# this include won't work for some reason: | |
# include Capistrano::Git::DefaultStrategy | |
module SubmoduleStrategy | |
# 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}" | |
end | |
end |
I forked this, fixed a couple bugs and added some basic documentation feel free to merge it if you want.
@ngottlieb: If you're requiring 'capistrano/git', you're causing the git rake tasks to be loaded twice. Rake appends new definitions on to the old ones rather than replacing them, so if you load the tasks twice, everything in them gets run twice.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I had to use "-B" in git :checkout as I kept running into an error saying the branch already existed, but I haven't been able to track down where that problem originates.
Also, I'm curious whether or not the
is necessary in release given that we're doing git clone --recursive in clone.
I guess the branch must be coming from fetch(:branch) in clone. It's working now so I'm probably not going to dig deeper.