summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-08-18 19:06:16 +0000
committerGerrit Code Review <review@openstack.org>2016-08-18 19:06:16 +0000
commit3c57feb005b2c8c69a26ba274aa550430df73f34 (patch)
tree4a4c9bf466f5041bcd7e7d1f7e9f340c93eb5b10
parent5debe5b3b6d4a91c0e780b92797d2dd057359e2f (diff)
parent8a656871d5790040412c9e4bed24fde423a484ff (diff)
downloadpython-jenkins-job-builder-3c57feb005b2c8c69a26ba274aa550430df73f34.tar.gz
python-jenkins-job-builder-3c57feb005b2c8c69a26ba274aa550430df73f34.tar.xz
python-jenkins-job-builder-3c57feb005b2c8c69a26ba274aa550430df73f34.zip
Merge "builders: add 'publish over ssh' support as a build step"
-rw-r--r--jenkins_jobs/modules/builders.py30
-rw-r--r--jenkins_jobs/modules/publishers.py50
-rw-r--r--tests/builders/fixtures/publish-over-ssh.xml36
-rw-r--r--tests/builders/fixtures/publish-over-ssh.yaml6
-rw-r--r--tests/publishers/fixtures/ssh001.xml6
5 files changed, 104 insertions, 24 deletions
diff --git a/jenkins_jobs/modules/builders.py b/jenkins_jobs/modules/builders.py
index 7a8efcd7..234ed4e4 100644
--- a/jenkins_jobs/modules/builders.py
+++ b/jenkins_jobs/modules/builders.py
@@ -53,6 +53,7 @@ from jenkins_jobs.modules.helpers import config_file_provider_settings
from jenkins_jobs.modules.helpers import convert_mapping_to_xml
from jenkins_jobs.modules.helpers import copyartifact_build_selector
from jenkins_jobs.modules import hudson_model
+from jenkins_jobs.modules.publishers import ssh
logger = logging.getLogger(__name__)
@@ -2130,6 +2131,35 @@ def critical_block_end(parser, xml_parent, data):
cbs.set('plugin', 'Exclusion')
+def publish_over_ssh(parser, xml_parent, data):
+ """yaml: publish-over-ssh
+ Send files or execute commands over SSH.
+ Requires the Jenkins :jenkins-wiki:`Publish over SSH Plugin
+ <Publish+Over+SSH+Plugin>`.
+
+ :arg str site: name of the ssh site
+ :arg str target: destination directory
+ :arg bool target-is-date-format: whether target is a date format. If true,
+ raw text should be quoted (default false)
+ :arg bool clean-remote: should the remote directory be deleted before
+ transferring files (default false)
+ :arg str source: source path specifier
+ :arg str command: a command to execute on the remote server (optional)
+ :arg int timeout: timeout in milliseconds for the Exec command (optional)
+ :arg bool use-pty: run the exec command in pseudo TTY (default false)
+ :arg str excludes: excluded file pattern (optional)
+ :arg str remove-prefix: prefix to remove from uploaded file paths
+ (optional)
+ :arg bool fail-on-error: fail the build if an error occurs (default false)
+
+ Example:
+
+ .. literalinclude:: /../../tests/builders/fixtures/publish-over-ssh.yaml
+ :language: yaml
+ """
+ ssh(parser, xml_parent, data)
+
+
class Builders(jenkins_jobs.modules.base.Base):
sequence = 60
diff --git a/jenkins_jobs/modules/publishers.py b/jenkins_jobs/modules/publishers.py
index 4ef18435..c80d5710 100644
--- a/jenkins_jobs/modules/publishers.py
+++ b/jenkins_jobs/modules/publishers.py
@@ -1700,18 +1700,18 @@ def ssh(parser, xml_parent, data):
:language: yaml
"""
console_prefix = 'SSH: '
- plugin_tag = 'jenkins.plugins.publish__over__ssh.BapSshPublisherPlugin'
- publisher_tag = 'jenkins.plugins.publish__over__ssh.BapSshPublisher'
- transfer_tag = 'jenkins.plugins.publish__over__ssh.BapSshTransfer'
- plugin_reference_tag = 'jenkins.plugins.publish_over_ssh.' \
- 'BapSshPublisherPlugin'
- base_publish_over(xml_parent,
- data,
- console_prefix,
- plugin_tag,
- publisher_tag,
- transfer_tag,
- plugin_reference_tag)
+ tag_prefix = 'jenkins.plugins.publish'
+ publisher_tag = '%s__over__ssh.BapSshPublisher' % tag_prefix
+ transfer_tag = '%s__over__ssh.BapSshTransfer' % tag_prefix
+ reference_tag = '%s_over_ssh.BapSshPublisherPlugin' % tag_prefix
+
+ if xml_parent.tag == 'publishers':
+ plugin_tag = '%s__over__ssh.BapSshPublisherPlugin' % tag_prefix
+ else:
+ plugin_tag = '%s__over__ssh.BapSshBuilderPlugin' % tag_prefix
+
+ base_publish_over(xml_parent, data, console_prefix, plugin_tag,
+ publisher_tag, transfer_tag, reference_tag)
def pipeline(parser, xml_parent, data):
@@ -2330,24 +2330,23 @@ def base_publish_over(xml_parent, data, console_prefix,
plugin_tag, publisher_tag,
transferset_tag, reference_plugin_tag):
outer = XML.SubElement(xml_parent, plugin_tag)
+ # 'Publish over SSH' builder has an extra top delegate element
+ if xml_parent.tag == 'builders':
+ outer = XML.SubElement(outer, 'delegate')
+
XML.SubElement(outer, 'consolePrefix').text = console_prefix
delegate = XML.SubElement(outer, 'delegate')
publishers = XML.SubElement(delegate, 'publishers')
+
inner = XML.SubElement(publishers, publisher_tag)
XML.SubElement(inner, 'configName').text = data['site']
XML.SubElement(inner, 'verbose').text = 'true'
transfers = XML.SubElement(inner, 'transfers')
transfersset = XML.SubElement(transfers, transferset_tag)
+
XML.SubElement(transfersset, 'remoteDirectory').text = data['target']
XML.SubElement(transfersset, 'sourceFiles').text = data['source']
- if 'command' in data:
- XML.SubElement(transfersset, 'execCommand').text = data['command']
- if 'timeout' in data:
- XML.SubElement(transfersset, 'execTimeout').text = str(data['timeout'])
- if 'use-pty' in data:
- XML.SubElement(transfersset, 'usePty').text = \
- str(data.get('use-pty', False)).lower()
XML.SubElement(transfersset, 'excludes').text = data.get('excludes', '')
XML.SubElement(transfersset, 'removePrefix').text = \
data.get('remove-prefix', '')
@@ -2358,16 +2357,25 @@ def base_publish_over(xml_parent, data, console_prefix,
XML.SubElement(transfersset, 'cleanRemote').text = \
str(data.get('clean-remote', False)).lower()
+ if 'command' in data:
+ XML.SubElement(transfersset, 'execCommand').text = data['command']
+ if 'timeout' in data:
+ XML.SubElement(transfersset, 'execTimeout').text = str(data['timeout'])
+ if 'use-pty' in data:
+ XML.SubElement(transfersset, 'usePty').text = \
+ str(data.get('use-pty', False)).lower()
+
XML.SubElement(inner, 'useWorkspaceInPromotion').text = 'false'
XML.SubElement(inner, 'usePromotionTimestamp').text = 'false'
+
XML.SubElement(delegate, 'continueOnError').text = 'false'
XML.SubElement(delegate, 'failOnError').text = \
str(data.get('fail-on-error', False)).lower()
XML.SubElement(delegate, 'alwaysPublishFromMaster').text = \
str(data.get('always-publish-from-master', False)).lower()
XML.SubElement(delegate, 'hostConfigurationAccess',
- {'class': reference_plugin_tag,
- 'reference': '../..'})
+ {'class': reference_plugin_tag, 'reference': '../..'})
+
return (outer, transfersset)
diff --git a/tests/builders/fixtures/publish-over-ssh.xml b/tests/builders/fixtures/publish-over-ssh.xml
new file mode 100644
index 00000000..91f05241
--- /dev/null
+++ b/tests/builders/fixtures/publish-over-ssh.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project>
+ <builders>
+ <jenkins.plugins.publish__over__ssh.BapSshBuilderPlugin>
+ <delegate>
+ <consolePrefix>SSH: </consolePrefix>
+ <delegate>
+ <publishers>
+ <jenkins.plugins.publish__over__ssh.BapSshPublisher>
+ <configName>server.example.com</configName>
+ <verbose>true</verbose>
+ <transfers>
+ <jenkins.plugins.publish__over__ssh.BapSshTransfer>
+ <remoteDirectory>dest/dir</remoteDirectory>
+ <sourceFiles>base/source/dir/**</sourceFiles>
+ <excludes/>
+ <removePrefix/>
+ <remoteDirectorySDF>false</remoteDirectorySDF>
+ <flatten>false</flatten>
+ <cleanRemote>false</cleanRemote>
+ <execTimeout>1800000</execTimeout>
+ </jenkins.plugins.publish__over__ssh.BapSshTransfer>
+ </transfers>
+ <useWorkspaceInPromotion>false</useWorkspaceInPromotion>
+ <usePromotionTimestamp>false</usePromotionTimestamp>
+ </jenkins.plugins.publish__over__ssh.BapSshPublisher>
+ </publishers>
+ <continueOnError>false</continueOnError>
+ <failOnError>false</failOnError>
+ <alwaysPublishFromMaster>false</alwaysPublishFromMaster>
+ <hostConfigurationAccess class="jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin" reference="../.."/>
+ </delegate>
+ </delegate>
+ </jenkins.plugins.publish__over__ssh.BapSshBuilderPlugin>
+ </builders>
+</project>
diff --git a/tests/builders/fixtures/publish-over-ssh.yaml b/tests/builders/fixtures/publish-over-ssh.yaml
new file mode 100644
index 00000000..533fb664
--- /dev/null
+++ b/tests/builders/fixtures/publish-over-ssh.yaml
@@ -0,0 +1,6 @@
+builders:
+ - publish-over-ssh:
+ site: 'server.example.com'
+ target: 'dest/dir'
+ source: 'base/source/dir/**'
+ timeout: 1800000
diff --git a/tests/publishers/fixtures/ssh001.xml b/tests/publishers/fixtures/ssh001.xml
index a2c869a9..44c82d5b 100644
--- a/tests/publishers/fixtures/ssh001.xml
+++ b/tests/publishers/fixtures/ssh001.xml
@@ -12,14 +12,14 @@
<jenkins.plugins.publish__over__ssh.BapSshTransfer>
<remoteDirectory>dest/dir</remoteDirectory>
<sourceFiles>base/source/dir/**</sourceFiles>
- <execCommand>rm -r jenkins_$BUILD_NUMBER</execCommand>
- <execTimeout>1800000</execTimeout>
- <usePty>true</usePty>
<excludes>**/*.excludedfiletype</excludes>
<removePrefix>base/source/dir</removePrefix>
<remoteDirectorySDF>false</remoteDirectorySDF>
<flatten>true</flatten>
<cleanRemote>false</cleanRemote>
+ <execCommand>rm -r jenkins_$BUILD_NUMBER</execCommand>
+ <execTimeout>1800000</execTimeout>
+ <usePty>true</usePty>
</jenkins.plugins.publish__over__ssh.BapSshTransfer>
</transfers>
<useWorkspaceInPromotion>false</useWorkspaceInPromotion>