quiverstaskrunner 0.1.40704

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8b209cdea61e88d3f5521ed36fd48f92a24a0ae8
4
+ data.tar.gz: 8bd5e19d3b8e1e64d66f3fe5573cedebc2c786b1
5
+ SHA512:
6
+ metadata.gz: b973d62b2d2304e6b04cd528251eac72e2d48d77f1ab85e899b3a180f1d5a1b8cfc38af0e7165a57d3d48766ff1548b602c28f2938dec2a36abe763e2b9d59ea
7
+ data.tar.gz: 9deb32c00ccfab9afaa2eecfa2be98be100ec3e6e8985dcb4ede51ff83e6a7782134bcbe28166a7c24b53ca747edb1cc8af3cfcb06677da86b3bf430d6df6b53
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in quivers-taskrunner.gemspec
4
+ gemspec
5
+
6
+ # Fork from original project. This is because the original project contains a series of bugs
7
+ # as well as a few missing features
8
+ gem "azure", :git => "https://github.com/nicolasdao/azure-sdk-for-ruby.git"
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 ndao
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # QuiversTaskrunner
2
+
3
+ Set of modules which defines common tasks to build, deploy C# projects. It also allows to query details about the project's hosting environment in Azure
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'quiverstaskrunner'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install quiverstaskrunner
18
+
19
+ ## Usage
20
+
21
+ Typically used inside a Rakefile
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( https://daonicolas@bitbucket.org/quivers/quivers.taskrunner/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,266 @@
1
+ require 'bundler/setup'
2
+ require 'azure'
3
+ require 'colorize'
4
+ require 'nokogiri'
5
+ require 'SecureRandom'
6
+ require "quiverstaskrunner/helpers/envhelper"
7
+ require "quiverstaskrunner/helpers/xmlhelper"
8
+ require "quiverstaskrunner/helpers/settingshelper"
9
+
10
+ include QuiversTaskrunner
11
+
12
+ module QuiversTaskrunner
13
+ module_function
14
+
15
+ def is_update_message_on
16
+ update_message_on = true
17
+ begin
18
+ update_message_on = (EnvHelper.get_env("update_message_on") == "true")
19
+ rescue
20
+ update_message_on = true
21
+ end
22
+ return update_message_on
23
+ end
24
+
25
+ def scale_host(cloud_service_name, service_configuration, service_definition, env=nil)
26
+ env = env || EnvHelper.get_env("env")
27
+
28
+ # 1. Get cloud service's details
29
+ cloud_services = SettingsHelper.get_settings(File.join(Dir.pwd, "secrets/cloud_services.yml"), env)
30
+ cloud_service_details = cloud_services[cloud_service_name]
31
+ raise StandardError, "No details were found for cloud service #{cloud_service_name}" unless cloud_service_details
32
+ vmsize = cloud_service_details["vmsize"]
33
+ vmnbr = cloud_service_details["vmnbr"]
34
+
35
+ # 2. Load xml files
36
+ service_config_xml = XmlHelper.get_xml(service_configuration)
37
+ service_def_xml = XmlHelper.get_xml(service_definition)
38
+
39
+ service_config_xml.update_node_at_css_selector('ServiceConfiguration Role Instances',
40
+ { :count => vmnbr })
41
+ service_def_xml.update_node_at_css_selector('ServiceDefinition WebRole',
42
+ { :vmsize => vmsize })
43
+
44
+ XmlHelper.overide_xml(service_configuration, service_config_xml)
45
+ XmlHelper.overide_xml(service_definition, service_def_xml)
46
+ end
47
+
48
+ def configure_subscription(env=nil)
49
+
50
+ # 1. Load environment variables
51
+ env = env || EnvHelper.get_env("env")
52
+ pfx_path = EnvHelper.get_env("azure_management_certificate")
53
+ subscription_id = EnvHelper.get_env("azure_subscription_id")
54
+
55
+ # 2. Load secrets
56
+ storage = SettingsHelper.get_settings(File.join(Dir.pwd, "secrets/storage.yml"), env)
57
+ storage_details = storage["blob"]
58
+ raise StandardError, "No details were found for blob storage for the #{env} environment" unless storage_details
59
+
60
+ Azure.configure do |config|
61
+ config.storage_account_name = storage_details["name"]
62
+ config.storage_access_key = storage_details["key"]
63
+ config.management_certificate = pfx_path
64
+ config.subscription_id = subscription_id
65
+ config.management_endpoint = "https://management.core.windows.net"
66
+ end
67
+ end
68
+
69
+ def upload_cspkg_to_blob(pkg_name, pkg_dir, options={})
70
+ # 1. Configure the blob object, and load the package inside it
71
+ timeout = options[:timeout] || 20*60 # 20 minutes
72
+ blob_srv = Azure::Blob::BlobService.new
73
+ blob_name = Time.now.utc.strftime("%Y%m%d_%H%M%S_#{pkg_name}")
74
+ blob_container = "mydeployments"
75
+ blob_content = nil
76
+ File.open(File.join(pkg_dir, pkg_name), "rb") do |f|
77
+ blob_content = f.read
78
+ end
79
+ blob_options = {
80
+ :content_type => "application/octet-stream",
81
+ :timeout => timeout
82
+ }
83
+
84
+ # 2. Upload the blob object to the blob storage
85
+ start_time = Time.now
86
+ uploaded_package_name = nil
87
+ no_error = true
88
+ begin
89
+ puts "Start uploading package #{blob_name} to blob storage"
90
+ new_blob = blob_srv.create_block_blob(blob_container, blob_name, blob_content, blob_options)
91
+ uploaded_package_name = blob_name
92
+ rescue Exception => ex
93
+ no_error = false
94
+ raise ex
95
+ ensure
96
+ ellappsed_min = (Time.now - start_time)/60.to_f
97
+ puts "Upload of package #{blob_name} to blob storage succeeded in #{ellappsed_min} minutes".colorize(:green)
98
+ end
99
+
100
+ return [uploaded_package_name, no_error]
101
+ end
102
+
103
+ def deploy_blob_pkg_to_staging(cloud_service_name, blob_pkg_name, pkg_dir, labels, options={})
104
+ # 1. Load cloud service's details
105
+ env = options[:env] || EnvHelper.get_env("env")
106
+ timeout = options[:timeout] || 20*60 # 20 minutes
107
+ update_message_on = is_update_message_on
108
+ cloud_services = SettingsHelper.get_settings(File.join(Dir.pwd, "secrets/cloud_services.yml"), env)
109
+ cloud_service_details = cloud_services[cloud_service_name]
110
+ raise StandardError, "No details were found for cloud service #{cloud_service_name}" unless cloud_service_details
111
+ # 2. Load storage details
112
+ storage = SettingsHelper.get_settings(File.join(Dir.pwd, "secrets/storage.yml"), env)
113
+ storage_details = storage["blob"]
114
+ raise StandardError, "No details were found for blob storage for the #{env} environment" unless storage_details
115
+
116
+ # 3. Configure the deployment details
117
+ deployment_name = SecureRandom.uuid
118
+ cloud_srv_name = cloud_service_details["name"]
119
+ package_url = ENV["package_url"]
120
+ if package_url.nil?
121
+ if blob_pkg_name.nil? || blob_pkg_name.empty?
122
+ raise ArgumentError, "Missing argument. No 'blob_pkg_name' or 'package_url' defined."
123
+ else
124
+ package_url = "https://#{storage_details['name']}.blob.core.windows.net/mydeployments/#{blob_pkg_name}"
125
+ end
126
+ end
127
+ # This way of getting the service configuration file may seem weird(indeed, why not
128
+ # using the standard File.open method?), but for some reasons that I don't understand,
129
+ # File.open will result in a 'Bad Request : The specified configuration settings for Configuration
130
+ # are invalid.' error
131
+ service_configuration = XmlHelper.get_xml(File.join(pkg_dir, "ServiceConfiguration.#{env.capitalize}.cscfg")).to_xml
132
+
133
+ deployment_options = {
134
+ :slot => "staging",
135
+ :label => labels,
136
+ :start_deployment => true,
137
+ :fire_and_forget => true,
138
+ :upgrade_if_exists => true
139
+ }
140
+
141
+ # 4. Asynchronously deploy package to staging
142
+ start_time = Time.now
143
+ init_msg = nil
144
+ cloud_srv_mgmt = Azure::CloudServiceManagementService.new
145
+ no_error = true
146
+ begin
147
+ puts "Start deploying package from blob storage #{package_url} to cloud service"
148
+ resp = cloud_srv_mgmt.create_deployment(deployment_name, cloud_srv_name, package_url, service_configuration, deployment_options)
149
+ init_msg = "successfully initiated"
150
+ rescue Exception => ex
151
+ no_error = false
152
+ init_msg = "failed"
153
+ raise ex
154
+ ensure
155
+ ellapsed_time_min = (Time.now - start_time)/60.to_f
156
+ puts "Deployment #{deployment_name} #{init_msg} after #{ellapsed_time_min} minutes"
157
+ end
158
+
159
+ # 5. Wait until the deployment is done
160
+ deployment_pending = true
161
+ waiting_start_time = Time.now
162
+ timeout = timeout
163
+ counter = 1
164
+ waiting_symbols = ["=", "+"]
165
+ deployment_id = nil
166
+ while deployment_pending do
167
+ waiting_characters = Array.new(counter, waiting_symbols[0]).join
168
+ if update_message_on
169
+ print "\r"
170
+ print "Waiting for confirmation of running instances #{waiting_characters}"
171
+ end
172
+ deployment = cloud_srv_mgmt.get_deployment(cloud_srv_name, {:slot => "staging" })
173
+ raise StandardError, "#{timeout} seconds timeout. Client unable to confirm operation success" if (Time.now - waiting_start_time) > timeout
174
+ deployment_pending = !deployment.all_vms_running? || deployment.is_transitioning?
175
+ deployment_id = deployment.private_id
176
+ counter+=1
177
+ if counter > 40
178
+ counter = 1
179
+ waiting_symbols.reverse!
180
+ end
181
+ end
182
+ print "\n"
183
+ ellapsed_time_min = (Time.now - start_time)/60.to_f
184
+ puts "Deployment #{deployment_name} with id #{deployment_id} running successfully. Deployment took #{ellapsed_time_min} minutes to complete".colorize(:green)
185
+ return no_error
186
+ end
187
+
188
+ def swap(cloud_service_name, options={})
189
+
190
+ # 1. Load cloud service's details
191
+ env = options[:env] || EnvHelper.get_env("env")
192
+ timeout = options[:timeout] || 20*60 # 20 minutes
193
+ update_message_on = is_update_message_on
194
+ cloud_services = SettingsHelper.get_settings(File.join(Dir.pwd, "secrets/cloud_services.yml"), env)
195
+ cloud_service_details = cloud_services[cloud_service_name]
196
+ cloud_srv_name = cloud_service_details["name"]
197
+
198
+ # 2. Asynchronously swap deployments
199
+ start_time = Time.now
200
+ init_msg = nil
201
+ cloud_srv_mgmt = Azure::CloudServiceManagementService.new
202
+ no_error = true
203
+ begin
204
+ puts "Start swapping deployments for cloud service '#{cloud_srv_name}'"
205
+ resp = cloud_srv_mgmt.swap_deployment(cloud_srv_name, {:fire_and_forget => true})
206
+ init_msg = "successfully initiated"
207
+ rescue Exception => ex
208
+ no_error = false
209
+ init_msg = "failed"
210
+ raise ex
211
+ ensure
212
+ ellapsed_time_min = (Time.now - start_time)/60.to_f
213
+ puts "Swapping deployments for cloud service '#{cloud_srv_name}' #{init_msg} after #{ellapsed_time_min} minutes"
214
+ end
215
+
216
+ # 3. Wait until the swapping is done
217
+ deployment_pending = true
218
+ waiting_start_time = Time.now
219
+ counter = 1
220
+ waiting_symbols = ["=", "+"]
221
+ while deployment_pending do
222
+ waiting_characters = Array.new(counter, waiting_symbols[0]).join
223
+ if update_message_on
224
+ print "\r"
225
+ print "Waiting for confirmation of running instances #{waiting_characters}"
226
+ end
227
+ deployment = cloud_srv_mgmt.get_deployment(cloud_srv_name, {:slot => "production" })
228
+ raise StandardError, "#{timeout} seconds timeout. Client unable to confirm operation success" if (Time.now - waiting_start_time) > timeout
229
+ deployment_pending = !deployment.all_vms_running? || deployment.is_transitioning?
230
+ counter+=1
231
+ if counter > 40
232
+ counter = 1
233
+ waiting_symbols.reverse!
234
+ end
235
+ end
236
+ print "\n"
237
+ ellapsed_time_min = (Time.now - start_time)/60.to_f
238
+ puts "Swapping deployments for cloud service '#{cloud_srv_name}' done. Swapping took #{ellapsed_time_min} minutes to complete".colorize(:green)
239
+ return no_error
240
+ end
241
+
242
+ def delete_staging(cloud_service_name, env=nil)
243
+
244
+ # 1. Load cloud service's details
245
+ env = env || EnvHelper.get_env("env")
246
+ cloud_services = SettingsHelper.get_settings(File.join(Dir.pwd, "secrets/cloud_services.yml"), env)
247
+ cloud_service_details = cloud_services[cloud_service_name]
248
+ raise StandardError, "No details were found for cloud service #{cloud_service_name}" unless cloud_service_details
249
+ cloud_srv_name = cloud_service_details["name"]
250
+
251
+ # 2. Check if there is a Staging deployment for that Cloud Service
252
+ cloud_srv_mgmt = Azure::CloudServiceManagementService.new
253
+ deployment = cloud_srv_mgmt.get_deployment(cloud_srv_name, {:slot => "staging", :no_exit_on_failure => true})
254
+
255
+ # 3. Delete the Staging deployment if it exists
256
+ start_time = Time.now
257
+ if deployment.exists?
258
+ puts "Deleting staging deployment with id #{deployment.private_id} for cloud service #{cloud_srv_name}"
259
+ cloud_srv_mgmt.delete_cloud_service_deployment(cloud_srv_name, "staging")
260
+ ellapsed_time_min = (Time.now - start_time)/60.to_f
261
+ puts "Deleting staging deployment #{deployment.private_id} for cloud service #{cloud_srv_name} done. Operation took #{ellapsed_time_min} minutes to complete".colorize(:green)
262
+ else
263
+ puts "No staging deployment detected for cloud service '#{cloud_srv_name}'".colorize(:magenta)
264
+ end
265
+ end
266
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module QuiversTaskrunner
3
+ module EnvHelper
4
+ def self.get_env(name)
5
+ begin
6
+ value = ENV[name]
7
+ if value.nil?
8
+ value = `#{name.upcase}`
9
+ end
10
+ return value
11
+ rescue Exception => ex
12
+ raise ArgumentError, "Environment variable '#{name}' not defined. Please pass\n" +
13
+ "a '#{name}' environment variable to your task, or create a '#{name}' \n" +
14
+ "environment variable on your machine"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ require 'rake'
2
+ require 'colorize'
3
+
4
+ module QuiversTaskrunner
5
+ module RakeHelper
6
+
7
+ def self.safe_invoke(tasks, ensure_tasks={}, options={})
8
+
9
+ start_time = Time.now
10
+ task_group_name = options[:task_group_name] || "safe task invoke"
11
+ if options[:display_message] && !options[:global].nil? && options[:global].respond_to?("no_error")
12
+ puts "Start #{task_group_name}...".colorize(:cyan)
13
+ end
14
+
15
+ begin
16
+ if tasks.is_a?(Array)
17
+ tasks.each { |t| Rake::Task[t].invoke }
18
+ else
19
+ Rake::Task[tasks].invoke
20
+ end
21
+ rescue Exception => ex
22
+ raise ex
23
+ ensure
24
+ if ensure_tasks.is_a?(Array) && ensure_tasks.any?
25
+ RakeHelper.safe_invoke(ensure_tasks[0], ensure_tasks.shift)
26
+ else
27
+ Rake::Task[ensure_tasks].invoke unless ensure_tasks.empty?
28
+ end
29
+ end
30
+
31
+ if options[:display_message] && !options[:global].nil? && options[:global].respond_to?("no_error")
32
+ ellapsed_time_min = (Time.now - start_time)/60.to_f
33
+ build_status = "successfully completed in"
34
+ color_theme = :green
35
+ unless options[:global].no_error
36
+ build_status = "failed after"
37
+ color_theme = :red
38
+ end
39
+ puts "#{task_group_name.capitalize} #{build_status} #{ellapsed_time_min} minutes".colorize(color_theme)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,16 @@
1
+ require "yaml"
2
+ require "erb"
3
+
4
+ module QuiversTaskrunner
5
+ module SettingsHelper
6
+ module_function
7
+
8
+ def get_settings(filepath, env={})
9
+ environment = env.is_a?(Hash) ? "defaults" : env
10
+ file_contents = open(filepath).read
11
+ YAML.load(ERB.new(file_contents).result).to_hash
12
+ all_settings = YAML.load(ERB.new(file_contents).result).to_hash
13
+ all_settings[environment]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,57 @@
1
+ require 'nokogiri'
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class Document
6
+ def add_node_under_css_selector(css_selector, node)
7
+ nodes = node.is_a?(Array) ? node : [node]
8
+ self.css(css_selector).each { |n| nodes.each { |x| n.add_child(x) } }
9
+ end
10
+
11
+ def update_node_at_css_selector(css_selector, attributes={}, content={})
12
+ attribute_exists = !attributes.nil? && attributes.any?
13
+ content_exists = !content.nil? && content.any?
14
+ self.css(css_selector).each { |n|
15
+ if attribute_exists
16
+ attributes.each { |k,v| n[k.to_s] = v}
17
+ end
18
+ if content_exists
19
+ n.content = content
20
+ end
21
+ }
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ module QuiversTaskrunner
28
+ module XmlHelper
29
+
30
+ def self.get_xml(filepath)
31
+ xml = nil
32
+ File.open(filepath, "rb") do |f|
33
+ xml = Nokogiri::XML(f)
34
+ end
35
+ return xml
36
+ end
37
+
38
+ def self.overide_xml(filepath, xml)
39
+ File.open(filepath, "w") do |f|
40
+ f.write(xml.to_xml)
41
+ end
42
+ end
43
+
44
+ def self.create_xmlnode(name, original_document, attributes={}, content={})
45
+ node = Nokogiri::XML::Node.new name, original_document
46
+ unless attributes.nil? || attributes.empty?
47
+ attributes.each { |k,v|
48
+ node[k.to_s] = v
49
+ }
50
+ end
51
+ unless content.nil? || content.empty?
52
+ node.content = content
53
+ end
54
+ return node
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,22 @@
1
+ module QuiversTaskrunner
2
+ module_function
3
+
4
+ def replace_tokens(files_with_missing_tokens, tokens)
5
+ files = files_with_missing_tokens.is_a?(Array) ? files_with_missing_tokens : [files_with_missing_tokens]
6
+ raise ArgumentError, "'tokens' must be a Hash" unless tokens.is_a?(Hash)
7
+
8
+ files.each { |f_path|
9
+ content = nil
10
+ File.open(f_path, "rb") do |f|
11
+ content = f.read
12
+ tokens.each { |k,v|
13
+ content = content.gsub("{{#{k}}}", v)
14
+ }
15
+ end
16
+
17
+ File.open(f_path, "w") do |f|
18
+ f.write(content)
19
+ end
20
+ }
21
+ end
22
+ end
@@ -0,0 +1,42 @@
1
+ require 'colorize'
2
+ require 'fileutils'
3
+
4
+ module QuiversTaskrunner
5
+ module_function
6
+
7
+ def create_azure_files_restore_points(files_to_backup)
8
+
9
+ # convert single file into an array
10
+ files = files_to_backup.is_a?(Array) ? files_to_backup : (files_to_backup.nil? ? [] : [files_to_backup])
11
+
12
+ files.each do |f|
13
+ f_ext = File.extname(f)
14
+ f_backup_ext = ".backup#{f_ext}"
15
+ f_backup = f.gsub(f_ext, f_backup_ext)
16
+ # 1. Delete previous backup files if there are still present
17
+ FileUtils.rm_f(f_backup) if FileTest.exists? f_backup
18
+ # 2. Create backup files
19
+ FileUtils.cp f, f_backup
20
+ end
21
+ end
22
+
23
+ def restore_and_clean_files(files_to_restore)
24
+
25
+ # convert single file into an array
26
+ files = files_to_restore.is_a?(Array) ? files_to_restore : (files_to_restore.nil? ? [] : [files_to_restore])
27
+
28
+ files.each do |f|
29
+ f_ext = File.extname(f)
30
+ f_backup_ext = ".backup#{f_ext}"
31
+ f_backup = f.gsub(f_ext, f_backup_ext)
32
+ # 1. Make sure there are restore files available
33
+ raise StandardError, "Missing restore file #{f_backup}" unless FileTest.exists? f_backup
34
+ # 2. Delete the modified files
35
+ FileUtils.rm_f(f)
36
+ # 3. Restore modified files
37
+ FileUtils.cp f_backup, f
38
+ # 4. Delete backup files
39
+ FileUtils.rm_f(f_backup)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1 @@
1
+ module QuiversTaskrunner
@@ -0,0 +1,8 @@
1
+ require "quiverstaskrunner/version"
2
+ require "quiverstaskrunner/azuresetup"
3
+ require "quiverstaskrunner/replacetokens"
4
+ require "quiverstaskrunner/restorepoints"
5
+ require "quiverstaskrunner/helpers/envhelper"
6
+ require "quiverstaskrunner/helpers/rakehelper"
7
+ require "quiverstaskrunner/helpers/settingshelper"
8
+ require "quiverstaskrunner/helpers/xmlhelper"
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ version = "0.1.%s" % ((Time.now.utc - Time.utc(2014, 7, 3))/60).round
6
+ version_file_path = File.join(lib, "quiverstaskrunner", "version.rb")
7
+ updated_content = nil
8
+
9
+ # update content
10
+ File.open(version_file_path, "rb") do |f|
11
+ content = f.read
12
+ updated_content = content.gsub(/(?<=").*?(?=")/, "%s" % version)
13
+ end
14
+
15
+ # overwrite version.rb with new content
16
+ File.open(version_file_path, "w") do |f|
17
+ f.write(updated_content)
18
+ end
19
+
20
+
21
+ Gem::Specification.new do |spec|
22
+ spec.name = "quiverstaskrunner"
23
+ spec.version = version
24
+ spec.authors = ["ndao"]
25
+ spec.email = ["nicolas@quivers.com"]
26
+ spec.summary = %q{Set of modules which defines common tasks to build, deploy C# projects.}
27
+ spec.description = %q{Set of modules which defines common tasks to build, deploy C# projects. It also allows to query details about the project's hosting environment in Azure}
28
+ spec.homepage = ""
29
+ spec.license = "MIT"
30
+
31
+ spec.files = `git ls-files -z`.split("\x0")
32
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
33
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
34
+ spec.require_paths = ["lib"]
35
+
36
+ spec.add_development_dependency "bundler", "~> 1.6"
37
+ spec.add_development_dependency "rake"
38
+ spec.add_runtime_dependency "nokogiri", "~> 1.6"
39
+ spec.add_runtime_dependency "azure", "~> 0.6"
40
+ spec.add_runtime_dependency "colorize", "~> 0.7"
41
+ end
metadata ADDED
@@ -0,0 +1,130 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: quiverstaskrunner
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.40704
5
+ platform: ruby
6
+ authors:
7
+ - ndao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: azure
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.6'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: colorize
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '0.7'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '0.7'
83
+ description: Set of modules which defines common tasks to build, deploy C# projects.
84
+ It also allows to query details about the project's hosting environment in Azure
85
+ email:
86
+ - nicolas@quivers.com
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - .gitignore
92
+ - Gemfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - lib/quiverstaskrunner.rb
97
+ - lib/quiverstaskrunner/azuresetup.rb
98
+ - lib/quiverstaskrunner/helpers/envhelper.rb
99
+ - lib/quiverstaskrunner/helpers/rakehelper.rb
100
+ - lib/quiverstaskrunner/helpers/settingshelper.rb
101
+ - lib/quiverstaskrunner/helpers/xmlhelper.rb
102
+ - lib/quiverstaskrunner/replacetokens.rb
103
+ - lib/quiverstaskrunner/restorepoints.rb
104
+ - lib/quiverstaskrunner/version.rb
105
+ - quiverstaskrunner.gemspec
106
+ homepage: ''
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 2.0.14
127
+ signing_key:
128
+ specification_version: 4
129
+ summary: Set of modules which defines common tasks to build, deploy C# projects.
130
+ test_files: []