packaging 0.88.77 → 0.99.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +128 -74
- data/lib/packaging/artifactory.rb +60 -433
- data/lib/packaging/config/params.rb +7 -28
- data/lib/packaging/config.rb +50 -150
- data/lib/packaging/deb/repo.rb +19 -20
- data/lib/packaging/gem.rb +83 -41
- data/lib/packaging/ips.rb +57 -0
- data/lib/packaging/msi.rb +89 -0
- data/lib/packaging/nuget.rb +1 -1
- data/lib/packaging/osx.rb +36 -0
- data/lib/packaging/paths.rb +87 -225
- data/lib/packaging/platforms.rb +416 -443
- data/lib/packaging/repo.rb +22 -122
- data/lib/packaging/retrieve.rb +7 -36
- data/lib/packaging/rpm/repo.rb +8 -5
- data/lib/packaging/tar.rb +0 -9
- data/lib/packaging/util/date.rb +0 -5
- data/lib/packaging/util/execution.rb +2 -2
- data/lib/packaging/util/git.rb +1 -1
- data/lib/packaging/util/gpg.rb +1 -5
- data/lib/packaging/util/net.rb +37 -79
- data/lib/packaging/util/rake_utils.rb +0 -1
- data/lib/packaging/util/ship.rb +13 -142
- data/lib/packaging/util/tool.rb +1 -1
- data/lib/packaging/util/version.rb +0 -8
- data/lib/packaging/util.rb +2 -2
- data/lib/packaging.rb +3 -3
- data/spec/fixtures/config/params.yaml +2 -0
- data/spec/lib/packaging/artifactory_spec.rb +16 -66
- data/spec/lib/packaging/config_spec.rb +29 -49
- data/spec/lib/packaging/deb/repo_spec.rb +7 -16
- data/spec/lib/packaging/paths_spec.rb +56 -321
- data/spec/lib/packaging/platforms_spec.rb +21 -46
- data/spec/lib/packaging/repo_spec.rb +40 -78
- data/spec/lib/packaging/retrieve_spec.rb +8 -47
- data/spec/lib/packaging/rpm/repo_spec.rb +4 -4
- data/spec/lib/packaging/tar_spec.rb +40 -34
- data/spec/lib/packaging/util/git_tag_spec.rb +1 -1
- data/spec/lib/packaging/util/gpg_spec.rb +1 -1
- data/spec/lib/packaging/util/net_spec.rb +15 -35
- data/spec/lib/packaging/util/ship_spec.rb +63 -145
- data/spec/spec_helper.rb +14 -0
- data/tasks/00_utils.rake +6 -4
- data/tasks/apple.rake +0 -2
- data/tasks/config.rake +0 -5
- data/tasks/education.rake +5 -5
- data/tasks/fetch.rake +14 -17
- data/tasks/gem.rake +121 -134
- data/tasks/jenkins.rake +7 -51
- data/tasks/nightly_repos.rake +69 -20
- data/tasks/pe_ship.rake +11 -16
- data/tasks/retrieve.rake +6 -13
- data/tasks/ship.rake +256 -196
- data/tasks/sign.rake +135 -63
- data/tasks/tar.rake +6 -0
- data/templates/packaging.xml.erb +7 -9
- data/templates/repo.xml.erb +3 -6
- metadata +27 -80
- data/lib/packaging/archive.rb +0 -126
- data/lib/packaging/artifactory/extensions.rb +0 -94
- data/lib/packaging/config/validations.rb +0 -13
- data/lib/packaging/metrics.rb +0 -15
- data/lib/packaging/sign/deb.rb +0 -9
- data/lib/packaging/sign/dmg.rb +0 -41
- data/lib/packaging/sign/ips.rb +0 -57
- data/lib/packaging/sign/msi.rb +0 -124
- data/lib/packaging/sign/rpm.rb +0 -115
- data/lib/packaging/sign.rb +0 -8
- data/spec/lib/packaging/gem_spec.rb +0 -86
- data/spec/lib/packaging/sign_spec.rb +0 -133
- data/tasks/archive.rake +0 -69
data/lib/packaging/repo.rb
CHANGED
@@ -1,108 +1,35 @@
|
|
1
1
|
module Pkg::Repo
|
2
2
|
|
3
3
|
class << self
|
4
|
-
|
5
|
-
##
|
6
|
-
## Construct a local_target based upon the versioning style
|
7
|
-
##
|
8
|
-
def construct_local_target_path(project, versioning)
|
9
|
-
case versioning
|
10
|
-
when 'ref'
|
11
|
-
return File.join(project, Pkg::Config.ref)
|
12
|
-
when 'version'
|
13
|
-
return File.join(project, Pkg::Util::Version.dot_version)
|
14
|
-
else
|
15
|
-
fail "Error: Unknown versioning argument: #{versioning}"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
##
|
20
|
-
## Put a single signed repo into a tarball stored in
|
21
|
-
## 'pkg/<local_target>/<archive_name>.tar.gz'
|
22
|
-
##
|
23
|
-
def create_signed_repo_archive(repo_location, archive_name, versioning)
|
4
|
+
def create_signed_repo_archive(path_to_repo, name_of_archive, versioning)
|
24
5
|
tar = Pkg::Util::Tool.check_tool('tar')
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
raise "Error: missing packages under #{repo_location}"
|
6
|
+
Dir.chdir("pkg") do
|
7
|
+
if versioning == 'ref'
|
8
|
+
local_target = File.join(Pkg::Config.project, Pkg::Config.ref)
|
9
|
+
elsif versioning == 'version'
|
10
|
+
local_target = File.join(Pkg::Config.project, Pkg::Util::Version.dot_version)
|
31
11
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
##
|
46
|
-
## Add a single repo tarball into the 'all' tarball located in
|
47
|
-
## 'pkg/<local_target>/<project>-all.tar'
|
48
|
-
## Create the 'all' tarball if needed.
|
49
|
-
##
|
50
|
-
def update_tarball_of_all_repos(project, platform, versioning)
|
51
|
-
tar = Pkg::Util::Tool.check_tool('tar')
|
52
|
-
|
53
|
-
all_repos_tarball_name = "#{project}-all.tar"
|
54
|
-
archive_name = "#{project}-#{platform['name']}"
|
55
|
-
local_target = construct_local_target_path(project, versioning)
|
56
|
-
repo_tarball_name = "#{archive_name}.tar.gz"
|
57
|
-
repo_tarball_path = File.join('repos', repo_tarball_name)
|
58
|
-
|
59
|
-
Dir.chdir(File.join('pkg', local_target)) do
|
60
|
-
unless Pkg::Util::File.exist?(repo_tarball_path)
|
61
|
-
warn "Skipping #{archive_name} because it (#{repo_tarball_path}) contains no files"
|
62
|
-
next
|
12
|
+
Dir.chdir(local_target) do
|
13
|
+
if Pkg::Util::File.empty_dir?(path_to_repo)
|
14
|
+
if ENV['FAIL_ON_MISSING_TARGET'] == "true"
|
15
|
+
raise "ERROR: missing packages under #{path_to_repo}"
|
16
|
+
else
|
17
|
+
warn "Skipping #{name_of_archive} because #{path_to_repo} has no files"
|
18
|
+
end
|
19
|
+
else
|
20
|
+
puts "Archiving #{path_to_repo} as #{name_of_archive}"
|
21
|
+
stdout, _, _ = Pkg::Util::Execution.capture3("#{tar} --owner=0 --group=0 --create --gzip --file #{File.join('repos', "#{name_of_archive}.tar.gz")} #{path_to_repo}")
|
22
|
+
stdout
|
23
|
+
end
|
63
24
|
end
|
64
|
-
|
65
|
-
tar_action = "--create"
|
66
|
-
if File.exist?(all_repos_tarball_name)
|
67
|
-
tar_action = "--update"
|
68
|
-
end
|
69
|
-
|
70
|
-
tar_command = "#{tar} --owner=0 --group=0 #{tar_action} --file #{all_repos_tarball_name} #{repo_tarball_path}"
|
71
|
-
stdout, _, _ = Pkg::Util::Execution.capture3(tar_command)
|
72
|
-
puts stdout
|
73
25
|
end
|
74
26
|
end
|
75
27
|
|
76
|
-
##
|
77
|
-
## Invoke gzip to compress the 'all' tarball located in
|
78
|
-
## 'pkg/<local_target>/<project>-all.tar'
|
79
|
-
##
|
80
|
-
def compress_tarball_of_all_repos(all_repos_tarball_name)
|
81
|
-
gzip = Pkg::Util::Tool.check_tool('gzip')
|
82
|
-
|
83
|
-
gzip_command = "#{gzip} --fast #{all_repos_tarball_name}"
|
84
|
-
stdout, _, _ = Pkg::Util::Execution.capture3(gzip_command)
|
85
|
-
puts stdout
|
86
|
-
end
|
87
|
-
|
88
|
-
##
|
89
|
-
## Generate each of the repos listed in <Config.platform_repos>.
|
90
|
-
## Update the 'all repos' tarball as we do each one.
|
91
|
-
## Compress the 'all repos' tarball when all the repos have been generated
|
92
|
-
##
|
93
28
|
def create_all_repo_archives(project, versioning)
|
94
29
|
platforms = Pkg::Config.platform_repos
|
95
|
-
local_target = construct_local_target_path(project, versioning)
|
96
|
-
all_repos_tarball_name = "#{project}-all.tar"
|
97
|
-
|
98
30
|
platforms.each do |platform|
|
99
31
|
archive_name = "#{project}-#{platform['name']}"
|
100
32
|
create_signed_repo_archive(platform['repo_location'], archive_name, versioning)
|
101
|
-
update_tarball_of_all_repos(project, platform, versioning)
|
102
|
-
end
|
103
|
-
|
104
|
-
Dir.chdir(File.join('pkg', local_target)) do
|
105
|
-
compress_tarball_of_all_repos(all_repos_tarball_name)
|
106
33
|
end
|
107
34
|
end
|
108
35
|
|
@@ -110,46 +37,19 @@ module Pkg::Repo
|
|
110
37
|
cmd = "[ -d #{artifact_directory} ] || exit 1 ; "
|
111
38
|
cmd << "pushd #{artifact_directory} > /dev/null && "
|
112
39
|
cmd << "find . -name '*.#{pkg_ext}' -print0 | xargs --no-run-if-empty -0 -I {} dirname {} "
|
113
|
-
stdout,
|
114
|
-
Pkg::Config.distribution_server,
|
115
|
-
cmd,
|
116
|
-
{ capture_output: true }
|
117
|
-
)
|
40
|
+
stdout, stderr = Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.distribution_server, cmd, true)
|
118
41
|
return stdout.split
|
119
42
|
rescue => e
|
120
|
-
fail "
|
43
|
+
fail "Could not retrieve directories that contain #{pkg_ext} packages in #{Pkg::Config.distribution_server}:#{artifact_directory}"
|
121
44
|
end
|
122
45
|
|
123
46
|
def populate_repo_directory(artifact_parent_directory)
|
124
47
|
cmd = "[ -d #{artifact_parent_directory}/artifacts ] || exit 1 ; "
|
125
48
|
cmd << "pushd #{artifact_parent_directory} > /dev/null && "
|
126
49
|
cmd << 'rsync --archive --verbose --one-file-system --ignore-existing artifacts/ repos/ '
|
127
|
-
Pkg::Util::Net.
|
50
|
+
Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.distribution_server, cmd)
|
128
51
|
rescue => e
|
129
|
-
fail "
|
130
|
-
end
|
131
|
-
|
132
|
-
def argument_required?(argument_name, repo_command)
|
133
|
-
repo_command.include?("__#{argument_name.upcase}__")
|
134
|
-
end
|
135
|
-
|
136
|
-
def update_repo(remote_host, command, options = {})
|
137
|
-
fail_message = "Error: Missing required argument '%s', update your build_defaults?"
|
138
|
-
[:repo_name, :repo_path, :repo_host, :repo_url].each do |option|
|
139
|
-
fail fail_message % option.to_s if argument_required?(option.to_s, command) && !options[option]
|
140
|
-
end
|
141
|
-
|
142
|
-
whitelist = {
|
143
|
-
__REPO_NAME__: options[:repo_name],
|
144
|
-
__REPO_PATH__: options[:repo_path],
|
145
|
-
__REPO_HOST__: options[:repo_host],
|
146
|
-
__REPO_URL__: options[:repo_url],
|
147
|
-
__APT_PLATFORMS__: Pkg::Config.apt_releases.join(' '),
|
148
|
-
__GPG_KEY__: Pkg::Util::Gpg.key
|
149
|
-
}
|
150
|
-
Pkg::Util::Net.remote_execute(
|
151
|
-
remote_host,
|
152
|
-
Pkg::Util::Misc.search_and_replace(command, whitelist))
|
52
|
+
fail "Could not populate repos directory in #{Pkg::Config.distribution_server}:#{artifact_parent_directory}"
|
153
53
|
end
|
154
54
|
end
|
155
55
|
end
|
data/lib/packaging/retrieve.rb
CHANGED
@@ -8,37 +8,9 @@ module Pkg::Retrieve
|
|
8
8
|
# --directory-prefix = where to save to disk (defaults to ./)
|
9
9
|
# --reject = Reject all hits that match the supplied regex
|
10
10
|
|
11
|
-
def
|
12
|
-
default_options = {
|
13
|
-
'quiet' => true,
|
14
|
-
'recursive' => true,
|
15
|
-
'no-parent' => true,
|
16
|
-
'no-host-directories' => true,
|
17
|
-
'level' => 0,
|
18
|
-
'cut-dirs' => 3,
|
19
|
-
'directory-prefix' => local_target,
|
20
|
-
'reject' => "'index*'",
|
21
|
-
}
|
22
|
-
options = default_options.merge(additional_options)
|
11
|
+
def default_wget(local_target, url)
|
23
12
|
wget = Pkg::Util::Tool.check_tool('wget')
|
24
|
-
wget_command = wget
|
25
|
-
options.each do |option, value|
|
26
|
-
next unless value
|
27
|
-
if value.is_a?(TrueClass)
|
28
|
-
wget_command << " --#{option}"
|
29
|
-
else
|
30
|
-
wget_command << " --#{option}=#{value}"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
wget_command << " #{url}"
|
34
|
-
return wget_command
|
35
|
-
end
|
36
|
-
|
37
|
-
# NOTE: When supplying additional options, if you want your value to be
|
38
|
-
# quoted (e.g. --reject='index*'), you must include the quotes as part of
|
39
|
-
# your string (e.g. {'reject' => "'index*'"}).
|
40
|
-
def default_wget(local_target, url, additional_options = {})
|
41
|
-
wget_command = default_wget_command(local_target, url, additional_options)
|
13
|
+
wget_command = "#{wget} --quiet --recursive --no-parent --no-host-directories --level=0 --cut-dirs 3 --directory-prefix=#{local_target} --reject 'index*' #{url}"
|
42
14
|
puts "Executing #{wget_command} . . ."
|
43
15
|
%x(#{wget_command})
|
44
16
|
end
|
@@ -48,25 +20,24 @@ module Pkg::Retrieve
|
|
48
20
|
unless Pkg::Config.foss_platforms
|
49
21
|
fail "FOSS_ONLY specified, but I don't know anything about FOSS_PLATFORMS. Retrieve cancelled."
|
50
22
|
end
|
51
|
-
default_wget(local_target, "#{build_url}/
|
23
|
+
default_wget(local_target, "#{build_url}/artifacts/#{Pkg::Config.ref}.yaml")
|
52
24
|
yaml_path = File.join(local_target, "#{Pkg::Config.ref}.yaml")
|
53
25
|
unless File.readable?(yaml_path)
|
54
26
|
fail "Couldn't read #{Pkg::Config.ref}.yaml, which is necessary for FOSS_ONLY. Retrieve cancelled."
|
55
27
|
end
|
56
28
|
platform_data = Pkg::Util::Serialization.load_yaml(yaml_path)[:platform_data]
|
57
29
|
platform_data.each do |platform, paths|
|
58
|
-
|
59
|
-
default_wget(local_target, "#{build_url}/#{path_to_retrieve}/") if Pkg::Config.foss_platforms.include?(platform)
|
30
|
+
default_wget(local_target, "#{build_url}/artifacts/#{paths[:artifact]}") if Pkg::Config.foss_platforms.include?(platform)
|
60
31
|
end
|
61
32
|
end
|
62
33
|
|
63
|
-
def retrieve_all(build_url, rsync_path, local_target)
|
34
|
+
def retrieve_all(build_url, rsync_path, remote_target, local_target)
|
64
35
|
if Pkg::Util::Tool.find_tool("wget")
|
65
|
-
default_wget(local_target, "#{build_url}/")
|
36
|
+
default_wget(local_target, "#{build_url}/#{remote_target}/")
|
66
37
|
else
|
67
38
|
warn "Could not find `wget` tool. Falling back to rsyncing from #{Pkg::Config.distribution_server}."
|
68
39
|
begin
|
69
|
-
Pkg::Util::Net.rsync_from("#{rsync_path}/", Pkg::Config.distribution_server, "#{local_target}/")
|
40
|
+
Pkg::Util::Net.rsync_from("#{rsync_path}/#{remote_target}/", Pkg::Config.distribution_server, "#{local_target}/")
|
70
41
|
rescue => e
|
71
42
|
fail "Couldn't rsync packages from distribution server.\n#{e}"
|
72
43
|
end
|
data/lib/packaging/rpm/repo.rb
CHANGED
@@ -14,9 +14,9 @@ module Pkg::Rpm::Repo
|
|
14
14
|
return
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
invoke_task("pl:fetch")
|
18
18
|
repo_dir = "#{Pkg::Config.jenkins_repo_path}/#{Pkg::Config.project}/#{Pkg::Config.ref}/#{target}/rpm"
|
19
|
-
Pkg::Util::Net.
|
19
|
+
Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.distribution_server, "mkdir -p #{repo_dir}")
|
20
20
|
Pkg::Util::Execution.retry_on_fail(:times => 3) do
|
21
21
|
Pkg::Util::Net.rsync_to("pkg/#{target}/rpm/", Pkg::Config.distribution_server, repo_dir)
|
22
22
|
end
|
@@ -75,6 +75,9 @@ module Pkg::Rpm::Repo
|
|
75
75
|
path = Pathname.new(origin_path)
|
76
76
|
dest_path = Pathname.new(destination_path)
|
77
77
|
|
78
|
+
# You may think "rsync doesn't actually remove the sticky bit, let's
|
79
|
+
# remove the Dugo-s from the chmod". However, that will make your rsyncs
|
80
|
+
# fail due to permission errors.
|
78
81
|
options = %w(
|
79
82
|
rsync
|
80
83
|
--recursive
|
@@ -215,7 +218,7 @@ module Pkg::Rpm::Repo
|
|
215
218
|
command = Pkg::Rpm::Repo.repo_creation_command(File.join(artifact_directory, directory), artifact_paths)
|
216
219
|
|
217
220
|
begin
|
218
|
-
Pkg::Util::Net.
|
221
|
+
Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.distribution_server, command)
|
219
222
|
# Now that we've created our package repositories, we can generate repo
|
220
223
|
# configurations for use with downstream jobs, acceptance clients, etc.
|
221
224
|
Pkg::Rpm::Repo.generate_repo_configs
|
@@ -224,7 +227,7 @@ module Pkg::Rpm::Repo
|
|
224
227
|
Pkg::Rpm::Repo.ship_repo_configs
|
225
228
|
ensure
|
226
229
|
# Always remove the lock file, even if we've failed
|
227
|
-
Pkg::Util::Net.
|
230
|
+
Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.distribution_server, "rm -f #{artifact_directory}/repos/.lock")
|
228
231
|
end
|
229
232
|
end
|
230
233
|
|
@@ -248,7 +251,7 @@ module Pkg::Rpm::Repo
|
|
248
251
|
def deploy_repos(yum_path, origin_server, destination_server, dryrun = false)
|
249
252
|
rsync_command = repo_deployment_command(yum_path, yum_path, destination_server, dryrun)
|
250
253
|
|
251
|
-
Pkg::Util::Net.
|
254
|
+
Pkg::Util::Net.remote_ssh_cmd(origin_server, rsync_command)
|
252
255
|
end
|
253
256
|
end
|
254
257
|
end
|
data/lib/packaging/tar.rb
CHANGED
@@ -14,10 +14,6 @@ module Pkg
|
|
14
14
|
@files = Pkg::Config.files
|
15
15
|
@target = File.join(Pkg::Config.project_root, "pkg", "#{@project}-#{@version}.tar.gz")
|
16
16
|
|
17
|
-
# If the user did not specify any files, then archive the entire working directory
|
18
|
-
# instead
|
19
|
-
@files ||= Dir.glob('*')
|
20
|
-
|
21
17
|
# We require that the excludes list be a string (which is space
|
22
18
|
# separated, we hope)(deprecated) or an array.
|
23
19
|
#
|
@@ -34,11 +30,6 @@ module Pkg
|
|
34
30
|
@excludes = []
|
35
31
|
end
|
36
32
|
|
37
|
-
# If the user has specified things to exclude via config file, they will be
|
38
|
-
# honored by the tar class, but we also always exclude the packaging repo
|
39
|
-
# and 'pkg' directory.
|
40
|
-
@excludes += ['pkg', 'ext/packaging']
|
41
|
-
|
42
33
|
# On the other hand, support for explicit templates started with Arrays,
|
43
34
|
# so that's all we support.
|
44
35
|
#
|
data/lib/packaging/util/date.rb
CHANGED
@@ -58,7 +58,7 @@ module Pkg::Util::Execution
|
|
58
58
|
# Loop a block up to the number of attempts given, exiting when we receive success
|
59
59
|
# or max attempts is reached. Raise an exception unless we've succeeded.
|
60
60
|
def retry_on_fail(args, &blk)
|
61
|
-
success =
|
61
|
+
success = FALSE
|
62
62
|
exception = ''
|
63
63
|
|
64
64
|
if args[:times].respond_to?(:times) and block_given?
|
@@ -69,7 +69,7 @@ module Pkg::Util::Execution
|
|
69
69
|
|
70
70
|
begin
|
71
71
|
blk.call
|
72
|
-
success =
|
72
|
+
success = TRUE
|
73
73
|
break
|
74
74
|
rescue => err
|
75
75
|
puts "An error was encountered evaluating block. Retrying.."
|
data/lib/packaging/util/git.rb
CHANGED
@@ -6,7 +6,7 @@ module Pkg::Util::Git
|
|
6
6
|
# Git utility to create a new git commit
|
7
7
|
def commit_file(file, message = 'changes')
|
8
8
|
fail_unless_repo
|
9
|
-
puts '
|
9
|
+
puts 'Commiting changes:'
|
10
10
|
puts
|
11
11
|
diff, = Pkg::Util::Execution.capture3("#{Pkg::Util::Tool::GIT} diff HEAD #{file}")
|
12
12
|
puts diff
|
data/lib/packaging/util/gpg.rb
CHANGED
@@ -25,7 +25,7 @@ module Pkg::Util::Gpg
|
|
25
25
|
kill_keychain
|
26
26
|
start_keychain
|
27
27
|
end
|
28
|
-
@keychain_loaded =
|
28
|
+
@keychain_loaded = TRUE
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -51,10 +51,6 @@ module Pkg::Util::Gpg
|
|
51
51
|
gpg ||= Pkg::Util::Tool.find_tool('gpg')
|
52
52
|
|
53
53
|
if gpg
|
54
|
-
if File.exist? "#{file}.asc"
|
55
|
-
warn "Signature on #{file} exists, skipping..."
|
56
|
-
return true
|
57
|
-
end
|
58
54
|
use_tty = "--no-tty --use-agent" if ENV['RPM_GPG_AGENT']
|
59
55
|
stdout, _, _ = Pkg::Util::Execution.capture3("#{gpg} #{use_tty} --armor --detach-sign -u #{key} #{file}")
|
60
56
|
stdout
|
data/lib/packaging/util/net.rb
CHANGED
@@ -20,11 +20,13 @@ module Pkg::Util::Net
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# Check that the current host matches the one we think it should
|
23
|
-
def check_host(host,
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
def check_host(host, args = { :required => true })
|
24
|
+
if hostname == host
|
25
|
+
return true
|
26
|
+
else
|
27
|
+
fail "#{hostname} does not match #{host}" if args[:required]
|
28
|
+
return nil
|
29
|
+
end
|
28
30
|
end
|
29
31
|
|
30
32
|
# @param hosts - An array of hosts to try ssh-ing into
|
@@ -36,7 +38,7 @@ module Pkg::Util::Net
|
|
36
38
|
errs = []
|
37
39
|
Array(hosts).flatten.each do |host|
|
38
40
|
begin
|
39
|
-
|
41
|
+
remote_ssh_cmd(host, 'exit', false, '-oBatchMode=yes')
|
40
42
|
rescue
|
41
43
|
errs << host
|
42
44
|
end
|
@@ -54,8 +56,7 @@ module Pkg::Util::Net
|
|
54
56
|
errs = []
|
55
57
|
Array(hosts).flatten.each do |host|
|
56
58
|
begin
|
57
|
-
|
58
|
-
{ extra_options: '-oBatchMode=yes' })
|
59
|
+
remote_ssh_cmd(host, "gpg --list-secret-keys #{gpg} > /dev/null 2&>1", false, '-oBatchMode=yes')
|
59
60
|
rescue
|
60
61
|
errs << host
|
61
62
|
end
|
@@ -63,62 +64,35 @@ module Pkg::Util::Net
|
|
63
64
|
return errs
|
64
65
|
end
|
65
66
|
|
66
|
-
def
|
67
|
-
option_defaults = {
|
68
|
-
capture_output: false,
|
69
|
-
extra_options: '',
|
70
|
-
fail_fast: true,
|
71
|
-
trace: false
|
72
|
-
}
|
73
|
-
options = option_defaults.merge(user_options)
|
74
|
-
|
67
|
+
def remote_ssh_cmd(target, command, capture_output = false, extra_options = '', fail_fast = true)
|
75
68
|
ssh = Pkg::Util::Tool.check_tool('ssh')
|
76
69
|
|
77
70
|
# we pass some pretty complicated commands in via ssh. We need this to fail
|
78
71
|
# if any part of the remote ssh command fails.
|
79
|
-
|
80
|
-
|
81
|
-
shell_flags += 'set -x;' if options[:trace]
|
82
|
-
shell_commands = "#{shell_flags}#{command}"
|
83
|
-
|
84
|
-
remote_command = "#{ssh} #{options[:extra_options]} -t #{target_host} " +
|
85
|
-
"'#{shell_commands.gsub("'", "'\\\\''")}'"
|
72
|
+
command = "set -e; #{command}" if fail_fast
|
73
|
+
cmd = "#{ssh} #{extra_options} -t #{target} '#{command.gsub("'", "'\\\\''")}'"
|
86
74
|
|
87
75
|
# This is NOT a good way to support this functionality.
|
76
|
+
# It needs to be refactored into a set of methods that
|
77
|
+
# other methods can use to safely and deterministically
|
78
|
+
# support dry-run operations.
|
79
|
+
# But I need to ship packages RIGHT NOW.
|
80
|
+
# - Ryan McKern, 13/01/2016
|
88
81
|
if ENV['DRYRUN']
|
89
82
|
puts "[DRY-RUN] Executing '#{command}' on #{target}"
|
90
83
|
puts "[DRY-RUN] #{cmd}"
|
91
|
-
return
|
84
|
+
return
|
92
85
|
end
|
93
86
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
stdout, stderr, exitstatus = Pkg::Util::Execution.capture3(remote_command)
|
99
|
-
Pkg::Util::Execution.success?(exitstatus) or
|
100
|
-
raise "Remote ssh command (\"#{remote_command}\") failed."
|
87
|
+
puts "Executing '#{command}' on #{target}"
|
88
|
+
if capture_output
|
89
|
+
stdout, stderr, exitstatus = Pkg::Util::Execution.capture3(cmd)
|
90
|
+
Pkg::Util::Execution.success?(exitstatus) or raise "Remote ssh command failed."
|
101
91
|
return stdout, stderr
|
92
|
+
else
|
93
|
+
Kernel.system(cmd)
|
94
|
+
Pkg::Util::Execution.success? or raise "Remote ssh command failed."
|
102
95
|
end
|
103
|
-
|
104
|
-
# Pkg::Util::Execution.capture3 reports its command but Kernel.system does not
|
105
|
-
# Let's print it out for some amount of consistency.
|
106
|
-
puts "Remote Execute: '#{remote_command}'"
|
107
|
-
Kernel.system(remote_command)
|
108
|
-
Pkg::Util::Execution.success? or
|
109
|
-
raise "Remote ssh command (\"#{remote_command}\") failed."
|
110
|
-
end
|
111
|
-
|
112
|
-
###
|
113
|
-
### Deprecated method implemented as a shim to the new `remote_execute` method
|
114
|
-
###
|
115
|
-
def remote_ssh_cmd(target, command, capture_output = false, extra_options = '', fail_fast = true, trace = false) # rubocop:disable Style/ParameterLists
|
116
|
-
puts "Warn: \"remote_ssh_cmd\" call in packaging is deprecated. Use \"remote_execute\" instead."
|
117
|
-
remote_execute(target, command, {
|
118
|
-
capture_output: capture_output,
|
119
|
-
extra_options: extra_options,
|
120
|
-
fail_fast: fail_fast,
|
121
|
-
trace: trace })
|
122
96
|
end
|
123
97
|
|
124
98
|
# Construct a valid rsync command
|
@@ -156,7 +130,7 @@ module Pkg::Util::Net
|
|
156
130
|
raise(ArgumentError, "Cannot sync between two remote hosts") if
|
157
131
|
options[:origin_host] && options[:target_host]
|
158
132
|
|
159
|
-
raise(ArgumentError, "Cannot sync path '#{origin}'
|
133
|
+
raise(ArgumentError, "Cannot sync path '#{origin}' to itself") unless
|
160
134
|
options[:origin_host] || options[:target_host]
|
161
135
|
|
162
136
|
cmd = %W(
|
@@ -293,17 +267,17 @@ module Pkg::Util::Net
|
|
293
267
|
|
294
268
|
def remote_set_ownership(host, owner, group, files)
|
295
269
|
remote_cmd = "for file in #{files.join(" ")}; do if [[ -d $file ]] || ! `lsattr $file | grep -q '\\-i\\-'`; then sudo chown #{owner}:#{group} $file; else echo \"$file is immutable\"; fi; done"
|
296
|
-
Pkg::Util::Net.
|
270
|
+
Pkg::Util::Net.remote_ssh_cmd(host, remote_cmd)
|
297
271
|
end
|
298
272
|
|
299
273
|
def remote_set_permissions(host, permissions, files)
|
300
274
|
remote_cmd = "for file in #{files.join(" ")}; do if [[ -d $file ]] || ! `lsattr $file | grep -q '\\-i\\-'`; then sudo chmod #{permissions} $file; else echo \"$file is immutable\"; fi; done"
|
301
|
-
Pkg::Util::Net.
|
275
|
+
Pkg::Util::Net.remote_ssh_cmd(host, remote_cmd)
|
302
276
|
end
|
303
277
|
|
304
278
|
# Remotely set the immutable bit on a list of files
|
305
279
|
def remote_set_immutable(host, files)
|
306
|
-
Pkg::Util::Net.
|
280
|
+
Pkg::Util::Net.remote_ssh_cmd(host, "sudo chattr +i #{files.join(" ")}")
|
307
281
|
end
|
308
282
|
|
309
283
|
# Create a symlink indicating the latest version of a package
|
@@ -319,14 +293,10 @@ module Pkg::Util::Net
|
|
319
293
|
# @option :excludes [Array] Strings you want to exclude from your search,
|
320
294
|
# e.g. 'agent' if only searching for 'puppet'.
|
321
295
|
def remote_create_latest_symlink(package_name, dir, platform_ext, options = {})
|
322
|
-
ls_cmd = "ls -1 *.#{platform_ext} | grep -v latest | grep -v rc | grep
|
323
|
-
|
324
|
-
# store this in a separate var to avoid side affects
|
325
|
-
full_package_name = String.new(package_name)
|
326
|
-
|
296
|
+
ls_cmd = "ls -1 *.#{platform_ext} | grep -v latest | grep -v rc | grep #{package_name} "
|
327
297
|
if options[:arch]
|
328
298
|
ls_cmd << "| grep #{options[:arch]}"
|
329
|
-
|
299
|
+
package_name << "-#{options[:arch]}"
|
330
300
|
end
|
331
301
|
if options[:excludes]
|
332
302
|
options[:excludes].each do |excl|
|
@@ -342,15 +312,14 @@ module Pkg::Util::Net
|
|
342
312
|
pushd '#{dir}'
|
343
313
|
link_target=$(#{ls_cmd})
|
344
314
|
if [ -z "$link_target" ] ; then
|
345
|
-
echo "Unable to find a link target for '#{
|
315
|
+
echo "Unable to find a link target for '#{package_name}' in '#{dir}'; skipping link creation"
|
346
316
|
exit 0
|
347
317
|
fi
|
348
318
|
echo "creating link to '$link_target'"
|
349
|
-
ln -sf "$link_target" #{
|
319
|
+
ln -sf "$link_target" #{package_name}-latest.#{platform_ext}
|
350
320
|
CMD
|
351
321
|
|
352
|
-
_, err = Pkg::Util::Net.
|
353
|
-
Pkg::Config.staging_server, cmd, { capture_output: true })
|
322
|
+
_, err = Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.staging_server, cmd, true)
|
354
323
|
$stderr.puts err
|
355
324
|
end
|
356
325
|
|
@@ -374,7 +343,7 @@ module Pkg::Util::Net
|
|
374
343
|
# We take a tar argument for cases where `tar` isn't best, e.g. Solaris. We
|
375
344
|
# also take an optional argument of the tarball containing the git bundle to
|
376
345
|
# use.
|
377
|
-
def
|
346
|
+
def remote_bootstrap(host, treeish, tar_cmd = nil, tarball = nil)
|
378
347
|
unless tar = tar_cmd
|
379
348
|
tar = 'tar'
|
380
349
|
end
|
@@ -382,19 +351,8 @@ module Pkg::Util::Net
|
|
382
351
|
tarball_name = File.basename(tarball).gsub('.tar.gz', '')
|
383
352
|
Pkg::Util::Net.rsync_to(tarball, host, '/tmp')
|
384
353
|
appendix = Pkg::Util.rand_string
|
385
|
-
|
386
|
-
|
387
|
-
#{tar} -zxvf /tmp/#{tarball_name}.tar.gz -C /tmp/ ;
|
388
|
-
git clone --recursive /tmp/#{tarball_name} #{git_bundle_directory} ;
|
389
|
-
DOC
|
390
|
-
Pkg::Util::Net.remote_execute(host, command)
|
391
|
-
return git_bundle_directory
|
392
|
-
end
|
393
|
-
|
394
|
-
def remote_bundle_install_command
|
395
|
-
export_packaging_location = ''
|
396
|
-
export_packaging_location = "export PACKAGING_LOCATION='#{ENV['PACKAGING_LOCATION']}';" if ENV['PACKAGING_LOCATION'] && !ENV['PACKAGING_LOCATION'].empty?
|
397
|
-
command = "source /usr/local/rvm/scripts/rvm; rvm use ruby-2.5.1; #{export_packaging_location} bundle install --path .bundle/gems ;"
|
354
|
+
Pkg::Util::Net.remote_ssh_cmd(host, "#{tar} -zxvf /tmp/#{tarball_name}.tar.gz -C /tmp/ ; git clone --recursive /tmp/#{tarball_name} /tmp/#{Pkg::Config.project}-#{appendix} ; cd /tmp/#{Pkg::Config.project}-#{appendix} ; rake package:bootstrap")
|
355
|
+
"/tmp/#{Pkg::Config.project}-#{appendix}"
|
398
356
|
end
|
399
357
|
|
400
358
|
# Given a BuildInstance object and a host, send its params to the host. Return
|