I developed the following solution:
1) Conditional BuildStep Plugin A, B C, cron D config.xml:
#!/bin/bash
echo " This script is a placeholder to represent a build step that can succeed or not succeed"
true
final String DOWNSTREAM_NAME = 'SO-27952216-Downstream-job'
final String CRON_SCHEDULE = '0 * * * *'
final String SEPARATOR = new String(new char[8]).replace('\0', '-')
println(" ${SEPARATOR} Adapting configuration of ${DOWNSTREAM_NAME} ${SEPARATOR}")
import jenkins.model.*
import hudson.model.*
final Project DOWNSTREAM_JOB = Jenkins.instance.getItem(DOWNSTREAM_NAME)
final String DOWNSTREAM_CONFIG = DOWNSTREAM_JOB.getRootDir().getPath() + "/config.xml"
import org.w3c.dom.*
import javax.xml.parsers.*
import javax.xml.xpath.*
println(" Reading ${DOWNSTREAM_CONFIG}")
Document doc =
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(DOWNSTREAM_CONFIG)
XPathExpression expr = XPathFactory.newInstance().newXPath()
.compile("/project/triggers/hudson.triggers.TimerTrigger/spec");
final org.w3c.dom.Node SCHEDULE_NODE = expr.evaluate(doc, XPathConstants.NODE)
println(String.format(
" Changing Build Triggers → Build periodically → Schedule from '%s' to ' %s'",
SCHEDULE_NODE.getTextContent(), CRON_SCHEDULE))
SCHEDULE_NODE.setTextContent(CRON_SCHEDULE)
import javax.xml.transform.*
import javax.xml.transform.dom.*
import javax.xml.transform.stream.*
println(" Writing ${DOWNSTREAM_CONFIG}")
Transformer transformer = TransformerFactory.newInstance().newTransformer()
transformer.setOutputProperty(OutputKeys.INDENT, "yes")
transformer.transform(new DOMSource(doc), new StreamResult(new File(DOWNSTREAM_CONFIG)))
println(" ${SEPARATOR} Adapted configuration of ${DOWNSTREAM_NAME} ${SEPARATOR}")
2) → Groovy Postbuild D reset cron config.xml:
#!/bin/bash
echo " This script is a placeholder to represent a build step"
final String THIS_JOB_NAME = 'SO-27952216-Downstream-job'
final String CRON_SCHEDULE = ''
final Object LOG = manager.listener.logger
final String SEPARATOR = new String(new char[8]).replace('\0', '-')
LOG.println(" ${SEPARATOR} Adapting configuration of ${THIS_JOB_NAME} ${SEPARATOR}")
import jenkins.model.*
import hudson.model.*
final Project THIS_JOB = Jenkins.instance.getItem(THIS_JOB_NAME)
final String THIS_JOB_CONFIG = THIS_JOB.getRootDir().getPath() + "/config.xml"
import org.w3c.dom.*;
import javax.xml.parsers.*
import javax.xml.xpath.*
LOG.println(" Reading ${THIS_JOB_CONFIG}")
Document doc =
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(THIS_JOB_CONFIG)
XPathExpression expr = XPathFactory.newInstance().newXPath()
.compile("/project/triggers/hudson.triggers.TimerTrigger/spec")
final org.w3c.dom.Node SCHEDULE_NODE = expr.evaluate(doc, XPathConstants.NODE)
LOG.println(String.format(
" Changing Build Triggers → Build periodically → Schedule from '%s' to ' %s'",
SCHEDULE_NODE.getTextContent(), CRON_SCHEDULE))
SCHEDULE_NODE.setTextContent(CRON_SCHEDULE)
import javax.xml.transform.*
import javax.xml.transform.dom.*
import javax.xml.transform.stream.*
LOG.println(" Writing ${THIS_JOB_CONFIG}")
Transformer transformer = TransformerFactory.newInstance().newTransformer()
transformer.setOutputProperty(OutputKeys.INDENT, "yes")
transformer.transform(new DOMSource(doc), new StreamResult(new File(THIS_JOB_CONFIG)))
LOG.println(" ${SEPARATOR} Adapted configuration of ${THIS_JOB_NAME} ${SEPARATOR}")
, println() Jenkin Console Output .
: ! [JENKINS-18651 - post build script] it manager.listener.logger.println() println().
, , :
- A, B, C D
config.xml, D ; .config.xml, .- script
config.xml, → , , "" :
.
- A B C
config.xml , D, ; . - A, B, C D
config.xml Jenkins TimerTrigger ( ) ; - , .
, upstream:
- Groovy :
http://jenkins/userContent/scripts/JobCronScheduleConfigurator.groovy - :
- Build
- ()
- Builder
- ◉ Groovy script
http://jenkins/userContent/scripts/JobCronScheduleConfigurator.groovy
→ Groovy Postbuild Groovy script, ( ).