2018-06-26 13:00:48 +02:00
import com.sap.piper.GitUtils
2018-08-09 11:35:33 +02:00
import com.sap.piper.Utils
2018-06-26 13:00:48 +02:00
import groovy.transform.Field
import hudson.AbortException
2018-07-06 09:05:26 +02:00
import com.sap.piper.ConfigurationHelper
2018-06-26 13:00:48 +02:00
import com.sap.piper.ConfigurationMerger
import com.sap.piper.cm.ChangeManagement
import com.sap.piper.cm.ChangeManagementException
@Field def STEP_NAME = 'checkChangeInDevelopment'
2018-10-16 13:07:57 +02:00
@Field Set STEP_CONFIG_KEYS = [
2018-07-17 09:21:56 +02:00
'changeManagement' ,
2018-10-26 12:14:03 +02:00
/ * *
* When set to ` false ` the step will not fail in case the step is not in status 'in development' .
* @possibleValues ` true ` , ` false `
* /
2018-07-17 09:21:56 +02:00
'failIfStatusIsNotInDevelopment'
2018-06-26 13:00:48 +02:00
]
2018-10-16 13:07:57 +02:00
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS . plus ( 'changeDocumentId' )
2018-07-12 09:49:18 +02:00
2018-10-16 13:07:57 +02:00
@Field Set GENERAL_CONFIG_KEYS = STEP_CONFIG_KEYS
2018-07-06 09:05:26 +02:00
2018-10-26 12:32:25 +02:00
/ * *
* This is my header comment
* /
2018-06-26 13:00:48 +02:00
def call ( parameters = [ : ] ) {
handlePipelineStepErrors ( stepName: STEP_NAME , stepParameters: parameters ) {
2018-07-06 09:04:04 +02:00
def script = parameters . script ? : [ commonPipelineEnvironment: commonPipelineEnvironment ]
2018-06-26 13:00:48 +02:00
GitUtils gitUtils = parameters ? . gitUtils ? : new GitUtils ( )
2018-07-06 09:04:04 +02:00
ChangeManagement cm = parameters ? . cmUtils ? : new ChangeManagement ( script , gitUtils )
2018-06-26 13:00:48 +02:00
2018-07-12 08:54:04 +02:00
ConfigurationHelper configHelper = ConfigurationHelper
2018-08-15 10:37:34 +02:00
. loadStepDefaults ( this )
2018-10-16 13:07:57 +02:00
. mixinGeneralConfig ( script . commonPipelineEnvironment , GENERAL_CONFIG_KEYS )
. mixinStepConfig ( script . commonPipelineEnvironment , STEP_CONFIG_KEYS )
. mixinStageConfig ( script . commonPipelineEnvironment , parameters . stageName ? : env . STAGE_NAME , STEP_CONFIG_KEYS )
. mixin ( parameters , PARAMETER_KEYS )
2018-08-15 10:37:34 +02:00
// for the following parameters we expect defaults
2018-10-16 13:07:57 +02:00
/ * *
* A pattern used for identifying lines holding the change document id .
2018-10-25 10:01:44 +02:00
* @possibleValues regex pattern
2018-10-16 13:07:57 +02:00
* /
2018-08-15 10:37:34 +02:00
. withMandatoryProperty ( 'changeManagement/changeDocumentLabel' )
2018-10-16 13:07:57 +02:00
/ * *
* Additional options for cm command line client , e . g . like JAVA_OPTS .
* /
2018-08-15 10:37:34 +02:00
. withMandatoryProperty ( 'changeManagement/clientOpts' )
2018-10-16 13:07:57 +02:00
/ * *
* The id of the credentials to connect to the Solution Manager . The credentials needs to be maintained on Jenkins .
* /
2018-08-15 10:37:34 +02:00
. withMandatoryProperty ( 'changeManagement/credentialsId' )
2018-10-16 13:07:57 +02:00
/ * *
* The starting point for retrieving the change document id
* /
2018-08-15 10:37:34 +02:00
. withMandatoryProperty ( 'changeManagement/git/from' )
2018-10-16 13:07:57 +02:00
/ * *
* The end point for retrieving the change document id
* /
2018-08-15 10:37:34 +02:00
. withMandatoryProperty ( 'changeManagement/git/to' )
2018-10-16 13:07:57 +02:00
/ * *
* Specifies what part of the commit is scanned . By default the body of the commit message is scanned .
2018-10-25 10:01:44 +02:00
* @possibleValues see ` git log - - help `
2018-10-16 13:07:57 +02:00
* /
2018-08-15 10:37:34 +02:00
. withMandatoryProperty ( 'changeManagement/git/format' )
. withMandatoryProperty ( 'failIfStatusIsNotInDevelopment' )
// for the following parameters we expect a value provided from outside
2018-10-16 13:07:57 +02:00
/ * *
* The address of the Solution Manager .
* /
2018-08-15 10:37:34 +02:00
. withMandatoryProperty ( 'changeManagement/endpoint' )
2018-07-17 09:21:56 +02:00
2018-07-12 08:54:04 +02:00
Map configuration = configHelper . use ( )
2018-06-26 13:00:48 +02:00
2018-08-09 11:35:33 +02:00
new Utils ( ) . pushToSWA ( [ step: STEP_NAME ] , configuration )
2018-07-10 11:09:20 +02:00
def changeId = configuration . changeDocumentId
if ( changeId ? . trim ( ) ) {
2018-07-16 15:41:46 +02:00
echo "[INFO] ChangeDocumentId retrieved from parameters."
2018-07-10 11:09:20 +02:00
} else {
2018-07-17 09:21:56 +02:00
echo "[INFO] Retrieving ChangeDocumentId from commit history [from: ${configuration.changeManagement.git.from}, to: ${configuration.changeManagement.git.to}]." +
"Searching for pattern '${configuration.changeManagement.changeDocumentLabel}'. Searching with format '${configuration.changeManagement.git.format}'."
2018-07-10 11:09:20 +02:00
try {
changeId = cm . getChangeDocumentId (
2018-07-17 09:21:56 +02:00
configuration . changeManagement . git . from ,
configuration . changeManagement . git . to ,
configuration . changeManagement . changeDocumentLabel ,
configuration . changeManagement . git . format
2018-07-10 11:09:20 +02:00
)
if ( changeId ? . trim ( ) ) {
echo "[INFO] ChangeDocumentId '${changeId}' retrieved from commit history"
}
} catch ( ChangeManagementException ex ) {
2018-07-19 10:26:34 +02:00
echo "[WARN] Cannot retrieve changeDocumentId from commit history: ${ex.getMessage()}."
2018-06-26 13:00:48 +02:00
}
}
2018-07-12 08:54:04 +02:00
configuration = configHelper . mixin ( [ changeDocumentId: changeId ? . trim ( ) ? : null ] , [ 'changeDocumentId' ] as Set )
2018-10-16 13:07:57 +02:00
/ * *
* The id of the change document to transport . If not provided , it is retrieved from the git commit history .
* /
2018-07-12 08:54:04 +02:00
. withMandatoryProperty ( 'changeDocumentId' ,
"No changeDocumentId provided. Neither via parameter 'changeDocumentId' " +
2018-07-17 09:21:56 +02:00
"nor via label '${configuration.changeManagement.changeDocumentLabel}' in commit range " +
"[from: ${configuration.changeManagement.git.from}, to: ${configuration.changeManagement.git.to}]." )
2018-07-12 08:54:04 +02:00
. use ( )
2018-06-26 13:00:48 +02:00
boolean isInDevelopment
2018-07-12 08:54:04 +02:00
echo "[INFO] Checking if change document '${configuration.changeDocumentId}' is in development."
2018-06-26 13:00:48 +02:00
2018-07-16 15:41:46 +02:00
try {
2018-06-26 13:00:48 +02:00
2018-07-16 15:41:46 +02:00
isInDevelopment = cm . isChangeInDevelopment ( configuration . changeDocumentId ,
configuration . changeManagement . endpoint ,
configuration . changeManagement . credentialsId ,
configuration . changeManagement . clientOpts )
} catch ( ChangeManagementException ex ) {
throw new AbortException ( ex . getMessage ( ) )
2018-06-26 13:00:48 +02:00
}
2018-07-16 15:41:46 +02:00
2018-06-26 13:00:48 +02:00
if ( isInDevelopment ) {
echo "[INFO] Change '${changeId}' is in status 'in development'."
return true
} else {
if ( configuration . failIfStatusIsNotInDevelopment . toBoolean ( ) ) {
throw new AbortException ( "Change '${changeId}' is not in status 'in development'." )
} else {
echo "[WARNING] Change '${changeId}' is not in status 'in development'. Failing the pipeline has been explicitly disabled."
return false
}
}
}
}