diff --git a/src/com/sap/piper/cm/ChangeManagement.groovy b/src/com/sap/piper/cm/ChangeManagement.groovy index 27f443c26..08d4472fc 100644 --- a/src/com/sap/piper/cm/ChangeManagement.groovy +++ b/src/com/sap/piper/cm/ChangeManagement.groovy @@ -64,60 +64,62 @@ public class ChangeManagement implements Serializable { return items[0] } - boolean isChangeInDevelopment(String changeId, String endpoint, String username, String password, String clientOpts = '') { + boolean isChangeInDevelopment(String changeId, String endpoint, String credentialsId, String clientOpts = '') { + int rc = executeWithCredentials(endpoint, credentialsId, 'is-change-in-development', ['-cID', "'${changeId}'", '--return-code'], + clientOpts) as int - int rc = script.sh(returnStatus: true, - script: getCMCommandLine(endpoint, username, password, - 'is-change-in-development', ['-cID', "'${changeId}'", - '--return-code'], - clientOpts)) - - if(rc == 0) { - return true - } else if(rc == 3) { - return false - } else { - throw new ChangeManagementException("Cannot retrieve status for change document '${changeId}'. Does this change exist? Return code from cmclient: ${rc}.") - } - } - - String createTransportRequest(String changeId, String developmentSystemId, String endpoint, String username, String password, String clientOpts = '') { - - try { - String transportRequest = script.sh(returnStdout: true, - script: getCMCommandLine(endpoint, username, password, 'create-transport', ['-cID', changeId, - '-dID', developmentSystemId], - clientOpts)) - return transportRequest.trim() - } catch(AbortException e) { - throw new ChangeManagementException("Cannot create a transport request for change id '$changeId'. $e.message.") + if (rc == 0) { + return true + } else if (rc == 3) { + return false + } else { + throw new ChangeManagementException("Cannot retrieve status for change document '${changeId}'. Does this change exist? Return code from cmclient: ${rc}.") } } - void uploadFileToTransportRequest(String changeId, String transportRequestId, String applicationId, String filePath, String endpoint, String username, String password, String cmclientOpts = '') { + String createTransportRequest(String changeId, String developmentSystemId, String endpoint, String credentialsId, String clientOpts = '') { + try { + def transportRequest = executeWithCredentials(endpoint, credentialsId, 'create-transport', ['-cID', changeId, '-dID', developmentSystemId], + clientOpts) + return transportRequest.trim() as String + }catch(AbortException e) { + throw new ChangeManagementException("Cannot create a transport request for change id '$changeId'. $e.message.") + } + } - int rc = script.sh(returnStatus: true, - script: getCMCommandLine(endpoint, username, password, - 'upload-file-to-transport', ['-cID', changeId, - '-tID', transportRequestId, - applicationId, filePath], - cmclientOpts)) + + void uploadFileToTransportRequest(String changeId, String transportRequestId, String applicationId, String filePath, String endpoint, String credentialsId, String cmclientOpts = '') { + int rc = executeWithCredentials(endpoint, credentialsId, 'upload-file-to-transport', ['-cID', changeId, + '-tID', transportRequestId, + applicationId, filePath], + cmclientOpts) as int if(rc == 0) { return } else { throw new ChangeManagementException("Cannot upload file '$filePath' for change document '$changeId' with transport request '$transportRequestId'. Return code from cmclient: $rc.") } + } - void releaseTransportRequest(String changeId, String transportRequestId, String endpoint, String username, String password, String clientOpts = '') { + def executeWithCredentials(String endpoint, String credentialsId, String command, List args, String clientOpts = '') { + script.withCredentials([script.usernamePassword( + credentialsId: credentialsId, + passwordVariable: 'password', + usernameVariable: 'username')]) { + def returnValue = script.sh(returnStatus: true, + script: getCMCommandLine(endpoint, script.username, script.password, + command, args, + clientOpts)) + return returnValue; - int rc = script.sh(returnStatus: true, - script: getCMCommandLine(endpoint, username, password, - 'release-transport', ['-cID', changeId, - '-tID', transportRequestId], - clientOpts)) + } + } + + void releaseTransportRequest(String changeId, String transportRequestId, String endpoint, String credentialsId, String clientOpts = '') { + int rc = executeWithCredentials( endpoint, credentialsId, 'release-transport', ['-cID', changeId, + '-tID', transportRequestId], clientOpts) as int if(rc == 0) { return } else { diff --git a/test/groovy/CheckChangeInDevelopmentTest.groovy b/test/groovy/CheckChangeInDevelopmentTest.groovy index 7ecba5bf3..6aa783415 100644 --- a/test/groovy/CheckChangeInDevelopmentTest.groovy +++ b/test/groovy/CheckChangeInDevelopmentTest.groovy @@ -1,5 +1,5 @@ import org.junit.After -import org.junit.Before + import org.junit.Rule import org.junit.Test import org.junit.rules.ExpectedException @@ -26,7 +26,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { .around(thrown) .around(jsr) .around(new JenkinsCredentialsRule(this) - .withCredentials('CM', 'anonymous', '********')) + .withCredentials('CM', 'anonymous', '********')) @After public void tearDown() { @@ -44,12 +44,10 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { changeManagement: [endpoint: 'https://example.org/cm']) assert inDevelopment - assert cmUtilReceivedParams == [ changeId: '001', endpoint: 'https://example.org/cm', - userName: 'anonymous', - password: '********', + credentialsId: 'CM', cmclientOpts: '' ] } @@ -163,11 +161,10 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { return changeDocumentId } - boolean isChangeInDevelopment(String changeId, String endpoint, String userName, String password, String cmclientOpts) { + boolean isChangeInDevelopment(String changeId, String endpoint, String credentialsId, String cmclientOpts) { cmUtilReceivedParams.changeId = changeId cmUtilReceivedParams.endpoint = endpoint - cmUtilReceivedParams.userName = userName - cmUtilReceivedParams.password = password + cmUtilReceivedParams.credentialsId = credentialsId cmUtilReceivedParams.cmclientOpts = cmclientOpts return inDevelopment diff --git a/test/groovy/TransportRequestCreateTest.groovy b/test/groovy/TransportRequestCreateTest.groovy index 297f3f7bf..56117d938 100644 --- a/test/groovy/TransportRequestCreateTest.groovy +++ b/test/groovy/TransportRequestCreateTest.groovy @@ -36,6 +36,7 @@ public class TransportRequestCreateTest extends BasePiperTest { nullScript.commonPipelineEnvironment.configuration = [general: [changeManagement: + [ credentialsId: 'CM', endpoint: 'https://example.org/cm', @@ -85,8 +86,7 @@ public class TransportRequestCreateTest extends BasePiperTest { String createTransportRequest(String changeId, String developmentSystemId, String cmEndpoint, - String username, - String password, + String credentialId, String clientOpts) { throw new ChangeManagementException('Exception message.') @@ -110,15 +110,14 @@ public class TransportRequestCreateTest extends BasePiperTest { String createTransportRequest(String changeId, String developmentSystemId, String cmEndpoint, - String username, - String password, + String credentialId, String clientOpts) { result.changeId = changeId result.developmentSystemId = developmentSystemId result.cmEndpoint = cmEndpoint - result.username = username - result.password = password + result.credentialId = credentialId + result.clientOpts = clientOpts return '001' } @@ -130,8 +129,7 @@ public class TransportRequestCreateTest extends BasePiperTest { assert result == [changeId: '001', developmentSystemId: '001', cmEndpoint: 'https://example.org/cm', - username: 'anonymous', - password: '********', + credentialId: 'CM', clientOpts: '-DmyProp=myVal' ] diff --git a/test/groovy/TransportRequestUploadFileTest.groovy b/test/groovy/TransportRequestUploadFileTest.groovy index 4b3c9306c..ad0712fdc 100644 --- a/test/groovy/TransportRequestUploadFileTest.groovy +++ b/test/groovy/TransportRequestUploadFileTest.groovy @@ -116,8 +116,7 @@ public class TransportRequestUploadFileTest extends BasePiperTest { String applicationId, String filePath, String endpoint, - String username, - String password, + String credentialsId, String cmclientOpts) { throw new ChangeManagementException('Exception message') } @@ -146,8 +145,7 @@ public class TransportRequestUploadFileTest extends BasePiperTest { String applicationId, String filePath, String endpoint, - String username, - String password, + String credentialsId, String cmclientOpts) { cmUtilReceivedParams.changeId = changeId @@ -155,8 +153,7 @@ public class TransportRequestUploadFileTest extends BasePiperTest { cmUtilReceivedParams.applicationId = applicationId cmUtilReceivedParams.filePath = filePath cmUtilReceivedParams.endpoint = endpoint - cmUtilReceivedParams.username = username - cmUtilReceivedParams.password = password + cmUtilReceivedParams.credentialsId = credentialsId cmUtilReceivedParams.cmclientOpts = cmclientOpts } } @@ -175,8 +172,7 @@ public class TransportRequestUploadFileTest extends BasePiperTest { applicationId: 'app', filePath: '/path', endpoint: 'https://example.org/cm', - username: 'anonymous', - password: '********', + credentialsId: 'CM', cmclientOpts: '' ] } @@ -193,8 +189,7 @@ public class TransportRequestUploadFileTest extends BasePiperTest { String applicationId, String filePath, String endpoint, - String username, - String password, + String credentialsId, String cmclientOpts) { cmUtilReceivedParams.filePath = filePath @@ -223,8 +218,7 @@ public class TransportRequestUploadFileTest extends BasePiperTest { String applicationId, String filePath, String endpoint, - String username, - String password, + String credentialsId, String cmclientOpts) { cmUtilReceivedParams.filePath = filePath @@ -252,8 +246,7 @@ public class TransportRequestUploadFileTest extends BasePiperTest { String applicationId, String filePath, String endpoint, - String username, - String password, + String credentialsId, String cmclientOpts) { throw new ChangeManagementException('Upload failure.') } diff --git a/test/groovy/com/sap/piper/cm/ChangeManagementTest.groovy b/test/groovy/com/sap/piper/cm/ChangeManagementTest.groovy index dfeef8d33..edf556fe7 100644 --- a/test/groovy/com/sap/piper/cm/ChangeManagementTest.groovy +++ b/test/groovy/com/sap/piper/cm/ChangeManagementTest.groovy @@ -21,6 +21,7 @@ import util.BasePiperTest import util.JenkinsLoggingRule import util.JenkinsScriptLoaderRule import util.JenkinsShellCallRule +import util.JenkinsCredentialsRule import util.Rules import hudson.AbortException @@ -37,6 +38,7 @@ public class ChangeManagementTest extends BasePiperTest { .around(thrown) .around(script) .around(logging) + .around(new JenkinsCredentialsRule(this).withCredentials('me','user','password')) @Test public void testRetrieveChangeDocumentIdOutsideGitWorkTreeTest() { @@ -90,8 +92,7 @@ public class ChangeManagementTest extends BasePiperTest { public void testIsChangeInDevelopmentReturnsTrueWhenChangeIsInDevelopent() { script.setReturnValue(JenkinsShellCallRule.Type.REGEX, "cmclient.*is-change-in-development -cID '001'", 0) - - boolean inDevelopment = new ChangeManagement(nullScript, null).isChangeInDevelopment('001', 'endpoint', 'user', 'password') + boolean inDevelopment = new ChangeManagement(nullScript, null).isChangeInDevelopment('001', 'endpoint', 'me') assertThat(inDevelopment, is(equalTo(true))) assertThat(script.shell[0], allOf(containsString("cmclient"), @@ -111,8 +112,7 @@ public class ChangeManagementTest extends BasePiperTest { boolean inDevelopment = new ChangeManagement(nullScript, null) .isChangeInDevelopment('001', 'endpoint', - 'user', - 'password') + 'me') assertThat(inDevelopment, is(equalTo(false))) } @@ -124,8 +124,7 @@ public class ChangeManagementTest extends BasePiperTest { thrown.expectMessage('Cannot retrieve status for change document \'001\'. Does this change exist? Return code from cmclient: 1.') script.setReturnValue(JenkinsShellCallRule.Type.REGEX, "cmclient.*is-change-in-development -cID '001'", 1) - - new ChangeManagement(nullScript, null).isChangeInDevelopment('001', 'endpoint', 'user', 'password') + new ChangeManagement(nullScript, null).isChangeInDevelopment('001', 'endpoint', 'me') } @Test @@ -139,7 +138,7 @@ public class ChangeManagementTest extends BasePiperTest { commandLine = commandLine.replaceAll(' +', " ") assertThat(commandLine, not(containsString("CMCLIENT_OPTS"))) assertThat(commandLine, containsString("cmclient -e 'https://example.org/cm' -u 'me' -p 'topSecret' -t SOLMAN the-command -key1 val1 -key2 val2")) -} + } @Test public void testGetCommandLineWithCMClientOpts() { @@ -158,7 +157,7 @@ public void testGetCommandLineWithCMClientOpts() { public void testCreateTransportRequestSucceeds() { script.setReturnValue(JenkinsShellCallRule.Type.REGEX, ".*cmclient.*create-transport -cID 001 -dID 002.*", '004') - def transportRequestId = new ChangeManagement(nullScript).createTransportRequest('001', '002', '003', 'me', 'openSesame') + def transportRequestId = new ChangeManagement(nullScript).createTransportRequest('001', '002', '003', 'me') // the check for the transportRequestID is sufficient. This checks implicit the command line since that value is // returned only in case the shell call matches. @@ -180,8 +179,7 @@ public void testGetCommandLineWithCMClientOpts() { 'XXX', '/path', 'https://example.org/cm', - 'me', - 'openSesame') + 'me') } @Test @@ -195,8 +193,7 @@ public void testGetCommandLineWithCMClientOpts() { 'XXX', '/path', 'https://example.org/cm', - 'me', - 'openSesame') + 'me') // no assert required here, since the regex registered above to the script rule is an implicit check for // the command line. @@ -216,8 +213,7 @@ public void testGetCommandLineWithCMClientOpts() { 'XXX', '/path', 'https://example.org/cm', - 'me', - 'openSesame') + 'me') } private GitUtils gitUtilsMock(boolean insideWorkTree, String[] changeIds) { diff --git a/vars/checkChangeInDevelopment.groovy b/vars/checkChangeInDevelopment.groovy index f6838e068..ca94d8bd3 100644 --- a/vars/checkChangeInDevelopment.groovy +++ b/vars/checkChangeInDevelopment.groovy @@ -52,7 +52,7 @@ def call(parameters = [:]) { if(changeId?.trim()) { - echo "[INFO] ChangeDocumentId retrieved from parameters." + echo "[INFO] ChangeDocumentId retrieved from parameters." } else { @@ -85,22 +85,19 @@ def call(parameters = [:]) { echo "[INFO] Checking if change document '${configuration.changeDocumentId}' is in development." - withCredentials([usernamePassword( - credentialsId: configuration.changeManagement.credentialsId, - passwordVariable: 'password', - usernameVariable: 'username')]) { + try { - try { - isInDevelopment = cm.isChangeInDevelopment(configuration.changeDocumentId, - configuration.changeManagement.endpoint, - username, - password, - configuration.changeManagement.clientOpts) - } catch(ChangeManagementException ex) { - throw new AbortException(ex.getMessage()) - } + + isInDevelopment = cm.isChangeInDevelopment(configuration.changeDocumentId, + configuration.changeManagement.endpoint, + configuration.changeManagement.credentialsId, + configuration.changeManagement.clientOpts) + + } catch(ChangeManagementException ex) { + throw new AbortException(ex.getMessage()) } + if(isInDevelopment) { echo "[INFO] Change '${changeId}' is in status 'in development'." return true diff --git a/vars/transportRequestCreate.groovy b/vars/transportRequestCreate.groovy index 88899b93d..c675f8706 100644 --- a/vars/transportRequestCreate.groovy +++ b/vars/transportRequestCreate.groovy @@ -79,22 +79,16 @@ def call(parameters = [:]) { echo "[INFO] Creating transport request for change document '${configuration.changeDocumentId}' and development system '${configuration.developmentSystemId}'." - withCredentials([usernamePassword( - credentialsId: configuration.changeManagement.credentialsId, - passwordVariable: 'password', - usernameVariable: 'username')]) { - try { transportRequestId = cm.createTransportRequest(configuration.changeDocumentId, configuration.developmentSystemId, configuration.changeManagement.endpoint, - username, - password, + configuration.changeManagement.credentialsId, configuration.changeManagement.clientOpts) } catch(ChangeManagementException ex) { throw new AbortException(ex.getMessage()) } - } + echo "[INFO] Transport Request '$transportRequestId' has been successfully created." return transportRequestId diff --git a/vars/transportRequestRelease.groovy b/vars/transportRequestRelease.groovy index 8e399766d..81ea5cdc7 100644 --- a/vars/transportRequestRelease.groovy +++ b/vars/transportRequestRelease.groovy @@ -108,22 +108,17 @@ def call(parameters = [:]) { echo "[INFO] Closing transport request '${configuration.transportRequestId}' for change document '${configuration.changeDocumentId}'." - withCredentials([usernamePassword( - credentialsId: configuration.changeManagement.credentialsId, - passwordVariable: 'password', - usernameVariable: 'username')]) { - try { cm.releaseTransportRequest(configuration.changeDocumentId, configuration.transportRequestId, configuration.changeManagement.endpoint, - username, - password, + configuration.changeManagement.credentialsId, configuration.changeManagement.clientOpts) + } catch(ChangeManagementException ex) { throw new AbortException(ex.getMessage()) } - } + echo "[INFO] Transport Request '${configuration.transportRequestId}' has been successfully closed." } diff --git a/vars/transportRequestUploadFile.groovy b/vars/transportRequestUploadFile.groovy index 130597477..edc6108aa 100644 --- a/vars/transportRequestUploadFile.groovy +++ b/vars/transportRequestUploadFile.groovy @@ -113,24 +113,21 @@ def call(parameters = [:]) { echo "[INFO] Uploading file '${configuration.filePath}' to transport request '${configuration.transportRequestId}' of change document '${configuration.changeDocumentId}'." - withCredentials([usernamePassword( - credentialsId: configuration.changeManagement.credentialsId, - passwordVariable: 'password', - usernameVariable: 'username')]) { - try { + + cm.uploadFileToTransportRequest(configuration.changeDocumentId, configuration.transportRequestId, configuration.applicationId, configuration.filePath, configuration.changeManagement.endpoint, - username, - password, + configuration.changeManagement.credentialsId, configuration.changeManagement.clientOpts) + } catch(ChangeManagementException ex) { throw new AbortException(ex.getMessage()) } - } + echo "[INFO] File '${configuration.filePath}' has been successfully uploaded to transport request '${configuration.transportRequestId}' of change document '${configuration.changeDocumentId}'." }