The PDK Templates is the default templates repository for use with the Puppet Development Kit, within which we have defined all the templates for the creation and configuration of a module. Look into these directories to find the templates:
moduleroottemplates get deployed on
convert; use them to enforce a common boilerplate for central files.
moduleroot_inittemplates get only deployed when the target file does not yet exist; use them to provide skeletons for files the developer needs to modify heavily.
object_templatestemplates are used by the various
new ...commands for classes, defined types, etc.
The PDK also absorbs the
config_defaults.yml file to apply a set of default configurations to the module. Each top-level key in the file corresponds to a target file, and will be merged with the
:global section at the top. Within the template evaluation the values are available under
@config. In the module itself, you can override/amend the values by putting new values into
.sync.yml in the module's root. You can remove default values by using the knockout prefix. The data for a target file also use
delete: true and
unmanaged: true to remove, or ignore the particular file.
Templates like this one can be used in conjunction with the PDK. As default the PDK itself uses the templates within this repository to render files for use within a module. Templates can be passed to the PDK as a flag for several of the commands.
pdk convert --template-url https://github.com/puppetlabs/pdk-templates
Please note that the template only needs to be passed in once if you wish to change it, every command run on the PDK will use the last specified template. For more on basic usage and more detailed description of the PDK in action please refer to the PDK documentation.
The following is a description and explaination of each of the keys within config_defaults. This will help clarify the default settings we choose to apply to pdk modules.
A .gitattributes file in your repo allows you to ensure consistent git settings.
|include||Defines which extensions are handled by git automatic conversions (see the gitattributes documentation). The default configuration helps to keep line endings consistent between windows and linux users.|
A .gitignore file in your repo allows you to specify intentionally untracked files to ignore.
|paths||Defines which files or paths for git to ignore or untrack. (see the gitignore documentation). The default configuration helps to set up commonly ignored or untracked files in a module project.|
Gitlab CI is a continuous integration platform that is free for all open source projects hosted on Github and Gitlab.com, it also has a self-hosted option that is free as well. We can trigger automated pipelines with ever change to our code base in the master branch, other branches, tags, or additional triggers. Gitlab CI uses a .gitlab-ci.yml file in the root of your repository tell Gitlab CI what jobs to run when in the pipeline.
|override||Defines whether your local
|custom_stages||Defines a custom job stage for when the CI/CD jobs will be executed in the pipeline. By default
|beaker||Defines if you want the default, Docker-in-Docker acceptance job added. Can be set to
|global_variables||Allows you to set any global environment variables for the gitlab-ci pipeline. Currently includes setting the Puppet gem version.|
|cache||If this setting exists, it expects a single sub-key called
|bundler_args||Define any arguments you want to pass through to bundler. The default is
|ruby_versions||Define a list of ruby_versions to test against. Each version can have a series of sub-keys that are options.
|custom_jobs||Define custom Gitlab CI jobs that will be executed. It is recommended that you use this option if you need customized Gitlab CI jobs. Please see the .gitlab-ci.yml docs for specifics.|
|rubygems_mirror||Use a custom rubygems mirror url|
|image||Define the Docker image to use, when using the Docker runner. Please see the Using Docker images docs for specifics.|
A .pdkignore file in your repo allows you to specify files to ignore when building a module package with
|paths||Defines which files or paths for PDK to ignore when building a module package. The default configuration helps to set up commonly ignored files in a module project when building a package.|
Travis CI is a hosted continuous integration platform that is free for all open source projects hosted on Github. We can trigger automated builds with every change to our code base in the master branch, other branches or even a pull request. Travis uses a .travis.yml file in the root of your repository to learn about your project and how you want your builds to be executed.
|ruby versions||Define the ruby versions on which you want your builds to be executed.|
|bundler_args||Define any arguments you want to pass through to bundler. The default is
|env||Allows you to add new travis job matrix entries based on the included environmnet variables, one per
|global_env||Allows you to set global environment variables which will be defined for all travis jobs; for example,
|docker_sets||Allows you to configure sets of docker to run your tests on. For example, if I wanted to run on a docker instance of Ubuntu I would add
|docker_sets['set']||this should refrence the docker nodeset that you wish to run|
|docker_sets['testmode']||this configueres the
|docker_defaults||Defines what values are used as default when using the
|stages||Allows you to specify order and conditions for travis-ci build stages. See Specifying Stage Order and Conditions.|
|includes||Ensures that the .travis file includes the following checks by default: Rubocop, Puppet Lint, Metadata Lint.|
|remove_includes||Allows you to remove includes set in config_defaults.yml.|
|branches||Allows you to specify the only branches that travis will run builds on. The default branches are
|branches_except||Allows you to specify branches that travis will not build on.|
|remove_branches||Allows you to remove default branches set in config_defaults.yml.|
|notifications||Allows you to specify the notifications configuration in the .travis.yml file.|
|remove_notifications||Allows you to remove default branches set in config_defaults.yml.|
YARD is a documentation generation tool for the Ruby programming language. It enables the user to generate consistent, usable documentation that can be exported to a number of formats very easily, and also supports extending for custom Ruby constructs such as custom class level definitions.
|markup||Specifies the markup formatting of your documentation. Default is
|optional||Define any additional arguments you want to pass through to the
AppVeyor is a hosted, distributed continuous integration service used to build and test projects hosted on GitHub by spinning up a Microsoft Windows virtual machine. AppVeyor is configured by adding a file named appveyor.yml, which is a YAML format text file, to the root directory of the code repository.
|appveyor_bundle_install||Defines the bundle install command for the appveyor execution run. In our case we use bundle install
|environment||Defines any environment variables wanted for the job run. In our case we default to the latest Puppet 4 gem version.|
|matrix||This defines the matrix of jobs to be executed at runtime. Each defines environment variables for that specific job run. In our defaults we have a Ruby version specfied, followed by the check that will be run for that job.|
|test_script||This defines the test script that will be executed. For our purposes the default is set to
Rake is a Make-like program implemented in Ruby. Tasks and dependencies are specified in standard Ruby syntax within the Rakefile, present in the root directory of the code repository. Within modules context Rake tasks are used quite frequently, from ensuring the integrity of a module, running validation and tests, to tasks for releasing modules.
|requires||A list of hashes with the library to
|changelog_user||Sets the github user for the change_log_generator rake task.Optional, if not set it will read the 'author' from the metadata.json file|
|changelog_project||Sets the github project for the change_log_generator rake task.Optional, if not set it will read the 'name' from the metadata.json file|
|changelog_since_tag||Sets the github since_tag for the change_log_generator rake task.Required for the changlog rake task|
|default_disabled_lint_checks||Defines any checks that are to be disabled by default when running lint checks. As default we disable the
|extra_disabled_lint_checks||Defines any checks that are to be disabled as extras when running lint checks. No defaults are defined for this configuration.|
|extras||An array of extra lines to add into your Rakefile|
RuboCop is a Ruby static code analyzer. We use Rubocop to enforce a level of quility and consistancy within Ruby code. Rubocop can be configured within .rubocop.yml which is located in the root directory of the code repository. Rubocop works by defining a sanitized list of cops that'll cleanup a code base without much effort, all of which support autocorrect and that are fairly uncontroversial across wide segments of the Community.
|include_todos||Allows you to use rubocop's "TODOs" to temporarily skip checks by setting this to
|selected_profile||Allows you to define which profile is used by default, which is set to
|default_configs||Allows you to define the default configuration of which cops will run. Includes the full name of the cop followed by a description of it and an enforced style. Can also make use of the key
|cleanup_cops||Defines a set of cleanup cops to then be included within a rubocop profile. Cops are defined by their full name, and further configuration can be done by specifying secondary keys. By default we specify a large amount of cleanup cops using their default configuration.|
|profiles||Defines the profiles that can be enabled and used within rubocop through the
A Gemfile is a file we create which is used for describing gem dependencies for Ruby programs. All modules should have an associated Gemfile for installing the relevant gems. As development and testing is somewhat consistant between modules we have used the template to define a set of gems relevant to these processes.
|required||Allows you to specify gems that are required within the Gemfile. Gems can be defined here within groups, for example we use the :development gem group to add in several gems that are relevant to the development of any module.|
|optional||Allows you to specify additional gems that are required within the Gemfile. This key can be used to further configure the Gemfile through assignment of a value in the .sync.yml file.|
The spec/default_facts.yml file contains a list of facts to be used by default when running rspec tests
|concat_basedir||Overrides the concat_basedir fact's value in the base template. Defaults to "/tmp".|
|ipaddress||Overrides the ipaddress fact's value in the base template. Defaults to "172.16.254.254".|
|is_pe||Overrides the is_pe fact's value in the base template. Defaults to false.|
|macaddress||Overrides the macaddress fact's value in the base template. Defaults to "AA:AA:AA:AA:AA:AA".|
|extra_facts||List of extra facts to be added to the default_facts.yml file. They are in the form: "
The spec/spec_helper.rb file contains setup for rspec tests
|spec_overrides||An array of extra lines to add into your
|strict_level||Defines the Puppet Strict configuration parameter. Defaults to
|coverage_report||Enable rspec-puppet coverage reports. Defaults to
|minimum_code_coverage_percentage||The desired code coverage percentage required for tests to pass. Defaults to
Making local changes to the template
While we provide a basic template it is likely that it will not match what you need exactly, as such we allow it to be altered or added to through the use of the
Adding configuration values
Values can be added to the data passed to the templates by adding them to your local
.sync.yml file, thus allowing you to make changes such as testing against additional operating systems or adding new rubocop rules.
To add a value to an array simply place it into the
.sync.yml file as shown below, here I am adding an additional unit test run against Puppet 4:
.travis.yml: includes: - env: PUPPET_GEM_VERSION="~> 4.0" CHECK=parallel_spec rvm: 2.1.9
Removing default configuration values
Values can be removed from the data passed to the templates using the knockout prefix
To remove a value from an array, prefix the value
---. For example, to remove
2.5.1 from the
ruby_versions array in
.travis.yml: ruby_versions: - '---2.5.1'
To remove a key from a hash, set the value to
---. For example, to remove the
ipaddress fact from
spec/default_facts.yml: ipaddress: '---'
Please note that the early version of this template contained only a 'moduleroot' directory, and did not have a 'moduleroot_init'. The PDK 'pdk new module' command will still work with templates that only have 'moduleroot', however the 'pdk convert' command will fail if the template does not have a 'moduleroot_init' directory present. To remedy this please use the up to date version of the template.