elocal_capistrano 2.0.4 → 2.1.0
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.
- checksums.yaml +4 -4
- data/lib/elocal_capistrano/git_tools.rb +92 -0
- data/lib/elocal_capistrano/version.rb +1 -1
- data/lib/elocal_capistrano.rb +3 -0
- data/lib/tasks/git_tagging.rake +60 -0
- data/lib/tasks/syslog.rake +1 -2
- data/lib/tasks/webpack.rake +57 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cf236043f8dc14523bf9c83e5bc189cc22f4244
|
4
|
+
data.tar.gz: 56dde8b4563dcd0ac38f54548e5d8e0a811e7dbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1c633b20b23a409e4d09c035cfcd478b52b2016fbfb6ec278ad18e270bf4523f4e893ba45beb2f3ebf6a3b63fe889bd0f3f521bfba46d2846d61bff87f79e1b
|
7
|
+
data.tar.gz: 79b8123b1dfa58ab7d3d1ea017f88988783d7cf552b95d18ef739ceb5803be34a6f682cea9009224c3823f6eef22d5e6ad22fef9fbd3a1b88b3a66350d53186a
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module ElocalCapistrano::GitTools
|
4
|
+
# Represents an API release, which is tagged in the repository as
|
5
|
+
# +rel_<MAJOR>.<MINOR>.<PATCH>+. Capistrano uses this pushed tag
|
6
|
+
# to deploy the next version of the API, which is reflected in the
|
7
|
+
# footer of each page. In development mode, this simply returns the
|
8
|
+
# latest commit in master.
|
9
|
+
class ReleaseTag
|
10
|
+
attr_accessor :major, :minor, :patch, :other
|
11
|
+
|
12
|
+
# Create a new ReleaseTag from a version string.
|
13
|
+
def initialize(tag=nil)
|
14
|
+
@major, @minor, @patch, @other = tag.gsub(/^rel_/,'').split(/[^0-9a-zA-Z]+/).map(&:to_i) unless tag.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
# Version number as an array of integers.
|
18
|
+
def to_a
|
19
|
+
[@major, @minor, @patch, @other].compact
|
20
|
+
end
|
21
|
+
|
22
|
+
# Compare two tags by version. The latest version is always chosen.
|
23
|
+
def <=>(rel_tag)
|
24
|
+
to_a <=> rel_tag.to_a
|
25
|
+
end
|
26
|
+
|
27
|
+
# Version number as a string, or tag name.
|
28
|
+
def to_s
|
29
|
+
"rel_" + to_a.compact.join(".")
|
30
|
+
end
|
31
|
+
|
32
|
+
def ==(rel_tag)
|
33
|
+
to_a == rel_tag.to_a
|
34
|
+
end
|
35
|
+
|
36
|
+
# Return the current ReleaseTag as specified in versions.yml.
|
37
|
+
def self.current(environment="production")
|
38
|
+
ReleaseTag.new(versions_hash[environment])
|
39
|
+
end
|
40
|
+
|
41
|
+
# Return the latest ReleaseTag as computed by looking at the most
|
42
|
+
# recent "rel_*" tag created on Git.
|
43
|
+
def self.latest
|
44
|
+
tags = %x(git tag).split("\n").select{|l| l =~ /^rel_/}.map{ |l| ReleaseTag.new(l) }.sort
|
45
|
+
tags.last || ReleaseTag.new('rel_0.0.0')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# A short user prompt if there are uncommitted changes in the repo, in
|
50
|
+
# case the user forgets before they deploy. Naturally, one may cancel
|
51
|
+
# this process effectively cancelling the entire deploy cleanly. This
|
52
|
+
# occurs before any hard changes (e.g., writing changes, pushes,
|
53
|
+
# command execution, etc.) are made.
|
54
|
+
def working_directory_copasetic?(options={})
|
55
|
+
return true if options[:force]
|
56
|
+
return false unless no_changes_pending? || yes?('There are currently uncommitted changes. Are you sure you want to continue?')
|
57
|
+
return false unless on_master? || yes?('You are not currently on the master branch. Are you sure you want to continue?')
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
# Test whether we are currently using the master branch. All
|
62
|
+
# deployment activity should take place on the master branch.
|
63
|
+
def on_master?
|
64
|
+
out = %x(git symbolic-ref -q HEAD)
|
65
|
+
out.strip == "refs/heads/master"
|
66
|
+
end
|
67
|
+
|
68
|
+
# Test whether there are any uncommitted changes in the working
|
69
|
+
# directory.
|
70
|
+
def no_changes_pending?
|
71
|
+
%x(git status --porcelain).split("\n").length == 0
|
72
|
+
end
|
73
|
+
|
74
|
+
def increment_patch_version
|
75
|
+
tag = ReleaseTag.latest
|
76
|
+
tag.patch += 1
|
77
|
+
tag
|
78
|
+
end
|
79
|
+
|
80
|
+
def versions_hash
|
81
|
+
YAML.load_file(fetch(:versions_path))
|
82
|
+
end
|
83
|
+
|
84
|
+
def update_versions_file(tag)
|
85
|
+
File.write(fetch(:versions_path), versions_hash.merge(fetch(:stage).to_s => tag.to_s).to_yaml.to_s)
|
86
|
+
end
|
87
|
+
|
88
|
+
def yes?(prompt_msg)
|
89
|
+
ask(:proceed, prompt_msg + ' [y/N]', default: 'y')
|
90
|
+
fetch(:proceed) == 'y'
|
91
|
+
end
|
92
|
+
end
|
data/lib/elocal_capistrano.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
namespace :load do
|
2
|
+
task :defaults do
|
3
|
+
set :syslog_grep_pattern, ENV['pattern']
|
4
|
+
set :syslog_all_logs, %w(y Y yes true 1).include?(ENV['all_logs'])
|
5
|
+
end
|
6
|
+
end
|
7
|
+
namespace :git do
|
8
|
+
namespace :tagging do
|
9
|
+
include ElocalCapistrano::GitTools
|
10
|
+
|
11
|
+
desc <<-DESC
|
12
|
+
Make sure the working directory is clean and on right branch
|
13
|
+
DESC
|
14
|
+
task :check_local do
|
15
|
+
run_locally do
|
16
|
+
unless working_directory_copasetic?
|
17
|
+
error 'Cannot continue because working directory is not clean'
|
18
|
+
raise 'Working directory not clean'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
desc <<-DESC
|
24
|
+
Create a new tag for current release and set current revision
|
25
|
+
DESC
|
26
|
+
task :tag_release do
|
27
|
+
run_locally do
|
28
|
+
tag = increment_patch_version
|
29
|
+
update_versions_file(tag)
|
30
|
+
execute :git, "commit -m '[RELEASE][#{fetch(:rails_env)}] Update release tag for #{fetch(:rails_env)} to #{tag}' #{fetch(:versions_path)}"
|
31
|
+
execute :git, 'push origin master'
|
32
|
+
execute :git, "tag #{tag}"
|
33
|
+
execute :git, "push origin #{tag}"
|
34
|
+
set :branch, tag.to_s
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc <<-DESC
|
39
|
+
Use previous staging tag for release
|
40
|
+
DESC
|
41
|
+
task :use_release do
|
42
|
+
run_locally do
|
43
|
+
tag = ReleaseTag.current('staging')
|
44
|
+
update_versions_file(tag)
|
45
|
+
execute :git, "commit -m '[RELEASE][#{fetch(:rails_env)}] Update release tag for #{fetch(:rails_env)} to #{tag}' #{fetch(:versions_path)}"
|
46
|
+
execute :git, 'push origin master'
|
47
|
+
set :branch, tag.to_s
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
desc <<-DESC
|
52
|
+
Prints out current environment release information
|
53
|
+
DESC
|
54
|
+
task :current_release do
|
55
|
+
run_locally do
|
56
|
+
puts "#{fetch(:stage)}: #{ReleaseTag.current(fetch(:stage).to_s)}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/tasks/syslog.rake
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
namespace :deploy do
|
2
|
+
namespace :webpack do
|
3
|
+
def frontend_changed?
|
4
|
+
%x(git diff #{ReleaseTag.latest} #{fetch(:fronted_path)}).length > 0
|
5
|
+
end
|
6
|
+
|
7
|
+
desc <<-DESC
|
8
|
+
Check if a new frontend release is required and deploy to S3
|
9
|
+
DESC
|
10
|
+
task :release do
|
11
|
+
on roles(:all) do
|
12
|
+
if frontend_changed? || fetch(:force_webpack_release, false)
|
13
|
+
info '[deploy:webpack] Creating new webpack release'
|
14
|
+
invoke 'deploy:webpack:make_new_release'
|
15
|
+
else
|
16
|
+
info '[deploy:webpack] Skipping webpack release as no changes were detected in frontend directory'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc <<-DESC
|
22
|
+
create new webpack bundle and release
|
23
|
+
DESC
|
24
|
+
task :make_new_release do
|
25
|
+
invoke 'deploy:webpack:install_dependencies'
|
26
|
+
invoke 'deploy:webpack:bundle'
|
27
|
+
invoke 'deploy:webpack:add_to_version_control'
|
28
|
+
end
|
29
|
+
|
30
|
+
desc <<-DESC
|
31
|
+
Installs required javascript packages from Node Package Manager
|
32
|
+
DESC
|
33
|
+
task :install_dependencies do
|
34
|
+
run_locally do
|
35
|
+
execute 'yarn install --pure-lockfile'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
desc <<-DESC
|
40
|
+
Compiles webpack bundle and uploads to S3
|
41
|
+
DESC
|
42
|
+
task :bundle do
|
43
|
+
run_locally do
|
44
|
+
execute 'yarn run build'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
desc <<-DESC
|
49
|
+
Check in updated webpack manifest and S3 paths to git
|
50
|
+
DESC
|
51
|
+
task :add_to_version_control do
|
52
|
+
run_locally do
|
53
|
+
execute "git commit -m '[FRONTEND] Updated webpack bundle' #{fetch(:webpack_manifest_file)}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elocal_capistrano
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Di Marco
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,12 +53,15 @@ files:
|
|
53
53
|
- Rakefile
|
54
54
|
- elocal_capistrano.gemspec
|
55
55
|
- lib/elocal_capistrano.rb
|
56
|
+
- lib/elocal_capistrano/git_tools.rb
|
56
57
|
- lib/elocal_capistrano/version.rb
|
57
58
|
- lib/tasks/chef.rake
|
59
|
+
- lib/tasks/git_tagging.rake
|
58
60
|
- lib/tasks/maintenance.rake
|
59
61
|
- lib/tasks/ssh.rake
|
60
62
|
- lib/tasks/syslog.rake
|
61
63
|
- lib/tasks/upstart.rake
|
64
|
+
- lib/tasks/webpack.rake
|
62
65
|
homepage: https://github.com/eLocal/elocal_capistrano
|
63
66
|
licenses:
|
64
67
|
- MIT
|
@@ -79,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
82
|
version: '0'
|
80
83
|
requirements: []
|
81
84
|
rubyforge_project:
|
82
|
-
rubygems_version: 2.
|
85
|
+
rubygems_version: 2.5.2
|
83
86
|
signing_key:
|
84
87
|
specification_version: 4
|
85
88
|
summary: Common eLocal Capistrano tasks
|