Merge "Allow update to provide plugin_info via yaml"

This commit is contained in:
Jenkins 2017-09-26 15:16:32 +00:00 committed by Gerrit Code Review
commit 5be08a5be6
6 changed files with 97 additions and 1 deletions

View File

@ -313,6 +313,22 @@ To delete jobs/views that only have 'foo' in their name::
jenkins-jobs delete --path ./myjobs \*foo\*
Providing Plugins Info
^^^^^^^^^^^^^^^^^^^^^^
With Jenkins LTS 1.651.1+ retrieving plugins info became a secure feature and
now requires Administrator rights to use [#f2]. This causes JJB to no longer be
able to work in situations where a user wants to publish jobs to Jenkins but is
not able to receive the Administrator permissions. In this case we can provide
a plugins_info.yaml file containing the plugin versions data needed by JJB to
parse the job templates.
To generate a plugins info, using an account with Administrator rights:
jenkins-jobs get-plugins-info -o plugins_info.yaml
To run JJB update using the plugins_info.yaml:
jenkins-jobs update -p plugins_info.yaml ./myjobs
.. _command-reference:
@ -323,8 +339,11 @@ Command Reference
.. program-output:: jenkins-jobs update --help
.. program-output:: jenkins-jobs delete-all --help
.. program-output:: jenkins-jobs delete --help
.. program-output:: jenkins-jobs get-plugins-info --help
.. rubric:: Footnotes
.. [#f1] The cache default location is at ``~/.cache/jenkins_jobs``, which
can be overridden by setting the ``XDG_CACHE_HOME`` environment
variable.
.. [#f2] Jenkins Security Advisory affecting plugins info retrieval
https://wiki.jenkins-ci.org/display/SECURITY/Jenkins+Security+Advisory+2016-05-11

View File

@ -80,6 +80,18 @@ To delete a job::
The above command deletes the job `simple` from the Jenkins master.
.. _use-case-5:
Use Case 5: Providing plugins info
----------------------------------
To generate a plugins info, using an account with Administrator rights:
jenkins-jobs get-plugins-info -o plugins_info.yaml
To run JJB update using the plugins_info.yaml:
jenkins-jobs update -p plugins_info.yaml ./myjobs
Please refer to the jenkins-jobs :ref:`command-reference` and the

View File

@ -0,0 +1,57 @@
#!/usr/bin/env python
# Copyright (C) 2017 Thanh Ha
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
import yaml
from jenkins_jobs.builder import JenkinsManager
import jenkins_jobs.cli.subcommand.base as base
logger = logging.getLogger(__name__)
class GetPluginsInfoSubCommand(base.BaseSubCommand):
def parse_args(self, subparser):
plugins_info = subparser.add_parser(
'get-plugins-info',
help='get plugins info yaml by querying Jenkins server.')
plugins_info.add_argument(
'-o', '--output-file',
default='plugins_info.yaml',
dest='plugins_info_file',
help='file to save output to.')
def execute(self, options, jjb_config):
builder = JenkinsManager(jjb_config)
plugin_data = builder.jenkins.get_plugins_info()
plugins_info = []
for plugin in plugin_data:
info = {
'longName': str(plugin['longName']),
'shortName': str(plugin['shortName']),
'version': str(plugin['version']),
}
plugins_info.append(info)
if options.plugins_info_file:
with open(options.plugins_info_file, 'w') as outfile:
outfile.write(yaml.dump(plugins_info))
logger.info("Generated {} file".format(options.plugins_info_file))
else:
print(yaml.dump(plugins_info))

View File

@ -39,7 +39,7 @@ class TestSubCommand(update.UpdateSubCommand):
default=False,
help='use alternative output file layout using config.xml files')
test.add_argument(
'-p',
'-p', '--plugin-info',
dest='plugins_info_path',
default=None,
help='path to plugin info YAML file')

View File

@ -58,6 +58,13 @@ class UpdateSubCommand(base.BaseSubCommand):
dest='delete_old',
default=False,
help='delete obsolete jobs')
update.add_argument(
'-p', '--plugin-info',
dest='plugins_info_path',
default=None,
help='path to plugin info YAML file. Can be used to provide '
'previously retrieved plugins info when connecting credentials '
'don\'t have permissions to query.')
update.add_argument(
'--workers',
type=int,

View File

@ -40,6 +40,7 @@ jjb.cli.subcommands =
test=jenkins_jobs.cli.subcommand.test:TestSubCommand
delete=jenkins_jobs.cli.subcommand.delete:DeleteSubCommand
delete-all=jenkins_jobs.cli.subcommand.delete_all:DeleteAllSubCommand
get-plugins-info=jenkins_jobs.cli.subcommand.get_plugins_info:GetPluginsInfoSubCommand
jenkins_jobs.projects =
externaljob=jenkins_jobs.modules.project_externaljob:ExternalJob
flow=jenkins_jobs.modules.project_flow:Flow