r10k 3.5.2

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 (358) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +1 -0
  3. data/.github/pull_request_template.md +1 -0
  4. data/.github/workflows/docker.yml +56 -0
  5. data/.github/workflows/release.yml +36 -0
  6. data/.gitignore +9 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.mkd +1759 -0
  9. data/CODEOWNERS +2 -0
  10. data/CONTRIBUTING.mkd +105 -0
  11. data/Gemfile +15 -0
  12. data/LICENSE +14 -0
  13. data/README.mkd +118 -0
  14. data/Rakefile +3 -0
  15. data/azure-pipelines.yml +86 -0
  16. data/bin/r10k +17 -0
  17. data/doc/common-patterns.mkd +44 -0
  18. data/doc/dynamic-environments.mkd +31 -0
  19. data/doc/dynamic-environments/configuration.mkd +669 -0
  20. data/doc/dynamic-environments/git-environments.mkd +75 -0
  21. data/doc/dynamic-environments/introduction.mkd +69 -0
  22. data/doc/dynamic-environments/master-configuration.mkd +40 -0
  23. data/doc/dynamic-environments/quickstart.mkd +201 -0
  24. data/doc/dynamic-environments/svn-environments.mkd +45 -0
  25. data/doc/dynamic-environments/usage.mkd +132 -0
  26. data/doc/dynamic-environments/workflow-guide.mkd +247 -0
  27. data/doc/faq.mkd +164 -0
  28. data/doc/git/cloning-and-mirroring.mkd +60 -0
  29. data/doc/git/providers.mkd +111 -0
  30. data/doc/puppetfile.mkd +309 -0
  31. data/doc/updating-your-puppetfile.mkd +38 -0
  32. data/docker/.gitignore +1 -0
  33. data/docker/.rspec +4 -0
  34. data/docker/Gemfile +11 -0
  35. data/docker/Makefile +89 -0
  36. data/docker/README.md +28 -0
  37. data/docker/r10k/Dockerfile +67 -0
  38. data/docker/r10k/adduser.sh +13 -0
  39. data/docker/r10k/docker-entrypoint.d/10-analytics.sh +30 -0
  40. data/docker/r10k/docker-entrypoint.sh +11 -0
  41. data/docker/r10k/release.Dockerfile +54 -0
  42. data/docker/spec/dockerfile_spec.rb +43 -0
  43. data/docker/spec/fixtures/Puppetfile +2 -0
  44. data/integration/Gemfile +19 -0
  45. data/integration/README.mkd +29 -0
  46. data/integration/Rakefile +77 -0
  47. data/integration/component/pre-suite/05_install_dev_r10k.rb +12 -0
  48. data/integration/files/README.mkd +4 -0
  49. data/integration/files/hiera.yaml +8 -0
  50. data/integration/files/modules/helloworld/manifests/init.pp +3 -0
  51. data/integration/files/modules/hieratest/manifests/init.pp +3 -0
  52. data/integration/files/modules/unicode/files/pretend_unicode +1 -0
  53. data/integration/files/modules/unicode/manifests/init.pp +6 -0
  54. data/integration/files/pre-suite/git_config.pp.erb +19 -0
  55. data/integration/files/pre-suite/prod_env.config +3 -0
  56. data/integration/files/r10k_conf.yaml.erb +9 -0
  57. data/integration/lib/README.mkd +4 -0
  58. data/integration/lib/git_utils.rb +205 -0
  59. data/integration/lib/master_manipulator.rb +205 -0
  60. data/integration/lib/r10k_utils.rb +222 -0
  61. data/integration/manifests/README.mkd +4 -0
  62. data/integration/pre-suite/00_pe_install.rb +6 -0
  63. data/integration/pre-suite/10_git_config.rb +48 -0
  64. data/integration/pre-suite/20_pe_r10k.rb +55 -0
  65. data/integration/pre-suite/README.mkd +5 -0
  66. data/integration/tests/Puppetfile/HTTP_PROXY_affects_forge_source.rb +72 -0
  67. data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +70 -0
  68. data/integration/tests/README.mkd +4 -0
  69. data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +83 -0
  70. data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +51 -0
  71. data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +28 -0
  72. data/integration/tests/basic_functionality/negative/neg_invalid_git_provider.rb +45 -0
  73. data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +34 -0
  74. data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +103 -0
  75. data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +128 -0
  76. data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +61 -0
  77. data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +109 -0
  78. data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +108 -0
  79. data/integration/tests/command_line/deploy_env_without_mod_update.rb +76 -0
  80. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +77 -0
  81. data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +23 -0
  82. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +70 -0
  83. data/integration/tests/git_source/git_source_git.rb +128 -0
  84. data/integration/tests/git_source/git_source_ssh.rb +87 -0
  85. data/integration/tests/git_source/git_source_submodule.rb +70 -0
  86. data/integration/tests/git_source/negative/neg_git_broken_remote.rb +38 -0
  87. data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +46 -0
  88. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +73 -0
  89. data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +35 -0
  90. data/integration/tests/i18n/deploy_module_with_unicode_in_file_name.rb +64 -0
  91. data/integration/tests/purging/content_not_purged_at_root.rb +89 -0
  92. data/integration/tests/purging/default_purging.rb +125 -0
  93. data/integration/tests/purging/does_not_purge_files_on_white_list.rb +93 -0
  94. data/integration/tests/purging/invalid_whitelist_types.rb +63 -0
  95. data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
  96. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +111 -0
  97. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +117 -0
  98. data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +100 -0
  99. data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +133 -0
  100. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +161 -0
  101. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +46 -0
  102. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +48 -0
  103. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +45 -0
  104. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +43 -0
  105. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +45 -0
  106. data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +64 -0
  107. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +75 -0
  108. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +44 -0
  109. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +58 -0
  110. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +34 -0
  111. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +36 -0
  112. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +49 -0
  113. data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +58 -0
  114. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +51 -0
  115. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +75 -0
  116. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +104 -0
  117. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +81 -0
  118. data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +49 -0
  119. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +75 -0
  120. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +82 -0
  121. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +68 -0
  122. data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +94 -0
  123. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +93 -0
  124. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +117 -0
  125. data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +60 -0
  126. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +166 -0
  127. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +163 -0
  128. data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +111 -0
  129. data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +78 -0
  130. data/integration/tests/user_scenario/complex_workflow/single_env_git_module_update.rb +100 -0
  131. data/lib/r10k.rb +11 -0
  132. data/lib/r10k/action/base.rb +31 -0
  133. data/lib/r10k/action/cri_runner.rb +72 -0
  134. data/lib/r10k/action/deploy.rb +9 -0
  135. data/lib/r10k/action/deploy/deploy_helpers.rb +34 -0
  136. data/lib/r10k/action/deploy/display.rb +89 -0
  137. data/lib/r10k/action/deploy/environment.rb +196 -0
  138. data/lib/r10k/action/deploy/module.rb +84 -0
  139. data/lib/r10k/action/puppetfile.rb +10 -0
  140. data/lib/r10k/action/puppetfile/check.rb +31 -0
  141. data/lib/r10k/action/puppetfile/cri_runner.rb +26 -0
  142. data/lib/r10k/action/puppetfile/install.rb +45 -0
  143. data/lib/r10k/action/puppetfile/purge.rb +28 -0
  144. data/lib/r10k/action/runner.rb +96 -0
  145. data/lib/r10k/action/visitor.rb +31 -0
  146. data/lib/r10k/cli.rb +51 -0
  147. data/lib/r10k/cli/deploy.rb +114 -0
  148. data/lib/r10k/cli/ext/logging.rb +15 -0
  149. data/lib/r10k/cli/help.rb +7 -0
  150. data/lib/r10k/cli/puppetfile.rb +74 -0
  151. data/lib/r10k/cli/version.rb +31 -0
  152. data/lib/r10k/deployment.rb +132 -0
  153. data/lib/r10k/deployment/config.rb +56 -0
  154. data/lib/r10k/environment.rb +37 -0
  155. data/lib/r10k/environment/bare.rb +16 -0
  156. data/lib/r10k/environment/base.rb +150 -0
  157. data/lib/r10k/environment/git.rb +81 -0
  158. data/lib/r10k/environment/name.rb +86 -0
  159. data/lib/r10k/environment/svn.rb +91 -0
  160. data/lib/r10k/environment/with_modules.rb +139 -0
  161. data/lib/r10k/errors.rb +61 -0
  162. data/lib/r10k/errors/formatting.rb +28 -0
  163. data/lib/r10k/feature.rb +56 -0
  164. data/lib/r10k/feature/collection.rb +23 -0
  165. data/lib/r10k/features.rb +20 -0
  166. data/lib/r10k/forge/module_release.rb +228 -0
  167. data/lib/r10k/git.rb +196 -0
  168. data/lib/r10k/git/alternates.rb +63 -0
  169. data/lib/r10k/git/cache.rb +108 -0
  170. data/lib/r10k/git/errors.rb +34 -0
  171. data/lib/r10k/git/rugged.rb +17 -0
  172. data/lib/r10k/git/rugged/bare_repository.rb +85 -0
  173. data/lib/r10k/git/rugged/base_repository.rb +93 -0
  174. data/lib/r10k/git/rugged/cache.rb +11 -0
  175. data/lib/r10k/git/rugged/credentials.rb +91 -0
  176. data/lib/r10k/git/rugged/thin_repository.rb +89 -0
  177. data/lib/r10k/git/rugged/working_repository.rb +145 -0
  178. data/lib/r10k/git/shellgit.rb +9 -0
  179. data/lib/r10k/git/shellgit/bare_repository.rb +43 -0
  180. data/lib/r10k/git/shellgit/base_repository.rb +137 -0
  181. data/lib/r10k/git/shellgit/cache.rb +11 -0
  182. data/lib/r10k/git/shellgit/thin_repository.rb +69 -0
  183. data/lib/r10k/git/shellgit/working_repository.rb +111 -0
  184. data/lib/r10k/git/stateful_repository.rb +95 -0
  185. data/lib/r10k/initializers.rb +67 -0
  186. data/lib/r10k/instance_cache.rb +32 -0
  187. data/lib/r10k/keyed_factory.rb +39 -0
  188. data/lib/r10k/logging.rb +109 -0
  189. data/lib/r10k/logging/terminaloutputter.rb +36 -0
  190. data/lib/r10k/module.rb +38 -0
  191. data/lib/r10k/module/base.rb +113 -0
  192. data/lib/r10k/module/forge.rb +177 -0
  193. data/lib/r10k/module/git.rb +109 -0
  194. data/lib/r10k/module/local.rb +36 -0
  195. data/lib/r10k/module/metadata_file.rb +31 -0
  196. data/lib/r10k/module/svn.rb +112 -0
  197. data/lib/r10k/puppetfile.rb +286 -0
  198. data/lib/r10k/settings.rb +194 -0
  199. data/lib/r10k/settings/collection.rb +123 -0
  200. data/lib/r10k/settings/container.rb +97 -0
  201. data/lib/r10k/settings/definition.rb +124 -0
  202. data/lib/r10k/settings/enum_definition.rb +30 -0
  203. data/lib/r10k/settings/helpers.rb +38 -0
  204. data/lib/r10k/settings/list.rb +107 -0
  205. data/lib/r10k/settings/loader.rb +99 -0
  206. data/lib/r10k/settings/mixin.rb +54 -0
  207. data/lib/r10k/settings/uri_definition.rb +19 -0
  208. data/lib/r10k/source.rb +42 -0
  209. data/lib/r10k/source/base.rb +74 -0
  210. data/lib/r10k/source/exec.rb +51 -0
  211. data/lib/r10k/source/git.rb +142 -0
  212. data/lib/r10k/source/hash.rb +182 -0
  213. data/lib/r10k/source/svn.rb +136 -0
  214. data/lib/r10k/source/yaml.rb +20 -0
  215. data/lib/r10k/source/yamldir.rb +32 -0
  216. data/lib/r10k/svn.rb +6 -0
  217. data/lib/r10k/svn/remote.rb +68 -0
  218. data/lib/r10k/svn/working_dir.rb +125 -0
  219. data/lib/r10k/util/attempt.rb +84 -0
  220. data/lib/r10k/util/basedir.rb +65 -0
  221. data/lib/r10k/util/commands.rb +31 -0
  222. data/lib/r10k/util/exec_env.rb +36 -0
  223. data/lib/r10k/util/license.rb +24 -0
  224. data/lib/r10k/util/platform.rb +42 -0
  225. data/lib/r10k/util/purgeable.rb +88 -0
  226. data/lib/r10k/util/setopts.rb +55 -0
  227. data/lib/r10k/util/subprocess.rb +84 -0
  228. data/lib/r10k/util/subprocess/result.rb +56 -0
  229. data/lib/r10k/util/subprocess/runner.rb +26 -0
  230. data/lib/r10k/util/subprocess/runner/jruby.rb +23 -0
  231. data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
  232. data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
  233. data/lib/r10k/util/subprocess/runner/windows.rb +23 -0
  234. data/lib/r10k/util/subprocess/subprocess_error.rb +24 -0
  235. data/lib/r10k/util/symbolize_keys.rb +35 -0
  236. data/lib/r10k/version.rb +6 -0
  237. data/locales/config.yaml +21 -0
  238. data/locales/r10k.pot +545 -0
  239. data/r10k.gemspec +50 -0
  240. data/r10k.yaml.example +112 -0
  241. data/spec/fixtures/empty/.empty +0 -0
  242. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  243. data/spec/fixtures/module/forge/bad_module/metadata.json +1 -0
  244. data/spec/fixtures/module/forge/eight_hundred/Modulefile +8 -0
  245. data/spec/fixtures/module/forge/eight_hundred/metadata.json +19 -0
  246. data/spec/fixtures/unit/action/r10k.yaml +5 -0
  247. data/spec/fixtures/unit/action/r10k_cachedir.yaml +2 -0
  248. data/spec/fixtures/unit/action/r10k_generate_types.yaml +3 -0
  249. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +3 -0
  250. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +1 -0
  251. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
  252. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +10 -0
  253. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +1 -0
  254. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +1 -0
  255. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +1 -0
  256. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +1 -0
  257. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +1 -0
  258. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  259. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  260. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  261. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  262. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  263. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  264. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +3 -0
  265. data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
  266. data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
  267. data/spec/integration/git/rugged/working_repository_spec.rb +48 -0
  268. data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
  269. data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
  270. data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
  271. data/spec/integration/git/stateful_repository_spec.rb +159 -0
  272. data/spec/matchers/exit_with.rb +28 -0
  273. data/spec/matchers/match_realpath.rb +18 -0
  274. data/spec/r10k-mocks.rb +3 -0
  275. data/spec/r10k-mocks/mock_config.rb +33 -0
  276. data/spec/r10k-mocks/mock_env.rb +15 -0
  277. data/spec/r10k-mocks/mock_source.rb +13 -0
  278. data/spec/shared-contexts/git-fixtures.rb +55 -0
  279. data/spec/shared-examples/deploy-actions.rb +69 -0
  280. data/spec/shared-examples/git-repository.rb +38 -0
  281. data/spec/shared-examples/git/bare_repository.rb +132 -0
  282. data/spec/shared-examples/git/thin_repository.rb +26 -0
  283. data/spec/shared-examples/git/working_repository.rb +207 -0
  284. data/spec/shared-examples/puppetfile-action.rb +39 -0
  285. data/spec/shared-examples/settings/ancestry.rb +44 -0
  286. data/spec/shared-examples/subprocess-runner.rb +83 -0
  287. data/spec/spec_helper.rb +40 -0
  288. data/spec/unit/action/cri_runner_spec.rb +72 -0
  289. data/spec/unit/action/deploy/deploy_helpers_spec.rb +38 -0
  290. data/spec/unit/action/deploy/display_spec.rb +31 -0
  291. data/spec/unit/action/deploy/environment_spec.rb +395 -0
  292. data/spec/unit/action/deploy/module_spec.rb +139 -0
  293. data/spec/unit/action/puppetfile/check_spec.rb +41 -0
  294. data/spec/unit/action/puppetfile/cri_runner_spec.rb +47 -0
  295. data/spec/unit/action/puppetfile/install_spec.rb +84 -0
  296. data/spec/unit/action/puppetfile/purge_spec.rb +42 -0
  297. data/spec/unit/action/runner_spec.rb +213 -0
  298. data/spec/unit/action/visitor_spec.rb +39 -0
  299. data/spec/unit/cli_spec.rb +9 -0
  300. data/spec/unit/deployment/config_spec.rb +33 -0
  301. data/spec/unit/deployment_spec.rb +162 -0
  302. data/spec/unit/environment/base_spec.rb +109 -0
  303. data/spec/unit/environment/git_spec.rb +97 -0
  304. data/spec/unit/environment/name_spec.rb +135 -0
  305. data/spec/unit/environment/svn_spec.rb +133 -0
  306. data/spec/unit/errors/formatting_spec.rb +84 -0
  307. data/spec/unit/feature_spec.rb +50 -0
  308. data/spec/unit/forge/module_release_spec.rb +213 -0
  309. data/spec/unit/git/alternates_spec.rb +116 -0
  310. data/spec/unit/git/cache_spec.rb +55 -0
  311. data/spec/unit/git/rugged/cache_spec.rb +29 -0
  312. data/spec/unit/git/rugged/credentials_spec.rb +109 -0
  313. data/spec/unit/git/shellgit/cache_spec.rb +27 -0
  314. data/spec/unit/git/stateful_repository_spec.rb +40 -0
  315. data/spec/unit/git_spec.rb +102 -0
  316. data/spec/unit/initializers_spec.rb +68 -0
  317. data/spec/unit/instance_cache_spec.rb +78 -0
  318. data/spec/unit/keyed_factory_spec.rb +51 -0
  319. data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
  320. data/spec/unit/logging_spec.rb +68 -0
  321. data/spec/unit/module/base_spec.rb +72 -0
  322. data/spec/unit/module/forge_spec.rb +207 -0
  323. data/spec/unit/module/git_spec.rb +274 -0
  324. data/spec/unit/module/metadata_file_spec.rb +68 -0
  325. data/spec/unit/module/svn_spec.rb +178 -0
  326. data/spec/unit/module_spec.rb +29 -0
  327. data/spec/unit/puppetfile_spec.rb +300 -0
  328. data/spec/unit/settings/collection_spec.rb +123 -0
  329. data/spec/unit/settings/container_spec.rb +92 -0
  330. data/spec/unit/settings/definition_spec.rb +79 -0
  331. data/spec/unit/settings/enum_definition_spec.rb +20 -0
  332. data/spec/unit/settings/inheritance_spec.rb +38 -0
  333. data/spec/unit/settings/list_spec.rb +88 -0
  334. data/spec/unit/settings/loader_spec.rb +110 -0
  335. data/spec/unit/settings/uri_definition_spec.rb +23 -0
  336. data/spec/unit/settings_spec.rb +246 -0
  337. data/spec/unit/source/base_spec.rb +31 -0
  338. data/spec/unit/source/exec_spec.rb +81 -0
  339. data/spec/unit/source/git_spec.rb +185 -0
  340. data/spec/unit/source/hash_spec.rb +54 -0
  341. data/spec/unit/source/svn_spec.rb +196 -0
  342. data/spec/unit/source/yaml_spec.rb +42 -0
  343. data/spec/unit/source_spec.rb +10 -0
  344. data/spec/unit/svn/remote_spec.rb +21 -0
  345. data/spec/unit/svn/working_dir_spec.rb +56 -0
  346. data/spec/unit/util/attempt_spec.rb +82 -0
  347. data/spec/unit/util/commands_spec.rb +61 -0
  348. data/spec/unit/util/exec_env_spec.rb +56 -0
  349. data/spec/unit/util/purgeable_spec.rb +230 -0
  350. data/spec/unit/util/setopts_spec.rb +59 -0
  351. data/spec/unit/util/subprocess/result_spec.rb +36 -0
  352. data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
  353. data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
  354. data/spec/unit/util/subprocess/runner/windows_spec.rb +7 -0
  355. data/spec/unit/util/subprocess/subprocess_error_spec.rb +26 -0
  356. data/spec/unit/util/subprocess_spec.rb +65 -0
  357. data/spec/unit/util/symbolize_keys_spec.rb +67 -0
  358. metadata +582 -0
