capistrano-archive 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 96b7849b39d712939f1ae0f6ceddb6387b8fcc22632d1f25631acbc151baae17
4
+ data.tar.gz: 4f6b81d6b51c2f3d1b71194b53f96a513698d472abd602e3291ebbb1d2461af4
5
+ SHA512:
6
+ metadata.gz: 3a1f0c749f8ec2f67d9789c926e2920a1d4b46254436d92acf7b5a9a20b6c9ee9ae0833250e9d61dff7bd94dbd401f8153b505d70387ee4008b0935f72e33ee1
7
+ data.tar.gz: 7219e2a539144cc24ad648fdf81153a72392d5ae4e4e7824cacdf79bce0db1357119e990885f5aa0a702327443515a71ea867c9aa115369832eec63dc3447c2c
@@ -0,0 +1,8 @@
1
+ # ChangeLog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [1.0.0] - To be released
6
+
7
+ ### Added
8
+ - First stable release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in capistrano-bundler.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 PrestaConcept
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,118 @@
1
+ # capistrano-archive
2
+
3
+ This plugin adds a new scm to Capistrano 3 allowing deployment from an archive stored on the target server (s).
4
+
5
+ ## Features
6
+
7
+ * Upload an archive (tar.bz2 as default) to target
8
+ * Create release from the archive
9
+ * Can use a file from the archive to know the deployed revision (./REVISION as default)
10
+ * Workflow between deploy stages copying the local archive on stage directory
11
+
12
+ ## Installation
13
+
14
+ Put this in the Gemfile
15
+ ```
16
+ gem 'capistrano-archive'
17
+ ```
18
+
19
+ Then run
20
+ ```
21
+ bundle install
22
+ ```
23
+
24
+ Add theses lines to your Capfile
25
+
26
+ ```ruby
27
+ # Include and use capistrano archive
28
+ require "capistrano/archive"
29
+ install_plugin Capistrano::Archive::SCM
30
+ ```
31
+
32
+ ## Usage
33
+
34
+ First, you need to have a build system storing artefact release on the server used to deploy.
35
+
36
+ ### Archive location and name
37
+
38
+ To specify the archive location, you can set the `:archive_release_path` variable. As default, the archive is supposed to be stored in the current directory.
39
+
40
+ The archive name is built as `:application_:branch` but you can change that with the `:archive_name` variable.
41
+
42
+ ### Compression
43
+
44
+ The tar is compressed with bzip as default but you can change that with `:archive_extension` and `:archive_tar_options` variables.
45
+
46
+ ### Upload
47
+
48
+ As default the archive is sent in the `:tmp_dir` but you can change the destination using the `:archive_remote_path` variable.
49
+
50
+ ### Workflow
51
+
52
+ If you want have workflow between stage, like force deploy on staging before production, you can set the `:archive_workflow_previous` variable in your stages config file.
53
+
54
+ For example, in a *staging.rb* file, set the variable like that
55
+
56
+ ```ruby
57
+ set :archive_workflow_previous, "build"
58
+ ```
59
+
60
+ And the archive location will be `:archive_releases_path`/build when you deploy the staging stage.
61
+ After the deploy, the archive file will be copied in the `:archive_workflow_next`, as default the current stage.
62
+
63
+ Do the same in a *production.rb* file
64
+
65
+ ```ruby
66
+ set :archive_workflow_previous, "staging"
67
+ ```
68
+
69
+ And the archive location will be `:archive_releases_path`/staging when you deploy the production stage.
70
+ So you'll have to deploy on staging before production.
71
+
72
+ If you want turn off the workflow process, set the variable `:archive_workflow` to false.
73
+
74
+ ### Revision
75
+
76
+ Capistrano log the revision info, the sha1 commit, in the revisions log file and in the file REVISION.
77
+ Since we are deploying from an archive, if we want to have the same info, it must already be present in the archive.
78
+ The most easy is to store the commit when build the archive in the REVISION file.
79
+
80
+ As default, the plugin can read the REVISION file from the archive.
81
+
82
+ If you want to store the info in another file, you can set the file with the `:archive_revision_file` variable.
83
+ If you have to manipulate the output (grep, awk, etc) you can change the `:archive_revision_command`
84
+
85
+ If you want turn off the revision process, set the variable `:archive_revision` to false.
86
+
87
+ ### Variables available
88
+
89
+ If you need to change default values, you can set the following configuration variables in `config/deploy.rb` or wherever relevant:
90
+
91
+ ```ruby
92
+ set :archive_releases_path, "./"
93
+ set :archive_name, "#{fetch(:application)}_#{fetch(:branch)}"
94
+ set :archive_extension, 'tar.bz2'
95
+ set :archive_tar_options, 'xjf'
96
+ set :archive_workflow, true
97
+ set :archive_workflow_previous, ""
98
+ set :archive_workflow_next,"#{fetch(:stage)}"
99
+ set :archive_remote_path, "#{fetch(:tmp_dir)}"
100
+ set :archive_revision, true
101
+ set :archive_revision_file, './REVISION'
102
+ set :archive_revision_command, 'cat'
103
+ ```
104
+
105
+ ## Contributing
106
+
107
+ Please feel free to open an [issue](https://github.com/prestaconcept/capistrano-archive/issues)
108
+ or a [pull request](https://github.com/prestaconcept/capistrano-archive),
109
+ if you want to help.
110
+
111
+ Thanks to
112
+ [everyone who has contributed](https://github.com/prestaconcept/capistrano-archive/graphs/contributors) already.
113
+
114
+ ---
115
+
116
+ *This project is supported by [PrestaConcept](http://www.prestaconcept.net)*
117
+
118
+ Released under the [MIT License](LICENSE)
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'capistrano/archive/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "capistrano-archive"
9
+ spec.version = Capistrano::Archive::VERSION
10
+ spec.authors = ['David Gaussinel']
11
+ spec.email = ['dgaussinel@prestaconcept.net']
12
+ spec.description = 'Transfer archive release strategy for capistrano.'
13
+ spec.summary = 'Transfer archive release strategy for capistrano.'
14
+ spec.homepage = 'https://github.com/prestaconcept/capistrano-archive'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_dependency 'capistrano', '>= 3.7.0', '< 4.0.0'
23
+ end
@@ -0,0 +1 @@
1
+ require 'capistrano/archive/scm'
@@ -0,0 +1,104 @@
1
+ require 'capistrano/scm/plugin'
2
+
3
+ module Capistrano
4
+ module Archive
5
+ class SCM < ::Capistrano::SCM::Plugin
6
+ def set_defaults
7
+ set_if_empty :archive_releases_path, ->{"./"}
8
+ set_if_empty :archive_name, ->{"#{fetch(:application)}_#{fetch(:branch)}"}
9
+ set_if_empty :archive_extension, ->{'tar.bz2'}
10
+ set_if_empty :archive_tar_options, ->{'xjf'}
11
+ set_if_empty :archive_workflow, ->{true}
12
+ set_if_empty :archive_workflow_previous, ""
13
+ set_if_empty :archive_workflow_next,->{"#{fetch(:stage)}"}
14
+ set_if_empty :archive_remote_path, ->{"#{fetch(:tmp_dir)}"}
15
+ set_if_empty :archive_revision, ->{true}
16
+ set_if_empty :archive_revision_file, ->{'./REVISION'}
17
+ set_if_empty :archive_revision_command, ->{'cat'}
18
+ set_if_empty :archive_roles, ->{:all}
19
+ end
20
+
21
+ def define_tasks
22
+ eval_rakefile File.expand_path('../tasks/archive.rake', __FILE__)
23
+ end
24
+
25
+ def register_hooks
26
+ before 'deploy:new_release_path', 'archive:upload_archive'
27
+ after "deploy:new_release_path", "archive:create_release"
28
+ before "deploy:set_current_revision", "archive:set_current_revision"
29
+ after 'deploy:finished', 'archive:copy_archive_file'
30
+ end
31
+
32
+ def release
33
+ backend.execute :mkdir, '-p', release_path
34
+ backend.execute(:tar, fetch(:archive_tar_options), uploaded_archive_filename, '-C', release_path)
35
+ end
36
+
37
+ # @return [String]
38
+ def revision
39
+ if fetch(:archive_revision)
40
+ if File.file?(release_path_filename)
41
+ `tar #{fetch(:archive_tar_options)} #{release_path_filename} --to-command=\'#{fetch(:archive_revision_command)}\' #{fetch(:archive_revision_file)}`.gsub(/\n/,"")
42
+ else
43
+ abort "Archive #{release_path_filename} doesn't exist!"
44
+ end
45
+ end
46
+ end
47
+
48
+ def check
49
+ if !File.file?(release_path_filename)
50
+ abort "Archive #{release_path_filename} doesn't exist!"
51
+ end
52
+ end
53
+
54
+ # Upload archive file to server
55
+ #
56
+ # @return void
57
+ def upload
58
+ if File.file?(release_path_filename)
59
+ backend.upload!(release_path_filename, fetch(:archive_remote_path))
60
+ else
61
+ abort "Archive #{release_path_filename} doesn't exist!"
62
+ end
63
+ end
64
+
65
+ # Remove archive file
66
+ #
67
+ # @return void
68
+ def clean
69
+ backend.execute(:rm, '-f', uploaded_archive_filename)
70
+ end
71
+
72
+ # Copy archive file from previous stage to next stage directory release
73
+ def copy
74
+ if fetch(:archive_workflow)
75
+ unless fetch(:archive_workflow_next).to_s.strip.empty?
76
+ backend.execute(:cp, release_path_filename, "#{fetch(:archive_releases_path)}/#{fetch(:archive_workflow_next)}/")
77
+ end
78
+ end
79
+ end
80
+
81
+ # Path and filename to local archive
82
+ #
83
+ # @return [String]
84
+ def release_path_filename
85
+ @_release_path_filename ||= File.join(fetch(:archive_releases_path), fetch(:archive_workflow_previous) , release_filename)
86
+ end
87
+
88
+ # Filename to local archive
89
+ #
90
+ # @return [String]
91
+ def release_filename
92
+ @_release_filename ||= "#{fetch(:archive_name)}.#{fetch(:archive_extension)}"
93
+ end
94
+
95
+ # Archive uploaded filename
96
+ #
97
+ # @return [String]
98
+ def uploaded_archive_filename
99
+ @_uploaded_archive_filename ||= File.join(fetch(:archive_remote_path), release_filename)
100
+ end
101
+
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,44 @@
1
+ set :archive_plugin, self
2
+
3
+ namespace :archive do
4
+ desc 'Check that the archive is readable'
5
+ task :check do
6
+ run_locally do
7
+ fetch(:archive_plugin).check
8
+ end
9
+ end
10
+
11
+ desc 'Upload release to current stage'
12
+ task :upload_archive do
13
+ on release_roles(fetch(:archive_roles)) do
14
+ fetch(:archive_plugin).upload
15
+ end
16
+ end
17
+
18
+ desc 'Copy repo to releases'
19
+ task :create_release do
20
+ on release_roles :all do
21
+ fetch(:archive_plugin).release
22
+ end
23
+ end
24
+
25
+ desc 'Determine the revision that will be deployed'
26
+ task :set_current_revision do
27
+ set :current_revision, fetch(:archive_plugin).revision
28
+ end
29
+
30
+ desc 'Clean : remove archive file after deploy'
31
+ task :clean do
32
+ on roles(:app) do
33
+ fetch(:archive_plugin).clean
34
+ end
35
+ end
36
+
37
+ desc 'Copy local archive to make it available to next stage'
38
+ task :copy_archive_file do
39
+ run_locally do
40
+ fetch(:archive_plugin).copy
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,8 @@
1
+ # Capistrano
2
+ module Capistrano
3
+ # Archive
4
+ module Archive
5
+ # gem version
6
+ VERSION = '1.0.0'
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capistrano-archive
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - David Gaussinel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-07 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.7.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 4.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.7.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 4.0.0
33
+ description: Transfer archive release strategy for capistrano.
34
+ email:
35
+ - dgaussinel@prestaconcept.net
36
+ executables: []
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - CHANGELOG.md
41
+ - Gemfile
42
+ - LICENSE
43
+ - README.md
44
+ - capistrano-archive.gemspec
45
+ - lib/capistrano/archive.rb
46
+ - lib/capistrano/archive/scm.rb
47
+ - lib/capistrano/archive/tasks/archive.rake
48
+ - lib/capistrano/archive/version.rb
49
+ homepage: https://github.com/prestaconcept/capistrano-archive
50
+ licenses:
51
+ - MIT
52
+ metadata: {}
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubyforge_project:
69
+ rubygems_version: 2.7.7
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: Transfer archive release strategy for capistrano.
73
+ test_files: []