voxpupuli / puppet-jenkins

Puppet module for Jenkins
http://forge.puppetlabs.com/puppet/jenkins
Apache License 2.0
275 stars 565 forks source link

Jenkins plugins will not install new modules when the new module name is contained in an existing module name #936

Open rnelson0 opened 4 years ago

rnelson0 commented 4 years ago

In jenkins::plugin, grep is used to see if a module name exists,. For instance, an installation that already has blueocean-jira reports something like this:

Debug: Facter: fact "jenkins_plugins" has resolved to "ace-editor 1.1, antisamy-markup-formatter 1.6, apache-httpcomponents-client-4-api 4.5.10-2.0, bitbucket 1.1.11, bitbucket-build-status-notifier 1.4.1, bitbucket-pullrequest-builder 1.5.0, blueocean 1.21.0, blueocean-autofavorite 1.2.4, blueocean-bitbucket-pipeline 1.21.0, blueocean-commons 1.21.0, blueocean-config 1.21.0, blueocean-core-js 1.21.0, blueocean-dashboard 1.21.0, blueocean-display-url 2.3.0, blueocean-events 1.21.0, blueocean-git-pipeline 1.21.0, blueocean-github-pipeline 1.21.0, blueocean-i18n 1.21.0, blueocean-jira 1.21.0, blueocean-jwt 1.21.0, blueocean-personalization 1.21.0, blueocean-pipeline-api-impl 1.21.0, blueocean-pipeline-editor 1.21.0, blueocean-pipeline-scm-api 1.21.0, blueocean-rest 1.21.0, blueocean-rest-impl 1.21.0, blueocean-web 1.21.0, bouncycastle-api 2.17, branch-api 2.5.4, cloudbees-folder 6.9, command-launcher 1.4, config-file-provider 3.6.2, credentials 2.3.0, display-url-api 2.3.2, durable-task 1.30, envinject 2.3.0, envinject-api 1.7, external-monitor-job 1.7, ghprb 1.42.0, git 4.0.0, git-client 3.0.0, github 1.29.5, github-api 1.95, github-branch-source 2.5.8, jackson2-api 2.10.1, javadoc 1.5, jaxb 2.3.0.1, jdk-tool 1.4, jenkins-design-language 1.21.0, jquery-detached 1.2.1, jsch 0.1.55.1, junit 1.28, ldap 1.21, mailer 1.23, matrix-auth 2.5, matrix-project 1.14, maven-plugin 3.4, mercurial 2.8, multiple-scms 0.6, pam-auth 1.6, pipeline-build-step 2.10, pipeline-milestone-step 1.3.1, plain-credentials 1.5, promoted-builds 3.5, pubsub-light 1.13, puppet-enterprise-pipeline 1.2.3, ruby-runtime 0.13, rvm 0.6, scm-api 2.6.3, script-security 1.68, ssh-agent 1.17, ssh-credentials 1.17.3, structs 1.20, token-macro 2.10, trilead-api 1.0.4, variant 1.3, windows-slaves 1.5, workflow-api 2.37, workflow-basic-steps 2.16.1, workflow-cps 2.77, workflow-durable-task-step 2.28, workflow-job 2.36, workflow-multibranch 2.21, workflow-scm-step 2.9, workflow-step-api 2.21, workflow-support 3.3".

When adding the plugin jira, L119 checks to see if jira is in that list, and it is. Therefore, it skips the entire block that installs the plugin. You can see this in /opt/puppetlabs/puppet/cache/state/state.yaml:

Jenkins::Plugin[blueocean-jira]:
File[/var/lib/jenkins/plugins/blueocean-jira.jpi]:
File[/var/lib/jenkins/plugins/blueocean-jira.jpi.disabled]:
File[/var/lib/jenkins/plugins/blueocean-jira.jpi.pinned]:
Archive[blueocean-jira.hpi]:
File[/var/lib/jenkins/plugins/blueocean-jira.hpi.disabled]:
File[/var/lib/jenkins/plugins/blueocean-jira.hpi.pinned]:
File[/var/lib/jenkins/plugins/blueocean-jira.hpi]:
Jenkins::Plugin[jira]:

If you then delete /var/lib/jenkins/blueocean-jira*, it does install both plugins:

Jenkins::Plugin[blueocean-jira]:
File[/var/lib/jenkins/plugins/blueocean-jira.jpi]:
File[/var/lib/jenkins/plugins/blueocean-jira.jpi.disabled]:
File[/var/lib/jenkins/plugins/blueocean-jira.jpi.pinned]:
Archive[blueocean-jira.hpi]:
File[/var/lib/jenkins/plugins/blueocean-jira.hpi.disabled]:
File[/var/lib/jenkins/plugins/blueocean-jira.hpi.pinned]:
File[/var/lib/jenkins/plugins/blueocean-jira.hpi]:
Jenkins::Plugin[jira]:
File[/var/lib/jenkins/plugins/jira.jpi]:
File[/var/lib/jenkins/plugins/jira.jpi.disabled]:
File[/var/lib/jenkins/plugins/jira.jpi.pinned]:
Archive[jira.hpi]:
File[/var/lib/jenkins/plugins/jira.hpi.disabled]:
File[/var/lib/jenkins/plugins/jira.hpi.pinned]:
File[/var/lib/jenkins/plugins/jira.hpi]:

Many jenkins plugins have partial overlap (blueocean-jira and jira, blueocean-autofavorite and favorite, git and numerous git plugins) and this race condition can result in different results depending on the already-installed plugins.

A potential solution is to convert the fact from returning a string to an array, and then using in in the conditional.

ekohl commented 4 years ago

A potential solution is to convert the fact from returning a string to an array, and then using in in the conditional.

This is IMHO the correct solution.