packaging 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.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +17 -0
  3. data/README-Solaris.md +117 -0
  4. data/README.md +1031 -0
  5. data/lib/packaging.rb +32 -0
  6. data/lib/packaging/artifactory.rb +278 -0
  7. data/lib/packaging/config.rb +392 -0
  8. data/lib/packaging/config/params.rb +366 -0
  9. data/lib/packaging/deb.rb +28 -0
  10. data/lib/packaging/deb/repo.rb +263 -0
  11. data/lib/packaging/gem.rb +112 -0
  12. data/lib/packaging/ips.rb +57 -0
  13. data/lib/packaging/msi.rb +89 -0
  14. data/lib/packaging/nuget.rb +39 -0
  15. data/lib/packaging/osx.rb +36 -0
  16. data/lib/packaging/paths.rb +238 -0
  17. data/lib/packaging/platforms.rb +480 -0
  18. data/lib/packaging/repo.rb +55 -0
  19. data/lib/packaging/retrieve.rb +46 -0
  20. data/lib/packaging/rpm.rb +5 -0
  21. data/lib/packaging/rpm/repo.rb +257 -0
  22. data/lib/packaging/tar.rb +154 -0
  23. data/lib/packaging/util.rb +146 -0
  24. data/lib/packaging/util/date.rb +15 -0
  25. data/lib/packaging/util/execution.rb +85 -0
  26. data/lib/packaging/util/file.rb +125 -0
  27. data/lib/packaging/util/git.rb +174 -0
  28. data/lib/packaging/util/git_tags.rb +73 -0
  29. data/lib/packaging/util/gpg.rb +62 -0
  30. data/lib/packaging/util/jenkins.rb +95 -0
  31. data/lib/packaging/util/misc.rb +69 -0
  32. data/lib/packaging/util/net.rb +368 -0
  33. data/lib/packaging/util/os.rb +17 -0
  34. data/lib/packaging/util/platform.rb +40 -0
  35. data/lib/packaging/util/rake_utils.rb +111 -0
  36. data/lib/packaging/util/serialization.rb +19 -0
  37. data/lib/packaging/util/ship.rb +171 -0
  38. data/lib/packaging/util/tool.rb +41 -0
  39. data/lib/packaging/util/version.rb +326 -0
  40. data/spec/fixtures/config/ext/build_defaults.yaml +2 -0
  41. data/spec/fixtures/config/ext/project_data.yaml +2 -0
  42. data/spec/fixtures/config/params.yaml +2 -0
  43. data/spec/fixtures/configs/components/test_file.json +1 -0
  44. data/spec/fixtures/configs/components/test_file_2.json +0 -0
  45. data/spec/fixtures/configs/components/test_file_not_tagged.json +1 -0
  46. data/spec/fixtures/configs/components/test_file_wrong_ext.txt +0 -0
  47. data/spec/fixtures/configs/components/test_file_wrong_ext.wrong +0 -0
  48. data/spec/fixtures/util/pre_tasks.yaml +4 -0
  49. data/spec/lib/packaging/artifactory_spec.rb +171 -0
  50. data/spec/lib/packaging/config_spec.rb +556 -0
  51. data/spec/lib/packaging/deb/repo_spec.rb +148 -0
  52. data/spec/lib/packaging/deb_spec.rb +52 -0
  53. data/spec/lib/packaging/paths_spec.rb +153 -0
  54. data/spec/lib/packaging/platforms_spec.rb +153 -0
  55. data/spec/lib/packaging/repo_spec.rb +97 -0
  56. data/spec/lib/packaging/retrieve_spec.rb +61 -0
  57. data/spec/lib/packaging/rpm/repo_spec.rb +133 -0
  58. data/spec/lib/packaging/tar_spec.rb +122 -0
  59. data/spec/lib/packaging/util/execution_spec.rb +56 -0
  60. data/spec/lib/packaging/util/file_spec.rb +139 -0
  61. data/spec/lib/packaging/util/git_spec.rb +160 -0
  62. data/spec/lib/packaging/util/git_tag_spec.rb +36 -0
  63. data/spec/lib/packaging/util/gpg_spec.rb +64 -0
  64. data/spec/lib/packaging/util/jenkins_spec.rb +112 -0
  65. data/spec/lib/packaging/util/misc_spec.rb +31 -0
  66. data/spec/lib/packaging/util/net_spec.rb +239 -0
  67. data/spec/lib/packaging/util/os_spec.rb +31 -0
  68. data/spec/lib/packaging/util/rake_utils_spec.rb +70 -0
  69. data/spec/lib/packaging/util/ship_spec.rb +117 -0
  70. data/spec/lib/packaging/util/version_spec.rb +123 -0
  71. data/spec/lib/packaging_spec.rb +19 -0
  72. data/spec/spec_helper.rb +36 -0
  73. data/static_artifacts/PackageInfo.plist +3 -0
  74. data/tasks/00_utils.rake +216 -0
  75. data/tasks/30_metrics.rake +33 -0
  76. data/tasks/apple.rake +266 -0
  77. data/tasks/build.rake +12 -0
  78. data/tasks/clean.rake +5 -0
  79. data/tasks/config.rake +30 -0
  80. data/tasks/deb.rake +129 -0
  81. data/tasks/deb_repos.rake +28 -0
  82. data/tasks/deprecated.rake +130 -0
  83. data/tasks/doc.rake +20 -0
  84. data/tasks/education.rake +57 -0
  85. data/tasks/fetch.rake +57 -0
  86. data/tasks/gem.rake +146 -0
  87. data/tasks/jenkins.rake +494 -0
  88. data/tasks/jenkins_dynamic.rake +202 -0
  89. data/tasks/load_extras.rake +21 -0
  90. data/tasks/mock.rake +348 -0
  91. data/tasks/nightly_repos.rake +335 -0
  92. data/tasks/pe_deb.rake +12 -0
  93. data/tasks/pe_rpm.rake +13 -0
  94. data/tasks/pe_ship.rake +221 -0
  95. data/tasks/pe_sign.rake +13 -0
  96. data/tasks/pe_tar.rake +5 -0
  97. data/tasks/retrieve.rake +45 -0
  98. data/tasks/rpm.rake +66 -0
  99. data/tasks/rpm_repos.rake +29 -0
  100. data/tasks/ship.rake +752 -0
  101. data/tasks/sign.rake +226 -0
  102. data/tasks/tag.rake +8 -0
  103. data/tasks/tar.rake +34 -0
  104. data/tasks/update.rake +16 -0
  105. data/tasks/vanagon.rake +35 -0
  106. data/tasks/vendor_gems.rake +117 -0
  107. data/tasks/version.rake +33 -0
  108. data/tasks/z_data_dump.rake +65 -0
  109. data/templates/README +1 -0
  110. data/templates/downstream.xml.erb +47 -0
  111. data/templates/msi.xml.erb +197 -0
  112. data/templates/packaging.xml.erb +344 -0
  113. data/templates/repo.xml.erb +114 -0
  114. metadata +234 -0
