diff --git a/documentation/docs/steps/checkChangeInDevelopment.md b/documentation/docs/steps/checkChangeInDevelopment.md index ed94ba146..f47bd79ee 100644 --- a/documentation/docs/steps/checkChangeInDevelopment.md +++ b/documentation/docs/steps/checkChangeInDevelopment.md @@ -1,11 +1,11 @@ # checkChangeInDevelopment ## Description -Checks if a Change Document is in status 'in development'. The change document id is retrieved from the git commit history. The change document id +Checks if a Change Document in SAP Solution Manager is in status 'in development'. The change document id is retrieved from the git commit history. The change document id can also be provided via parameter `changeDocumentId`. Any value provided as parameter has a higher precedence than a value from the commit history. By default the git commit messages between `origin/master` and `HEAD` are scanned for a line like `ChangeDocument : `. The commit -range and the pattern can be configured. For details see 'parameters' table. +range and the pattern can be configured. For details see 'parameters' table. ## Prerequisites * **[Change Management Client 2.0.0 or compatible version](http://central.maven.org/maven2/com/sap/devops/cmclient/dist.cli/)** - available for download on Maven Central. @@ -15,27 +15,72 @@ range and the pattern can be configured. For details see 'parameters' table. | -------------------|-----------|--------------------------------------------------------|--------------------| | `script` | yes | | | | `changeDocumentId` | yes | | | -| `credentialsId` | yes | | | -| `endpoint` | yes | | | -| `gitFrom` | no | `origin/master` | | -| `gitTo` | no | `HEAD` | | -| `gitChangeDocumentLabel` | no | `ChangeDocument\s?:` | regex pattern | -| `gitFormat` | no | `%b` | see `git log --help` | +| `changeManagement/changeDocumentLabel` | no | `ChangeDocument\s?:` | regex pattern | +| `changeManagement/credentialsId` | yes | | | +| `changeManagement/endpoint` | yes | | | +| `changeManagement/git/from` | no | `origin/master` | | +| `changeManagement/git/to` | no | `HEAD` | | +| `changeManagement/git/format` | no | `%b` | see `git log --help` | +| `failIfStatusIsNotInDevelopment` | no | `true` | `true`, `false` | * `script` - The common script environment of the Jenkinsfile running. Typically the reference to the script calling the pipeline step is provided with the `this` parameter, as in `script: this`. This allows the function to access the [`commonPipelineEnvironment`](commonPipelineEnvironment.md) for retrieving, for example, configuration parameters. * `changeDocumentId` - The id of the change document to transport. If not provided, it is retrieved from the git commit history. -* `credentialsId` - The credentials to connect to the Solution Manager. -* `endpoint` - The address of the Solution Manager. -* `gitFrom` - The starting point for retrieving the change document id -* `gitTo` - The end point for retrieving the change document id -* `gitChangeDocumentLabel` - A pattern used for identifying lines holding the change document id. -* `gitFormat` - Specifies what part of the commit is scanned. By default the body of the commit message is scanned. +* `changeManagement/changeDocumentLabel` - A pattern used for identifying lines holding the change document id. +* `changeManagement/credentialsId` - The id of the credentials to connect to the Solution Manager. The credentials needs to be maintained on Jenkins. +* `changeManagement/endpoint` - The address of the Solution Manager. +* `changeManagement/git/from` - The starting point for retrieving the change document id +* `changeManagement/git/to` - The end point for retrieving the change document id +* `changeManagement/git/format` - Specifies what part of the commit is scanned. By default the body of the commit message is scanned. +* `failIfStatusIsNotInDevelopment` - when set to `false` the step will not fail in case the step is not in status 'in development'. ## Step configuration -The following parameters can also be specified as step parameters using the global configuration file: +The step is configured using a customer configuration file provided as +resource in an custom shared library. -* `credentialsId` -* `endpoint` +``` +@Library('piper-library-os@master') _ + +// the shared lib containing the additional configuration +// needs to be configured in Jenkins +@Library(foo@master') __ + +// inside the shared lib denoted by 'foo' the additional configuration file +// needs to be located under 'resources' ('resoures/myConfig.yml') +prepareDefaultValues script: this, + customDefaults: 'myConfig.yml' +``` + +Example content of ```'resources/myConfig.yml'``` in branch ```'master'``` of the repository denoted by +```'foo'```: + +``` +general: + changeManagement: + changeDocumentLabel: 'ChangeDocument\s?:' + cmClientOpts: '-Djavax.net.ssl.trustStore=' + credentialsId: 'CM' + endpoint: 'https://example.org/cm' + git: + from: 'HEAD~1' + to: 'HEAD' + format: '%b' +``` + +The properties configured in section `'general/changeManagement'` are shared between all change managment related steps. + +The properties can also be configured on a per-step basis: + +``` + [...] + steps: + checkChangeInDevelopment: + changeManagement: + endpoint: 'https://example.org/cm' + [...] + failIfStatusIsNotInDevelopment: true +``` + +The parameters can also be provided when the step is invoked. For examples see below. ## Return value `true` in case the change document is in status 'in development'. Otherwise an hudson.AbortException is thrown. In case `failIfStatusIsNotInDevelopment` @@ -45,9 +90,26 @@ is set to `false`, `false` is returned in case the change document is not in sta * `AbortException`: * If the change id is not provided via parameter and if the change document id cannot be retrieved from the commit history. * If the change is not in status `in development`. In this case no exception will be thrown when `failIfStatusIsNotInDevelopment` is set to `false`. - -## Example +* `IllegalArgumentException`: + * If a mandatory property is not provided. +## Examples ```groovy + // simple case. All mandatory parameters provided via + // configuration, changeDocumentId provided via commit + // history checkChangeInDevelopment script:this ``` +```groovy + // explict endpoint provided, we search for changeDocumentId + // starting at the previous commit (HEAD~1) rather than on + // 'origin/master' (the default). + checkChangeInDevelopment script:this + changeManagement: [ + endpoint: 'https:example.org/cm' + git: [ + from: 'HEAD~1' + ] + ] +``` + diff --git a/documentation/docs/steps/transportRequestCreate.md b/documentation/docs/steps/transportRequestCreate.md index 321ad7fc3..c3bd341ca 100644 --- a/documentation/docs/steps/transportRequestCreate.md +++ b/documentation/docs/steps/transportRequestCreate.md @@ -11,41 +11,88 @@ Creates a Transport Request for a Change Document on the Solution Manager. | -----------------|-----------|--------------------------------------------------------|--------------------| | `script` | yes | | | | `changeDocumentId` | yes | | | -| `credentialsId` | yes | | | -| `endpoint` | yes | | | -| `clientOpts` | no | | | -| `gitFrom` | no | `origin/master` | | -| `gitTo` | no | `HEAD` | | -| `gitChangeDocumentLabel` | no | `ChangeDocument\s?:` | regex pattern | -| `gitFormat` | no | `%b` | see `git log --help` | +| `changeManagement/credentialsId` | yes | | | +| `changeManagement/endpoint` | yes | | | +| `changeManagement/clientOpts` | no | | | +| `changeManagement/git/from` | no | `origin/master` | | +| `changeManagement/git/to` | no | `HEAD` | | +| `changeManagement/changeDocumentLabel` | no | `ChangeDocument\s?:` | regex pattern | +| `changeManagement/git/format` | no | `%b` | see `git log --help` | * `script` - The common script environment of the Jenkinsfile running. Typically the reference to the script calling the pipeline step is provided with the `this` parameter, as in `script: this`. This allows the function to access the [`commonPipelineEnvironment`](commonPipelineEnvironment.md) for retrieving, for example, configuration parameters. * `changeDocumentId` - The id of the change document to transport. -* `credentialsId` - The credentials to connect to the Solution Manager. -* `endpoint` - The address of the Solution Manager. -* `clientOpts`- Options forwarded to JVM used by the CM client, like `JAVA_OPTS` -* `gitFrom` - The starting point for retrieving the change document id -* `gitTo` - The end point for retrieving the change document id -* `gitChangeDocumentLabel` - A pattern used for identifying lines holding the change document id. -* `gitFormat` - Specifies what part of the commit is scanned. By default the body of the commit message is scanned. +* `changeManagement/credentialsId` - The credentials to connect to the Solution Manager. +* `changeManagement/endpoint` - The address of the Solution Manager. +* `changeManagement/clientOpts`- Options forwarded to JVM used by the CM client, like `JAVA_OPTS` +* `changeManagement/git/from` - The starting point for retrieving the change document id +* `changeManagement/git/to` - The end point for retrieving the change document id +* `changeManagement/changeDocumentLabel` - A pattern used for identifying lines holding the change document id. +* `changeManagement/git/format` - Specifies what part of the commit is scanned. By default the body of the commit message is scanned. ## Step configuration -The following parameters can also be specified as step parameters using the global configuration file: +The step is configured using a customer configuration file provided as +resource in an custom shared library. -* `credentialsId` -* `endpoint` -* `clientOpts` +``` +@Library('piper-library-os@master') _ + +// the shared lib containing the additional configuration +// needs to be configured in Jenkins +@Library(foo@master') __ + +// inside the shared lib denoted by 'foo' the additional configuration file +// needs to be located under 'resources' ('resoures/myConfig.yml') +prepareDefaultValues script: this, + customDefaults: 'myConfig.yml' +``` + +Example content of ```'resources/myConfig.yml'``` in branch ```'master'``` of the repository denoted by +```'foo'```: + +``` +general: + changeManagement: + changeDocumentLabel: 'ChangeDocument\s?:' + cmClientOpts: '-Djavax.net.ssl.trustStore=' + credentialsId: 'CM' + endpoint: 'https://example.org/cm' + git: + from: 'HEAD~1' + to: 'HEAD' + format: '%b' +``` + +The properties configured in section `'general/changeManagement'` are shared between +all change managment related steps. + +The properties can also be configured on a per-step basis: + +``` + [...] + steps: + transportRequestCreate: + changeManagement: + endpoint: 'https://example.org/cm' + [...] +``` + +The parameters can also be provided when the step is invoked. For examples see below. ## Return value The id of the Transport Request that has been created. ## Exceptions * `AbortException`: - * If the change id is not provided. * If the creation of the transport request fails. +* `IllegalStateException`: + * If the change id is not provided. ## Example ```groovy -def transportRequestId = transportRequestCreate script:this, changeDocumentId: '001' +def transportRequestId = transportRequestCreate script:this, + changeDocumentId: '001,' + changeManagement: [ + endpoint: 'https://example.org/cm' + ] ``` diff --git a/documentation/docs/steps/transportRequestRelease.md b/documentation/docs/steps/transportRequestRelease.md index 2cadda07e..1ea0a7d79 100644 --- a/documentation/docs/steps/transportRequestRelease.md +++ b/documentation/docs/steps/transportRequestRelease.md @@ -12,42 +12,90 @@ Releases a Transport Request for a Change Document on the Solution Manager. | `script` | yes | | | | `changeDocumentId` | yes | | | | `transportRequestId`| yes | | | -| `credentialsId` | yes | | | -| `endpoint` | yes | | | -| `gitTransportRequestLabel` | no | `TransportRequest\s?:` | regex pattern | -| `gitFrom` | no | `origin/master` | | -| `gitTo` | no | `HEAD` | | -| `gitChangeDocumentLabel` | no | `ChangeDocument\s?:` | regex pattern | -| `gitFormat` | no | `%b` | see `git log --help` | +| `changeManagement/changeDocumentLabel` | no | `ChangeDocument\s?:` | regex pattern | +| `changeManagment/transportRequestLabel` | no | `TransportRequest\s?:` | regex pattern | +| `changeManagement/credentialsId` | yes | | | +| `changeManagement/endpoint` | yes | | | +| `changeManagement/git/from` | no | `origin/master` | | +| `changeManagement/git/to` | no | `HEAD` | | +| `changeManagement/git/format` | no | `%b` | see `git log --help` | * `script` - The common script environment of the Jenkinsfile running. Typically the reference to the script calling the pipeline step is provided with the `this` parameter, as in `script: this`. This allows the function to access the [`commonPipelineEnvironment`](commonPipelineEnvironment.md) for retrieving, for example, configuration parameters. * `changeDocumentId` - The id of the change document related to the transport request to release. * `transportRequestId` - The id of the transport request to release. -* `credentialsId` - The credentials to connect to the Solution Manager. -* `endpoint` - The address of the Solution Manager. -* `gitFrom` - The starting point for retrieving the change document id -* `gitTo` - The end point for retrieving the change document id -* `gitChangeDocumentLabel` - A pattern used for identifying lines holding the change document id. -* `gitTransportReqeustLabel` - A pattern used for identifying lines holding the transport request id. -* `gitFormat` - Specifies what part of the commit is scanned. By default the body of the commit message is scanned. +* `changeManagement/changeDocumentLabel` - A pattern used for identifying lines holding the change document id. +* `changeManagment/transportRequestLabel` - A pattern used for identifying lines holding the transport request id. +* `changeManagement/credentialsId` - The id of the credentials to connect to the Solution Manager. The credentials needs to be maintained on Jenkins. +* `changeManagement/endpoint` - The address of the Solution Manager. +* `changeManagement/git/from` - The starting point for retrieving the change document id +* `changeManagement/git/to` - The end point for retrieving the change document id +* `changeManagement/git/format` - Specifies what part of the commit is scanned. By default the body of the commit message is scanned. ## Step configuration -The following parameters can also be specified as step parameters using the global configuration file: +The step is configured using a customer configuration file provided as +resource in an custom shared library. -* `credentialsId` -* `endpoint` +``` +@Library('piper-library-os@master') _ + +// the shared lib containing the additional configuration +// needs to be configured in Jenkins +@Library(foo@master') __ + +// inside the shared lib denoted by 'foo' the additional configuration file +// needs to be located under 'resources' ('resoures/myConfig.yml') +prepareDefaultValues script: this, + customDefaults: 'myConfig.yml' +``` + +Example content of ```'resources/myConfig.yml'``` in branch ```'master'``` of the repository denoted by +```'foo'```: + +``` +general: + changeManagement: + changeDocumentLabel: 'ChangeDocument\s?:' + cmClientOpts: '-Djavax.net.ssl.trustStore=' + credentialsId: 'CM' + endpoint: 'https://example.org/cm' + git: + from: 'HEAD~1' + to: 'HEAD' + format: '%b' +``` + +The properties configured in section `'general/changeManagement'` are shared between all change managment related steps. + +The properties can also be configured on a per-step basis: + +``` + [...] + steps: + transportRequestRelease: + changeManagement: + endpoint: 'https://example.org/cm' + [...] +``` + +The parameters can also be provided when the step is invoked. For examples see below. ## Return value None. ## Exceptions -* `AbortException`: +* `IllegalArgumentException`: * If the change id is not provided. * If the transport request id is not provided. +* `AbortException`: * If the release of the transport request fails. ## Example ```groovy -transportRequestRelease script:this, changeDocumentId: '001', transportRequestId: '001' +transportRequestRelease script:this, + changeDocumentId: '001', + transportRequestId: '001', + changeManagement: [ + endpoint: 'https://example.org/cm' + ] ``` diff --git a/documentation/docs/steps/transportRequestUploadFile.md b/documentation/docs/steps/transportRequestUploadFile.md index 9d2bd6999..35fa11a45 100644 --- a/documentation/docs/steps/transportRequestUploadFile.md +++ b/documentation/docs/steps/transportRequestUploadFile.md @@ -14,46 +14,97 @@ Uploads a file to a Transport Request for a Change Document on the Solution Mana | `transportRequestId`| yes | | | | `applicationId` | yes | | | | `filePath` | yes | | | -| `credentialsId` | yes | | | -| `endpoint` | yes | | | -| `gitFrom` | no | `origin/master` | | -| `gitTo` | no | `HEAD` | | -| `gitChangeDocumentLabel` | no | `ChangeDocument\s?:` | regex pattern | -| `gitTransportRequestLabel` | no | `TransportRequest\s?:` | regex pattern | -| `gitFormat` | no | `%b` | see `git log --help` | +| `changeManagement/credentialsId` | yes | | | +| `changeManagement/endpoint` | yes | | | +| `changeManagement/git/from` | no | `origin/master` | | +| `changeManagement/git/to` | no | `HEAD` | | +| `changeManagement/changeDocumentLabel` | no | `ChangeDocument\s?:` | regex pattern | +| `changeManagement/transportRequestLabel` | no | `TransportRequest\s?:` | regex pattern | +| `changeManagement/git/format` | no | `%b` | see `git log --help` | * `script` - The common script environment of the Jenkinsfile running. Typically the reference to the script calling the pipeline step is provided with the `this` parameter, as in `script: this`. This allows the function to access the [`commonPipelineEnvironment`](commonPipelineEnvironment.md) for retrieving, for example, configuration parameters. * `changeDocumentId` - The id of the change document related to the transport request to release. * `transportRequestId` - The id of the transport request to release. * `applicationId` - The id of the application. * `filePath` - The path of the file to upload. -* `credentialsId` - The credentials to connect to the Solution Manager. -* `endpoint` - The address of the Solution Manager. -* `gitFrom` - The starting point for retrieving the change document id -* `gitTo` - The end point for retrieving the change document id -* `gitChangeDocumentLabel` - A pattern used for identifying lines holding the change document id. -* `gitTransportRequestLabel` - A pattern used for identifying lines holding the transport request id. -* `gitFormat` - Specifies what part of the commit is scanned. By default the body of the commit message is scanned. +* `changeManagement/credentialsId` - The credentials to connect to the Solution Manager. +* `changeManagement/endpoint` - The address of the Solution Manager. +* `changeManagement/git/from` - The starting point for retrieving the change document id +* `changeManagement/git/to` - The end point for retrieving the change document id +* `changeManagement/changeDocumentLabel` - A pattern used for identifying lines holding the change document id. +* `changeManagement/transportRequestLabel` - A pattern used for identifying lines holding the transport request id. +* `changeManagement/git/format` - Specifies what part of the commit is scanned. By default the body of the commit message is scanned. ## Step configuration -The following parameters can also be specified as step parameters using the global configuration file: +The step is configured using a customer configuration file provided as +resource in an custom shared library. -* `credentialsId` -* `endpoint` +``` +@Library('piper-library-os@master') _ + +// the shared lib containing the additional configuration +// needs to be configured in Jenkins +@Library(foo@master') __ + +// inside the shared lib denoted by 'foo' the additional configuration file +// needs to be located under 'resources' ('resoures/myConfig.yml') +prepareDefaultValues script: this, + customDefaults: 'myConfig.yml' +``` + +Example content of ```'resources/myConfig.yml'``` in branch ```'master'``` of the repository denoted by +```'foo'```: + +``` +general: + changeManagement: + changeDocumentLabel: 'ChangeDocument\s?:' + cmClientOpts: '-Djavax.net.ssl.trustStore=' + credentialsId: 'CM' + endpoint: 'https://example.org/cm' + git: + from: 'HEAD~1' + to: 'HEAD' + format: '%b' +``` + +The properties configured in section `'general/changeManagement'` are shared between all change managment related steps. + +The properties can also be configured on a per-step basis: + +``` + [...] + steps: + transportRequestUploadFile: + applicationId: 'FOO' + changeManagement: + endpoint: 'https://example.org/cm' + [...] +``` + +The parameters can also be provided when the step is invoked. For examples see below. ## Return value None. ## Exceptions -* `AbortException`: +* `IllegalArgumentException`: * If the change id is not provided. * If the transport request id is not provided. * If the application id is not provided. * If the file path is not provided. +* `AbortException`: * If the upload fails. ## Example ```groovy -transportRequestUploadFile script:this, changeDocumentId: '001', transportRequestId: '001', applicationId: '001', filePath: '/path' +transportRequestUploadFile script:this, + changeDocumentId: '001', + transportRequestId: '001', + applicationId: '001', + filePath: '/path', + changeManagement:[ + endpoint: 'https://example.org/cm' + ] ``` diff --git a/resources/default_pipeline_environment.yml b/resources/default_pipeline_environment.yml index 4c2f153a7..d7424f1e0 100644 --- a/resources/default_pipeline_environment.yml +++ b/resources/default_pipeline_environment.yml @@ -1,7 +1,15 @@ #Project Setup general: productiveBranch: 'master' - + changeManagement: + transportRequestLabel: 'TransportRequest\s?:' + changeDocumentLabel: 'ChangeDocument\s?:' + clientOpts: '' + credentialsId: 'CM' + git: + from: 'origin/master' + to: 'HEAD' + format: '%b' #Steps Specific Configuration steps: artifactSetVersion: @@ -174,29 +182,8 @@ steps: archive: false active: false checkChangeInDevelopment: - credentialsId: 'CM' failIfStatusIsNotInDevelopment: true - gitFrom: 'origin/master' - gitTo: 'HEAD' - gitChangeDocumentLabel: 'ChangeDocument\s?:' - gitFormat: '%b' transportRequestCreate: - credentialsId: 'CM' - gitFrom: 'origin/master' - gitTo: 'HEAD' - gitChangeDocumentLabel: 'ChangeDocument\s?:' - gitFormat: '%b' + developmentSystemId: null transportRequestUploadFile: - credentialsId: 'CM' - gitFrom: 'origin/master' - gitTo: 'HEAD' - gitChangeDocumentLabel: 'ChangeDocument\s?:' - gitTransportRequestLabel: 'TransportRequest\s?:' - gitFormat: '%b' transportRequestRelease: - credentialsId: 'CM' - gitFrom: 'origin/master' - gitTo: 'HEAD' - gitChangeDocumentLabel: 'ChangeDocument\s?:' - gitTransportRequestLabel: 'TransportRequest\s?:' - gitFormat: '%b' diff --git a/src/com/sap/piper/ConfigurationHelper.groovy b/src/com/sap/piper/ConfigurationHelper.groovy index 04eecf048..e07752cd1 100644 --- a/src/com/sap/piper/ConfigurationHelper.groovy +++ b/src/com/sap/piper/ConfigurationHelper.groovy @@ -103,7 +103,6 @@ class ConfigurationHelper implements Serializable { } } - return config[parts.head()] } diff --git a/test/groovy/CheckChangeInDevelopmentTest.groovy b/test/groovy/CheckChangeInDevelopmentTest.groovy index b7e9ded1c..7ecba5bf3 100644 --- a/test/groovy/CheckChangeInDevelopmentTest.groovy +++ b/test/groovy/CheckChangeInDevelopmentTest.groovy @@ -41,7 +41,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { ChangeManagement cm = getChangeManagementUtils(true) boolean inDevelopment = jsr.step.checkChangeInDevelopment( cmUtils: cm, - endpoint: 'https://example.org/cm') + changeManagement: [endpoint: 'https://example.org/cm']) assert inDevelopment @@ -50,7 +50,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { endpoint: 'https://example.org/cm', userName: 'anonymous', password: '********', - cmclientOpts: null + cmclientOpts: '' ] } @@ -63,7 +63,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { ChangeManagement cm = getChangeManagementUtils(false) jsr.step.checkChangeInDevelopment( cmUtils: cm, - endpoint: 'https://example.org/cm') + changeManagement: [endpoint: 'https://example.org/cm']) } @Test @@ -72,7 +72,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { ChangeManagement cm = getChangeManagementUtils(false) boolean inDevelopment = jsr.step.checkChangeInDevelopment( cmUtils: cm, - endpoint: 'https://example.org/cm', + changeManagement: [endpoint: 'https://example.org/cm'], failIfStatusIsNotInDevelopment: false) assert !inDevelopment } @@ -84,7 +84,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { jsr.step.checkChangeInDevelopment( changeDocumentId: '42', cmUtils: cm, - endpoint: 'https://example.org/cm') + changeManagement: [endpoint: 'https://example.org/cm']) assert cmUtilReceivedParams.changeId == '42' } @@ -95,7 +95,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { jsr.step.checkChangeInDevelopment( cmUtils: cm, - endpoint: 'https://example.org/cm') + changeManagement : [endpoint: 'https://example.org/cm']) assert cmUtilReceivedParams.changeId == '0815' } @@ -120,7 +120,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { jsr.step.checkChangeInDevelopment( cmUtils: cm, - endpoint: 'https://example.org/cm') + changeManagement: [endpoint: 'https://example.org/cm']) } @Test @@ -134,7 +134,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { ChangeManagement cm = getChangeManagementUtils(false, null) jsr.step.checkChangeInDevelopment( cmUtils: cm, - endpoint: 'https://example.org/cm') + changeManagement: [endpoint: 'https://example.org/cm']) } @Test @@ -148,7 +148,7 @@ class CheckChangeInDevelopmentTest extends BasePiperTest { ChangeManagement cm = getChangeManagementUtils(false, '') jsr.step.checkChangeInDevelopment( cmUtils: cm, - endpoint: 'https://example.org/cm') + changeManagement: [endpoint: 'https://example.org/cm']) } private ChangeManagement getChangeManagementUtils(boolean inDevelopment, String changeDocumentId = '001') { diff --git a/test/groovy/TransportRequestCreateTest.groovy b/test/groovy/TransportRequestCreateTest.groovy index 17febb6fc..297f3f7bf 100644 --- a/test/groovy/TransportRequestCreateTest.groovy +++ b/test/groovy/TransportRequestCreateTest.groovy @@ -33,12 +33,17 @@ public class TransportRequestCreateTest extends BasePiperTest { @Before public void setup() { - nullScript.commonPipelineEnvironment.configuration = [steps: - [transportRequestCreate: + + nullScript.commonPipelineEnvironment.configuration = [general: + [changeManagement: [ credentialsId: 'CM', endpoint: 'https://example.org/cm', - clientOpts: '-DmyProp=myVal' + clientOpts: '-DmyProp=myVal', + changeDocumentLabel: 'ChangeId\\s?:', + git: [from: 'origin/master', + to: 'HEAD', + format: '%b'] ] ] ] diff --git a/test/groovy/TransportRequestReleaseTest.groovy b/test/groovy/TransportRequestReleaseTest.groovy index f498c0479..93bb028c6 100644 --- a/test/groovy/TransportRequestReleaseTest.groovy +++ b/test/groovy/TransportRequestReleaseTest.groovy @@ -34,8 +34,8 @@ public class TransportRequestReleaseTest extends BasePiperTest { @Before public void setup() { - nullScript.commonPipelineEnvironment.configuration = [steps: - [transportRequestRelease: + nullScript.commonPipelineEnvironment.configuration = [general: + [changeManagement: [ credentialsId: 'CM', endpoint: 'https://example.org/cm' diff --git a/test/groovy/TransportRequestUploadFileTest.groovy b/test/groovy/TransportRequestUploadFileTest.groovy index 802f18af4..d2991fe33 100644 --- a/test/groovy/TransportRequestUploadFileTest.groovy +++ b/test/groovy/TransportRequestUploadFileTest.groovy @@ -39,8 +39,8 @@ public class TransportRequestUploadFileTest extends BasePiperTest { cmUtilReceivedParams.clear() - nullScript.commonPipelineEnvironment.configuration = [steps: - [transportRequestUploadFile: + nullScript.commonPipelineEnvironment.configuration = [general: + [changeManagement: [ credentialsId: 'CM', endpoint: 'https://example.org/cm' @@ -177,7 +177,7 @@ public class TransportRequestUploadFileTest extends BasePiperTest { endpoint: 'https://example.org/cm', username: 'anonymous', password: '********', - cmclientOpts: null + cmclientOpts: '' ] } diff --git a/test/groovy/com/sap/piper/ConfigurationHelperTest.groovy b/test/groovy/com/sap/piper/ConfigurationHelperTest.groovy index 7e180051a..506c2f23e 100644 --- a/test/groovy/com/sap/piper/ConfigurationHelperTest.groovy +++ b/test/groovy/com/sap/piper/ConfigurationHelperTest.groovy @@ -50,7 +50,6 @@ class ConfigurationHelperTest { assertThat(configuration.getConfigProperty('a/c'), is((nullValue()))) } - @Test void testGetPropertyNestedPathStartsWithTokenizer() { def configuration = new ConfigurationHelper([k:'v']) assertThat(configuration.getConfigProperty('/k'), is(('v'))) diff --git a/vars/checkChangeInDevelopment.groovy b/vars/checkChangeInDevelopment.groovy index afc44650a..f6838e068 100644 --- a/vars/checkChangeInDevelopment.groovy +++ b/vars/checkChangeInDevelopment.groovy @@ -10,14 +10,8 @@ import com.sap.piper.cm.ChangeManagementException @Field def STEP_NAME = 'checkChangeInDevelopment' @Field Set stepConfigurationKeys = [ - 'cmClientOpts', - 'credentialsId', - 'endpoint', - 'failIfStatusIsNotInDevelopment', - 'gitFrom', - 'gitTo', - 'gitChangeDocumentLabel', - 'gitFormat' + 'changeManagement', + 'failIfStatusIsNotInDevelopment' ] @Field Set parameterKeys = stepConfigurationKeys.plus('changeDocumentId') @@ -40,6 +34,17 @@ def call(parameters = [:]) { .mixinStageConfig(script.commonPipelineEnvironment, parameters.stageName?:env.STAGE_NAME, stepConfigurationKeys) .mixinStepConfig(script.commonPipelineEnvironment, stepConfigurationKeys) .mixin(parameters, parameterKeys) + // for the following parameters we expect defaults + .withMandatoryProperty('changeManagement/changeDocumentLabel') + .withMandatoryProperty('changeManagement/clientOpts') + .withMandatoryProperty('changeManagement/credentialsId') + .withMandatoryProperty('changeManagement/git/from') + .withMandatoryProperty('changeManagement/git/to') + .withMandatoryProperty('changeManagement/git/format') + .withMandatoryProperty('failIfStatusIsNotInDevelopment') + // for the following parameters we expect a value provided from outside + .withMandatoryProperty('changeManagement/endpoint') + Map configuration = configHelper.use() @@ -51,15 +56,15 @@ def call(parameters = [:]) { } else { - echo "[INFO] Retrieving ChangeDocumentId from commit history [from: ${configuration.gitFrom}, to: ${configuration.gitTo}]." + - "Searching for pattern '${configuration.gitChangeDocumentLabel}'. Searching with format '${configuration.gitFormat}'." + 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}'." try { changeId = cm.getChangeDocumentId( - configuration.gitFrom, - configuration.gitTo, - configuration.gitChangeDocumentLabel, - configuration.gitFormat + configuration.changeManagement.git.from, + configuration.changeManagement.git.to, + configuration.changeManagement.changeDocumentLabel, + configuration.changeManagement.git.format ) if(changeId?.trim()) { echo "[INFO] ChangeDocumentId '${changeId}' retrieved from commit history" @@ -70,11 +75,10 @@ def call(parameters = [:]) { } configuration = configHelper.mixin([changeDocumentId: changeId?.trim() ?: null], ['changeDocumentId'] as Set) - .withMandatoryProperty('endpoint') .withMandatoryProperty('changeDocumentId', "No changeDocumentId provided. Neither via parameter 'changeDocumentId' " + - "nor via label '${configuration.gitChangeDocumentLabel}' in commit range " + - "[from: ${configuration.gitFrom}, to: ${configuration.gitTo}].") + "nor via label '${configuration.changeManagement.changeDocumentLabel}' in commit range " + + "[from: ${configuration.changeManagement.git.from}, to: ${configuration.changeManagement.git.to}].") .use() boolean isInDevelopment @@ -82,16 +86,16 @@ def call(parameters = [:]) { echo "[INFO] Checking if change document '${configuration.changeDocumentId}' is in development." withCredentials([usernamePassword( - credentialsId: configuration.credentialsId, + credentialsId: configuration.changeManagement.credentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { try { isInDevelopment = cm.isChangeInDevelopment(configuration.changeDocumentId, - configuration.endpoint, + configuration.changeManagement.endpoint, username, password, - configuration.cmClientOpts) + configuration.changeManagement.clientOpts) } catch(ChangeManagementException ex) { throw new AbortException(ex.getMessage()) } diff --git a/vars/transportRequestCreate.groovy b/vars/transportRequestCreate.groovy index c0db4852c..88899b93d 100644 --- a/vars/transportRequestCreate.groovy +++ b/vars/transportRequestCreate.groovy @@ -12,16 +12,11 @@ import hudson.AbortException @Field def STEP_NAME = 'transportRequestCreate' @Field Set stepConfigurationKeys = [ - 'credentialsId', - 'clientOpts', - 'endpoint', - 'gitFrom', - 'gitTo', - 'gitChangeDocumentLabel', - 'gitFormat' + 'changeManagement', + 'developmentSystemId' ] -@Field Set parameterKeys = stepConfigurationKeys.plus(['changeDocumentId', 'developmentSystemId']) +@Field Set parameterKeys = stepConfigurationKeys.plus(['changeDocumentId']) @Field generalConfigurationKeys = stepConfigurationKeys @@ -39,7 +34,12 @@ def call(parameters = [:]) { .mixinStageConfig(script.commonPipelineEnvironment, parameters.stageName?:env.STAGE_NAME, stepConfigurationKeys) .mixinStepConfig(script.commonPipelineEnvironment, stepConfigurationKeys) .mixin(parameters, parameterKeys) - .withMandatoryProperty('endpoint') + .withMandatoryProperty('changeManagement/clientOpts') + .withMandatoryProperty('changeManagement/credentialsId') + .withMandatoryProperty('changeManagement/endpoint') + .withMandatoryProperty('changeManagement/git/from') + .withMandatoryProperty('changeManagement/git/to') + .withMandatoryProperty('changeManagement/git/format') .withMandatoryProperty('developmentSystemId') Map configuration = configHelper.use() @@ -52,15 +52,16 @@ def call(parameters = [:]) { } else { - echo "[INFO] Retrieving ChangeDocumentId from commit history [from: ${configuration.gitFrom}, to: ${configuration.gitTo}]." + - "Searching for pattern '${configuration.gitChangeDocumentLabel}'. Searching with format '${configuration.gitFormat}'." + echo "[INFO] Retrieving ChangeDocumentId from commit history [from: ${configuration.changeManagement.git.from}, to: ${configuration.changeManagement.git.to}]." + + "Searching for pattern '${configuration.changeDocumentLabel}'. Searching with format '${configuration.changeManagement.git.format}'." try { + changeDocumentId = cm.getChangeDocumentId( - configuration.gitFrom, - configuration.gitTo, - configuration.gitChangeDocumentLabel, - configuration.gitFormat + configuration.changeManagement.git.from, + configuration.changeManagement.git.to, + configuration.changeManagement.changeDocumentLabel, + configuration.changeManagement.git.format ) echo "[INFO] ChangeDocumentId '${changeDocumentId}' retrieved from commit history" @@ -79,17 +80,17 @@ def call(parameters = [:]) { echo "[INFO] Creating transport request for change document '${configuration.changeDocumentId}' and development system '${configuration.developmentSystemId}'." withCredentials([usernamePassword( - credentialsId: configuration.credentialsId, + credentialsId: configuration.changeManagement.credentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { try { transportRequestId = cm.createTransportRequest(configuration.changeDocumentId, configuration.developmentSystemId, - configuration.endpoint, + configuration.changeManagement.endpoint, username, password, - configuration.clientOpts) + configuration.changeManagement.clientOpts) } catch(ChangeManagementException ex) { throw new AbortException(ex.getMessage()) } diff --git a/vars/transportRequestRelease.groovy b/vars/transportRequestRelease.groovy index 01ce6ab79..8e399766d 100644 --- a/vars/transportRequestRelease.groovy +++ b/vars/transportRequestRelease.groovy @@ -12,14 +12,7 @@ import hudson.AbortException @Field def STEP_NAME = 'transportRequestRelease' @Field Set stepConfigurationKeys = [ - 'credentialsId', - 'cmClientOpts', - 'endpoint', - 'gitChangeDocumentLabel', - 'gitFrom', - 'gitTo', - 'gitTransportRequestLabel', - 'gitFormat' + 'changeManagement' ] @Field Set parameterKeys = stepConfigurationKeys.plus([ @@ -43,7 +36,12 @@ def call(parameters = [:]) { .mixinStageConfig(script.commonPipelineEnvironment, parameters.stageName?:env.STAGE_NAME, stepConfigurationKeys) .mixinStepConfig(script.commonPipelineEnvironment, stepConfigurationKeys) .mixin(parameters, parameterKeys) - .withMandatoryProperty('endpoint') + .withMandatoryProperty('changeManagement/clientOpts') + .withMandatoryProperty('changeManagement/credentialsId') + .withMandatoryProperty('changeManagement/endpoint') + .withMandatoryProperty('changeManagement/git/to') + .withMandatoryProperty('changeManagement/git/from') + .withMandatoryProperty('changeManagement/git/format') Map configuration = configHelper.use() @@ -55,15 +53,15 @@ def call(parameters = [:]) { } else { - echo "[INFO] Retrieving transport request id from commit history [from: ${configuration.gitFrom}, to: ${configuration.gitTo}]." + - " Searching for pattern '${configuration.gitTransportRequestLabel}'. Searching with format '${configuration.gitFormat}'." + echo "[INFO] Retrieving transport request id from commit history [from: ${configuration.changeManagement.git.from}, to: ${configuration.changeManagement.git.to}]." + + " Searching for pattern '${configuration.gitTransportRequestLabel}'. Searching with format '${configuration.changeManagement.git.format}'." try { transportRequestId = cm.getTransportRequestId( - configuration.gitFrom, - configuration.gitTo, - configuration.gitTransportRequestLabel, - configuration.gitFormat + configuration.changeManagement.git.from, + configuration.changeManagement.git.to, + configuration.changeManagement.transportRequestLabel, + configuration.changeManagement.git.format ) echo "[INFO] Transport request id '${transportRequestId}' retrieved from commit history" @@ -81,15 +79,15 @@ def call(parameters = [:]) { } else { - echo "[INFO] Retrieving ChangeDocumentId from commit history [from: ${configuration.gitFrom}, to: ${configuration.gitTo}]." + - "Searching for pattern '${configuration.gitChangeDocumentLabel}'. Searching with format '${configuration.gitFormat}'." + echo "[INFO] Retrieving ChangeDocumentId from commit history [from: ${configuration.changeManagement.git.from}, to: ${configuration.changeManagement.git.to}]." + + "Searching for pattern '${configuration.changeDocumentLabel}'. Searching with format '${configuration.changeManagement.git.format}'." try { changeDocumentId = cm.getChangeDocumentId( - configuration.gitFrom, - configuration.gitTo, - configuration.gitChangeDocumentLabel, - configuration.gitFormat + configuration.changeManagement.git.from, + configuration.changeManagement.git.to, + configuration.changeManagement.changeDocumentLabel, + configuration.changeManagement.gitformat ) echo "[INFO] ChangeDocumentId '${changeDocumentId}' retrieved from commit history" @@ -111,17 +109,17 @@ def call(parameters = [:]) { echo "[INFO] Closing transport request '${configuration.transportRequestId}' for change document '${configuration.changeDocumentId}'." withCredentials([usernamePassword( - credentialsId: configuration.credentialsId, + credentialsId: configuration.changeManagement.credentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { try { cm.releaseTransportRequest(configuration.changeDocumentId, configuration.transportRequestId, - configuration.endpoint, + configuration.changeManagement.endpoint, username, password, - configuration.cmClientOpts) + configuration.changeManagement.clientOpts) } catch(ChangeManagementException ex) { throw new AbortException(ex.getMessage()) } diff --git a/vars/transportRequestUploadFile.groovy b/vars/transportRequestUploadFile.groovy index 5390c1334..4095ae55e 100644 --- a/vars/transportRequestUploadFile.groovy +++ b/vars/transportRequestUploadFile.groovy @@ -12,14 +12,7 @@ import hudson.AbortException @Field def STEP_NAME = 'transportRequestUploadFile' @Field Set generalConfigurationKeys = [ - 'credentialsId', - 'cmClientOpts', - 'endpoint', - 'gitFrom', - 'gitTo', - 'gitChangeDocumentLabel', - 'gitTransportRequestLabel', - 'gitFormat' + 'changeManagement', ] @Field Set parameterKeys = generalConfigurationKeys.plus([ @@ -44,8 +37,14 @@ def call(parameters = [:]) { .mixinStageConfig(script.commonPipelineEnvironment, parameters.stageName?:env.STAGE_NAME, stepConfigurationKeys) .mixinStepConfig(script.commonPipelineEnvironment, stepConfigurationKeys) .mixin(parameters, parameterKeys) - .withMandatoryProperty('endpoint') .withMandatoryProperty('applicationId') + .withMandatoryProperty('changeManagement/changeDocumentLabel') + .withMandatoryProperty('changeManagement/clientOpts') + .withMandatoryProperty('changeManagement/credentialsId') + .withMandatoryProperty('changeManagement/endpoint') + .withMandatoryProperty('changeManagement/git/from') + .withMandatoryProperty('changeManagement/git/to') + .withMandatoryProperty('changeManagement/git/format') .withMandatoryProperty('filePath') Map configuration = configHelper.use() @@ -58,15 +57,15 @@ def call(parameters = [:]) { } else { - echo "[INFO] Retrieving ChangeDocumentId from commit history [from: ${configuration.gitFrom}, to: ${configuration.gitTo}]." + - "Searching for pattern '${configuration.gitChangeDocumentLabel}'. Searching with format '${configuration.gitFormat}'." + 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}'." try { changeDocumentId = cm.getChangeDocumentId( - configuration.gitFrom, - configuration.gitTo, - configuration.gitChangeDocumentLabel, - configuration.gitFormat + configuration.changeManagement.git.from, + configuration.changeManagement.git.to, + configuration.changeManagement.changeDocumentLabel, + configuration.changeManagement.git.format ) echo "[INFO] ChangeDocumentId '${changeDocumentId}' retrieved from commit history" @@ -114,7 +113,7 @@ def call(parameters = [:]) { echo "[INFO] Uploading file '${configuration.filePath}' to transport request '${configuration.transportRequestId}' of change document '${configuration.changeDocumentId}'." withCredentials([usernamePassword( - credentialsId: configuration.credentialsId, + credentialsId: configuration.changeManagement.credentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { @@ -123,10 +122,10 @@ def call(parameters = [:]) { configuration.transportRequestId, configuration.applicationId, configuration.filePath, - configuration.endpoint, + configuration.changeManagement.endpoint, username, password, - configuration.cmClientOpts) + configuration.changeManagement.clientOpts) } catch(ChangeManagementException ex) { throw new AbortException(ex.getMessage()) }