capistrano_two_phase_deployment 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b9c9945152efe930fa68bfd3a9bfd609e15a3045
4
+ data.tar.gz: 55b96b28d9cde94d9dd7bb72583cf19473175580
5
+ SHA512:
6
+ metadata.gz: 547039642f57031e4ed9c0ff809f8447dbc76b29f4f78f9cda168743275cda9b800bd3978625c705cc69a63eedab84268a08bfb13cd9e72797ab2e87933a28e7
7
+ data.tar.gz: 0c620e3e14fbc4c0f4103dbde1fc36116646a1c0cef7bf3239f1145d277419f31ef96964085f812fc687b392a708d41f4534886a5c7a9a098f5cb0a36bfb66d0
@@ -0,0 +1,66 @@
1
+ # Two-Phase Deployment for Capistrano 3.1
2
+
3
+ This gem provides two-phase deployment capabilities to capistrano 3.
4
+
5
+ The deployment process is split into two phases: the first generates a
6
+ tar.gz file of the content to be deployed via ```cap deploy:prepare_release```
7
+ and uploads it to an intermediary server. This intermediary server should
8
+ ideally be located in the network infrastructure of your application servers.
9
+
10
+ In the second phase (```cap deploy```), the frontend servers pull the current
11
+ release from the intermediary server and install it locally.
12
+
13
+ This allows the servers to not require an installed SCM (e.g. git),
14
+ and saves network bandwith, because the new release is no longer transmitted
15
+ to all servers from an external source.
16
+
17
+ ## Installation
18
+ Add the following to your deploy.rb file:
19
+ ```
20
+ set :scm, :intermediate_host
21
+ set :intermediate_host, "host.example.com"
22
+ ```
23
+
24
+ ## Capistrano Directory structure on the intermediary host
25
+ These recipes will use the same capistrano directory structure on the
26
+ intermediary host as on the application servers.
27
+
28
+ The tar Archives are stored as {deploy_to}/releases/{timestamp}.tar.gz with
29
+ a {deploy_to}/current_tgz symlink pointing to the release tarfile that should
30
+ be pulled in the second phase of the deployment process. This also allows your
31
+ intermediary host to be a regular application server.
32
+
33
+ ## Release directory changes from the capistrano default
34
+ Unlike the default capistrano release path name, the release path will now
35
+ consist of two timestamps:
36
+ {deploy_to}/releases/{deployment_timestamp_of_phase2}_#{timestamp_of_release_preparation}/
37
+
38
+ Using this directory name format, you can deploy the same intermediary archive
39
+ multiple times without conflicting with an existing deployment of the same
40
+ version. This can come in handy in case you generate additional files during
41
+ your deployment that are not part of the tar archive (e.g. rendering configuration
42
+ file templates, locally compiled assets during deployment etc.).
43
+
44
+ ## Configuration Options
45
+ ```
46
+ # Host which acts as intermediary for the deployment files
47
+ # NOTE: only the primary host is currently evaluated
48
+ role :intermediate_host, "host.example.com"
49
+
50
+ # Which format git archive should output as. See the git archive manual page.
51
+ # Defaults to tar.gz
52
+ set :archive_format, "tar.gz"
53
+
54
+ # Where to output the generated git archive locally before uploading.
55
+ # Will use Tempfile.new by default to create non-static filename.
56
+ # The tempfile will be deleted after capistrano terminates.
57
+ set :archive_output, "myfile"
58
+
59
+ # Which branch git archive should generate the tar file from.
60
+ set :branch, "production"
61
+ ```
62
+
63
+ ## Caveats/TODOs
64
+ * Only supports git at the moment
65
+ * Will only evaluate the primary intermediary host
66
+
@@ -0,0 +1,30 @@
1
+ require 'capistrano'
2
+ require 'capistrano/scm'
3
+ require 'tempfile'
4
+
5
+ class Capistrano::IntermediateHost < Capistrano::SCM
6
+ module GitStrategy
7
+ def test
8
+ test! "[ -f #{repo_path}/HEAD ]"
9
+ end
10
+
11
+ def check
12
+ end
13
+
14
+ def generate_archive
15
+ now = Time.now
16
+ format = fetch( :archive_format, "tar.gz" )
17
+ prefix = release_timestamp
18
+ output_file = fetch( :archive_output, Tempfile.new( "archive" ).path )
19
+ branch = fetch( :branch )
20
+ run_locally do
21
+ execute :git, "archive --format=#{format} --prefix=#{prefix}/ --output=#{output_file} #{branch}"
22
+ end
23
+ output_file
24
+ end
25
+
26
+ end
27
+ end
28
+
29
+ import File.join( File.dirname( __FILE__ ), 'tasks', 'intermediate_host.cap' )
30
+ import File.join( File.dirname( __FILE__ ), 'tasks', 'deploy.cap' )
@@ -0,0 +1,6 @@
1
+ namespace :deploy do
2
+ desc 'Generate a new release archive and push it to the intermediary host'
3
+ task :prepare_release do
4
+ invoke 'intermediate_host:prepare_release'
5
+ end
6
+ end
@@ -0,0 +1,85 @@
1
+ namespace :intermediate_host do
2
+ def strategy
3
+ @strategy ||= Capistrano::IntermediateHost.new(self, Capistrano::IntermediateHost::GitStrategy )
4
+ end
5
+
6
+ def upload_path
7
+ @upload_path ||= "#{releases_path}/#{release_timestamp}.tar.gz"
8
+ end
9
+
10
+ def current_tgz
11
+ @current_tgz ||= deploy_path.join( "current.tar.gz" )
12
+ end
13
+
14
+ desc 'check stuff'
15
+ task :check do
16
+ strategy.check
17
+ end
18
+
19
+ desc 'Update the repo mirror to reflect the origin state'
20
+ task :update do
21
+ output_file = strategy.generate_archive
22
+ end
23
+
24
+ desc 'Upload a release to the intermediary server'
25
+ task :upload_release do
26
+ output_file = strategy.generate_archive
27
+
28
+ on primary( :intermediate_host ) do
29
+ upload! output_file, upload_path
30
+ end
31
+ end
32
+
33
+ desc 'Copy repo to releases host'
34
+ task :prepare_release => :upload_release do
35
+ on primary( :intermediate_host ) do
36
+ execute :rm, "-f", current_tgz
37
+ execute :ln, "-sf", upload_path, current_tgz
38
+ end
39
+ end
40
+
41
+ def mk_tempfile_name
42
+ tempfile_template = "#{fetch( :application )}_XXXXXX"
43
+
44
+ mktemp_version_info = capture( :mktemp, "-V" )
45
+ if mktemp_version_info =~ /mktemp version 1\./
46
+ # Old CentOS/OpenBSD mktemp style
47
+ capture( :mktemp, "-p #{fetch(:deploy_to)}", tempfile_template )
48
+ else
49
+ # Otherwise, be more sane.
50
+ capture( :mktemp, "--suffix=.tar.gz", "--tmpdir=#{fetch(:deploy_to)}", tempfile_template )
51
+ end
52
+ end
53
+
54
+ desc 'Extract the archive timestamp from current.tar.gz on intermediary host'
55
+ task :set_release_path_based_on_archive_timestamp do
56
+ on primary( :intermediate_host ) do
57
+ archive_timestamp = capture( :tar, "tfzv", current_tgz, " | head -n 1 | awk '{print $6}'" )
58
+
59
+ deploy_timestamp = "#{release_timestamp}_#{archive_timestamp}"
60
+
61
+ set( :release_path, releases_path.join( deploy_timestamp ) )
62
+ end
63
+ end
64
+
65
+ desc 'Pull release from releases host'
66
+ task :update => :set_release_path_based_on_archive_timestamp do
67
+ on release_roles :all do
68
+ download_path = mk_tempfile_name
69
+
70
+ execute :scp, "#{primary( :intermediate_host )}:#{current_tgz}",
71
+ download_path
72
+
73
+ execute :mkdir, "-p", release_path
74
+ execute :tar, "xfz", download_path, "-C", release_path, "--strip-components=1"
75
+ execute :rm, "-f", download_path
76
+ end
77
+ end
78
+
79
+ desc 'Create release from pulled repo'
80
+ task :create_release => :update do
81
+ on release_roles :all do
82
+ # something
83
+ end
84
+ end
85
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capistrano_two_phase_deployment
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sven Riedel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: capistrano
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.0
27
+ description: Deploy with tar files via an intermediary host
28
+ email: sr@gimp.org
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files:
32
+ - README.md
33
+ files:
34
+ - README.md
35
+ - lib/capistrano/intermediate_host.rb
36
+ - lib/capistrano/tasks/deploy.cap
37
+ - lib/capistrano/tasks/intermediate_host.cap
38
+ homepage: http://github.com/sriedel/capistrano_two_phase_deployment
39
+ licenses: []
40
+ metadata: {}
41
+ post_install_message:
42
+ rdoc_options:
43
+ - "--charset=UTF-8"
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 2.0.0
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.2.2
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: Allows Capistrano 3 to deploy tar archives via an intermediary host; servers
62
+ no longer need to have an SCM client installed
63
+ test_files: []