packaging 0.88.77 → 0.99.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 +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
|