packaging 0.88.77

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.
Files changed (123) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +17 -0
  3. data/README-Solaris.md +117 -0
  4. data/README.md +977 -0
  5. data/lib/packaging.rb +32 -0
  6. data/lib/packaging/archive.rb +126 -0
  7. data/lib/packaging/artifactory.rb +651 -0
  8. data/lib/packaging/artifactory/extensions.rb +94 -0
  9. data/lib/packaging/config.rb +492 -0
  10. data/lib/packaging/config/params.rb +387 -0
  11. data/lib/packaging/config/validations.rb +13 -0
  12. data/lib/packaging/deb.rb +28 -0
  13. data/lib/packaging/deb/repo.rb +264 -0
  14. data/lib/packaging/gem.rb +70 -0
  15. data/lib/packaging/metrics.rb +15 -0
  16. data/lib/packaging/nuget.rb +39 -0
  17. data/lib/packaging/paths.rb +376 -0
  18. data/lib/packaging/platforms.rb +507 -0
  19. data/lib/packaging/repo.rb +155 -0
  20. data/lib/packaging/retrieve.rb +75 -0
  21. data/lib/packaging/rpm.rb +5 -0
  22. data/lib/packaging/rpm/repo.rb +254 -0
  23. data/lib/packaging/sign.rb +8 -0
  24. data/lib/packaging/sign/deb.rb +9 -0
  25. data/lib/packaging/sign/dmg.rb +41 -0
  26. data/lib/packaging/sign/ips.rb +57 -0
  27. data/lib/packaging/sign/msi.rb +124 -0
  28. data/lib/packaging/sign/rpm.rb +115 -0
  29. data/lib/packaging/tar.rb +163 -0
  30. data/lib/packaging/util.rb +146 -0
  31. data/lib/packaging/util/date.rb +20 -0
  32. data/lib/packaging/util/execution.rb +85 -0
  33. data/lib/packaging/util/file.rb +125 -0
  34. data/lib/packaging/util/git.rb +174 -0
  35. data/lib/packaging/util/git_tags.rb +73 -0
  36. data/lib/packaging/util/gpg.rb +66 -0
  37. data/lib/packaging/util/jenkins.rb +95 -0
  38. data/lib/packaging/util/misc.rb +69 -0
  39. data/lib/packaging/util/net.rb +410 -0
  40. data/lib/packaging/util/os.rb +17 -0
  41. data/lib/packaging/util/platform.rb +40 -0
  42. data/lib/packaging/util/rake_utils.rb +112 -0
  43. data/lib/packaging/util/serialization.rb +19 -0
  44. data/lib/packaging/util/ship.rb +300 -0
  45. data/lib/packaging/util/tool.rb +41 -0
  46. data/lib/packaging/util/version.rb +334 -0
  47. data/spec/fixtures/config/ext/build_defaults.yaml +2 -0
  48. data/spec/fixtures/config/ext/project_data.yaml +2 -0
  49. data/spec/fixtures/configs/components/test_file.json +1 -0
  50. data/spec/fixtures/configs/components/test_file_2.json +0 -0
  51. data/spec/fixtures/configs/components/test_file_not_tagged.json +1 -0
  52. data/spec/fixtures/configs/components/test_file_wrong_ext.txt +0 -0
  53. data/spec/fixtures/configs/components/test_file_wrong_ext.wrong +0 -0
  54. data/spec/fixtures/util/pre_tasks.yaml +4 -0
  55. data/spec/lib/packaging/artifactory_spec.rb +221 -0
  56. data/spec/lib/packaging/config_spec.rb +576 -0
  57. data/spec/lib/packaging/deb/repo_spec.rb +157 -0
  58. data/spec/lib/packaging/deb_spec.rb +52 -0
  59. data/spec/lib/packaging/gem_spec.rb +86 -0
  60. data/spec/lib/packaging/paths_spec.rb +418 -0
  61. data/spec/lib/packaging/platforms_spec.rb +178 -0
  62. data/spec/lib/packaging/repo_spec.rb +135 -0
  63. data/spec/lib/packaging/retrieve_spec.rb +100 -0
  64. data/spec/lib/packaging/rpm/repo_spec.rb +133 -0
  65. data/spec/lib/packaging/sign_spec.rb +133 -0
  66. data/spec/lib/packaging/tar_spec.rb +116 -0
  67. data/spec/lib/packaging/util/execution_spec.rb +56 -0
  68. data/spec/lib/packaging/util/file_spec.rb +139 -0
  69. data/spec/lib/packaging/util/git_spec.rb +160 -0
  70. data/spec/lib/packaging/util/git_tag_spec.rb +36 -0
  71. data/spec/lib/packaging/util/gpg_spec.rb +64 -0
  72. data/spec/lib/packaging/util/jenkins_spec.rb +112 -0
  73. data/spec/lib/packaging/util/misc_spec.rb +31 -0
  74. data/spec/lib/packaging/util/net_spec.rb +259 -0
  75. data/spec/lib/packaging/util/os_spec.rb +31 -0
  76. data/spec/lib/packaging/util/rake_utils_spec.rb +70 -0
  77. data/spec/lib/packaging/util/ship_spec.rb +199 -0
  78. data/spec/lib/packaging/util/version_spec.rb +123 -0
  79. data/spec/lib/packaging_spec.rb +19 -0
  80. data/spec/spec_helper.rb +22 -0
  81. data/static_artifacts/PackageInfo.plist +3 -0
  82. data/tasks/00_utils.rake +214 -0
  83. data/tasks/30_metrics.rake +33 -0
  84. data/tasks/apple.rake +268 -0
  85. data/tasks/archive.rake +69 -0
  86. data/tasks/build.rake +12 -0
  87. data/tasks/clean.rake +5 -0
  88. data/tasks/config.rake +35 -0
  89. data/tasks/deb.rake +129 -0
  90. data/tasks/deb_repos.rake +28 -0
  91. data/tasks/deprecated.rake +130 -0
  92. data/tasks/doc.rake +20 -0
  93. data/tasks/education.rake +57 -0
  94. data/tasks/fetch.rake +60 -0
  95. data/tasks/gem.rake +159 -0
  96. data/tasks/jenkins.rake +538 -0
  97. data/tasks/jenkins_dynamic.rake +202 -0
  98. data/tasks/load_extras.rake +21 -0
  99. data/tasks/mock.rake +348 -0
  100. data/tasks/nightly_repos.rake +286 -0
  101. data/tasks/pe_deb.rake +12 -0
  102. data/tasks/pe_rpm.rake +13 -0
  103. data/tasks/pe_ship.rake +226 -0
  104. data/tasks/pe_sign.rake +13 -0
  105. data/tasks/pe_tar.rake +5 -0
  106. data/tasks/retrieve.rake +52 -0
  107. data/tasks/rpm.rake +66 -0
  108. data/tasks/rpm_repos.rake +29 -0
  109. data/tasks/ship.rake +692 -0
  110. data/tasks/sign.rake +154 -0
  111. data/tasks/tag.rake +8 -0
  112. data/tasks/tar.rake +28 -0
  113. data/tasks/update.rake +16 -0
  114. data/tasks/vanagon.rake +35 -0
  115. data/tasks/vendor_gems.rake +117 -0
  116. data/tasks/version.rake +33 -0
  117. data/tasks/z_data_dump.rake +65 -0
  118. data/templates/README +1 -0
  119. data/templates/downstream.xml.erb +47 -0
  120. data/templates/msi.xml.erb +197 -0
  121. data/templates/packaging.xml.erb +346 -0
  122. data/templates/repo.xml.erb +117 -0
  123. metadata +287 -0
