r10k 3.5.2

Sign up to get free protection for your applications and to get access to all the features.
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,75 @@
1
+ Git Based Dynamic Environments
2
+ ==============================
3
+
4
+ R10k can use Git repositories to implement dynamic environments. You can create,
5
+ update, and delete Puppet environments automatically as part of your normal Git
6
+ workflow.
7
+
8
+ Dynamic Environments in a nutshell
9
+ ----------------------------------
10
+
11
+ The core idea of dynamic environments is that you should be able to manage your
12
+ Puppet modules in the same manner that you would manage any other code base. It
13
+ builds on top of Git topic branch model.
14
+
15
+ [git-topic-branching]: http://git-scm.com/book/en/Git-Branching-Branching-Workflows#Topic-Branches
16
+
17
+ One of the most prevalent ways of using Git relies on using [topic branches][git-topic-branching].
18
+ Whenever changes need to be made that need to be reviewed or tested before going
19
+ live, they should be done in a different, short lived branch called a topic
20
+ branch. Work can be freely done on a topic branch in isolation and when the work
21
+ is completed it is merged into a "master" or "production" branch. This is very
22
+ powerful because it allows any number of people to rapidly develop features in
23
+ isolation and merge features in a single operation.
24
+
25
+ The dynamic environment model extends this git branching strategy to
26
+ your live Puppet masters. It creates a mapping between Git branches and Puppet
27
+ environments so that you can use the Git branching model and have that be
28
+ seamlessly reflected in Puppet environments. This means that creating a new Git
29
+ branch creates a new Puppet environment, updating a Git branch will update that
30
+ environment, and deleting a Git branch will remove that environment.
31
+
32
+ R10k supports both [directory and config file environments](https://puppet.com/docs/puppet/latest/env_environments.html).
33
+ Ensure that the basedir for your sources and your puppet config align.
34
+
35
+ How it works
36
+ ------------
37
+
38
+ R10k works by tracking the state of your Git repository or repositories. Each
39
+ repository's branches will be cloned into a directory with a matching name,
40
+ creating a Puppet environment for the branch. If a repository includes a
41
+ Puppetfile, such as the control repo, the Forge modules and Git/SVN
42
+ repositories described within will be cloned as well, into the same directories.
43
+ Subsequent changes to the branches will be kept in sync on the filesystem by
44
+ future r10k runs. Finally, if there are directories that do not match existing
45
+ branches, r10k will assume that the branches for those environments were delete
46
+ and will remove those environments.
47
+
48
+ r10k will need to be be able to authenticate with each repository. Most Git
49
+ systems support authentication with SSH keys. GitHub calls them [deploy
50
+ keys][github-deploy-keys]. Bitbucket calls them [deployment
51
+ keys][bitbucket-deployment-keys]. Stash calls them [SSH access
52
+ keys][stash-access-keys].
53
+
54
+ [github-deploy-keys]: https://developer.github.com/guides/managing-deploy-keys/#deploy-keys
55
+ [bitbucket-deployment-keys]: https://confluence.atlassian.com/display/BITBUCKET/Use+deployment+keys
56
+ [stash-access-keys]: https://confluence.atlassian.com/display/STASH/SSH+access+keys+for+system+use
57
+
58
+ Configuration
59
+ -------------
60
+
61
+ The following configuration options can be specified for Git based environment
62
+ sources.
63
+
64
+ ### invalid_branches:
65
+
66
+ This setting specifies how Git branch names that cannot be cleanly mapped to
67
+ Puppet environments will be handled.
68
+
69
+ Valid values:
70
+
71
+ * 'correct_and_warn': Non-word characters will be replaced with underscores
72
+ and a warning will be emitted. (Default)
73
+ * 'correct': Non-word characters will silently be replaced with underscores.
74
+ * 'error': Branches with non-word characters will be ignored and an error will
75
+ be emitted.
@@ -0,0 +1,69 @@
1
+ Dynamic Environments
2
+ ====================
3
+
4
+ One of the most important functions of r10k is its ability to dynamically manage
5
+ your Puppet environments.
6
+
7
+ When environments were originally built into Puppet they were meant to be static
8
+ in nature. Each environment had to be defined beforehand in the master's
9
+ puppet.conf file in a section, like so:
10
+
11
+ ```ini
12
+ [master]
13
+ # Environment independent settings
14
+ vardir = '/var/lib/puppet'
15
+
16
+ [production]
17
+ modulepath = '/etc/puppet/environments/production/modules'
18
+
19
+ [testing]
20
+ modulepath = '/etc/puppet/environments/testing/modules'
21
+
22
+ [development]
23
+ modulepath = '/etc/puppet/environments/development/modules'
24
+ ```
25
+
26
+ Static Puppet environments were frequently used to implement a pipeline for
27
+ developing Puppet code. New Puppet code would be developed and deployed to the
28
+ development environment, pushed to testing for validation, and then finally
29
+ pushed to the production for general deployment.
30
+
31
+ This static nature of Puppet environments turned out to be inflexible in
32
+ practice. With a predefined list of environments it could be very cumbersome to
33
+ develop on different parts of a Puppet codebase in isolation; you could either
34
+ develop multiple features in the same environment and risk cross pollution, or
35
+ manually create new environments every time you needed isolation.
36
+
37
+ Dynamic environments work by dynamically determining the settings for Puppet
38
+ environment when the environment is used, rather than by defining an explicit
39
+ section in puppet.conf. This works by making the current environment (in the
40
+ '$environment' variable) part of of the path to environment specific settings,
41
+ like modulepath, manifest, and so forth.
42
+
43
+ ```ini
44
+ [master]
45
+ environmentpath = $confdir/environments'
46
+ ```
47
+
48
+ Running `puppet agent -t --environment myenv` will cause $environment to be
49
+ expanded to 'myenv', so the modulepath for that environment will be set to
50
+ '/etc/puppet/environments/myenv/modules'.
51
+
52
+ This approach of allowing environments to be defined on the fly is a complete
53
+ reversal of the original architecture of environments. This approach means that
54
+ it can be very easy to create new environments, update existing environments,
55
+ and remove environments that aren't needed anymore. It's common practice
56
+ to create a temporary environment to test an idea and destroy it shortly after.
57
+ R10k is designed to enable this sort of fluid workflow.
58
+
59
+ R10k predominantly uses version control systems to implement dynamic
60
+ environments. This works by inspecting the VCS repositories containing your
61
+ Puppet code and checking out that code on your masters so, that there's a 1:1
62
+ connection between a branch in your VCS repository and a Puppet environment on
63
+ your masters. This approach allows you to define the way you want to work and
64
+ use that with your chosen VCS, and r10k will make Puppet implement that
65
+ workflow.
66
+
67
+ Different version control systems will implement dynamic environments in
68
+ slightly different ways; check out the VCS specific documentation for more
69
+ information.
@@ -0,0 +1,40 @@
1
+ Puppet master configuration
2
+ ===========================
3
+
4
+ In order to use environments, your Puppet masters will need to be
5
+ configured to load manifests and modules relative to the requested environment.
6
+
7
+ This is the default behavior in Puppet 4+
8
+
9
+ This behavior is controled by the following settings
10
+ (listed with their default values):
11
+
12
+ ```
13
+ codedir = /etc/puppetlabs/code
14
+ environmentpath = $codedir/environments
15
+ basemodulepath = $codedir/modules:/opt/puppetlabs/puppet/share/modules
16
+ ```
17
+
18
+ The environment requested by the agent or assigned to it by an ENC is looked
19
+ for at `$environmentpath/$environment`.
20
+
21
+ That environment may have an environment.conf file in its base directory that
22
+ specifies its own modulepath. If not, the default computed modulepath for that
23
+ environment is `$environmentpath/$environment/modules:$basemodulepath`.
24
+
25
+ These configuration variables are documented at
26
+ [Puppet Configuration Reference](https://puppet.com/docs/puppet/latest/configuration.html)
27
+ and their interaction in forming the modulepath is documented at
28
+ [Directories and the Modulepath](https://puppet.com/docs/puppet/latest/dirs_modulepath.html).
29
+ More information can be found about environments in general at
30
+ [Creating Environmnets](https://puppet.com/docs/puppet/latest/environments_creating.html).
31
+
32
+ The evolution to using environments in this way was a gradual one from community
33
+ conventions to supported feature and there were several intermediate stages that
34
+ had different configuration requirements within the puppet.conf. Some Puppet
35
+ documentation from the 3.x and 4.x series may no longer be applicable to the
36
+ above which solidified in Puppet 4.x.
37
+
38
+ If you need to upgrade away from any intermediate setup see
39
+ [Environments in Puppet 3.8](https://puppet.com/docs/puppet/3.8/environments.html)
40
+ for examples that may help.
@@ -0,0 +1,201 @@
1
+ # Overview
2
+
3
+ This intent of this document is to serve as a basic guide for getting started with r10k and a fresh Puppet installation, including the following:
4
+
5
+ * Installing Puppet and its dependencies
6
+ * Installing r10k and its dependencies
7
+ * Configuring all components to support r10k
8
+ * Configuring your git repository and initial files
9
+
10
+ This document is based around Puppet 4+, specifically using the Puppet Collection repositories provided by Puppet Labs.
11
+
12
+ # Pre-Requisites
13
+
14
+ * Clean install of CentOS 7 or Debian 7.0 with root access / sudo rights.
15
+ * Clean github repository with a deploy key generated by the server above.
16
+
17
+ # Installing Puppetmaster on Centos 7
18
+
19
+ Install and enable the official Puppet Labs package repositories.
20
+
21
+ ```
22
+ yum localinstall http://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
23
+ ```
24
+
25
+ Clean all yum data and rebuild the metadata cache.
26
+
27
+ ```
28
+ yum clean all && yum makecache
29
+ ```
30
+
31
+ Install the Puppet master.
32
+
33
+ ```
34
+ yum install puppetserver
35
+ ```
36
+
37
+ # Installing Puppetmaster on Debian 7
38
+
39
+ Install and enable the official Puppet Labs package repositories
40
+
41
+ ```
42
+ wget http://apt.puppetlabs.com/puppetlabs-release-pc1-wheezy.deb
43
+ dpkg -i puppetlabs-release-pc1-wheezy.deb
44
+ apt-get update
45
+ ```
46
+
47
+ Install the Pupppet master
48
+ ```
49
+ apt-get install puppetserver
50
+ ```
51
+
52
+ # Configuring Puppet
53
+
54
+ Configure the Puppet master by editing `/etc/puppetlabs/puppet/puppet.conf` and ensuring it has the following contents:
55
+
56
+ ```
57
+ [main]
58
+ dns_alt_names = $_Insert FQDN of Puppet Master Here_$
59
+
60
+ [agent]
61
+ server = $_Insert FQDN of Puppet Master Here_$
62
+ ```
63
+
64
+ Restart the Puppet master service.
65
+
66
+ ```
67
+ service puppetserver restart
68
+ ```
69
+
70
+ Ensure the certificate for the Puppet master was created.
71
+
72
+ ```
73
+ # /opt/puppetlabs/bin/puppet cert list --all
74
+
75
+ + "puppet-master.domain.local" (SHA256) 3F:F3:63:BB:EE:57:46:A4:7B:03:AB:9D:FD:97:0F:8F:73:87:40:3B:6D:E5:DC:FC:C3:49:F5:C9:B6:F4:DE:B8 (alt names: "DNS:puppet-master.domain.local")
76
+ ```
77
+
78
+ Notice for Debian users: apt post-configure will build the certificate for the server BEFORE you configure it. Therefore you should rebuild your certs after done with /etc/puppetlabs/puppet/puppet.conf configuration.
79
+ To do so you need to remove old certs and restart puppetmaster:
80
+ ```
81
+ service puppetserver stop
82
+ find $(/opt/puppetlabs/bin/puppet master --configprint ssldir) -name "$(/opt/puppetlabs/bin/puppet master --configprint certname).pem" -delete
83
+ service puppetserver start
84
+ ```
85
+
86
+ # Install and Configure R10k
87
+
88
+ Install r10k via Ruby Gems.
89
+
90
+ ```
91
+ /opt/puppetlabs/puppet/bin/gem install r10k
92
+ ```
93
+
94
+ Configure r10k by creating the following directory structure and file `/etc/puppetlabs/r10k/r10k.yaml` and ensuring it has the following contents:
95
+
96
+ ```
97
+ # The location to use for storing cached Git repos
98
+ :cachedir: '/var/cache/r10k'
99
+
100
+ # A list of git repositories to create
101
+ :sources:
102
+ # This will clone the git repository and instantiate an environment per
103
+ # branch in /etc/puppetlabs/code/environments
104
+ :my-org:
105
+ remote: 'git@github.com:$_Insert GitHub Organization Here_$/$_Insert GitHub Repository That Will Be Used For Your Puppet Code Here_$'
106
+ basedir: '/etc/puppetlabs/code/environments'
107
+ ```
108
+ # Configure Puppet Code Repository
109
+
110
+ Populate the repository by cloning it locally and performing each of the following actions within it:
111
+
112
+ Note that puppet defaults to the `production` environment. You may wish to change your default git
113
+ branch from `master` to `production` in order to match this. Alternatively, you can set your agents'
114
+ environment to `master`.
115
+
116
+ ```
117
+ mkdir -p {modules,site/profile/manifests,hieradata}
118
+ touch hieradata/common.yaml
119
+ touch site/profile/manifests/base.pp
120
+ touch environment.conf
121
+ touch Puppetfile
122
+ touch site.pp
123
+ ```
124
+
125
+ Edit the `environment.conf` file and ensure it has the following contents:
126
+
127
+ ```
128
+ manifest = site.pp
129
+ modulepath = modules:site
130
+ ```
131
+
132
+ Edit the `site.pp` file and ensure it has the following contents:
133
+
134
+ ```
135
+ hiera_include('classes')
136
+ ```
137
+
138
+ Edit the `hieradata/common.yaml file and ensure it has the following contents:
139
+
140
+ ```
141
+ ---
142
+ classes:
143
+ - 'profile::base'
144
+
145
+ ntp::servers:
146
+ - 0.us.pool.ntp.org
147
+ - 1.us.pool.ntp.org
148
+ ```
149
+
150
+ Edit the `Puppetfile` file and ensure it has the following contents:
151
+
152
+ ```
153
+ forge 'forge.puppetlabs.com'
154
+
155
+ # Forge Modules
156
+ mod 'puppetlabs/ntp', '4.1.0'
157
+ mod 'puppetlabs/stdlib'
158
+ ```
159
+
160
+ Edit the `site/profile/manifests/base.pp` file and ensure it has the following contents:
161
+
162
+ ```
163
+ class profile::base {
164
+ class { '::ntp': }
165
+ }
166
+ ```
167
+
168
+ Ensure that the user r10k runs as (typically root) can access the git
169
+ repository. See the [git environment guide](git-environments.mkd)
170
+ for more detail. You can test
171
+ the access by using su/sudo to perform `git clone yourrepoURL` as the correct
172
+ user.
173
+
174
+ # Summary
175
+
176
+ We now have the following functional pieces:
177
+
178
+ 1. Puppet master
179
+ 2. Hiera
180
+ 3. r10k
181
+ 4. Puppet code repository
182
+ 5. Initial 'profile' named 'base' that will configure NTP on our servers.
183
+
184
+ This base will allow us to do all sorts of useful things. Most interesting (to me and for the purposes of this tutorial) is the ability to now utilize Git branches to help manage infrastructure as part of your software development lifecycle. Now, when you want to test a new profile, you can do the following:
185
+
186
+ 1. Create a new branch of the Puppet code repository
187
+ 2. Create your Puppet code in this new branch
188
+ 3. Push the new branch up to the repository
189
+ 4. Deploy it as a new environment using the `/opt/puppetlabs/puppet/bin/r10k deploy environment -p` command.
190
+
191
+ From any agent node (including the master), you may run the agent against the new environment by specifying it on the command line. For example, if you create the branch `test`, run puppet as:
192
+ ```
193
+ puppet agent -t --environment test
194
+ ```
195
+ You can also modify the `/etc/puppetlabs/puppet/puppet.conf` file on a node and add the environment setting to the agent section to make the change permanent:
196
+ ```
197
+ ...
198
+ [agent]
199
+ environment = test
200
+ ```
201
+ Voila - you're testing code without impacting your production environment!
@@ -0,0 +1,45 @@
1
+ SVN Based Dynamic Environments
2
+ ==============================
3
+
4
+ R10k can use SVN repositories to implement dynamic environments. You can create,
5
+ update, and delete Puppet environments automatically as part of your normal SVN
6
+ workflow.
7
+
8
+ How it works
9
+ ------------
10
+
11
+ R10k implements a branching workflow similar to Git by using the SVN concept of
12
+ branches. SVN repositories must conform to the conventional SVN repository
13
+ structure with the directories trunk/, branches/, and optionally tags/ in the
14
+ root of the repository. R10k maps the trunk/ directory to the production
15
+ environment, and production environment, and branches (directories in branches/)
16
+ are created as environments with the name of the given branch.
17
+
18
+ Configuration
19
+ -------------
20
+
21
+ In addition to the settings that all sources support, SVN sources can specify
22
+ the following additional options:
23
+
24
+ ### username/password
25
+
26
+ If the SVN repository requires credentials, you can supply the `username` and
27
+ `password` options.
28
+
29
+ Both `username` and `password` must be specified in order to SVN authentication.
30
+
31
+ **Note**: SVN credentials are passed as command line options, so the SVN
32
+ credentials may be visible in the process table when r10k is running. If you
33
+ choose to supply SVN credentials make sure that the system running r10k is
34
+ appropriately secured.
35
+
36
+ ```yaml
37
+ ---
38
+ sources:
39
+ myenvs:
40
+ type: svn
41
+ remote: 'svn://my-svn.server/my-svn-repo'
42
+ basedir: '/etc/puppet/environments'
43
+ username: 'azurediamond'
44
+ password: 'hunter2'
45
+ ```
@@ -0,0 +1,132 @@
1
+ Usage
2
+ =====
3
+
4
+ R10k provides fairly fine grained controls over your environments to fit your
5
+ needs. If you want to do a full update of all of your environments and modules
6
+ and don't need it to be done in real time, you can trigger a full update and let
7
+ it run in the background. If you are actively developing code and need to run
8
+ very fast updates of one specific environment, you can do a targeted update of
9
+ that code as well.
10
+
11
+ All commands that deal with deploying environments are grouped under the `r10k
12
+ deploy` subcommand.
13
+
14
+ Command line invocation
15
+ -----------------------
16
+
17
+ ### Deploying environments
18
+
19
+ Recursively update all environments:
20
+
21
+ r10k deploy environment --puppetfile
22
+
23
+ The simplest way to use r10k is by simply updating all environments and modules
24
+ and takes the brute force approach of "update everything, ever." When this
25
+ command is run r10k will update all sources, create new environments and delete
26
+ old environments, and recursively update all environment modules specified in
27
+ environment Puppetfiles. While this is the simplest method for running r10k, is
28
+ is also the slowest by a very large degree because it does the maximum possible
29
+ work. This should not be something you run interactively, or use on a regular
30
+ basis.
31
+
32
+ - - -
33
+
34
+ Update environments while avoiding unnecessary recursion:
35
+
36
+ r10k deploy environment
37
+
38
+ This will update existing environments and recursively create new environments.
39
+ Note that when an environment is deployed for the first time, it will
40
+ automatically update all modules as well. For subsequent updates only the
41
+ environment itself will be updated.
42
+
43
+ - - -
44
+
45
+ Update a single environment:
46
+
47
+ r10k deploy environment my_working_environment
48
+
49
+ When you're actively developing on a given environment, this is the best way to
50
+ deploy your changes. Note that when an environment is deployed for the first
51
+ time, it will automatically update all modules as well. For subsequent updates
52
+ only the environment itself will be updated.
53
+
54
+ - - -
55
+
56
+ Update a single environment and force an update of modules:
57
+
58
+ r10k deploy environment my_working_environment --puppetfile
59
+
60
+ This will update the given environment and update all contained modules. This is
61
+ useful if you want to make sure that a given environment is fully up to date.
62
+
63
+ - - -
64
+
65
+ Update a single environment and specify a default branch override:
66
+
67
+ r10k deploy environment my_working_environment --puppetfile --default-branch-override default_branch_override
68
+
69
+ This will update the given environment and update all contained modules, overrideing
70
+ the :default_branch entry in the Puppetfile of each module. This is used primarily to allow
71
+ automated r10k solutions using the control_branch pattern with a temporary branch deployment to
72
+ ensure the deployment is pushed to the correct module repository branch. Note that the :default_branch
73
+ is only ever utilized if the desired ref cannot be located.
74
+
75
+ ### Deploying modules
76
+
77
+ Update a single module across all environments:
78
+
79
+ r10k deploy module apache
80
+
81
+ This is useful for when you're working on a module specified in a Puppetfile
82
+ and want to update it across all environments. See
83
+ [Puppetfile documentation](doc/puppetfile.mkd) for details on how this affects
84
+ Forge vs. Git/SVN modules.
85
+
86
+ - - -
87
+
88
+ Update multiple modules across all environments:
89
+
90
+ r10k deploy module apache jenkins java
91
+
92
+ - - -
93
+
94
+ Update one or more modules in a single environment:
95
+
96
+ r10k deploy module -e production apache jenkins java
97
+
98
+ ### Viewing environments
99
+
100
+ Display all environments being managed by r10k:
101
+
102
+ r10k deploy display
103
+
104
+ Display all environments being managed by r10k, and modules specified in the
105
+ Puppetfile:
106
+
107
+ r10k deploy display -p
108
+
109
+ Display all environments being managed by r10k, and modules specified in the
110
+ Puppetfile along with their expected and actual versions:
111
+
112
+ r10k deploy display -p --detail
113
+
114
+ Display an explicit list of environments being managed by r10k and modules
115
+ specified in the Puppetfile along with their expected and actual versions:
116
+
117
+ r10k deploy display -p --detail production vmwr webrefactor
118
+
119
+ User accounts
120
+ -------------
121
+
122
+ When running commands to deploy code on a master, r10k needs to have write
123
+ access to your Puppet environment path and should create files that are
124
+ readable by the user account running the master. If you're using Puppet
125
+ Enterprise this account is `pe-puppet`, and if you're using Puppet open source
126
+ this account is `puppet`.
127
+
128
+ This can be done in a few ways. First off, you can run r10k as the puppet user
129
+ itself. You can also create a new user that has write access to the Puppet
130
+ environment path, has the same GID as the puppet user, and has a umask of 0027.
131
+ You can also run r10k as root, which is the simplest solution but does require
132
+ access control to the root user.