@@ -0,0 +1,366 @@
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_host,
9
+ :apt_releases,
10
+ :apt_repo_command,
11
+ :apt_repo_name,
12
+ :apt_repo_path,
13
+ :apt_repo_staging_path,
14
+ :apt_repo_url,
15
+ :apt_signing_server,
16
+ :apt_staging_server,
17
+ :author,
18
+ :benchmark,
19
+ :build_data_repo,
20
+ :build_date,
21
+ :build_defaults,
22
+ :build_dmg,
23
+ :build_doc,
24
+ :build_gem,
25
+ :build_ips,
26
+ :build_msi,
27
+ :build_pe,
28
+ :build_tar,
29
+ :builder_data_file,
30
+ :builds_server,
31
+ :bundle_platforms,
32
+ :certificate_pem,
33
+ :cows,
34
+ :db_table,
35
+ :deb_build_host,
36
+ :deb_build_mirrors,
37
+ :deb_targets,
38
+ :debug,
39
+ :debversion,
40
+ :default_cow,
41
+ :default_mock,
42
+ :dev_build,
43
+ :description,
44
+ :distribution_server,
45
+ :dmg_host,
46
+ :dmg_path,
47
+ :dmg_staging_server,
48
+ :email,
49
+ :files,
50
+ :final_mocks,
51
+ :foss_only,
52
+ :foss_platforms,
53
+ :freight_conf,
54
+ :gem_default_executables,
55
+ :gem_dependencies,
56
+ :gem_description,
57
+ :gem_devel_dependencies,
58
+ :gem_development_dependencies,
59
+ :gem_excludes,
60
+ :gem_executables,
61
+ :gem_files,
62
+ :gem_forge_project,
63
+ :gem_host,
64
+ :gem_name,
65
+ :gem_path,
66
+ :gem_platform_dependencies,
67
+ :gem_rdoc_options,
68
+ :gem_require_path,
69
+ :gem_required_ruby_version,
70
+ :gem_required_rubygems_version,
71
+ :gem_runtime_dependencies,
72
+ :gem_summary,
73
+ :gem_test_files,
74
+ :gemversion,
75
+ :gpg_key,
76
+ :gpg_name,
77
+ :homepage,
78
+ :internal_gem_host,
79
+ :internal_nexus_host,
80
+ :internal_stickler_host,
81
+ :ips_build_host,
82
+ :ips_host,
83
+ :ips_inter_cert,
84
+ :ips_package_host,
85
+ :ips_path,
86
+ :ips_repo,
87
+ :ips_root_cert,
88
+ :ips_signing_cert,
89
+ :ips_signing_key,
90
+ :ips_signing_server,
91
+ :ips_signing_ssh_key,
92
+ :ips_store,
93
+ :jenkins_build_host,
94
+ :jenkins_packaging_job,
95
+ :jenkins_repo_path,
96
+ :metrics,
97
+ :metrics_url,
98
+ :msi_host,
99
+ :msi_name,
100
+ :msi_path,
101
+ :msi_signing_cert,
102
+ :msi_signing_cert_pw,
103
+ :msi_signing_server,
104
+ :msi_signing_ssh_key,
105
+ :msi_staging_server,
106
+ :name,
107
+ :nonfinal_apt_repo_command,
108
+ :nonfinal_apt_repo_path,
109
+ :nonfinal_apt_repo_staging_path,
110
+ :nonfinal_dmg_path,
111
+ :nonfinal_ips_path,
112
+ :nonfinal_msi_path,
113
+ :nonfinal_p5p_path,
114
+ :nonfinal_repo_name,
115
+ :nonfinal_repo_link_target,
116
+ :nonfinal_svr4_path,
117
+ :nonfinal_swix_path,
118
+ :nonfinal_yum_repo_path,
119
+ :notify,
120
+ :nuget_host,
121
+ :nuget_repo_path,
122
+ :origversion,
123
+ :osx_build_host,
124
+ :osx_signing_cert,
125
+ :osx_signing_keychain,
126
+ :osx_signing_keychain_pw,
127
+ :osx_signing_server,
128
+ :osx_signing_ssh_key,
129
+ :p5p_host,
130
+ :p5p_path,
131
+ :packager,
132
+ :packaging_repo,
133
+ :packaging_root,
134
+ :packaging_url,
135
+ :pbuild_conf,
136
+ :pe_feature_branch,
137
+ :pe_name,
138
+ :pe_platforms,
139
+ :pe_version,
140
+ :pg_major_version,
141
+ :platform_repos,
142
+ :pre_tar_task,
143
+ :pre_tasks,
144
+ :privatekey_pem,
145
+ :project,
146
+ :project_root,
147
+ :random_mockroot,
148
+ :rc_mocks,
149
+ :redis_hostname,
150
+ :ref,
151
+ :release,
152
+ :repo_link_target,
153
+ :repo_name,
154
+ :rpm_build_host,
155
+ :rpm_targets,
156
+ :rpmrelease,
157
+ :rpmversion,
158
+ :rsync_servers,
159
+ :s3_ship,
160
+ :short_ref,
161
+ :sign_tar,
162
+ :signing_server,
163
+ :staging_server,
164
+ :summary,
165
+ :svr4_host,
166
+ :svr4_path,
167
+ :swix_host,
168
+ :swix_path,
169
+ :swix_staging_server,
170
+ :tar_excludes,
171
+ :tar_host,
172
+ :tar_staging_server,
173
+ :tarball_path,
174
+ :task,
175
+ :team,
176
+ :templates,
177
+ :update_version_file,
178
+ :vanagon_project,
179
+ :version,
180
+ :version_file,
181
+ :version_strategy,
182
+ :yum_host,
183
+ :yum_repo_command,
184
+ :yum_repo_name,
185
+ :yum_repo_path,
186
+ :yum_staging_server,
187
+ ]
188
+
189
+ # Environment variable overrides for Pkg::Config parameters
190
+ #
191
+ # :var => :config_param, :envvar => :environment var :type => :variable type
192
+ #
193
+ # Note: :type is assumed :string if not present
194
+ #
195
+ ENV_VARS = [
196
+ { :var => :allow_dirty_tree, :envvar => :ALLOW_DIRTY_TREE, :type => :bool },
197
+ { :var => :answer_override, :envvar => :ANSWER_OVERRIDE },
198
+ { :var => :apt_host, :envvar => :APT_HOST },
199
+ { :var => :apt_releases, :envvar => :APT_RELEASES, :type => :array },
200
+ { :var => :apt_repo_path, :envvar => :APT_REPO },
201
+ { :var => :apt_repo_staging_path, :envvar => :APT_REPO_STAGING_PATH },
202
+ { :var => :apt_signing_server, :envvar => :APT_SIGNING_SERVER },
203
+ { :var => :apt_staging_server, :envvar => :APT_STAGING_SERVER },
204
+ { :var => :build_data_repo, :envvar => :BUILD_DATA_REPO },
205
+ { :var => :build_dmg, :envvar => :DMG, :type => :bool },
206
+ { :var => :build_doc, :envvar => :DOC, :type => :bool },
207
+ { :var => :build_gem, :envvar => :GEM, :type => :bool },
208
+ { :var => :build_ips, :envvar => :IPS, :type => :bool },
209
+ { :var => :build_msi, :envvar => :MSI, :type => :bool },
210
+ { :var => :build_pe, :envvar => :PE_BUILD, :type => :bool },
211
+ { :var => :build_tar, :envvar => :TAR, :type => :bool },
212
+ { :var => :certificate_pem, :envvar => :CERT_PEM },
213
+ { :var => :cows, :envvar => :COW },
214
+ { :var => :debug, :envvar => :DEBUG, :type => :bool },
215
+ { :var => :default_cow, :envvar => :COW },
216
+ { :var => :default_mock, :envvar => :MOCK },
217
+ { :var => :dev_build, :envvar => :DEV_BUILD, :type => :bool },
218
+ { :var => :dmg_host, :envvar => :DMG_HOST },
219
+ { :var => :dmg_path, :envvar => :DMG_PATH },
220
+ { :var => :dmg_staging_server, :envvar => :DMG_STAGING_SERVER },
221
+ { :var => :final_mocks, :envvar => :MOCK },
222
+ { :var => :foss_only, :envvar => :FOSS_ONLY, :type => :bool },
223
+ { :var => :foss_platforms, :envvar => :FOSS_PLATFORMS, :type => :array },
224
+ { :var => :gem_host, :envvar => :GEM_HOST },
225
+ { :var => :gpg_key, :envvar => :GPG_KEY },
226
+ { :var => :gpg_name, :envvar => :GPG_NAME },
227
+ { :var => :ips_host, :envvar => :IPS_HOST },
228
+ { :var => :ips_inter_cert, :envvar => :IPS_INTER_CERT },
229
+ { :var => :ips_path, :envvar => :IPS_PATH },
230
+ { :var => :ips_repo, :envvar => :IPS_REPO },
231
+ { :var => :ips_root_cert, :envvar => :IPS_ROOT_CERT },
232
+ { :var => :ips_signing_cert, :envvar => :IPS_SIGNING_CERT },
233
+ { :var => :ips_signing_key, :envvar => :IPS_SIGNING_KEY },
234
+ { :var => :ips_signing_server, :envvar => :IPS_SIGNING_SERVER },
235
+ { :var => :ips_signing_ssh_key, :envvar => :IPS_SIGNING_SSH_KEY },
236
+ { :var => :msi_host, :envvar => :MSI_HOST },
237
+ { :var => :msi_path, :envvar => :MSI_PATH },
238
+ { :var => :msi_signing_cert, :envvar => :MSI_SIGNING_CERT },
239
+ { :var => :msi_signing_cert_pw, :envvar => :MSI_SIGNING_CERT_PW },
240
+ { :var => :msi_signing_server, :envvar => :MSI_SIGNING_SERVER },
241
+ { :var => :msi_signing_ssh_key, :envvar => :MSI_SIGNING_SSH_KEY },
242
+ { :var => :msi_staging_server, :envvar => :MSI_STAGING_SERVER },
243
+ { :var => :nonfinal_apt_repo_command, :envvar => :NONFINAL_APT_REPO_COMMAND },
244
+ { :var => :nonfinal_apt_repo_path, :envvar => :NONFINAL_APT_REPO_PATH },
245
+ { :var => :nonfinal_apt_repo_staging_path, :envvar => :NONFINAL_APT_REPO_STAGING_PATH },
246
+ { :var => :nonfinal_dmg_path, :envvar => :NONFINAL_DMG_PATH },
247
+ { :var => :nonfinal_ips_path, :envvar => :NONFINAL_IPS_PATH },
248
+ { :var => :nonfinal_msi_path, :envvar => :NONFINAL_MSI_PATH },
249
+ { :var => :nonfinal_p5p_path, :envvar => :NONFINAL_P5P_PATH },
250
+ { :var => :nonfinal_repo_link_target, :envvar => :NONFINAL_REPO_LINK_TARGET },
251
+ { :var => :nonfinal_repo_name, :envvar => :NONFINAL_REPO_NAME },
252
+ { :var => :nonfinal_svr4_path, :envvar => :NONFINAL_SVR4_PATH },
253
+ { :var => :nonfinal_swix_path, :envvar => :NONFINAL_SWIX_PATH },
254
+ { :var => :nonfinal_yum_repo_path, :envvar => :NONFINAL_YUM_REPO_PATH },
255
+ { :var => :notify, :envvar => :NOTIFY },
256
+ { :var => :nuget_host, :envvar => :NUGET_HOST },
257
+ { :var => :nuget_repo_path, :envvar => :NUGET_REPO },
258
+ { :var => :osx_signing_cert, :envvar => :OSX_SIGNING_CERT },
259
+ { :var => :osx_signing_keychain, :envvar => :OSX_SIGNING_KEYCHAIN },
260
+ { :var => :osx_signing_keychain_pw, :envvar => :OSX_SIGNING_KEYCHAIN_PW },
261
+ { :var => :osx_signing_server, :envvar => :OSX_SIGNING_SERVER },
262
+ { :var => :osx_signing_ssh_key, :envvar => :OSX_SIGNING_SSH_KEY },
263
+ { :var => :p5p_host, :envvar => :P5P_HOST },
264
+ { :var => :p5p_path, :envvar => :P5P_PATH },
265
+ { :var => :packager, :envvar => :PACKAGER },
266
+ { :var => :pbuild_conf, :envvar => :PBUILDCONF },
267
+ { :var => :pe_feature_branch, :envvar => :PE_FEATURE_BRANCH },
268
+ { :var => :pe_version, :envvar => :PE_VER },
269
+ { :var => :privatekey_pem, :envvar => :PRIVATE_PEM },
270
+ { :var => :project_root, :envvar => :PROJECT_ROOT },
271
+ { :var => :random_mockroot, :envvar => :RANDOM_MOCKROOT, :type => :bool },
272
+ { :var => :rc_mocks, :envvar => :MOCK },
273
+ { :var => :release, :envvar => :RELEASE },
274
+ { :var => :repo_name, :envvar => :REPO_NAME },
275
+ { :var => :repo_link_target, :envvar => :REPO_LINK_TARGET },
276
+ { :var => :s3_ship, :envvar => :S3_SHIP, :type => :bool },
277
+ { :var => :sign_tar, :envvar => :SIGN_TAR, :type => :bool },
278
+ { :var => :signing_server, :envvar => :SIGNING_SERVER },
279
+ { :var => :staging_server, :envvar => :STAGING_SERVER },
280
+ { :var => :swix_host, :envvar => :SWIX_HOST },
281
+ { :var => :swix_staging_server, :envvar => :SWIX_STAGING_SERVER },
282
+ { :var => :svr4_host, :envvar => :SVR4_HOST },
283
+ { :var => :svr4_path, :envvar => :SVR4_PATH },
284
+ { :var => :swix_path, :envvar => :SWIX_PATH },
285
+ { :var => :tar_host, :envvar => :TAR_HOST },
286
+ { :var => :tar_staging_server, :envvar => :TAR_STAGING_SERVER },
287
+ { :var => :team, :envvar => :TEAM },
288
+ { :var => :update_version_file, :envvar => :NEW_STYLE_PACKAGE },
289
+ { :var => :vanagon_project, :envvar => :VANAGON_PROJECT, :type => :bool },
290
+ { :var => :yum_host, :envvar => :YUM_HOST },
291
+ { :var => :yum_repo_path, :envvar => :YUM_REPO },
292
+ { :var => :yum_staging_server, :envvar => :YUM_STAGING_SERVER },
293
+ { :var => :internal_gem_host, :envvar => :INTERNAL_GEM_HOST },
294
+ { :var => :internal_nexus_host, :envvar => :INTERNAL_NEXUS_HOST },
295
+ { :var => :internal_stickler_host, :envvar => :INTERNAL_STICKLER_HOST },
296
+ ]
297
+ # Default values that are supplied if the user does not supply them
298
+ #
299
+ # usage is the same as above
300
+ #
301
+ DEFAULTS = [{ :var => :allow_dirty_tree, :val => false },
302
+ { :var => :builder_data_file, :val => 'builder_data.yaml' },
303
+ { :var => :team, :val => 'dev' },
304
+ { :var => :random_mockroot, :val => true },
305
+ { :var => :keychain_loaded, :val => false },
306
+ { :var => :foss_only, :val => false },
307
+ { :var => :build_data_repo, :val => 'https://github.com/puppetlabs/build-data.git' },
308
+ { :var => :build_date, :val => Pkg::Util::Date.timestamp('-') },
309
+ { :var => :release, :val => '1' },
310
+ { :var => :internal_gem_host, :val => 'https://artifactory.delivery.puppetlabs.net/artifactory/api/gems/rubygems/' },
311
+ { :var => :build_tar, :val => true },
312
+ { :var => :dev_build, :val => false },
313
+ { :var => :osx_signing_cert, :val => '$OSX_SIGNING_CERT' },
314
+ { :var => :osx_signing_keychain, :val => '$OSX_SIGNING_KEYCHAIN' },
315
+ { :var => :osx_signing_keychain_pw, :val => '$OSX_SIGNING_KEYCHAIN_PW' },
316
+ { :var => :ips_signing_cert, :val => '$IPS_SIGNING_CERT' },
317
+ { :var => :ips_inter_cert, :val => '$IPS_INTER_CERT' },
318
+ { :var => :ips_root_cert, :val => '$IPS_ROOT_CERT' },
319
+ { :var => :ips_signing_key, :val => '$IPS_SIGNING_KEY' },
320
+ { :var => :msi_signing_cert, :val => '$MSI_SIGNING_CERT' },
321
+ { :var => :msi_signing_cert_pw, :val => '$MSI_SIGNING_CERT_PW' },
322
+ { :var => :pe_feature_branch, :val => false },
323
+ { :var => :s3_ship, :val => false },
324
+ { :var => :apt_releases, :val => Pkg::Platforms.codenames }]
325
+
326
+ # These are variables which, over time, we decided to rename or replace. For
327
+ # backwards compatibility, we assign the value of the old/deprecated
328
+ # variables, if set, to the new ones. We also use this method for accessor
329
+ # "redirects" - e.g. defaulting the populated value of one parameter for another
330
+ # in case it is not set.
331
+ #
332
+ REASSIGNMENTS = [
333
+ { :oldvar => :internal_gem_host, :newvar => :internal_nexus_host },
334
+ { :oldvar => :internal_gem_host, :newvar => :internal_stickler_host },
335
+ # These are fall-through values for shipping endpoints
336
+ { :oldvar => :staging_server, :newvar => :apt_staging_server },
337
+ { :oldvar => :staging_server, :newvar => :dmg_staging_server },
338
+ { :oldvar => :staging_server, :newvar => :swix_staging_server },
339
+ { :oldvar => :staging_server, :newvar => :tar_staging_server },
340
+ { :oldvar => :staging_server, :newvar => :yum_staging_server },
341
+ # These are fall-through values for signing/repo endpoints
342
+ { :oldvar => :yum_staging_server, :newvar => :yum_host },
343
+ { :oldvar => :apt_repo_staging_path, :newvar => :apt_repo_path },
344
+ { :oldvar => :apt_signing_server, :newvar => :apt_host },
345
+ # These are legitimately old values
346
+ { :oldvar => :gem_devel_dependencies, :newvar => :gem_development_dependencies },
347
+ { :oldvar => :gpg_name, :newvar => :gpg_key },
348
+ { :oldvar => :name, :newvar => :project },
349
+ { :oldvar => :pe_name, :newvar => :project },
350
+ { :oldvar => :project, :newvar => :gem_name },
351
+ { :oldvar => :yum_host, :newvar => :swix_host },
352
+ { :oldvar => :yum_host, :newvar => :dmg_host },
353
+ { :oldvar => :yum_host, :newvar => :tar_host },
354
+ ]
355
+
356
+ # These are variables that we have deprecated. If they are encountered in a
357
+ # project's config, we issue deprecations for them.
358
+ #
359
+ DEPRECATIONS = [{ :var => :gem_devel_dependencies, :message => "
360
+ DEPRECATED, 9-Nov-2013: 'gem_devel_dependencies' has been replaced with
361
+ 'gem_development_dependencies.' Please update this field in your
362
+ build_defaults.yaml or project_data.yaml" },
363
+ { :var => :gpg_name, :message => "
364
+ DEPRECATED, 29-Jul-2014: 'gpg_name' has been replaced with 'gpg_key'.
365
+ Please update this field in your build_defaults.yaml" }]
366
+ 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,263 @@
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_ssh_cmd(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_ssh_cmd(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
+ 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_ssh_cmd(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
+ if dists
163
+ dists.each do |dist|
164
+ next unless supported_codenames.include?(dist)
165
+ arches = Pkg::Platforms.arches_for_codename(dist)
166
+ Dir.chdir("#{target}/apt/#{dist}") do
167
+ File.open("conf/distributions", "w") do |f|
168
+ f.puts "Origin: Puppet Labs
169
+ Label: Puppet Labs
170
+ Codename: #{dist}
171
+ Architectures: #{(DEBIAN_PACKAGING_ARCHES + arches).uniq.join(' ')}
172
+ Components: #{reprepro_repo_name}
173
+ Description: #{message} for #{dist}
174
+ SignWith: #{Pkg::Config.gpg_key}"
175
+ end
176
+
177
+ stdout, _, _ = Pkg::Util::Execution.capture3("#{reprepro} -vvv --confdir ./conf --dbdir ./db --basedir ./ export")
178
+ stdout
179
+ end
180
+ end
181
+ else
182
+ warn "No repos found to sign. Maybe you didn't build any debs, or the repo creation failed?"
183
+ end
184
+ end
185
+
186
+ # @deprecated this command will die a painful death when we are
187
+ # able to sit down with Operations and refactor our distribution infra.
188
+ # For now, it's extremely debian specific, which is why it lives here.
189
+ # - Ryan McKern 11/2015
190
+ #
191
+ # @param origin_path [String] path for Deb repos on local filesystem
192
+ # @param destination_path [String] path for Deb repos on remote filesystem
193
+ # @param destination [String] remote host to send rsynced content to. If
194
+ # nil will copy locally
195
+ # @param dryrun [Boolean] whether or not to use '--dry-run'
196
+ #
197
+ # @return [String] an rsync command that can be executed on a remote host
198
+ # to copy local content from that host to a remote node.
199
+ def repo_deployment_command(origin_path, destination_path, destination, dryrun = false)
200
+ path = Pathname.new(origin_path)
201
+ dest_path = Pathname.new(destination_path)
202
+
203
+ # You may think "rsync doesn't actually remove the sticky bit, let's
204
+ # remove the Dugo-s from the chmod". However, that will make your rsyncs
205
+ # fail due to permission errors.
206
+ options = %w(
207
+ rsync
208
+ --itemize-changes
209
+ --hard-links
210
+ --copy-links
211
+ --omit-dir-times
212
+ --progress
213
+ --archive
214
+ --update
215
+ --verbose
216
+ --super
217
+ --delay-updates
218
+ --omit-dir-times
219
+ --no-perms
220
+ --no-owner
221
+ --no-group
222
+ --exclude='dists/*-*'
223
+ --exclude='pool/*-*'
224
+ )
225
+
226
+ options << '--dry-run' if dryrun
227
+ options << path
228
+ if !destination.nil?
229
+ options << "#{destination}:#{dest_path.parent}"
230
+ else
231
+ options << "#{dest_path.parent}"
232
+ end
233
+ options.join("\s")
234
+ end
235
+
236
+ # @deprecated this command will die a painful death when we are
237
+ # able to sit down with Operations and refactor our distribution infra.
238
+ # It's extremely Debian specific due to how Debian repos are signed,
239
+ # which is why it lives here.
240
+ # Yes, it is basically just a layer of indirection around the task
241
+ # of copying content from one node to another. No, I am not proud
242
+ # of it. - Ryan McKern 11/2015
243
+ #
244
+ # @param apt_path [String] path for Deb repos on local and remote filesystem
245
+ # @param destination_staging_path [String] staging path for Deb repos on
246
+ # remote filesystem
247
+ # @param origin_server [String] remote host to start the rsync from
248
+ # @param destination_server [String] remote host to send rsynced content to
249
+ # @param dryrun [Boolean] whether or not to use '--dry-run'
250
+ def deploy_repos(apt_path, destination_staging_path, origin_server, destination_server, dryrun = false)
251
+ rsync_command = repo_deployment_command(apt_path, destination_staging_path, destination_server, dryrun)
252
+ cp_command = repo_deployment_command(destination_staging_path, apt_path, nil, dryrun)
253
+
254
+ Pkg::Util::Net.remote_ssh_cmd(origin_server, rsync_command)
255
+ if dryrun
256
+ puts "[DRYRUN] not executing #{cp_command} on #{destination_server}"
257
+ else
258
+ Pkg::Util::Net.remote_ssh_cmd(destination_server, cp_command)
259
+ end
260
+ end
261
+
262
+ end
263
+ end