@@ -0,0 +1,387 @@
1
+ require "packaging/platforms"
2
+
3
+ # These are all of the parameters known to our packaging system.
4
+ # They are ingested by the config class as class instance variables
5
+ module Pkg::Params
6
+ BUILD_PARAMS = [:allow_dirty_tree,
7
+ :answer_override,
8
+ :apt_archive_path,
9
+ :apt_archive_repo_command,
10
+ :apt_host,
11
+ :apt_releases,
12
+ :apt_repo_command,
13
+ :apt_repo_name,
14
+ :apt_repo_path,
15
+ :apt_repo_staging_path,
16
+ :apt_repo_url,
17
+ :apt_signing_server,
18
+ :apt_staging_server,
19
+ :author,
20
+ :benchmark,
21
+ :build_data_repo,
22
+ :build_date,
23
+ :build_defaults,
24
+ :build_dmg,
25
+ :build_doc,
26
+ :build_gem,
27
+ :build_ips,
28
+ :build_msi,
29
+ :build_pe,
30
+ :build_tar,
31
+ :builder_data_file,
32
+ :builds_server,
33
+ :bundle_platforms,
34
+ :certificate_pem,
35
+ :cows,
36
+ :db_table,
37
+ :deb_build_host,
38
+ :deb_build_mirrors,
39
+ :deb_targets,
40
+ :debug,
41
+ :debversion,
42
+ :default_cow,
43
+ :default_mock,
44
+ :dev_build,
45
+ :description,
46
+ :distribution_server,
47
+ :dmg_host,
48
+ :dmg_path,
49
+ :dmg_staging_server,
50
+ :downloads_archive_path,
51
+ :email,
52
+ :files,
53
+ :final_mocks,
54
+ :foss_only,
55
+ :foss_platforms,
56
+ :freight_archive_path,
57
+ :freight_conf,
58
+ :gem_default_executables,
59
+ :gem_dependencies,
60
+ :gem_description,
61
+ :gem_devel_dependencies,
62
+ :gem_development_dependencies,
63
+ :gem_excludes,
64
+ :gem_executables,
65
+ :gem_files,
66
+ :gem_forge_project,
67
+ :gem_host,
68
+ :gem_name,
69
+ :gem_path,
70
+ :gem_platform_dependencies,
71
+ :gem_rdoc_options,
72
+ :gem_require_path,
73
+ :gem_required_ruby_version,
74
+ :gem_required_rubygems_version,
75
+ :gem_runtime_dependencies,
76
+ :gem_summary,
77
+ :gem_test_files,
78
+ :gemversion,
79
+ :gpg_key,
80
+ :gpg_name,
81
+ :homepage,
82
+ :internal_gem_host,
83
+ :ips_build_host,
84
+ :ips_host,
85
+ :ips_inter_cert,
86
+ :ips_package_host,
87
+ :ips_path,
88
+ :ips_repo,
89
+ :ips_root_cert,
90
+ :ips_signing_cert,
91
+ :ips_signing_key,
92
+ :ips_signing_server,
93
+ :ips_signing_ssh_key,
94
+ :ips_store,
95
+ :jenkins_build_host,
96
+ :jenkins_packaging_job,
97
+ :jenkins_repo_path,
98
+ :metrics,
99
+ :metrics_url,
100
+ :msi_host,
101
+ :msi_name,
102
+ :msi_path,
103
+ :msi_signing_cert,
104
+ :msi_signing_cert_pw,
105
+ :msi_signing_server,
106
+ :msi_signing_ssh_key,
107
+ :msi_staging_server,
108
+ :name,
109
+ :nonfinal_apt_repo_command,
110
+ :nonfinal_apt_repo_path,
111
+ :nonfinal_apt_repo_staging_path,
112
+ :nonfinal_dmg_path,
113
+ :nonfinal_gem_path,
114
+ :nonfinal_ips_path,
115
+ :nonfinal_msi_path,
116
+ :nonfinal_p5p_path,
117
+ :nonfinal_repo_name,
118
+ :nonfinal_repo_link_target,
119
+ :nonfinal_svr4_path,
120
+ :nonfinal_swix_path,
121
+ :nonfinal_yum_repo_path,
122
+ :notify,
123
+ :nuget_host,
124
+ :nuget_repo_path,
125
+ :origversion,
126
+ :osx_build_host,
127
+ :osx_signing_cert,
128
+ :osx_signing_keychain,
129
+ :osx_signing_keychain_pw,
130
+ :osx_signing_server,
131
+ :osx_signing_ssh_key,
132
+ :p5p_host,
133
+ :p5p_path,
134
+ :packager,
135
+ :packaging_repo,
136
+ :packaging_root,
137
+ :packaging_url,
138
+ :pbuild_conf,
139
+ :pe_feature_branch,
140
+ :pe_release_branch,
141
+ :pe_name,
142
+ :pe_platforms,
143
+ :pe_version,
144
+ :pg_major_version,
145
+ :platform_repos,
146
+ :pre_tar_task,
147
+ :pre_tasks,
148
+ :privatekey_pem,
149
+ :project,
150
+ :project_root,
151
+ :random_mockroot,
152
+ :rc_mocks,
153
+ :redis_hostname,
154
+ :ref,
155
+ :release,
156
+ :repo_link_target,
157
+ :repo_name,
158
+ :rpm_build_host,
159
+ :rpm_targets,
160
+ :rpmrelease,
161
+ :rpmversion,
162
+ :rsync_servers,
163
+ :s3_ship,
164
+ :short_ref,
165
+ :sign_tar,
166
+ :signing_server,
167
+ :staging_server,
168
+ :summary,
169
+ :svr4_host,
170
+ :svr4_path,
171
+ :swix_host,
172
+ :swix_path,
173
+ :swix_staging_server,
174
+ :tar_excludes,
175
+ :tar_host,
176
+ :tar_staging_server,
177
+ :tarball_path,
178
+ :task,
179
+ :team,
180
+ :templates,
181
+ :update_version_file,
182
+ :vanagon_project,
183
+ :version,
184
+ :version_file,
185
+ :version_strategy,
186
+ :yum_archive_path,
187
+ :yum_host,
188
+ :yum_repo_command,
189
+ :yum_repo_name,
190
+ :yum_repo_path,
191
+ :yum_staging_server,
192
+ ]
193
+
194
+ # Environment variable overrides for Pkg::Config parameters
195
+ #
196
+ # :var => :config_param, :envvar => :environment var :type => :variable type
197
+ #
198
+ # Note: :type is assumed :string if not present
199
+ #
200
+ ENV_VARS = [
201
+ { :var => :allow_dirty_tree, :envvar => :ALLOW_DIRTY_TREE, :type => :bool },
202
+ { :var => :answer_override, :envvar => :ANSWER_OVERRIDE },
203
+ { :var => :apt_archive_path, :envvar => :APT_ARCHIVE_PATH },
204
+ { :var => :apt_archive_repo_command, :envvar => :APT_ARCHIVE_REPO_COMMAND },
205
+ { :var => :apt_host, :envvar => :APT_HOST },
206
+ { :var => :apt_releases, :envvar => :APT_RELEASES, :type => :array },
207
+ { :var => :apt_repo_path, :envvar => :APT_REPO },
208
+ { :var => :apt_repo_staging_path, :envvar => :APT_REPO_STAGING_PATH },
209
+ { :var => :apt_signing_server, :envvar => :APT_SIGNING_SERVER },
210
+ { :var => :apt_staging_server, :envvar => :APT_STAGING_SERVER },
211
+ { :var => :build_data_repo, :envvar => :BUILD_DATA_REPO },
212
+ { :var => :build_dmg, :envvar => :DMG, :type => :bool },
213
+ { :var => :build_doc, :envvar => :DOC, :type => :bool },
214
+ { :var => :build_gem, :envvar => :GEM, :type => :bool },
215
+ { :var => :build_ips, :envvar => :IPS, :type => :bool },
216
+ { :var => :build_msi, :envvar => :MSI, :type => :bool },
217
+ { :var => :build_pe, :envvar => :PE_BUILD, :type => :bool },
218
+ { :var => :build_tar, :envvar => :TAR, :type => :bool },
219
+ { :var => :certificate_pem, :envvar => :CERT_PEM },
220
+ { :var => :cows, :envvar => :COW },
221
+ { :var => :debug, :envvar => :DEBUG, :type => :bool },
222
+ { :var => :default_cow, :envvar => :COW },
223
+ { :var => :default_mock, :envvar => :MOCK },
224
+ { :var => :dev_build, :envvar => :DEV_BUILD, :type => :bool },
225
+ { :var => :dmg_host, :envvar => :DMG_HOST },
226
+ { :var => :dmg_path, :envvar => :DMG_PATH },
227
+ { :var => :dmg_staging_server, :envvar => :DMG_STAGING_SERVER },
228
+ { :var => :downloads_archive_path, :envvar => :DOWNLOADS_ARCHIVE_PATH },
229
+ { :var => :final_mocks, :envvar => :MOCK },
230
+ { :var => :foss_only, :envvar => :FOSS_ONLY, :type => :bool },
231
+ { :var => :foss_platforms, :envvar => :FOSS_PLATFORMS, :type => :array },
232
+ { :var => :freight_archive_path, :envvar => :FREIGHT_ARCHIVE_PATH },
233
+ { :var => :gem_host, :envvar => :GEM_HOST },
234
+ { :var => :gpg_key, :envvar => :GPG_KEY },
235
+ { :var => :gpg_name, :envvar => :GPG_NAME },
236
+ { :var => :ips_host, :envvar => :IPS_HOST },
237
+ { :var => :ips_inter_cert, :envvar => :IPS_INTER_CERT },
238
+ { :var => :ips_path, :envvar => :IPS_PATH },
239
+ { :var => :ips_repo, :envvar => :IPS_REPO },
240
+ { :var => :ips_root_cert, :envvar => :IPS_ROOT_CERT },
241
+ { :var => :ips_signing_cert, :envvar => :IPS_SIGNING_CERT },
242
+ { :var => :ips_signing_key, :envvar => :IPS_SIGNING_KEY },
243
+ { :var => :ips_signing_server, :envvar => :IPS_SIGNING_SERVER },
244
+ { :var => :ips_signing_ssh_key, :envvar => :IPS_SIGNING_SSH_KEY },
245
+ { :var => :msi_host, :envvar => :MSI_HOST },
246
+ { :var => :msi_path, :envvar => :MSI_PATH },
247
+ { :var => :msi_signing_cert, :envvar => :MSI_SIGNING_CERT },
248
+ { :var => :msi_signing_cert_pw, :envvar => :MSI_SIGNING_CERT_PW },
249
+ { :var => :msi_signing_server, :envvar => :MSI_SIGNING_SERVER },
250
+ { :var => :msi_signing_ssh_key, :envvar => :MSI_SIGNING_SSH_KEY },
251
+ { :var => :msi_staging_server, :envvar => :MSI_STAGING_SERVER },
252
+ { :var => :nonfinal_apt_repo_command, :envvar => :NONFINAL_APT_REPO_COMMAND },
253
+ { :var => :nonfinal_apt_repo_path, :envvar => :NONFINAL_APT_REPO_PATH },
254
+ { :var => :nonfinal_apt_repo_staging_path, :envvar => :NONFINAL_APT_REPO_STAGING_PATH },
255
+ { :var => :nonfinal_dmg_path, :envvar => :NONFINAL_DMG_PATH },
256
+ { :var => :nonfinal_gem_path, :envvar => :NONFINAL_GEM_PATH },
257
+ { :var => :nonfinal_ips_path, :envvar => :NONFINAL_IPS_PATH },
258
+ { :var => :nonfinal_msi_path, :envvar => :NONFINAL_MSI_PATH },
259
+ { :var => :nonfinal_p5p_path, :envvar => :NONFINAL_P5P_PATH },
260
+ { :var => :nonfinal_repo_link_target, :envvar => :NONFINAL_REPO_LINK_TARGET },
261
+ { :var => :nonfinal_repo_name, :envvar => :NONFINAL_REPO_NAME },
262
+ { :var => :nonfinal_svr4_path, :envvar => :NONFINAL_SVR4_PATH },
263
+ { :var => :nonfinal_swix_path, :envvar => :NONFINAL_SWIX_PATH },
264
+ { :var => :nonfinal_yum_repo_path, :envvar => :NONFINAL_YUM_REPO_PATH },
265
+ { :var => :notify, :envvar => :NOTIFY },
266
+ { :var => :nuget_host, :envvar => :NUGET_HOST },
267
+ { :var => :nuget_repo_path, :envvar => :NUGET_REPO },
268
+ { :var => :osx_signing_cert, :envvar => :OSX_SIGNING_CERT },
269
+ { :var => :osx_signing_keychain, :envvar => :OSX_SIGNING_KEYCHAIN },
270
+ { :var => :osx_signing_keychain_pw, :envvar => :OSX_SIGNING_KEYCHAIN_PW },
271
+ { :var => :osx_signing_server, :envvar => :OSX_SIGNING_SERVER },
272
+ { :var => :osx_signing_ssh_key, :envvar => :OSX_SIGNING_SSH_KEY },
273
+ { :var => :p5p_host, :envvar => :P5P_HOST },
274
+ { :var => :p5p_path, :envvar => :P5P_PATH },
275
+ { :var => :packager, :envvar => :PACKAGER },
276
+ { :var => :pbuild_conf, :envvar => :PBUILDCONF },
277
+ { :var => :pe_feature_branch, :envvar => :PE_FEATURE_BRANCH },
278
+ { :var => :pe_version, :envvar => :PE_VER },
279
+ { :var => :privatekey_pem, :envvar => :PRIVATE_PEM },
280
+ { :var => :project, :envvar => :PROJECT_OVERRIDE },
281
+ { :var => :project_root, :envvar => :PROJECT_ROOT },
282
+ { :var => :random_mockroot, :envvar => :RANDOM_MOCKROOT, :type => :bool },
283
+ { :var => :rc_mocks, :envvar => :MOCK },
284
+ { :var => :release, :envvar => :RELEASE },
285
+ { :var => :repo_name, :envvar => :REPO_NAME },
286
+ { :var => :repo_link_target, :envvar => :REPO_LINK_TARGET },
287
+ { :var => :s3_ship, :envvar => :S3_SHIP, :type => :bool },
288
+ { :var => :sign_tar, :envvar => :SIGN_TAR, :type => :bool },
289
+ { :var => :signing_server, :envvar => :SIGNING_SERVER },
290
+ { :var => :staging_server, :envvar => :STAGING_SERVER },
291
+ { :var => :swix_host, :envvar => :SWIX_HOST },
292
+ { :var => :swix_staging_server, :envvar => :SWIX_STAGING_SERVER },
293
+ { :var => :svr4_host, :envvar => :SVR4_HOST },
294
+ { :var => :svr4_path, :envvar => :SVR4_PATH },
295
+ { :var => :swix_path, :envvar => :SWIX_PATH },
296
+ { :var => :tar_host, :envvar => :TAR_HOST },
297
+ { :var => :tar_staging_server, :envvar => :TAR_STAGING_SERVER },
298
+ { :var => :team, :envvar => :TEAM },
299
+ { :var => :update_version_file, :envvar => :NEW_STYLE_PACKAGE },
300
+ { :var => :vanagon_project, :envvar => :VANAGON_PROJECT, :type => :bool },
301
+ { :var => :version, :envvar => :PACKAGING_PACKAGE_VERSION },
302
+ { :var => :yum_archive_path, :envvar => :YUM_ARCHIVE_PATH },
303
+ { :var => :yum_host, :envvar => :YUM_HOST },
304
+ { :var => :yum_repo_path, :envvar => :YUM_REPO },
305
+ { :var => :yum_staging_server, :envvar => :YUM_STAGING_SERVER },
306
+ { :var => :internal_gem_host, :envvar => :INTERNAL_GEM_HOST },
307
+ ]
308
+ # Default values that are supplied if the user does not supply them
309
+ #
310
+ # usage is the same as above
311
+ #
312
+ DEFAULTS = [{ :var => :allow_dirty_tree, :val => false },
313
+ { :var => :builder_data_file, :val => 'builder_data.yaml' },
314
+ { :var => :team, :val => 'dev' },
315
+ { :var => :random_mockroot, :val => true },
316
+ { :var => :keychain_loaded, :val => false },
317
+ { :var => :foss_only, :val => false },
318
+ { :var => :build_data_repo, :val => 'https://github.com/puppetlabs/build-data.git' },
319
+ { :var => :build_date, :val => Pkg::Util::Date.timestamp('-') },
320
+ { :var => :release, :val => '1' },
321
+ { :var => :internal_gem_host, :val => 'https://artifactory.delivery.puppetlabs.net/artifactory/api/gems/rubygems' },
322
+ { :var => :build_tar, :val => true },
323
+ { :var => :dev_build, :val => false },
324
+ { :var => :osx_signing_cert, :val => '$OSX_SIGNING_CERT' },
325
+ { :var => :osx_signing_keychain, :val => '$OSX_SIGNING_KEYCHAIN' },
326
+ { :var => :osx_signing_keychain_pw, :val => '$OSX_SIGNING_KEYCHAIN_PW' },
327
+ { :var => :ips_signing_cert, :val => '$IPS_SIGNING_CERT' },
328
+ { :var => :ips_inter_cert, :val => '$IPS_INTER_CERT' },
329
+ { :var => :ips_root_cert, :val => '$IPS_ROOT_CERT' },
330
+ { :var => :ips_signing_key, :val => '$IPS_SIGNING_KEY' },
331
+ { :var => :msi_signing_cert, :val => '$MSI_SIGNING_CERT' },
332
+ { :var => :msi_signing_cert_pw, :val => '$MSI_SIGNING_CERT_PW' },
333
+ { :var => :pe_feature_branch, :val => false },
334
+ { :var => :pe_release_branch, :val => false },
335
+ { :var => :s3_ship, :val => false },
336
+ { :var => :apt_releases, :val => Pkg::Platforms.codenames }]
337
+
338
+ # These are variables which, over time, we decided to rename or replace. For
339
+ # backwards compatibility, we assign the value of the old/deprecated
340
+ # variables, if set, to the new ones. We also use this method for accessor
341
+ # "redirects" - e.g. defaulting the populated value of one parameter for another
342
+ # in case it is not set.
343
+ #
344
+ REASSIGNMENTS = [
345
+ # These are fall-through values for shipping endpoints
346
+ { :oldvar => :staging_server, :newvar => :apt_staging_server },
347
+ { :oldvar => :staging_server, :newvar => :dmg_staging_server },
348
+ { :oldvar => :staging_server, :newvar => :swix_staging_server },
349
+ { :oldvar => :staging_server, :newvar => :tar_staging_server },
350
+ { :oldvar => :staging_server, :newvar => :yum_staging_server },
351
+ # These are fall-through values for signing/repo endpoints
352
+ { :oldvar => :yum_staging_server, :newvar => :yum_host },
353
+ { :oldvar => :apt_repo_staging_path, :newvar => :apt_repo_path },
354
+ { :oldvar => :apt_signing_server, :newvar => :apt_host },
355
+ # These are legitimately old values
356
+ { :oldvar => :gem_devel_dependencies, :newvar => :gem_development_dependencies },
357
+ { :oldvar => :gpg_name, :newvar => :gpg_key },
358
+ { :oldvar => :name, :newvar => :project },
359
+ { :oldvar => :pe_name, :newvar => :project },
360
+ { :oldvar => :project, :newvar => :gem_name },
361
+ { :oldvar => :yum_host, :newvar => :swix_host },
362
+ { :oldvar => :yum_host, :newvar => :dmg_host },
363
+ { :oldvar => :yum_host, :newvar => :tar_host },
364
+ ]
365
+
366
+
367
+ # These are variables that we have deprecated. If they are encountered in a
368
+ # project's config, we issue deprecations for them.
369
+ #
370
+ DEPRECATIONS = [{ :var => :gem_devel_dependencies, :message => "
371
+ DEPRECATED, 9-Nov-2013: 'gem_devel_dependencies' has been replaced with
372
+ 'gem_development_dependencies.' Please update this field in your
373
+ build_defaults.yaml or project_data.yaml" },
374
+ { :var => :gpg_name, :message => "
375
+ DEPRECATED, 29-Jul-2014: 'gpg_name' has been replaced with 'gpg_key'.
376
+ Please update this field in your build_defaults.yaml" }]
377
+
378
+ # Provide an open-ended template for validating BUILD_PARAMS.
379
+ #
380
+ # Each validatation contains the variable name as ':var' and a list of validations it
381
+ # must pass from the Pkg::Params::Validations class.
382
+ #
383
+ VALIDATIONS = [
384
+ { :var => :project, :validations => [:not_empty?] }
385
+ ]
386
+
387
+ end
@@ -0,0 +1,13 @@
1
+ module Pkg
2
+ class ConfigValidations
3
+
4
+ class << self
5
+
6
+ # As a validation, this one is kindof lame but is intended as a seed pattern for possibly
7
+ # more robust ones.
8
+ def not_empty?(value)
9
+ value.to_s.empty? ? false : true
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ # DEB methods used by various libraries and rake tasks
2
+
3
+ module Pkg::Deb
4
+ require 'packaging/deb/repo'
5
+ class << self
6
+ def set_cow_envs(cow)
7
+ elements = /base-(.*)-(.*)\.cow/.match(cow)
8
+ if elements.nil?
9
+ fail "Didn't get a matching cow, e.g. 'base-squeeze-i386'"
10
+ end
11
+ dist = elements[1]
12
+ arch = elements[2]
13
+ if Pkg::Config.build_pe
14
+ ENV['PE_VER'] = Pkg::Config.pe_version
15
+ end
16
+ if Pkg::Config.deb_build_mirrors
17
+ ENV['BUILDMIRROR'] = Pkg::Config.deb_build_mirrors.map do |mirror|
18
+ mirror.gsub(/__DIST__/, dist)
19
+ end.join(' | ')
20
+ end
21
+ ENV['DIST'] = dist
22
+ ENV['ARCH'] = arch
23
+ if dist =~ /cumulus/
24
+ ENV['NETWORK_OS'] = 'cumulus'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,264 @@
1
+ # Utilities for working with deb repos
2
+ require 'fileutils'
3
+
4
+ module Pkg::Deb::Repo
5
+
6
+ class << self
7
+
8
+ # This is the default set of arches we are using for our reprepro repos. We
9
+ # take this list and combine it with the list of supported arches for each
10
+ # given platform to ensure a complete set of architectures. We use this
11
+ # when we initially create the repos and when we sign the repos.
12
+ DEBIAN_PACKAGING_ARCHES = ['i386', 'amd64', 'arm64', 'armel', 'armhf', 'powerpc', 'ppc64el', 'sparc', 'mips', 'mipsel']
13
+
14
+ def reprepro_repo_name
15
+ if Pkg::Config.apt_repo_name
16
+ Pkg::Config.apt_repo_name
17
+ else
18
+ Pkg::Paths.repo_name.empty? ? 'main' : Pkg::Paths.repo_name
19
+ end
20
+ end
21
+
22
+ def base_url
23
+ "http://#{Pkg::Config.builds_server}/#{Pkg::Config.project}/#{Pkg::Config.ref}"
24
+ end
25
+
26
+ # Generate apt configuration files that point to the repositories created
27
+ # on the distribution server with packages created from the current source
28
+ # repo commit. There is one for each dist that is packaged for (e.g. lucid,
29
+ # squeeze, etc). Files are created in pkg/repo_configs/deb and are named
30
+ # pl-$project-$sha.list, and can be placed in /etc/apt/sources.list.d to
31
+ # enable clients to install these packages.
32
+ #
33
+ def generate_repo_configs(source = "repos", target = "repo_configs")
34
+ # We use wget to obtain a directory listing of what are presumably our deb repos
35
+ #
36
+ wget = Pkg::Util::Tool.check_tool("wget")
37
+
38
+ # This is the standard path to all debian build artifact repositories on
39
+ # the distribution server for this commit
40
+ #
41
+ repo_base = "#{base_url}/#{source}/apt/"
42
+
43
+ # First test if the directory even exists
44
+ #
45
+ begin
46
+ stdout, _, _ = Pkg::Util::Execution.capture3("#{wget} --spider -r -l 1 --no-parent #{repo_base} 2>&1")
47
+ rescue RuntimeError
48
+ warn "No debian repos available for #{Pkg::Config.project} at #{Pkg::Config.ref}."
49
+ return
50
+ end
51
+
52
+ # We want to exclude index and robots files and only include the http: prefixed elements
53
+ repo_urls = stdout.split.uniq.reject { |x| x =~ /\?|index|robots/ }.select { |x| x =~ /http:/ }.map { |x| x.chomp('/') }
54
+
55
+
56
+ # Create apt sources.list files that can be added to hosts for installing
57
+ # these packages. We use the list of distributions to create a config
58
+ # file for every distribution.
59
+ #
60
+ FileUtils.mkdir_p(File.join("pkg", target, "deb"))
61
+ repo_urls.each do |url|
62
+ # We want to skip the base_url, which wget returns as one of the results
63
+ next if "#{url}/" == repo_base
64
+ platform_tag = Pkg::Paths.tag_from_artifact_path(url)
65
+ platform, version, _ = Pkg::Platforms.parse_platform_tag(platform_tag)
66
+ codename = Pkg::Platforms.codename_for_platform_version(platform, version)
67
+ repoconfig = ["# Packages for #{Pkg::Config.project} built from ref #{Pkg::Config.ref}",
68
+ "deb #{url} #{codename} #{reprepro_repo_name}"]
69
+ config = File.join("pkg", target, "deb", "pl-#{Pkg::Config.project}-#{Pkg::Config.ref}-#{codename}.list")
70
+ File.open(config, 'w') { |f| f.puts repoconfig }
71
+ end
72
+ puts "Wrote apt repo configs for #{Pkg::Config.project} at #{Pkg::Config.ref} to pkg/#{target}/deb."
73
+ end
74
+
75
+ def retrieve_repo_configs(target = "repo_configs")
76
+ wget = Pkg::Util::Tool.check_tool("wget")
77
+ FileUtils.mkdir_p("pkg/#{target}")
78
+ config_url = "#{base_url}/#{target}/deb/"
79
+ stdout, _, _ = Pkg::Util::Execution.capture3("#{wget} -r -np -nH --cut-dirs 3 -P pkg/#{target} --reject 'index*' #{config_url}")
80
+ stdout
81
+ rescue => e
82
+ fail "Couldn't retrieve deb apt repo configs.\n#{e}"
83
+ end
84
+
85
+ def repo_creation_command(repo_directory, artifact_paths)
86
+ cmd = "[ -d #{repo_directory} ] || exit 1 ; "
87
+ cmd << "pushd #{repo_directory} > /dev/null && "
88
+ cmd << 'echo "Checking for running repo creation. Will wait if detected." && '
89
+ cmd << 'while [ -f .lock ] ; do sleep 1 ; echo -n "." ; done && '
90
+ cmd << 'echo "Setting lock" && '
91
+ cmd << 'touch .lock && '
92
+
93
+ # Make the conf directory and write out our configuration file
94
+ cmd << 'rm -rf apt && mkdir -p apt ; pushd apt > /dev/null && '
95
+
96
+ artifact_paths.each do |path|
97
+ platform_tag = Pkg::Paths.tag_from_artifact_path(path)
98
+ platform, version, _ = Pkg::Platforms. parse_platform_tag(platform_tag)
99
+ codename = Pkg::Platforms.codename_for_platform_version(platform, version)
100
+ arches = Pkg::Platforms.arches_for_codename(codename)
101
+
102
+ cmd << "mkdir -p #{codename}/conf && "
103
+ cmd << "pushd #{codename} ; "
104
+ cmd << %Q( [ -e 'conf/distributions' ] || echo "
105
+ Origin: Puppet Labs
106
+ Label: Puppet Labs
107
+ Codename: #{codename}
108
+ Architectures: #{(DEBIAN_PACKAGING_ARCHES + arches).uniq.join(' ')}
109
+ Components: #{reprepro_repo_name}
110
+ Description: Apt repository for acceptance testing" >> conf/distributions ; )
111
+
112
+ cmd << 'reprepro=$(which reprepro) && '
113
+ cmd << "$reprepro includedeb #{codename} ../../#{path}/*.deb && "
114
+ cmd << 'popd > /dev/null ; '
115
+ end
116
+ cmd << 'popd > /dev/null ; popd > /dev/null '
117
+ cmd
118
+ end
119
+
120
+ # This method is doing too much for its name
121
+ def create_repos(directory = 'repos')
122
+ artifact_directory = File.join(Pkg::Config.jenkins_repo_path, Pkg::Config.project, Pkg::Config.ref)
123
+ artifact_paths = Pkg::Repo.directories_that_contain_packages(File.join(artifact_directory, 'artifacts'), 'deb')
124
+ Pkg::Repo.populate_repo_directory(artifact_directory)
125
+ command = repo_creation_command(File.join(artifact_directory, 'repos'), artifact_paths)
126
+
127
+ begin
128
+ Pkg::Util::Net.remote_execute(Pkg::Config.distribution_server, command)
129
+ # Now that we've created our package repositories, we can generate repo
130
+ # configurations for use with downstream jobs, acceptance clients, etc.
131
+ Pkg::Deb::Repo.generate_repo_configs
132
+
133
+ # Now that we've created the repo configs, we can ship them
134
+ Pkg::Deb::Repo.ship_repo_configs
135
+ ensure
136
+ # Always remove the lock file, even if we've failed
137
+ Pkg::Util::Net.remote_execute(Pkg::Config.distribution_server, "rm -f #{artifact_directory}/repos/.lock")
138
+ end
139
+ end
140
+
141
+ def ship_repo_configs(target = "repo_configs")
142
+ if (!File.exist?("pkg/#{target}/deb")) || Pkg::Util::File.empty_dir?("pkg/#{target}/deb")
143
+ warn "No repo configs have been generated! Try pl:deb_repo_configs."
144
+ return
145
+ end
146
+
147
+ Pkg::Util::RakeUtils.invoke_task("pl:fetch")
148
+ repo_dir = "#{Pkg::Config.jenkins_repo_path}/#{Pkg::Config.project}/#{Pkg::Config.ref}/#{target}/deb"
149
+ Pkg::Util::Net.remote_execute(Pkg::Config.distribution_server, "mkdir -p #{repo_dir}")
150
+ Pkg::Util::Execution.retry_on_fail(:times => 3) do
151
+ Pkg::Util::Net.rsync_to("pkg/#{target}/deb/", Pkg::Config.distribution_server, repo_dir)
152
+ end
153
+ end
154
+
155
+ def sign_repos(target = "repos", message = "Signed apt repository")
156
+ reprepro = Pkg::Util::Tool.check_tool('reprepro')
157
+ Pkg::Util::Gpg.load_keychain if Pkg::Util::Tool.find_tool('keychain')
158
+
159
+ dists = Pkg::Util::File.directories("#{target}/apt")
160
+ supported_codenames = Pkg::Platforms.codenames
161
+
162
+ unless dists
163
+ warn "No repos found to sign. Maybe you didn't build any debs, or the repo creation failed?"
164
+ return
165
+ end
166
+
167
+ dists.each do |dist|
168
+ next unless supported_codenames.include?(dist)
169
+ arches = Pkg::Platforms.arches_for_codename(dist)
170
+ Dir.chdir("#{target}/apt/#{dist}") do
171
+ File.open("conf/distributions", "w") do |f|
172
+ f.puts "Origin: Puppet Labs
173
+ Label: Puppet Labs
174
+ Codename: #{dist}
175
+ Architectures: #{(DEBIAN_PACKAGING_ARCHES + arches).uniq.join(' ')}
176
+ Components: #{reprepro_repo_name}
177
+ Description: #{message} for #{dist}
178
+ SignWith: #{Pkg::Config.gpg_key}"
179
+ end
180
+
181
+ stdout, _, _ = Pkg::Util::Execution.capture3("#{reprepro} -vvv --confdir ./conf --dbdir ./db --basedir ./ export")
182
+ stdout
183
+ end
184
+ end
185
+ end
186
+
187
+ # @deprecated this command will die a painful death when we are
188
+ # able to sit down with Operations and refactor our distribution infra.
189
+ # For now, it's extremely debian specific, which is why it lives here.
190
+ # - Ryan McKern 11/2015
191
+ #
192
+ # @param origin_path [String] path for Deb repos on local filesystem
193
+ # @param destination_path [String] path for Deb repos on remote filesystem
194
+ # @param destination [String] remote host to send rsynced content to. If
195
+ # nil will copy locally
196
+ # @param dryrun [Boolean] whether or not to use '--dry-run'
197
+ #
198
+ # @return [String] an rsync command that can be executed on a remote host
199
+ # to copy local content from that host to a remote node.
200
+ def repo_deployment_command(origin_path, destination_path, destination, dryrun = false)
201
+ path = Pathname.new(origin_path)
202
+ dest_path = Pathname.new(destination_path)
203
+
204
+ # You may think "rsync doesn't actually remove the sticky bit, let's
205
+ # remove the Dugo-s from the chmod". However, that will make your rsyncs
206
+ # fail due to permission errors.
207
+ options = %w(
208
+ rsync
209
+ --itemize-changes
210
+ --hard-links
211
+ --copy-links
212
+ --omit-dir-times
213
+ --progress
214
+ --archive
215
+ --update
216
+ --verbose
217
+ --super
218
+ --delay-updates
219
+ --omit-dir-times
220
+ --no-perms
221
+ --no-owner
222
+ --no-group
223
+ --exclude='dists/*-*'
224
+ --exclude='pool/*-*'
225
+ )
226
+
227
+ options << '--dry-run' if dryrun
228
+ options << path
229
+ if !destination.nil?
230
+ options << "#{destination}:#{dest_path.parent}"
231
+ else
232
+ options << "#{dest_path.parent}"
233
+ end
234
+ options.join("\s")
235
+ end
236
+
237
+ # @deprecated this command will die a painful death when we are
238
+ # able to sit down with Operations and refactor our distribution infra.
239
+ # It's extremely Debian specific due to how Debian repos are signed,
240
+ # which is why it lives here.
241
+ # Yes, it is basically just a layer of indirection around the task
242
+ # of copying content from one node to another. No, I am not proud
243
+ # of it. - Ryan McKern 11/2015
244
+ #
245
+ # @param apt_path [String] path for Deb repos on local and remote filesystem
246
+ # @param destination_staging_path [String] staging path for Deb repos on
247
+ # remote filesystem
248
+ # @param origin_server [String] remote host to start the rsync from
249
+ # @param destination_server [String] remote host to send rsynced content to
250
+ # @param dryrun [Boolean] whether or not to use '--dry-run'
251
+ def deploy_repos(apt_path, destination_staging_path, origin_server, destination_server, dryrun = false)
252
+ rsync_command = repo_deployment_command(apt_path, destination_staging_path, destination_server, dryrun)
253
+ cp_command = repo_deployment_command(destination_staging_path, apt_path, nil, dryrun)
254
+
255
+ Pkg::Util::Net.remote_execute(origin_server, rsync_command)
256
+ if dryrun
257
+ puts "[DRYRUN] not executing #{cp_command} on #{destination_server}"
258
+ else
259
+ Pkg::Util::Net.remote_execute(destination_server, cp_command)
260
+ end
261
+ end
262
+
263
+ end
264
+ end