8625fe2a97
The changes include: - <concurrentBuild> should now be represented as <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/> property - <triggers> should now be localed inside <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty> property, in <properties> section - unsupported XML elements got removed: - <blockBuildWhenDownstreamBuilding> - <blockBuildWhenUpstreamBuilding> - <assignedNode> - <canRoam> - <customWorkspace> - got rid of publishers from project_pipeline_template005.{xml,yaml} as these are not supported in Pipeline jobs The above changes align the produced XMLs with the ones from Jenkins 2.190.1 and Pipeline plugin v2.6. Task: 39836 Story: 2007708 Change-Id: I650ef2ee60e872cce8f93de5f391933d68ec81f0
222 lines
9.2 KiB
Python
222 lines
9.2 KiB
Python
# Copyright 2012 Hewlett-Packard Development Company, L.P.
|
|
#
|
|
# 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.
|
|
|
|
|
|
"""These are job parameters that are common to every type of Jenkins job.
|
|
|
|
Example:
|
|
|
|
.. literalinclude:: /../../tests/yamlparser/fixtures/general-example-001.yaml
|
|
|
|
:Job Parameters:
|
|
* **project-type**:
|
|
Defaults to "freestyle", but "maven" as well as "multijob", "flow",
|
|
"pipeline" or "externaljob" can also be specified.
|
|
|
|
* **defaults**:
|
|
Specifies a set of :ref:`defaults` to use for this job, defaults to
|
|
''global''. If you have values that are common to all of your jobs,
|
|
create a ``global`` :ref:`defaults` object to hold them, and no further
|
|
configuration of individual jobs is necessary. If some jobs
|
|
should not use the ``global`` defaults, use this field to specify a
|
|
different set of defaults.
|
|
|
|
* **description**:
|
|
The description for the job. By default, the description
|
|
"!-- Managed by Jenkins Job Builder" is applied.
|
|
|
|
* **disabled**:
|
|
Boolean value to set whether or not this job should be disabled in
|
|
Jenkins. Defaults to ``false`` (job will be enabled).
|
|
|
|
* **display-name**:
|
|
Optional name shown for the project throughout the Jenkins web GUI in
|
|
place of the actual job name. The jenkins_jobs tool cannot fully remove
|
|
this trait once it is set, so use caution when setting it. Setting it to
|
|
the same string as the job's name is an effective un-set workaround.
|
|
Alternately, the field can be cleared manually using the Jenkins web
|
|
interface.
|
|
|
|
* **concurrent**:
|
|
Boolean value to set whether or not Jenkins can run this job
|
|
concurrently. Defaults to ``false``.
|
|
|
|
* **workspace**:
|
|
Path for a custom workspace. Defaults to Jenkins default
|
|
configuration.
|
|
|
|
* **folder**:
|
|
The folder attribute provides an alternative to using '<path>/<name>' as
|
|
the job name to specify which Jenkins folder to upload the job to.
|
|
|
|
Requires the Jenkins :jenkins-plugins:`CloudBees Folders Plugin
|
|
<cloudbees-folder>`.
|
|
|
|
* **child-workspace**:
|
|
Path for a child custom workspace. Defaults to Jenkins default
|
|
configuration. This parameter is only valid for matrix type jobs.
|
|
|
|
* **quiet-period**:
|
|
Number of seconds to wait between consecutive runs of this job.
|
|
Defaults to ``0``.
|
|
|
|
* **block-downstream**:
|
|
Boolean value to set whether or not this job must block while
|
|
downstream jobs are running. Downstream jobs are determined
|
|
transitively. Defaults to ``false``.
|
|
|
|
* **block-upstream**:
|
|
Boolean value to set whether or not this job must block while
|
|
upstream jobs are running. Upstream jobs are determined
|
|
transitively. Defaults to ``false``.
|
|
|
|
* **auth-token**:
|
|
Specifies an authentication token that allows new builds to be
|
|
triggered by accessing a special predefined URL. Only those who
|
|
know the token will be able to trigger builds remotely.
|
|
|
|
* **retry-count**:
|
|
If a build fails to checkout from the repository, Jenkins will
|
|
retry the specified number of times before giving up.
|
|
|
|
* **node**:
|
|
Restrict where this job can be run. If there is a group of
|
|
machines that the job can be built on, you can specify that
|
|
label as the node to tie on, which will cause Jenkins to build the job on
|
|
any of the machines with that label. For matrix projects, this parameter
|
|
will only restrict where the parent job will run.
|
|
|
|
* **logrotate**:
|
|
The Logrotate section allows you to automatically remove old build
|
|
history. It adds the ``logrotate`` attribute to the :ref:`Job`
|
|
definition. All logrotate attributes default to "-1" (keep forever).
|
|
**Deprecated on jenkins >=1.637**: use the ``build-discarder``
|
|
property instead
|
|
|
|
* **jdk**:
|
|
The name of the jdk to use
|
|
|
|
* **raw**:
|
|
If present, this section should contain a single **xml** entry. This XML
|
|
will be inserted at the top-level of the :ref:`Job` definition.
|
|
"""
|
|
|
|
import logging
|
|
import xml.etree.ElementTree as XML
|
|
|
|
import jenkins_jobs.modules.base
|
|
from jenkins_jobs.xml_config import remove_ignorable_whitespace
|
|
|
|
|
|
class General(jenkins_jobs.modules.base.Base):
|
|
sequence = 10
|
|
logrotate_warn_issued = False
|
|
|
|
def gen_xml(self, xml, data):
|
|
jdk = data.get("jdk", None)
|
|
if jdk:
|
|
XML.SubElement(xml, "jdk").text = jdk
|
|
XML.SubElement(xml, "actions")
|
|
desc_text = data.get("description", None)
|
|
if desc_text is not None:
|
|
description = XML.SubElement(xml, "description")
|
|
description.text = desc_text
|
|
XML.SubElement(xml, "keepDependencies").text = "false"
|
|
|
|
# Need to ensure we support the None parameter to allow disabled to
|
|
# remain the last setting if the user purposely adds and then removes
|
|
# the disabled parameter.
|
|
# See: http://lists.openstack.org/pipermail/openstack-infra/2016-March/003980.html # noqa
|
|
disabled = data.get("disabled", None)
|
|
if disabled is not None:
|
|
XML.SubElement(xml, "disabled").text = str(disabled).lower()
|
|
|
|
if "display-name" in data:
|
|
XML.SubElement(xml, "displayName").text = data["display-name"]
|
|
if data.get("project-type", "freestyle") != "pipeline":
|
|
if data.get("block-downstream"):
|
|
XML.SubElement(xml, "blockBuildWhenDownstreamBuilding").text = "true"
|
|
else:
|
|
XML.SubElement(xml, "blockBuildWhenDownstreamBuilding").text = "false"
|
|
if data.get("block-upstream"):
|
|
XML.SubElement(xml, "blockBuildWhenUpstreamBuilding").text = "true"
|
|
else:
|
|
XML.SubElement(xml, "blockBuildWhenUpstreamBuilding").text = "false"
|
|
authtoken = data.get("auth-token", None)
|
|
if authtoken is not None:
|
|
XML.SubElement(xml, "authToken").text = authtoken
|
|
if data.get("project-type", "freestyle") != "pipeline":
|
|
if data.get("concurrent"):
|
|
XML.SubElement(xml, "concurrentBuild").text = "true"
|
|
else:
|
|
XML.SubElement(xml, "concurrentBuild").text = "false"
|
|
else:
|
|
if not data.get("concurrent"):
|
|
properties = xml.find("properties")
|
|
if properties is None:
|
|
properties = XML.SubElement(xml, "properties")
|
|
XML.SubElement(
|
|
properties,
|
|
"org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty",
|
|
)
|
|
if data.get("project-type", "freestyle") != "pipeline":
|
|
if "workspace" in data:
|
|
XML.SubElement(xml, "customWorkspace").text = str(data["workspace"])
|
|
if (xml.tag == "matrix-project") and ("child-workspace" in data):
|
|
XML.SubElement(xml, "childCustomWorkspace").text = str(
|
|
data["child-workspace"]
|
|
)
|
|
if "quiet-period" in data:
|
|
XML.SubElement(xml, "quietPeriod").text = str(data["quiet-period"])
|
|
node = data.get("node", None)
|
|
if data.get("project-type", "freestyle") != "pipeline":
|
|
if node:
|
|
XML.SubElement(xml, "assignedNode").text = node
|
|
XML.SubElement(xml, "canRoam").text = "false"
|
|
else:
|
|
XML.SubElement(xml, "canRoam").text = "true"
|
|
if "retry-count" in data:
|
|
XML.SubElement(xml, "scmCheckoutRetryCount").text = str(data["retry-count"])
|
|
|
|
if "logrotate" in data:
|
|
if not self.logrotate_warn_issued:
|
|
logging.warning(
|
|
"logrotate is deprecated on jenkins>=1.637,"
|
|
" the property build-discarder on newer"
|
|
" jenkins instead"
|
|
)
|
|
self.logrotate_warn_issued = True
|
|
|
|
lr_xml = XML.SubElement(xml, "logRotator")
|
|
logrotate = data["logrotate"]
|
|
lr_days = XML.SubElement(lr_xml, "daysToKeep")
|
|
lr_days.text = str(logrotate.get("daysToKeep", -1))
|
|
lr_num = XML.SubElement(lr_xml, "numToKeep")
|
|
lr_num.text = str(logrotate.get("numToKeep", -1))
|
|
lr_adays = XML.SubElement(lr_xml, "artifactDaysToKeep")
|
|
lr_adays.text = str(logrotate.get("artifactDaysToKeep", -1))
|
|
lr_anum = XML.SubElement(lr_xml, "artifactNumToKeep")
|
|
lr_anum.text = str(logrotate.get("artifactNumToKeep", -1))
|
|
|
|
if "raw" in data:
|
|
raw(self.registry, xml, data["raw"])
|
|
|
|
|
|
def raw(registry, xml_parent, data):
|
|
# documented in definition.rst since includes and docs is not working well
|
|
# For cross cutting method like this
|
|
root = XML.fromstring(data.get("xml"))
|
|
remove_ignorable_whitespace(root)
|
|
xml_parent.append(root)
|