azdeploy 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/azdeploy.gemspec +1 -1
- data/lib/azdeploy.rb +2 -2
- data/lib/build.rb +62 -0
- data/lib/install.rb +41 -34
- data/lib/transform.rb +50 -40
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38e00e6d7d29447196dbc0a629fd5f836376a849
|
4
|
+
data.tar.gz: f4e001f2b23e8802e8a8cf72de019b0f8ac459dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 328e1222c72b0ec4263e974c7d3237f349753cfd4e8c8a64acb8f236fb06054400679cdecf652fec41786b303f45a5c253e66ca92041039c746484df8473f5d9
|
7
|
+
data.tar.gz: 8c9b83d8bb900c016a267168964bfabb671950a5c2025ad0204de5dd1eb8d232987fdb88645d6fe34d72fa8b4ae9867269b65cba14b5e493f902bddc3269c760
|
data/azdeploy.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'azdeploy'
|
3
|
-
s.version = '1.0.
|
3
|
+
s.version = '1.0.1'
|
4
4
|
s.date = '2015-02-04'
|
5
5
|
s.summary = 'Setup and scripting support for .Net project builds'
|
6
6
|
s.description = 'Azure Deployment Gem. Provides easy setup and deployment scripting support for .Net project builds'
|
data/lib/azdeploy.rb
CHANGED
@@ -4,11 +4,11 @@ require_relative 'build.rb'
|
|
4
4
|
|
5
5
|
# installation
|
6
6
|
installers = [
|
7
|
-
'
|
7
|
+
'ruby', 'devkit', 'doxygen', 'gems'
|
8
8
|
]
|
9
9
|
|
10
10
|
installers.each { |method|
|
11
|
-
exit if !send("
|
11
|
+
exit if !send("check_#{method}")
|
12
12
|
}
|
13
13
|
|
14
14
|
require 'rubygems'
|
data/lib/build.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
$versionMap = {}
|
2
|
+
|
1
3
|
def copy_output_files(fromDir, filePattern, outDir)
|
2
4
|
FileUtils.mkdir_p outDir unless exists?(outDir)
|
3
5
|
Dir.glob(File.join(fromDir, filePattern)){|file|
|
@@ -67,4 +69,64 @@ def cleantask(props)
|
|
67
69
|
Dir.mkdir props[:output]
|
68
70
|
Dir.mkdir props[:artifacts]
|
69
71
|
|
72
|
+
end
|
73
|
+
|
74
|
+
def restore_project_pkgs(proj)
|
75
|
+
msbuild :nuget_restore do |msb|
|
76
|
+
msb.use :net4
|
77
|
+
msb.targets :RestorePackages
|
78
|
+
msb.solution = proj
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def clean_build(msb, solution)
|
83
|
+
msb.properties :Configuration => 'Release',
|
84
|
+
:Platform => 'Any CPU',
|
85
|
+
:VisualStudioVersion => '12.0'
|
86
|
+
msb.use :net4
|
87
|
+
msb.solution = solution
|
88
|
+
end
|
89
|
+
|
90
|
+
def versioning
|
91
|
+
ver = SemVer.find
|
92
|
+
revision = (ENV['BUILD_NUMBER'] || ver.patch).to_i
|
93
|
+
var = SemVer.new(ver.major, ver.minor, revision, ver.special)
|
94
|
+
|
95
|
+
commitData = commit_data()
|
96
|
+
|
97
|
+
# extensible number w/ git hash
|
98
|
+
ENV['BUILD_VERSION'] = $versionMap[:build_version] = ver.format('%M.%m.%p%s') + ".#{commitData[0]}"
|
99
|
+
|
100
|
+
# nuget (not full semver 2.0.0-rc.1 support) see http://nuget.codeplex.com/workitem/1796
|
101
|
+
ENV['NUGET_VERSION'] = $versionMap[:nuget_version] = ver.format('%M.%m.%p%s')
|
102
|
+
|
103
|
+
ENV['PLATFORM_VERSION'] = $versionMap[:platform_version] = Time.new.strftime('%y.%-m.%-d') + ".#{(ENV['BUILD_NUMBER'] || '0')}"
|
104
|
+
|
105
|
+
ENV['PLATFORM_BUILD_VERSION'] = $versionMap[:platform_build_version] = Time.new.strftime('%y.%-m.%-d') + ".#{commitData[0]}"
|
106
|
+
|
107
|
+
# purely M.m.p format
|
108
|
+
ENV['FORMAL_VERSION'] = $versionMap[:formal_version] = "#{ SemVer.new(ver.major, ver.minor, revision).format '%M.%m.%p'}"
|
109
|
+
puts "##teamcity[buildNumber '#{$versionMap[:platform_version]}']" # tell teamcity our decision
|
110
|
+
end
|
111
|
+
|
112
|
+
def set_framework_version(asm)
|
113
|
+
set_version asm, $versionMap[:formal_version], $versionMap[:formal_version], $versionMap[:build_version], 'Framework'
|
114
|
+
end
|
115
|
+
|
116
|
+
def set_solution_version(asm)
|
117
|
+
set_version asm, $versionMap[:platform_version], $versionMap[:platform_version], $versionMap[:platform_build_version], 'Solution'
|
118
|
+
end
|
119
|
+
|
120
|
+
def set_version(asm, version, file_version, assembly_version, output_file)
|
121
|
+
# Assembly file config
|
122
|
+
asm.product_name = PRODUCT
|
123
|
+
asm.description = PRODUCT_DESCRIPTION
|
124
|
+
asm.version = version
|
125
|
+
asm.file_version = file_version
|
126
|
+
asm.custom_attributes :AssemblyInformationalVersion => assembly_version,
|
127
|
+
:ComVisibleAttribute => false,
|
128
|
+
:CLSCompliantAttribute => true
|
129
|
+
asm.copyright = COPYRIGHT
|
130
|
+
asm.output_file = "src/#{output_file}Version.cs"
|
131
|
+
asm.namespaces 'System', 'System.Reflection', 'System.Runtime.InteropServices'
|
70
132
|
end
|
data/lib/install.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
|
3
|
-
def
|
3
|
+
def download_file(sourcePath, filePath, localFileLocation)
|
4
4
|
Net::HTTP.start(sourcePath) do |http|
|
5
5
|
resp = http.get(filePath)
|
6
6
|
f = open(localFileLocation, 'wb')
|
@@ -22,7 +22,7 @@ def downloadFile(sourcePath, filePath, localFileLocation)
|
|
22
22
|
return true
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def install_file(cmd, versionedExeFile)
|
26
26
|
begin
|
27
27
|
installerOutput = `#{cmd}`
|
28
28
|
puts installerOutput
|
@@ -38,7 +38,7 @@ def installFile(cmd, versionedExeFile)
|
|
38
38
|
return true
|
39
39
|
end
|
40
40
|
|
41
|
-
def
|
41
|
+
def gem_exists(name, version)
|
42
42
|
begin
|
43
43
|
gem name, version
|
44
44
|
rescue Gem::LoadError
|
@@ -49,37 +49,50 @@ def gemExists(name, version)
|
|
49
49
|
return true
|
50
50
|
end
|
51
51
|
|
52
|
+
$version_map = {
|
53
|
+
'1.9.3-p551' => {
|
54
|
+
:devkit => 'DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe',
|
55
|
+
:gems => {
|
56
|
+
'albacore' => '0.3.5',
|
57
|
+
'semver2' => '3.3.3',
|
58
|
+
'nokogiri' => '1.6.4.1',
|
59
|
+
'zip' => '2.0.2',
|
60
|
+
'azure' => '0.6.4'
|
61
|
+
},
|
62
|
+
},
|
63
|
+
'2.0.0-p481' => {
|
64
|
+
:devkit => 'DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe',
|
65
|
+
:gems => {
|
66
|
+
'albacore' => '0.3.6',
|
67
|
+
'semver2' => '3.3.3',
|
68
|
+
'nokogiri' => '1.6.4.1',
|
69
|
+
'azure' => '0.6.4'
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
$selected_version = {}
|
74
|
+
|
52
75
|
# Ruby version check
|
53
|
-
def
|
76
|
+
def check_ruby
|
54
77
|
puts 'Checking ruby version...'
|
55
78
|
# check if expected ruby version exists. If not download and install ruby
|
56
79
|
rubyVersion = "#{RUBY_VERSION}"
|
57
80
|
localVersion = "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
58
|
-
|
59
|
-
|
60
|
-
if (!rubyVersion.nil? && localVersion !=
|
61
|
-
puts "Uninstall incompatible version of ruby: #{localVersion} and install version: #{
|
81
|
+
expectedVersion1 = '1.9.3-p551'
|
82
|
+
expectedVersion2 = '2.0.0-p481'
|
83
|
+
if (!rubyVersion.nil? && localVersion != expectedVersion1 && localVersion != expectedVersion2)
|
84
|
+
puts "Uninstall incompatible version of ruby: #{localVersion} and install version: #{expectedVersion1} or #{expectedVersion2}. Then Restart rake. Goto http://rubyinstaller.org/downloads/"
|
62
85
|
return false
|
63
86
|
end
|
64
|
-
if (rubyVersion.nil?)
|
65
|
-
puts 'Expected ruby version #{expectedVersion} not found'
|
66
87
|
|
67
|
-
|
68
|
-
versionedExeFile = "rubyinstaller-#{expectedVersion}.exe"
|
69
|
-
filePath = "/oneclick/rubyinstaller/#{versionedExeFile}?direct"
|
70
|
-
return false if !downloadFile(sourcePath, filePath, versionedExeFile)
|
71
|
-
|
72
|
-
puts 'Ruby installation in progress...'
|
73
|
-
cmd = "#{versionedExeFile} /silent /tasks=\"assocfiles,modpath\""
|
74
|
-
puts cmd
|
75
|
-
return false if !installFile(cmd, versionedExeFile)
|
76
|
-
end
|
88
|
+
$selected_version = $version_map[expectedVersion1] || $version_map[expectedVersion2]
|
77
89
|
puts 'Ruby ok'
|
90
|
+
|
78
91
|
return true
|
79
92
|
end
|
80
93
|
|
81
94
|
### devkit version check
|
82
|
-
def
|
95
|
+
def check_devkit
|
83
96
|
# check if devkit exists
|
84
97
|
puts 'Checking devkit version...'
|
85
98
|
rubyPath = `where.exe ruby.exe`
|
@@ -91,14 +104,14 @@ def checkDevkit
|
|
91
104
|
puts 'Downloading devkit...'
|
92
105
|
|
93
106
|
sourcePath = 'cdn.rubyinstaller.org'
|
94
|
-
versionedExeFile =
|
107
|
+
versionedExeFile = $selected_version[:devkit]
|
95
108
|
filePath = "/archives/devkits/#{versionedExeFile}?direct"
|
96
|
-
return false if !
|
109
|
+
return false if !download_file(sourcePath, filePath, versionedExeFile)
|
97
110
|
|
98
111
|
puts 'Devkit installation in progress...'
|
99
112
|
cmd = "#{versionedExeFile} -y -o\"#{rubyPath}\"" #no space after -o, gotcha
|
100
113
|
puts cmd
|
101
|
-
return false if !
|
114
|
+
return false if !install_file(cmd, versionedExeFile)
|
102
115
|
|
103
116
|
puts 'Setting up devkit...'
|
104
117
|
Dir.chdir "#{rubyPath}"
|
@@ -131,22 +144,16 @@ def checkDevkit
|
|
131
144
|
end
|
132
145
|
|
133
146
|
# doxygen check
|
134
|
-
def
|
147
|
+
def check_doxygen
|
135
148
|
# download doxygen
|
136
149
|
return true
|
137
150
|
end
|
138
151
|
|
139
152
|
# check and install required gems
|
140
|
-
def
|
153
|
+
def check_gems
|
141
154
|
puts 'Checking required gems...'
|
142
|
-
|
143
|
-
|
144
|
-
'semver' => '1.0.1',
|
145
|
-
'nokogiri' => '1.6.4.1',
|
146
|
-
'azure' => '0.6.4'
|
147
|
-
}
|
148
|
-
gemlist.each {|key, value|
|
149
|
-
if !gemExists(key, "=#{value}")
|
155
|
+
$selected_version[:gems].each {|key, value|
|
156
|
+
if !gem_exists(key, "=#{value}")
|
150
157
|
begin
|
151
158
|
puts "Installing missing gem: #{key}"
|
152
159
|
cmd = "gem install #{key} -v #{value}"
|
data/lib/transform.rb
CHANGED
@@ -10,7 +10,7 @@ def get(key)
|
|
10
10
|
result
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
13
|
+
def get_all
|
14
14
|
begin
|
15
15
|
query = { :filter => "PartitionKey eq '#{@env}'" }
|
16
16
|
result = @svc.query_entities(@table, query)
|
@@ -23,7 +23,7 @@ def getAll
|
|
23
23
|
result
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
26
|
+
def get_value(key)
|
27
27
|
value = ''
|
28
28
|
@settings.each { |i|
|
29
29
|
if i.properties['RowKey'] == key
|
@@ -35,7 +35,7 @@ def getValue(key)
|
|
35
35
|
value
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
38
|
+
def transform_appsettings
|
39
39
|
# go to each file and replace value of matching appSettings key
|
40
40
|
@configFiles.each{|file|
|
41
41
|
doc = Nokogiri::XML(File.read(file))
|
@@ -55,22 +55,22 @@ def transformAppSettings
|
|
55
55
|
}
|
56
56
|
end
|
57
57
|
|
58
|
-
def
|
58
|
+
def transform_servicemodelconfig
|
59
59
|
@configFiles.each{|file|
|
60
60
|
doc = Nokogiri::XML(File.read(file))
|
61
61
|
doc.xpath('//system.serviceModel').each do |node|
|
62
62
|
#puts node
|
63
63
|
if file.end_with?('app.config') || file.end_with?('App.config')
|
64
|
-
node.replace(
|
64
|
+
node.replace(get_value('system.ServiceModel.Client')) if !node.nil?
|
65
65
|
elsif file.end_with?('Web.config')
|
66
|
-
node.replace(
|
66
|
+
node.replace(get_value('system.ServiceModel.Service')) if !node.nil?
|
67
67
|
end
|
68
68
|
end
|
69
69
|
File.write(file, doc.to_xml)
|
70
70
|
}
|
71
71
|
end
|
72
72
|
|
73
|
-
def
|
73
|
+
def transform_systemwebcompilationattribs
|
74
74
|
@configFiles.each{|file|
|
75
75
|
doc = Nokogiri::XML(File.read(file))
|
76
76
|
node = doc.at_css "compilation"
|
@@ -84,7 +84,7 @@ def transformSystemWebCompilationAttribs
|
|
84
84
|
}
|
85
85
|
end
|
86
86
|
|
87
|
-
def
|
87
|
+
def transform_csdef
|
88
88
|
csdef = Dir.glob("**/*.csdef")
|
89
89
|
csdef.each{ |file|
|
90
90
|
doc = Nokogiri::XML(File.read(file))
|
@@ -96,19 +96,19 @@ def transformCsdef
|
|
96
96
|
node['name'] = ENV['ServiceName'] if !node.nil?
|
97
97
|
|
98
98
|
node = doc.at_css "Certificates"
|
99
|
-
node.replace(
|
99
|
+
node.replace(get_value('Certificates_csdef')) if !node.nil?
|
100
100
|
|
101
101
|
node = doc.at_css "Endpoints"
|
102
|
-
node.replace(
|
102
|
+
node.replace(get_value('Endpoints')) if !node.nil?
|
103
103
|
|
104
104
|
node = doc.at_css "Bindings"
|
105
|
-
node.replace(
|
105
|
+
node.replace(get_value('Bindings')) if !node.nil?
|
106
106
|
|
107
107
|
File.write(file, doc.to_xml)
|
108
108
|
}
|
109
109
|
end
|
110
110
|
|
111
|
-
def
|
111
|
+
def transform_cscfg
|
112
112
|
csdef = Dir.glob("**/*.cscfg")
|
113
113
|
csdef.each{ |file|
|
114
114
|
doc = Nokogiri::XML(File.read(file))
|
@@ -120,22 +120,22 @@ def transformCscfg
|
|
120
120
|
node['name'] = ENV['ServiceName'] if !node.nil?
|
121
121
|
|
122
122
|
node = doc.at_css "Certificates"
|
123
|
-
node.replace(
|
123
|
+
node.replace(get_value('Certificates_cscfg')) if !node.nil?
|
124
124
|
|
125
125
|
File.write(file, doc.to_xml)
|
126
126
|
}
|
127
127
|
end
|
128
128
|
|
129
|
-
def
|
129
|
+
def transform_diagnosticscfg
|
130
130
|
csdef = Dir.glob("**/*.wadcfgx")
|
131
131
|
csdef.each{ |file|
|
132
132
|
doc = Nokogiri::XML(File.read(file))
|
133
133
|
|
134
134
|
node = doc.at_css "PrivateConfig/StorageAccount"
|
135
|
-
node['name'] =
|
136
|
-
node['key'] =
|
135
|
+
node['name'] = get_value('StorageAccount')
|
136
|
+
node['key'] = get_value('StorageAccountKey')
|
137
137
|
node = doc.at_css "StorageAccount"
|
138
|
-
node.content =
|
138
|
+
node.content = get_value('StorageAccount')
|
139
139
|
|
140
140
|
File.write(file, doc.to_xml)
|
141
141
|
}
|
@@ -149,6 +149,13 @@ def transform
|
|
149
149
|
puts 'Environment name required to transform. No configuration changes will be done...'
|
150
150
|
return false
|
151
151
|
end
|
152
|
+
|
153
|
+
@is_service = ENV['ServiceName'] || 'nosvc'
|
154
|
+
if @is_service == 'nosvc'
|
155
|
+
puts 'Target to transform is not a service...'
|
156
|
+
return false
|
157
|
+
end
|
158
|
+
|
152
159
|
puts "Transforming config for environment: #{@env} ..."
|
153
160
|
|
154
161
|
# azure table storage account where settings reside
|
@@ -160,39 +167,42 @@ def transform
|
|
160
167
|
@svc = Azure::TableService.new
|
161
168
|
|
162
169
|
# get all settings for environment
|
163
|
-
@settings =
|
164
|
-
|
165
|
-
# get config templates
|
166
|
-
puts "Obtaining templates..."
|
167
|
-
csdefTemplate = getValue('ServiceDefinitionTemplate')
|
168
|
-
File.write('ServiceDefinition.csdef', csdefTemplate)
|
169
|
-
cscfgTemplate = getValue('ServiceConfigurationTemplate')
|
170
|
-
File.write('ServiceConfiguration.cscfg', cscfgTemplate)
|
171
|
-
|
172
|
-
# start updating config files
|
170
|
+
@settings = get_all
|
173
171
|
|
174
172
|
# find all App.config and web.config files
|
175
173
|
@configFiles = Dir.glob("**/app.config")
|
176
174
|
@configFiles.concat(Dir.glob("**/web.config"))
|
177
|
-
@configFiles.concat(Dir.glob("**/RuntimeWeb/*Web.dll.config"))
|
178
175
|
|
179
|
-
|
180
|
-
|
176
|
+
# get config templates
|
177
|
+
if @is_service
|
181
178
|
|
182
|
-
|
183
|
-
|
179
|
+
puts "Obtaining templates..."
|
180
|
+
csdefTemplate = get_value('ServiceDefinitionTemplate')
|
181
|
+
File.write('ServiceDefinition.csdef', csdefTemplate)
|
182
|
+
cscfgTemplate = get_value('ServiceConfigurationTemplate')
|
183
|
+
File.write('ServiceConfiguration.cscfg', cscfgTemplate)
|
184
|
+
|
185
|
+
@configFiles.concat(Dir.glob("**/RuntimeWeb/*Web.dll.config"))
|
186
|
+
|
187
|
+
puts "Transforming csdef..."
|
188
|
+
transform_csdef
|
189
|
+
|
190
|
+
puts "Transforming cscfg..."
|
191
|
+
transform_cscfg
|
184
192
|
|
185
|
-
|
186
|
-
|
193
|
+
puts "Transforming diagnostics cfg..."
|
194
|
+
transform_diagnosticscfg
|
187
195
|
|
188
|
-
|
189
|
-
|
196
|
+
puts "Replacing service model settings..."
|
197
|
+
transform_servicemodelconfig
|
198
|
+
|
199
|
+
end
|
190
200
|
|
191
|
-
puts "
|
192
|
-
|
201
|
+
puts "Replacing app settings..."
|
202
|
+
transform_appsettings
|
193
203
|
|
194
|
-
puts "
|
195
|
-
|
204
|
+
puts "Removing debug compilation attributes..."
|
205
|
+
transform_systemwebcompilationattribs
|
196
206
|
|
197
207
|
return true
|
198
208
|
end
|