factorylabs-auto_tagger 0.1.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,6 @@
1
+ README.md
2
+ CHANGELOG
3
+ MIT-LICENSE
4
+ bin/*
5
+ lib/**/*
6
+ recipes/**/*
@@ -0,0 +1,6 @@
1
+ pkg/*
2
+ rdoc/*
3
+ *.gem
4
+ .DS_Store
5
+ test_files/*
6
+ .idea/*
@@ -0,0 +1,30 @@
1
+ 2009-10-15
2
+
3
+ - You can now define your stages as strings or symbols and auto-tagger will not fail (thanks to Chad Wooley for the bug report)
4
+ - When deploying from a branch auto_tagger uses real_revision, not the previous tag, to create the new tag (Brian Takita)
5
+
6
+ 2009-04-30
7
+
8
+ - Fixed bug whereby auto-tagger would use the wrong tag because it found tags that had similar names to what it uses.
9
+
10
+ 2009-04-20
11
+
12
+ - `release_tagger:create_tag` creates a production tag if you don't set any stages
13
+
14
+ 2009-04-05
15
+
16
+ - Added basic support for cap-ext-multistage
17
+ - Changed "stages" variable to "autotagger_stages" so as not to conflict with the multistage "stages" variable in capistrano
18
+ - Changed the :current_stage variable in the capistrano tasks to just :stage
19
+
20
+ 2009-03-31
21
+
22
+ - Capistrano bases new tags off of old tags from the previous environment when tagging if there is a tag from the previous environment
23
+ - Added the following cap tasks:
24
+ - print_latest_tags
25
+ - read_tag_from_shared
26
+ - write_tag_to_shared
27
+
28
+ 2009-03-29
29
+
30
+ - Capistrano tasks :set_branch no longer sets the branch to nil. If the CapistranoHelper returns nil, it leaves the branch alone.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 [Jeff Dean]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,176 @@
1
+ # IMPORTANT NOTE
2
+
3
+ This gem is still in it's infancy, and lots of things might change. Since this creates and pushes tags to your git repository, please use with caution.
4
+
5
+ # AutoTagger
6
+
7
+ AutoTagger is a gem that helps you automatically create a date-stamped tag for each stage of your deployment, and deploy from the last tag from the previous environment.
8
+
9
+ Let's say you have the following workflow:
10
+
11
+ * Run all test on a Continuous Integration (CI) server
12
+ * Deploy to a staging server
13
+ * Deploy to a production server
14
+
15
+ You can use the `autotag` command to tag releases on your CI box, then use the capistrano tasks to auto-tag each release.
16
+
17
+ ## Installation
18
+
19
+ sudo gem install auto_tagger
20
+
21
+ ## Contribute
22
+
23
+ * [GitHub Repository](http://github.com/zilkey/auto_tagger/tree/master)
24
+
25
+ ## The autotag executable
26
+
27
+ Installing the gem creates an executable file named autotag, which takes two arguments: the stage, and optionally the path to the git repo:
28
+
29
+ $ autotag demo # => creates a tag like demo/200804041234 in the current directory
30
+ $ autotag demo . # => same as above
31
+ $ autotag demo /Users/me/foo # => cd's to /Users/me/foo before creating the tag
32
+
33
+ Running autotag does the following:
34
+
35
+ $ git fetch origin --tags
36
+ $ git tag <stage>/<timestamp>
37
+ $ git push origin --tags
38
+
39
+ ## Capistrano Integration
40
+
41
+ AutoTagger comes with 2 capistrano tasks:
42
+
43
+ * `release_tagger:set_branch` tries to set the branch to the last tag from the previous environment.
44
+ * `release_tagger:create_tag` runs autotag for the current stage
45
+
46
+ Example `config/deploy.rb` file:
47
+
48
+ require 'release_tagger'
49
+
50
+ # The :autotagger_stages variable is required
51
+ set :autotagger_stages, [:ci, :staging, :production]
52
+
53
+ # The :working_directory variable is optional, and defaults to Dir.pwd
54
+ # :working_directory can be an absolute or relative path
55
+ set :working_directory, "../../"
56
+
57
+ task :production do
58
+ # In each of your environments that need auto-branch setting, you need to set :stage
59
+ set :stage, :production
60
+ end
61
+
62
+ task :staging do
63
+ # If you do not set stage, it will not auto-set your branch
64
+ # set :stage, :staging
65
+ end
66
+
67
+ # You need to add the before/ater callbacks yourself
68
+ before "deploy:update_code", "release_tagger:set_branch"
69
+ after "deploy", "release_tagger:create_tag"
70
+ after "deploy", "release_tagger:write_tag_to_shared"
71
+ after "deploy", "release_tagger:print_latest_tags"
72
+
73
+ ### Cpistano-ext multistage support
74
+
75
+ If you use capistano-ext multistage, you can use auto_tagger.
76
+
77
+ set :autotagger_stages, [:ci, :staging, :production]
78
+ set :stages, [:staging, :production]
79
+ set :default_stage, :staging
80
+ require 'capistrano/ext/multistage'
81
+
82
+ When you deploy, autotagger will auto-detect your current stage.
83
+
84
+ ### release_tagger:set_branch
85
+
86
+ This task sets the git branch to the latest tag from the previous stage. Assume you have the following tags in your git repository:
87
+
88
+ * ci/01
89
+ * staging/01
90
+ * production/01
91
+
92
+ And the following stages in your capistrano file:
93
+
94
+ set :autotagger_stages, [:ci, :staging, :production]
95
+
96
+ The deployments would look like this:
97
+
98
+ cap staging release_tagger:set_branch # => sets branch to ci/01
99
+ cap production release_tagger:set_branch # => sets branch to staging/01
100
+
101
+ You can override with with the -Shead and -Stag options
102
+
103
+ cap staging release_tagger:set_branch -Shead=true # => sets branch to master
104
+ cap staging release_tagger:set_branch -Stag=staging/01 # => sets branch to staging/01
105
+
106
+ If you add `before "deploy:update_code", "release_tagger:set_branch"`, you can just deploy with:
107
+
108
+ cap staging deploy
109
+
110
+ and the branch will be set for you automatically.
111
+
112
+ ### release_tagger:create_tag
113
+
114
+ This cap task creates a new tag, based on the latest tag from the previous environment.
115
+
116
+ If there is no tag from the previous stage, it creates a new tag from the latest commit in your _working directory_.
117
+
118
+ If you don't specify any `autotagger_stages`, autotagger will create a tag that starts with "production".
119
+
120
+ ### release_tagger:print_latest_tags
121
+
122
+ This task reads the git version from the text file in shared:
123
+
124
+ cap staging release_tagger:read_tag_from_shared
125
+
126
+ ### release_tagger:print_latest_tags
127
+
128
+ This task takes the latest tag from each environment and prints it to the screen. You can add it to your deploy.rb like so:
129
+
130
+ after "deploy", "release_tagger:print_latest_tags"
131
+
132
+ Or call it directly, like:
133
+
134
+ cap production release_tagger:print_latest_tags
135
+
136
+ This will produce output like:
137
+
138
+ ** AUTO TAGGER: release tag history is:
139
+ ** ci ci/20090331045345 8031807feb5f4f99dd83257cdc07081fa6080cba some commit message
140
+ ** staging staging/20090331050908 8031807feb5f4f99dd83257cdc07081fa6080cba some commit message
141
+ ** production production/20090331050917 8031807feb5f4f99dd83257cdc07081fa6080cba some commit message
142
+
143
+ ## Running tests:
144
+
145
+ You must be able to ssh into your box via localhost (remote login). To make this easier, add your own key to your own account:
146
+
147
+ cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
148
+
149
+ To ensure that this has worked, try this:
150
+
151
+ ssh localhost
152
+
153
+ If it asks you for a password, you've done something wrong.
154
+
155
+ To run the specs, execute:
156
+
157
+ spec spec/
158
+
159
+ To run the cucumber features, execute:
160
+
161
+ cucumber features/
162
+
163
+ ## Acknowledgments
164
+
165
+ Special thanks to
166
+
167
+ * Brian Takita for the original recipes
168
+ * Mike Dalessio for his git fu
169
+ * Chad Wooley for his feature ideas
170
+ * Tim Holahan for his QA
171
+
172
+ ## Links
173
+
174
+ * http://codeintensity.blogspot.com/2008/06/changelogs-and-deployment-notification.html
175
+
176
+ Copyright (c) 2009 [Jeff Dean], released under the MIT license
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "factorylabs-auto_tagger"
8
+ gem.summary = %Q{Helps you automatically create tags for each stage in a multi-stage deploment and deploy from the latest tag from the previous environment}
9
+ gem.email = "jeff@zilkey.com"
10
+ gem.homepage = "http://github.com/zilkey/auto_tagger"
11
+ gem.authors = ["Jeff Dean", "Brian Takita", "Mike Grafton"]
12
+ gem.add_dependency('capistrano', [">= 2.5.3"])
13
+ gem.require_paths = ["lib"]
14
+ gem.executables = ["autotag"]
15
+ gem.default_executable = %q{autotag}
16
+ gem.date = %q{2009-03-28}
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
21
+ end
22
+
23
+ require 'spec/rake/spectask'
24
+ Spec::Rake::SpecTask.new(:spec) do |spec|
25
+ spec.libs << 'lib' << 'spec'
26
+ spec.spec_files = FileList['spec/**/*_spec.rb']
27
+ end
28
+
29
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
30
+ spec.libs << 'lib' << 'spec'
31
+ spec.pattern = 'spec/**/*_spec.rb'
32
+ spec.rcov = true
33
+ end
34
+
35
+
36
+ task :default => :spec
37
+
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rdoc|
40
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
+
42
+ rdoc.rdoc_dir = 'rdoc'
43
+ rdoc.title = "the-perfect-gem #{version}"
44
+ rdoc.rdoc_files.include('README*')
45
+ rdoc.rdoc_files.include('lib/**/*.rb')
46
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
@@ -0,0 +1,83 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{auto_tagger}
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jeff Dean", "Brian Takita", "Mike Grafton"]
12
+ s.date = %q{2010-04-06}
13
+ s.default_executable = %q{autotag}
14
+ s.email = %q{jeff@zilkey.com}
15
+ s.executables = ["autotag"]
16
+ s.extra_rdoc_files = [
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "CHANGELOG",
23
+ "MIT-LICENSE",
24
+ "README.md",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "auto_tagger.gemspec",
28
+ "bin/autotag",
29
+ "features/autotag.feature",
30
+ "features/deployment.feature",
31
+ "features/step_definitions/autotag_steps.rb",
32
+ "features/step_definitions/deployment_steps.rb",
33
+ "features/support/env.rb",
34
+ "features/support/step_helpers.rb",
35
+ "features/templates/cap_ext_deploy.erb",
36
+ "features/templates/deploy.erb",
37
+ "features/templates/stage.erb",
38
+ "geminstaller.yml",
39
+ "lib/auto_tagger.rb",
40
+ "lib/auto_tagger/auto_tagger.rb",
41
+ "lib/auto_tagger/capistrano_helper.rb",
42
+ "lib/auto_tagger/commander.rb",
43
+ "lib/auto_tagger/recipes.rb",
44
+ "lib/auto_tagger/repository.rb",
45
+ "lib/auto_tagger/stage_manager.rb",
46
+ "lib/auto_tagger/tag.rb",
47
+ "spec/auto_tagger/auto_tagger_spec.rb",
48
+ "spec/auto_tagger/capistrano_helper_spec.rb",
49
+ "spec/auto_tagger/commander_spec.rb",
50
+ "spec/auto_tagger/repository_spec.rb",
51
+ "spec/auto_tagger/stage_manager_spec.rb",
52
+ "spec/auto_tagger/tag_spec.rb",
53
+ "spec/spec_helper.rb"
54
+ ]
55
+ s.homepage = %q{http://github.com/zilkey/auto_tagger}
56
+ s.rdoc_options = ["--charset=UTF-8"]
57
+ s.require_paths = ["lib"]
58
+ s.rubygems_version = %q{1.3.6}
59
+ s.summary = %q{Helps you automatically create tags for each stage in a multi-stage deploment and deploy from the latest tag from the previous environment}
60
+ s.test_files = [
61
+ "spec/auto_tagger/auto_tagger_spec.rb",
62
+ "spec/auto_tagger/capistrano_helper_spec.rb",
63
+ "spec/auto_tagger/commander_spec.rb",
64
+ "spec/auto_tagger/repository_spec.rb",
65
+ "spec/auto_tagger/stage_manager_spec.rb",
66
+ "spec/auto_tagger/tag_spec.rb",
67
+ "spec/spec_helper.rb"
68
+ ]
69
+
70
+ if s.respond_to? :specification_version then
71
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
72
+ s.specification_version = 3
73
+
74
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
75
+ s.add_runtime_dependency(%q<capistrano>, [">= 2.5.3"])
76
+ else
77
+ s.add_dependency(%q<capistrano>, [">= 2.5.3"])
78
+ end
79
+ else
80
+ s.add_dependency(%q<capistrano>, [">= 2.5.3"])
81
+ end
82
+ end
83
+
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "auto_tagger"))
3
+ require 'getoptlong'
4
+
5
+ opts = GetoptLong.new(
6
+ ['--help', '-h', '-?', GetoptLong::NO_ARGUMENT]
7
+ )
8
+
9
+ def usage
10
+ puts
11
+ puts "USAGE: #{File.basename($0)} <stage> [<repository>]"
12
+ puts
13
+ puts ' where: stage sets the tag prefix'
14
+ puts ' repository sets the repository to act on - defualts to the current directory'
15
+ puts
16
+ puts ' examples: autotag'
17
+ puts ' autotag .'
18
+ puts ' autotag ../'
19
+ puts ' autotag /data/myrepo'
20
+ puts ' autotag demo'
21
+ puts
22
+ puts
23
+ exit 0
24
+ end
25
+
26
+ opts.each do |opt, arg|
27
+ case opt
28
+ when "--help"
29
+ usage
30
+ end
31
+ end
32
+
33
+ if ARGV[0]
34
+ AutoTagger.new(ARGV[0], ARGV[1]).create_tag
35
+ exit 0
36
+ else
37
+ usage
38
+ end
@@ -0,0 +1,39 @@
1
+ Feature: Deployment
2
+ In order to get auto-tagging goodness on ci boxes
3
+ As a ruby and git ninja
4
+ I want to be able to easily create a tag from the command line with the same name format as the one created by the cap tasks
5
+
6
+ Scenario: user runs autotag with no args
7
+ Given a repo
8
+ When I run autotag with no arguments
9
+ Then I should see "USAGE:"
10
+ And no tags should be created
11
+
12
+ Scenario: user runs autotag with "--help"
13
+ Given a repo
14
+ When I run autotag with "--help"
15
+ Then I should see "USAGE:"
16
+ And no tags should be created
17
+
18
+ Scenario: user runs autotag with "-h"
19
+ Given a repo
20
+ When I run autotag with "-h"
21
+ Then I should see "USAGE:"
22
+ And no tags should be created
23
+
24
+ Scenario: user runs autotag with "-?"
25
+ Given a repo
26
+ When I run autotag with "-?"
27
+ Then I should see "USAGE:"
28
+ And no tags should be created
29
+
30
+ Scenario: user runs autotag with "demo"
31
+ Given a repo
32
+ When I run autotag with "demo"
33
+ # can't check output here for some reason
34
+ Then a "demo" tag should be created
35
+
36
+ Scenario: user runs autotag with "demo ."
37
+ Given a repo
38
+ When I run autotag with "demo"
39
+ Then a "demo" tag should be created