RSS

puppet-lint: Already initialized constant warnings

For a while now, the voxpupuli-puppet-lint-plugins meta gem has provided the community with a number of amazing plugins for puppet-lint.

With the latest release of puppet-lint and and Vox’s plugins gem, a few things have changed that might cause a bit of friction when updating.

I wanted to take a second to go over a few scenarios that might help you on your journey.

Problem

First of all, lets talk about the problem.

In puppet-lint v3.1.0 we adopted two plugins which are now included as default checks:

Prior to v4.0.0 of voxpupuli-puppet-lint-plugins, these plugins were included in the meta gem.

So now we have a scenario where it’s possible to update puppet-lint (>= 3.1.0) and end up with duplicate plugins installed.

In this case, users may see warnings like this:

warning: already initialized constant PuppetLint::CheckLegacyFacts
warning: previous definition of CheckLegacyFacts was here
warning: already initialized constant LEGACY_FACTS_VAR_TYPES
....
warning: already initialized constant TOP_SCOPE_FACTS_VAR_TYPES
warning: previous definition of TOP_SCOPE_FACTS_VAR_TYPES was here

Not the end of the world, but it’s extra noise that you don’t want in your pipeline.

Help! This is happening to me!

So you are seeing these warnings? Read on…

What we are seeing here is a soft dependency conflict.

We have two identical plugins registering the same code inside puppet lint. That’s what is causing the already initialized constant warning.

The best way forward is to clean up our environment and start again.

Remove voxpupuli-puppet-lint-plugins and it’s dependencies

We can start by removing dependencies of voxpupuli-puppet-lint-plugins.

The command below will do just that. We grab the dependencies of Vox’s meta gem and remove them one by one.

gem dependency voxpupuli-puppet-lint-plugins --pipe | grep "puppet-lint" | cut -d" " -f1 | xargs gem uninstall -aIx

Note: Take extra care when running commands like this! 👀

After the previous command has completed, we should be left with the voxpupuli-puppet-lint-plugins meta gem.

Let’s remove it with the following command:

gem uninstall voxpupuli-puppet-lint-plugins

..and check to see if everything has really gone.

gem list | grep "puppet-lint"

Tldr; It should return nothing! Hurrah 🎉

Re-install the latest gems

Now we are free to re-install puppet-lint and voxpupuli-puppet-lint-plugins

gem install puppet-lint
gem install voxpupuli-puppet-lint-plugins

Once they have installed you can enjoy a warning free puppet-lint experience with all of the joys from voxpupuli-puppet-lint-plugins!

… unless you have linting issues!