@@ -0,0 +1,247 @@
1
+ R10k's dynamic deployments work best with a workflow that understands and
2
+ respects how r10k works, to prevent automation and manual processes from
3
+ conflicting. Your workflow will need to be customized to meet your team's
4
+ skills, tools, and needs. This guide describes a generic workflow that can
5
+ be customized easily.
6
+
7
+ This guide assumes that each of your modules is in a separate repository
8
+ and that the `Puppetfile` is in its own repo called the
9
+ [Control Repo](http://technoblogic.io/blog/2014/05/16/r10k-control-repos/).
10
+ All module repos have a primary branch of *master* and the Control's primary
11
+ branch is *production*. All changes are made through r10k and no user makes
12
+ manual changes to the environments under **/etc/puppet**.
13
+
14
+ Adding New Modules
15
+ ------------------
16
+
17
+ This workflow is useful when adding a forge or internally-developed module
18
+ to your puppet environment.
19
+
20
+ ### Create new feature branch
21
+
22
+ Create a new feature branch in your module repositories. Do this for each
23
+ repository, including the control repository, that will reference the new
24
+ module. You do not need to do so for modules that are not being edited.
25
+
26
+ ```git checkout -b feature```
27
+
28
+ If you are simply adding the module at this time and not referencing it in
29
+ other modules or manifests, only the Control repo requires a new branch.
30
+
31
+ ### Add new module and branches to control repo
32
+
33
+ The new module is added to the control repository's `Puppetfile` like so:
34
+
35
+ ```
36
+ # Forge modules:
37
+ mod "puppetlabs/ntp"
38
+
39
+ # Your modules:
40
+ mod "custom_facts",
41
+ :git => "git://github.com/user/custom_facts"
42
+ ```
43
+
44
+ For any existing modules that you branched, add a reference to the new branch
45
+ name. Don't forget the comma at the end of the *:git* value.
46
+
47
+ ```
48
+ mod "other_module",
49
+ :git => "git://github.com/user/other_module",
50
+ :ref => "feature"
51
+ ```
52
+
53
+ ### Reference new module in manifests, modules, and hiera
54
+
55
+ If you are simply adding the module at this time and not referencing it in
56
+ other modules or manifests, you may skip this step.
57
+
58
+ Edit your existing manifests, modules, and hiera as needed to make sure of
59
+ the new module.
60
+
61
+ ### Deploy environments
62
+
63
+ Save all your changes in each module repo. Commit and push the changes upstream:
64
+
65
+ ```
66
+ git commit -a -m ‘Add feature reference to module’
67
+ git push origin feature
68
+ ```
69
+
70
+ Commit and push the change in your control repo upstream:
71
+
72
+ ```
73
+ git commit -a -m ‘Add module puppetlabs/ntp to branch feature'
74
+ git push origin feature
75
+ ```
76
+
77
+ Finally, deploy the environments via r10k. This step must occur on the master:
78
+
79
+ ```r10k deploy environment -p```
80
+
81
+ Add the **-v** option for verbosity if you need to troubleshoot any errors. The
82
+ new branch should be located at `$environmentpath/feature`.
83
+
84
+
85
+ ### Test the new module branches
86
+
87
+ If you are simply adding the module at this time and not referencing it in
88
+ other modules or manifests, you may skip this step.
89
+
90
+ Run the puppet agent against the new environment from at least two nodes, one
91
+ that should not be impacted by change and one that should be impacted.
92
+
93
+ ```puppet agent -t --environment feature```
94
+
95
+ Verify that catalog compilation succeeds and that you are satisfied that the
96
+ effective changes match your expected changes. Repeat the steps above until
97
+ you are satisfied with the results.
98
+
99
+ ### Merge changes
100
+
101
+ In each of the changed modules and the control repo, checkout the main branch,
102
+ merge, and push changes to the master/production branch.
103
+
104
+ ```
105
+ # Module repos
106
+ git checkout master
107
+ git merge feature
108
+ git push origin master
109
+
110
+ # Control repo
111
+ git checkout production
112
+ git merge feature
113
+ vi Puppetfile
114
+ # Remove all :ref's pointing to 'feature'. Don't forget the trailing commas
115
+ # on the :git statements
116
+ git commit -a -m 'Remove refs to feature branch for module puppetlabs/ntp'
117
+ git push origin production
118
+ ```
119
+
120
+ If you are simply adding the module at this time and not referencing it in
121
+ other modules or manifests, you are now finished.
122
+
123
+ ### Cleanup feature branches
124
+
125
+ You may skip this step for long-lived branches, however most feature branches
126
+ should be short-lived and can be pruned once testing and merging is complete.
127
+
128
+ Remove the old branches in each repo:
129
+
130
+ ```
131
+ git branch -D repo
132
+ git push origin :repo
133
+ ```
134
+
135
+ Deploy via r10k on the master and ensure there are no errors. The *feature*
136
+ dynamic environment will no longer exist at `$environmentpath/feature` if you
137
+ deleted the branch in your Control repo.
138
+
139
+ ```r10k deploy environment -p```
140
+
141
+ Editing existing Modules
142
+ ------------------------
143
+
144
+ When editing your own existing modules, this workflow should be followed.
145
+
146
+ ### Create new feature branches
147
+
148
+ Create a new feature branch in your module repositories. Do this in the edited
149
+ module, the control repository, and in each module that will reference the
150
+ updated module. You do not need to do so for modules that are not being edited.
151
+
152
+ ```git checkout -b feature```
153
+
154
+ ### Update control repo to reference new branch
155
+
156
+ For all modules that you branched, add a reference to the new branch name to
157
+ the `Puppetfile` in your Control repo. Don't forget the comma at the end of
158
+ the *:git* value.
159
+
160
+ ```
161
+ mod "other_module",
162
+ :git => "git://github.com/user/other_module",
163
+ :ref => "feature"
164
+ ```
165
+
166
+ ### Modify existing module, references to module
167
+
168
+ Make the required changes to your existing module. Edit your existing manifests,
169
+ modules, and hiera as needed to make sure of the updated module.
170
+
171
+ ### Deploy environments
172
+
173
+ Save all your changes in each modified repo. Commit and push the changes upstream:
174
+
175
+ ```
176
+ git commit -a -m ‘Add feature reference to module’
177
+ git push origin feature
178
+ ```
179
+
180
+ Commit and push the change in your control repo upstream:
181
+
182
+ ```
183
+ git commit -a -m ‘Add module puppetlabs/ntp to branch feature'
184
+ git push origin feature
185
+ ```
186
+
187
+ Finally, deploy the environments via r10k. This step must occur on the master:
188
+
189
+ ```r10k deploy environment -p```
190
+
191
+ Add the *-v* option for verbosity if you need to troubleshoot any errors. The
192
+ new branch should be located at `$environmentpath/feature`.
193
+
194
+ ### Test the new module branches
195
+
196
+ Run the puppet agent against the new environment from at least two nodes, one
197
+ that should not be impacted by change and one that should be impacted.
198
+
199
+ ```puppet agent -t --environment feature```
200
+
201
+ Verify that catalog compilation succeeds and that you are satisfied that the
202
+ effective changes match your expected changes. Repeat the steps above until
203
+ you are satisfied with the results.
204
+
205
+ ### Merge changes
206
+
207
+ In each of the changed module repos, checkout the main branch and merge.
208
+
209
+ ```
210
+ # Module repos
211
+ git checkout master
212
+ git merge feature
213
+ git push origin master
214
+ ```
215
+
216
+ In the Control repo, check out production. Do NOT merge the feature branch as it
217
+ now references the incorrect branch for each git repo, and no other changes
218
+ were made (unlike a new module, where a new repo is referenced).
219
+
220
+ ```
221
+ # Control repo
222
+ git checkout production
223
+ ```
224
+
225
+ ### Cleanup feature branches
226
+
227
+ You may skip this step for long-lived branches, however most feature branches
228
+ should be short-lived and can be pruned once testing and merging is complete.
229
+
230
+ Remove the old branches in each repo:
231
+
232
+ ```
233
+ git branch -D repo
234
+ git push origin :repo
235
+ ```
236
+
237
+ Redeploy with r10k on your Puppet Master and ensure there are no errors. The *feature*
238
+ dynamic environment should no longer exist at `$environmentpath/feature`.
239
+
240
+ ```r10k deploy environment -p```
241
+
242
+ Customize Your Workflow
243
+ -----------------------
244
+
245
+ This guide is very generic in nature. Use it as a template and expand and
246
+ modify it to fit your team, your tools, and your company culture. Above all,
247
+ be consistent in your methodology.
@@ -0,0 +1,164 @@
1
+ Frequently Asked Questions
2
+ ==========================
3
+
4
+ ### How can run I `puppet generate types` for each changed environment during deployment?
5
+
6
+ The command `puppet generate types` creates Puppet signatures for custom
7
+ types circumventing the need to load their Ruby code during compilation.
8
+ This prevents the type definitions from "leaking" across environments.
9
+
10
+ Best practice currently is to run this command as part of your Puppet
11
+ code deployment pipeline, and r10k's postrun command ability is a natural
12
+ place to do so.
13
+
14
+ The postrun command will have any occurance of "$modifiedenvs" replaced
15
+ with a space-seperated list of environments the deploy was configured to
16
+ modify. For example creating the script:
17
+
18
+ ```
19
+ $ cat /usr/local/bin/generate-puppet-types.sh
20
+ !#/bin/bash
21
+
22
+ for environment in $1; do
23
+ /opt/puppetlabs/bin/puppet generate types --environment $environment
24
+ done
25
+ ```
26
+
27
+ And configuring r10k such:
28
+ ```
29
+ $ tail -2 /etc/puppetlabs/r10k/r10k.yaml
30
+
31
+ postrun: ["/usr/local/bin/generate-puppet-types.sh", "$modifiedenvs"]
32
+ ```
33
+
34
+ Should provide you with the necessary generate type definitions for
35
+ improved environment isolation.
36
+
37
+
38
+
39
+ ### The default Git branch is 'master', while the default Puppet environment is 'production'. How do I reconcile this?
40
+
41
+ The default Git branch name is 'master', but this is a somewhat arbitrary name
42
+ and doesn't necessarily map to every use case. In the case of R10K it's generally
43
+ easiest to rename 'master' to 'production'. You can rename the master branch
44
+ with the following:
45
+
46
+ ```
47
+ git branch -m master production
48
+ git push --set-upstream origin production
49
+ ```
50
+
51
+ Note that this will only create a new branch called production with a copy of
52
+ master - to change the default branch for all subsequent clones, read on.
53
+
54
+ #### Changing the default branch for bare Git repositories
55
+
56
+ When you clone a repository, Git checks out the [currently active branch][git-clone]
57
+ on the remote repository. Changing this for a non-bare repository is simple - just
58
+ check out a different branch and subsequent clones from that repository will
59
+ use that branch.
60
+
61
+ For bare repositories things are a bit more complex. Bare repositories do not
62
+ have a working directory that can be checked out, but they do have a [symbolic
63
+ ref][git-symbolic-ref] that serves the same role. To change this, run the
64
+ following command:
65
+
66
+ ```
67
+ git --git-dir /path/to/bare/repo symbolic-ref HEAD refs/heads/production
68
+ ```
69
+
70
+ #### Changing the default branch for different Git services
71
+
72
+ For Git hosting services where you may not cannot directly invoke commands,
73
+ there are usually administrative tools to allow you to change the default branch
74
+ on your remote repositories:
75
+
76
+ * [GitHub][github-default-branch]
77
+ * [Bitbucket][bitbucket-default-branch]
78
+ * [Gitolite v2][gitolite-v2-default-branch]
79
+ * [Gitolite v3][gitolite-v3-default-branch]
80
+
81
+ [git-clone]: https://www.kernel.org/pub/software/scm/git/docs/git-clone.html "Man page for git-clone"
82
+ [git-symbolic-ref]: https://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html "Man page for git-symbolic-ref"
83
+
84
+ [github-default-branch]: https://help.github.com/articles/setting-the-default-branch "Changing the default branch on GitHub"
85
+ [bitbucket-default-branch]: https://answers.atlassian.com/questions/280944/how-to-change-main-branch-in-bitbucket "Changing the default branch on Bitbucket"
86
+ [gitolite-v2-default-branch]: http://stackoverflow.com/questions/7091599/git-default-remote-branch-with-gitolite "Changing the default branch on Gitolite v2"
87
+ [gitolite-v3-default-branch]: http://stackoverflow.com/questions/13949093/git-change-default-branch-gitolite "Changing the default branch on Gitolite v3"
88
+
89
+ ### How do I prevent r10k from removing modules in the `/modules` directory of my Git repository?
90
+
91
+ By default, r10k will install modules specified in the Puppetfile into the
92
+ `/modules` directory of each environment, but if you already use that directory
93
+ and keep modules in it, r10k may think those modules are not meant to exist and
94
+ may remove them.
95
+
96
+ There are three ways of fixing this: including your local modules in the
97
+ Puppetfile, moving the directory where r10k install Puppetfile sourced modules,
98
+ or moving your modules.
99
+
100
+ #### Including your local modules in the Puppetfile
101
+
102
+ The Puppetfile has a concept of a "local" module, otherwise known as a module
103
+ that r10k did not directly placed there but should not be removed. If you want
104
+ to continue keep your modules in the `/modules` directory and still install
105
+ external modules from the Puppetfile into that directory, you can add a `mod`
106
+ directive to the Puppetfile for each of your local modules.
107
+
108
+ ```
109
+
110
+ mod 'my_ntp', :local => true
111
+ mod 'roles', :local => true
112
+ mod 'profiles', :local => true
113
+
114
+ # Include your external modules as usual
115
+ mod 'puppetlabs/stdlib'
116
+ mod 'puppetlabs/apache'
117
+ ```
118
+
119
+ #### Move where the Puppetfile installs external modules
120
+
121
+ Instead of having to add a module entry for each of your local modules, you can
122
+ simply move where the Puppetfile installs modules with the `moduledir` setting.
123
+
124
+ ```
125
+ # The moduledir setting must be set before any modules are created
126
+ moduledir "external-modules"
127
+
128
+ mod 'puppetlabs/stdlib'
129
+ mod 'puppetlabs/apache'
130
+ ```
131
+
132
+ In Puppet 3.6 and later you can create an `environment.conf` in the root of your
133
+ environment to indicate which directories contain modules:
134
+
135
+ ```
136
+ # environment.conf
137
+ modulepath = modules:external-modules
138
+ ```
139
+
140
+ #### Move your local modules
141
+
142
+ Lastly, you can simply move your locally versioned modules to a separate
143
+ directory to avoid conflicting over the `/modules` directory entirely. With this
144
+ example as well you can use the `environment.conf` file to tell Puppet which
145
+ directories contain modules.
146
+
147
+ ```
148
+ # environment.conf
149
+ modulepath = internal-modules:modules
150
+ ```
151
+
152
+ #### Does R10K support Local/Private Forge?
153
+
154
+ Yes. Set the Forge to use _globally_ in `r10k.yaml`. see [Configuration](/doc/dynamic-environments/configuration.mkd#baseurl) for details.
155
+
156
+
157
+ #### What does the name mean?
158
+
159
+ It’s called R10K because I’m terrible at names. When I started working on R10K
160
+ I couldn’t come up with a decent name. While trying to come up with something
161
+ clever, I recalled that Randall Munroe wrote a bot for [controlling IRC chatter](http://blog.xkcd.com/2008/01/14/robot9000-and-xkcd-signal-attacking-noise-in-chat/),
162
+ and gave it the most generic name he could think of - Robot 9000. Since I just
163
+ needed a name, any name, I decided to go with an equally generic name by
164
+ incrementing the robot index.
@@ -0,0 +1,60 @@
1
+ Git Cloning and Mirroring
2
+ =========================
3
+
4
+ Most Git operations on a repository require having a full clone of that
5
+ repository locally available. Because this clone is a full copy, the initial
6
+ clone is heavyweight and generally time consuming. For a situation like r10k
7
+ where the same repositories are reused often, constantly cloning and deleting
8
+ repositories is very inefficient.
9
+
10
+ In order to speed up Git operations r10k takes a number of steps to avoid
11
+ cloning and fetching repositories, as well as deduplicating content across
12
+ multiple clones of the same repositories.
13
+
14
+ Because r10k tends to reuse the same Git repositories in multiple places, r10k
15
+ avoids repeated, full repository clones by mirroring repositories. When r10k
16
+ starts using a new repository, it first clones that repository into a central
17
+ location for later use. This initial clone is the only time that r10k will
18
+ perform a full clone of that repository.
19
+
20
+ When r10k creates an actual checkout of a Git repository, it uses the
21
+ corresponding mirrored repository as a [reference](#git-alternates). This allows
22
+ the working checkout to borrow objects from the mirrored repository instead of
23
+ cloning all of the Git objects again. This saves a great deal of time and space
24
+ as the number of copies of a repository increases.
25
+
26
+ Mirrored git repositories are cloned into the directory specified by the
27
+ r10k.yaml 'cachedir' setting.
28
+
29
+ The name 'cachedir' is a bit of a misnomer; Git repositories are mirrored to
30
+ speed up access to the remote resource like a cache, but unlike a traditional
31
+ cache the mirrored repositories are persistent and should not be deleted.
32
+
33
+ Because the mirrored repository contains all of the objects for all of the
34
+ referencing repositories, deleting the mirrored repository is akin to deleting
35
+ the `.git/objects` directory. Doing so effectively cripples the repository, so
36
+ removing mirrored repositories should be done with care to avoid deleting
37
+ repositories that are still in use.
38
+
39
+ Git alternates
40
+ --------------
41
+
42
+ A standard git repository stores all content in the `.git/objects` directory,
43
+ either as a zlib compressed file in `.git/objects/[0-9a-f]{2}/[0-9a-f]{38}` or
44
+ as part of a packfile in `.git/objects/pack`. Since content can be both stored
45
+ in and retrieved from this location it's treated like a simple database, and is
46
+ generally referred to as the Git object database.
47
+
48
+ Git allows a single repository to look in more than just `.git/objects` for
49
+ objects; additional object databases are referred to as **alternates**. If a
50
+ repository has alternate object databases set up, it will check `.git/objects`
51
+ and then each alternate object database when looking for an object. Git stores a
52
+ list of alternate object databases in `.git/objects/info/alternates`. Invoking
53
+ `git clone` with the `--reference <repo>` flag will use that repository as an
54
+ alternate object database.
55
+
56
+ Links
57
+ -----
58
+
59
+ * [man git-clone(1) --reference](https://www.kernel.org/pub/software/scm/git/docs/git-clone.html)
60
+ * [man gitrepository-layout(5) objects/info/alternates](https://www.kernel.org/pub/software/scm/git/docs/gitrepository-layout.html)