mirror of
https://github.com/SAP/jenkins-library.git
synced 2025-01-30 05:59:39 +02:00
Merge branch 'master' into whitesource-step
This commit is contained in:
commit
27c4db47e4
@ -25,7 +25,7 @@ function notify() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
[ -z "${notificationThreadPid}" ] || kill -PIPE "${notificationThreadPid}" &>/dev/null
|
[[ -z "${notificationThreadPid}" ]] || kill -PIPE "${notificationThreadPid}" &>/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
@ -33,7 +33,7 @@ trap cleanup EXIT
|
|||||||
#
|
#
|
||||||
# In case the build is performed for a pull request TRAVIS_COMMIT is a merge
|
# In case the build is performed for a pull request TRAVIS_COMMIT is a merge
|
||||||
# commit between the base branch and the PR branch HEAD. That commit is actually built.
|
# commit between the base branch and the PR branch HEAD. That commit is actually built.
|
||||||
# But for notifying about a build status we need the commit which is currenty
|
# But for notifying about a build status we need the commit which is currently
|
||||||
# the HEAD of the PR branch.
|
# the HEAD of the PR branch.
|
||||||
#
|
#
|
||||||
# In case the build is performed for a simple branch (not associated with a PR)
|
# In case the build is performed for a simple branch (not associated with a PR)
|
||||||
@ -42,16 +42,16 @@ trap cleanup EXIT
|
|||||||
# TRAVIS_COMMIT itself.
|
# TRAVIS_COMMIT itself.
|
||||||
#
|
#
|
||||||
COMMIT_HASH_FOR_STATUS_NOTIFICATIONS="${TRAVIS_PULL_REQUEST_SHA}"
|
COMMIT_HASH_FOR_STATUS_NOTIFICATIONS="${TRAVIS_PULL_REQUEST_SHA}"
|
||||||
[ -z "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}" ] && COMMIT_HASH_FOR_STATUS_NOTIFICATIONS="${TRAVIS_COMMIT}"
|
[[ -z "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}" ]] && COMMIT_HASH_FOR_STATUS_NOTIFICATIONS="${TRAVIS_COMMIT}"
|
||||||
|
|
||||||
notify "pending" "Integration tests in progress." "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}"
|
notify "pending" "Integration tests in progress." "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}"
|
||||||
|
|
||||||
WORKSPACES_ROOT=workspaces
|
WORKSPACES_ROOT=workspaces
|
||||||
[ -e "${WORKSPACES_ROOT}" ] && rm -rf ${WORKSPACES_ROOT}
|
[[ -e "${WORKSPACES_ROOT}" ]] && rm -rf ${WORKSPACES_ROOT}
|
||||||
|
|
||||||
TEST_CASES=$(find testCases -name '*.yml')
|
TEST_CASES=$(find testCases -name '*.yml')
|
||||||
|
|
||||||
# This auxiliar thread is needed in order to produce some output while the
|
# This auxiliary thread is needed in order to produce some output while the
|
||||||
# test are running. Otherwise the job will be canceled after 10 minutes without
|
# test are running. Otherwise the job will be canceled after 10 minutes without
|
||||||
# output.
|
# output.
|
||||||
while true; do sleep 10; echo "[INFO] Integration tests still running."; done &
|
while true; do sleep 10; echo "[INFO] Integration tests still running."; done &
|
||||||
@ -65,7 +65,7 @@ do
|
|||||||
area=$(dirname "${f#*/}")
|
area=$(dirname "${f#*/}")
|
||||||
echo "[INFO] Running test case \"${testCase}\" in area \"${area}\"."
|
echo "[INFO] Running test case \"${testCase}\" in area \"${area}\"."
|
||||||
TEST_CASE_ROOT="${WORKSPACES_ROOT}/${area}/${testCase}"
|
TEST_CASE_ROOT="${WORKSPACES_ROOT}/${area}/${testCase}"
|
||||||
[ -e "${TEST_CASE_ROOT}" ] && rm -rf "${TEST_CASE_ROOT}"
|
[[ -e "${TEST_CASE_ROOT}" ]] && rm -rf "${TEST_CASE_ROOT}"
|
||||||
mkdir -p "${TEST_CASE_ROOT}" || fail "Cannot create test case root directory for test case \"${testCase}\"." 1
|
mkdir -p "${TEST_CASE_ROOT}" || fail "Cannot create test case root directory for test case \"${testCase}\"." 1
|
||||||
source ./runTest.sh "${testCase}" "${TEST_CASE_ROOT}" &> "${TEST_CASE_ROOT}/log.txt" &
|
source ./runTest.sh "${testCase}" "${TEST_CASE_ROOT}" &> "${TEST_CASE_ROOT}/log.txt" &
|
||||||
pid=$!
|
pid=$!
|
||||||
@ -74,7 +74,7 @@ do
|
|||||||
let i=i+1
|
let i=i+1
|
||||||
done
|
done
|
||||||
|
|
||||||
[ "${i}" == 0 ] && fail "No tests has been executed." 1
|
[[ "${i}" == 0 ]] && fail "No tests has been executed." 1
|
||||||
|
|
||||||
#
|
#
|
||||||
# wait for the test cases and cat the log
|
# wait for the test cases and cat the log
|
||||||
@ -112,7 +112,7 @@ do
|
|||||||
area=$(dirname "${p%:*}")
|
area=$(dirname "${p%:*}")
|
||||||
testCase=$(basename "${p%:*}")
|
testCase=$(basename "${p%:*}")
|
||||||
TEST_CASE_ROOT="${WORKSPACES_ROOT}/${area}/${testCase}"
|
TEST_CASE_ROOT="${WORKSPACES_ROOT}/${area}/${testCase}"
|
||||||
if [ -f "${TEST_CASE_ROOT}/SUCCESS" ]
|
if [[ -f "${TEST_CASE_ROOT}/SUCCESS" ]]
|
||||||
then
|
then
|
||||||
status="SUCCESS"
|
status="SUCCESS"
|
||||||
else
|
else
|
||||||
@ -125,7 +125,7 @@ done
|
|||||||
STATUS_DESCRIPTION="The integration tests failed."
|
STATUS_DESCRIPTION="The integration tests failed."
|
||||||
STATUS_STATE="failure"
|
STATUS_STATE="failure"
|
||||||
|
|
||||||
if [ "${failure}" == "false" ]
|
if [[ "${failure}" == "false" ]]
|
||||||
then
|
then
|
||||||
STATUS_DESCRIPTION="The integration tests succeeded."
|
STATUS_DESCRIPTION="The integration tests succeeded."
|
||||||
STATUS_STATE="success"
|
STATUS_STATE="success"
|
||||||
@ -133,7 +133,7 @@ fi
|
|||||||
|
|
||||||
notify "${STATUS_STATE}" "${STATUS_DESCRIPTION}" "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}"
|
notify "${STATUS_STATE}" "${STATUS_DESCRIPTION}" "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}"
|
||||||
|
|
||||||
[ "${failure}" != "false" ] && fail "Integration tests failed." 1
|
[[ "${failure}" != "false" ]] && fail "Integration tests failed." 1
|
||||||
|
|
||||||
echo "[INFO] Integration tests succeeded."
|
echo "[INFO] Integration tests succeeded."
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -27,4 +27,4 @@ RC=$?
|
|||||||
|
|
||||||
cd - &> /dev/null || { echo "[ERROR] change directory back into integration test root folder failed."; exit 1; }
|
cd - &> /dev/null || { echo "[ERROR] change directory back into integration test root folder failed."; exit 1; }
|
||||||
|
|
||||||
[ "${RC}" == 0 ] && touch "${TEST_CASE_ROOT}/SUCCESS"
|
[[ "${RC}" == 0 ]] && touch "${TEST_CASE_ROOT}/SUCCESS"
|
||||||
|
@ -1,14 +1,6 @@
|
|||||||
# mailSendNotification
|
# ${docGenStepName}
|
||||||
|
|
||||||
## Description
|
## ${docGenDescription}
|
||||||
|
|
||||||
Sends notifications to all potential culprits of a current or previous build failure plus to fixed list of recipients.
|
|
||||||
It will attach the current build log to the email.
|
|
||||||
|
|
||||||
Notifications are sent in following cases:
|
|
||||||
|
|
||||||
* current build failed or is unstable
|
|
||||||
* current build is successful and previous build failed or was unstable
|
|
||||||
|
|
||||||
## Prerequsites
|
## Prerequsites
|
||||||
|
|
||||||
@ -22,60 +14,9 @@ Usage of pipeline step:
|
|||||||
mailSendNotification script: this
|
mailSendNotification script: this
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## ${docGenParameters}
|
||||||
|
|
||||||
| parameter | mandatory | default | possible values |
|
## ${docGenConfiguration}
|
||||||
| ----------|-----------|---------|-----------------|
|
|
||||||
|script|yes|||
|
|
||||||
|buildResult|no|||
|
|
||||||
|gitCommitId|no|`script.commonPipelineEnvironment.getGitCommitId()`||
|
|
||||||
|gitSshKeyCredentialsId|no|``||
|
|
||||||
|gitUrl|no|||
|
|
||||||
|notificationAttachment|no|`true`||
|
|
||||||
|notificationRecipients|no|||
|
|
||||||
|notifyCulprits|no|`true`||
|
|
||||||
|numLogLinesInBody|no|`100`||
|
|
||||||
|projectName|no|||
|
|
||||||
|wrapInNode|no|`false`||
|
|
||||||
|
|
||||||
### Details
|
|
||||||
|
|
||||||
* `script` defines the global script environment of the Jenkinsfile run. Typically `this` is passed to this parameter. This allows the function to access the [`commonPipelineEnvironment`](commonPipelineEnvironment.md) for storing the measured duration.
|
|
||||||
* `buildResult` may be used to overrule the build result coming from `currentBuild.result`. This is for example used in the step `pipelineRestartSteps`
|
|
||||||
* `gitCommitId` defines a dedicated git commitId for culprit retrieval.
|
|
||||||
* `gitUrl` and `gitCommitId` are used to retrieve culprit information.
|
|
||||||
* `gitSshKeyCredentialsId` only required if your git repository is protected. It defines the credentialsId for the git ssh credentials.
|
|
||||||
* `notificationAttachment` defines if the console log file should be attached to the notification mail.
|
|
||||||
* `notificationRecipients` defines the fixed list of recipient that always get the notification. In case you want to send the notification to the culprits only set it to an empty string `''`.
|
|
||||||
|
|
||||||
!!! note
|
|
||||||
Multiple recipients need to be separated with the `space` character.
|
|
||||||
In case you do not want to have any fixed recipients of the notifications leave the property empty.
|
|
||||||
|
|
||||||
* `notifyCulprits` defines if potential culprits should receive an email.
|
|
||||||
* `numLogLinesInBody` defines the number of log lines (=last lines of the log) which are included into the body of the notification email.
|
|
||||||
* `projectName` may be used to specify a different name in the email subject.
|
|
||||||
* `wrapInNode` needs to be set to `true` if step is used outside of a node context, e.g. post actions in a declarative pipeline script.
|
|
||||||
|
|
||||||
## Step configuration
|
|
||||||
|
|
||||||
We recommend to define values of step parameters via [config.yml file](../configuration.md).
|
|
||||||
|
|
||||||
In following sections the configuration is possible:
|
|
||||||
|
|
||||||
| parameter | general | step | stage |
|
|
||||||
| ----------|-----------|---------|-----------------|
|
|
||||||
|script||||
|
|
||||||
|buildResult||X|X|
|
|
||||||
|gitCommitId||X|X|
|
|
||||||
|gitSshKeyCredentialsId|X|X|X|
|
|
||||||
|gitUrl||X|X|
|
|
||||||
|notificationAttachment||X|X|
|
|
||||||
|notificationRecipients||X|X|
|
|
||||||
|notifyCulprits||X|X|
|
|
||||||
|numLogLinesInBody||X|X|
|
|
||||||
|projectName||X|X|
|
|
||||||
|wrapInNode||X|X|
|
|
||||||
|
|
||||||
## Side effects
|
## Side effects
|
||||||
|
|
||||||
|
@ -1,12 +1,22 @@
|
|||||||
# newmanExecute
|
# ${docGenStepName}
|
||||||
|
|
||||||
## Description
|
## ${docGenDescription}
|
||||||
|
|
||||||
This script executes your [Postman](https://www.getpostman.com) tests from a collection via the [Newman](https://www.getpostman.com/docs/v6/postman/collection_runs/command_line_integration_with_newman) command line collection.
|
## Prerequisites
|
||||||
|
|
||||||
## Prequisites
|
* prepared Postman with a test collection
|
||||||
|
|
||||||
- prepared Postman with a test collection
|
## ${docGenParameters}
|
||||||
|
|
||||||
|
## ${docGenConfiguration}
|
||||||
|
|
||||||
|
## Side effects
|
||||||
|
|
||||||
|
Step uses `dockerExecute` inside.
|
||||||
|
|
||||||
|
## Exceptions
|
||||||
|
|
||||||
|
none
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
@ -22,51 +32,3 @@ This step should be used in combination with `testsPublishResults`:
|
|||||||
newmanExecute script: this, failOnError: false
|
newmanExecute script: this, failOnError: false
|
||||||
testsPublishResults script: this, junit: [pattern: '**/newman/TEST-*.xml']
|
testsPublishResults script: this, junit: [pattern: '**/newman/TEST-*.xml']
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
|
||||||
|
|
||||||
| name | mandatory | default | possible values |
|
|
||||||
|------|-----------|---------|-----------------|
|
|
||||||
| `dockerImage` | no | | |
|
|
||||||
| `failOnError` | no | | `true`, `false` |
|
|
||||||
| `gitBranch` | no | | |
|
|
||||||
| `gitSshKeyCredentialsId` | no | | |
|
|
||||||
| `newmanCollection` | no | | |
|
|
||||||
| `newmanEnvironment` | no | | |
|
|
||||||
| `newmanGlobals` | no | | |
|
|
||||||
| `newmanRunCommand` | no | | |
|
|
||||||
| `script` | yes | | |
|
|
||||||
| `stashContent` | no | | |
|
|
||||||
| `testRepository` | no | | |
|
|
||||||
|
|
||||||
- `dockerImage` - Docker image for code execution.
|
|
||||||
- `failOnError` - Defines the behavior, in case tests fail.
|
|
||||||
- `gitBranch` - see `testRepository`
|
|
||||||
- `gitSshKeyCredentialsId` - see `testRepository`
|
|
||||||
- `newmanCollection` - The test collection that should be executed. This could also be a file pattern.
|
|
||||||
- `newmanEnvironment` - Specify an environment file path or URL. Environments provide a set of variables that one can use within collections. see also [Newman docs](https://github.com/postmanlabs/newman#newman-run-collection-file-source-options)
|
|
||||||
- `newmanGlobals` - Specify the file path or URL for global variables. Global variables are similar to environment variables but have a lower precedence and can be overridden by environment variables having the same name. see also [Newman docs](https://github.com/postmanlabs/newman#newman-run-collection-file-source-options)
|
|
||||||
- `newmanRunCommand` - The newman command that will be executed inside the docker container.
|
|
||||||
- `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 for retrieving, for example, configuration parameters.
|
|
||||||
- `stashContent` - If specific stashes should be considered for the tests, you can pass this via this parameter.
|
|
||||||
- `testRepository` - In case the test implementation is stored in a different repository than the code itself, you can define the repository containing the tests using parameter `testRepository` and if required `gitBranch` (for a different branch than master) and `gitSshKeyCredentialsId` (for protected repositories). For protected repositories the `testRepository` needs to contain the ssh git url.
|
|
||||||
|
|
||||||
## Step configuration
|
|
||||||
|
|
||||||
We recommend to define values of step parameters via [config.yml file](../configuration.md).
|
|
||||||
|
|
||||||
In following sections the configuration is possible:
|
|
||||||
|
|
||||||
| parameter | general | step | stage |
|
|
||||||
|-----------|---------|------|-------|
|
|
||||||
| `dockerImage` | | X | X |
|
|
||||||
| `failOnError` | | X | X |
|
|
||||||
| `gitBranch` | | X | X |
|
|
||||||
| `gitSshKeyCredentialsId` | | X | X |
|
|
||||||
| `newmanCollection` | | X | X |
|
|
||||||
| `newmanEnvironment` | | X | X |
|
|
||||||
| `newmanGlobals` | | X | X |
|
|
||||||
| `newmanRunCommand` | | X | X |
|
|
||||||
| `script` | X | X | X |
|
|
||||||
| `stashContent` | | X | X |
|
|
||||||
| `testRepository` | | X | X |
|
|
||||||
|
@ -1,73 +1,33 @@
|
|||||||
# slackSendNotification
|
# ${docGenStepName}
|
||||||
|
|
||||||
## Description
|
## ${docGenDescription}
|
||||||
|
|
||||||
Sends notifications to the Slack channel about the build status.
|
|
||||||
|
|
||||||
Notification contains:
|
|
||||||
|
|
||||||
* Build status;
|
|
||||||
* Repo Owner;
|
|
||||||
* Repo Name;
|
|
||||||
* Branch Name;
|
|
||||||
* Jenkins Build Number;
|
|
||||||
* Jenkins Build URL.
|
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
Installed and configured [Jenkins Slack plugin](https://github.com/jenkinsci/slack-plugin).
|
* Installed and configured [Jenkins Slack plugin](https://github.com/jenkinsci/slack-plugin).
|
||||||
|
|
||||||
|
## ${docGenParameters}
|
||||||
|
|
||||||
|
## ${docGenConfiguration}
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
Usage of pipeline step:
|
Usage of pipeline step:
|
||||||
|
|
||||||
```groovy
|
```groovy
|
||||||
try {
|
pipeline {
|
||||||
stage('..') {..}
|
agent any
|
||||||
stage('..') {..}
|
stages {
|
||||||
stage('..') {..}
|
stage('Build') {
|
||||||
currentBuild.result = 'SUCCESS'
|
steps {
|
||||||
} catch (Throwable err) {
|
echo "do something"
|
||||||
currentBuild.result = 'FAILURE'
|
}
|
||||||
throw err
|
}
|
||||||
} finally {
|
}
|
||||||
stage('report') {
|
post {
|
||||||
slackSendNotification script: this
|
always {
|
||||||
|
slackSendNotification script: this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
|
||||||
|
|
||||||
| parameter | mandatory | default | possible values |
|
|
||||||
| ----------|-----------|---------|-----------------|
|
|
||||||
|script|yes|||
|
|
||||||
|baseUrl|no|||
|
|
||||||
|channel|no|||
|
|
||||||
|color|no|`${buildStatus == 'SUCCESS'?'#008000':'#E60000'}`||
|
|
||||||
|credentialsId|no|||
|
|
||||||
|message|no|||
|
|
||||||
|
|
||||||
### Details
|
|
||||||
|
|
||||||
* `script` defines the global script environment of the Jenkinsfile run. Typically `this` is passed to this parameter. This allows the function to access the [`commonPipelineEnvironment`](commonPipelineEnvironment.md) for storing the measured duration.
|
|
||||||
* `baseUrl` allows overriding the Slack Plugin Integration Base Url specified in the global configuration.
|
|
||||||
* `color` defines the message color.
|
|
||||||
* If `channel` is defined another than the default channel will be used.
|
|
||||||
* `credentialsId` defines the Jenkins credentialId which holds the Slack token
|
|
||||||
* With parameter `message` a custom message can be defined which is sent into the Slack channel.
|
|
||||||
|
|
||||||
## Step configuration
|
|
||||||
|
|
||||||
We recommend to define values of step parameters via [config.yml file](../configuration.md).
|
|
||||||
|
|
||||||
In following sections the configuration is possible:
|
|
||||||
|
|
||||||
| parameter | general | step | stage |
|
|
||||||
| ----------|-----------|---------|-----------------|
|
|
||||||
|script||||
|
|
||||||
|baseUrl||X|X|
|
|
||||||
|channel||X|X|
|
|
||||||
|color||X|X|
|
|
||||||
|credentialsId||X|X|
|
|
||||||
|message||X|X|
|
|
||||||
|
@ -16,8 +16,8 @@ import static org.junit.Assert.assertNotNull
|
|||||||
|
|
||||||
|
|
||||||
class SetupCommonPipelineEnvironmentTest extends BasePiperTest {
|
class SetupCommonPipelineEnvironmentTest extends BasePiperTest {
|
||||||
|
|
||||||
def usedConfigFile
|
def usedConfigFile
|
||||||
def swaOldConfigUsed
|
|
||||||
|
|
||||||
private JenkinsStepRule stepRule = new JenkinsStepRule(this)
|
private JenkinsStepRule stepRule = new JenkinsStepRule(this)
|
||||||
|
|
||||||
@ -28,6 +28,7 @@ class SetupCommonPipelineEnvironmentTest extends BasePiperTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
void init() {
|
void init() {
|
||||||
|
|
||||||
def examplePipelineConfig = new File('test/resources/test_pipeline_config.yml').text
|
def examplePipelineConfig = new File('test/resources/test_pipeline_config.yml').text
|
||||||
|
|
||||||
helper.registerAllowedMethod("readYaml", [Map], { Map parameters ->
|
helper.registerAllowedMethod("readYaml", [Map], { Map parameters ->
|
||||||
@ -38,14 +39,6 @@ class SetupCommonPipelineEnvironmentTest extends BasePiperTest {
|
|||||||
usedConfigFile = parameters.file
|
usedConfigFile = parameters.file
|
||||||
return yamlParser.load(examplePipelineConfig)
|
return yamlParser.load(examplePipelineConfig)
|
||||||
})
|
})
|
||||||
helper.registerAllowedMethod("readProperties", [Map], { Map parameters ->
|
|
||||||
usedConfigFile = parameters.file
|
|
||||||
Properties props = new Properties()
|
|
||||||
props.setProperty('key', 'value')
|
|
||||||
return props
|
|
||||||
})
|
|
||||||
|
|
||||||
swaOldConfigUsed = null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -55,35 +48,12 @@ class SetupCommonPipelineEnvironmentTest extends BasePiperTest {
|
|||||||
return path.endsWith('.pipeline/config.yml')
|
return path.endsWith('.pipeline/config.yml')
|
||||||
})
|
})
|
||||||
|
|
||||||
stepRule.step.setupCommonPipelineEnvironment(script: nullScript, utils: getSWAMockedUtils())
|
stepRule.step.setupCommonPipelineEnvironment(script: nullScript)
|
||||||
|
|
||||||
assertEquals(Boolean.FALSE.toString(), swaOldConfigUsed)
|
|
||||||
assertEquals('.pipeline/config.yml', usedConfigFile)
|
assertEquals('.pipeline/config.yml', usedConfigFile)
|
||||||
assertNotNull(nullScript.commonPipelineEnvironment.configuration)
|
assertNotNull(nullScript.commonPipelineEnvironment.configuration)
|
||||||
assertEquals('develop', nullScript.commonPipelineEnvironment.configuration.general.productiveBranch)
|
assertEquals('develop', nullScript.commonPipelineEnvironment.configuration.general.productiveBranch)
|
||||||
assertEquals('my-maven-docker', nullScript.commonPipelineEnvironment.configuration.steps.mavenExecute.dockerImage)
|
assertEquals('my-maven-docker', nullScript.commonPipelineEnvironment.configuration.steps.mavenExecute.dockerImage)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
void testIsPropertiesConfigurationAvailable() {
|
|
||||||
|
|
||||||
helper.registerAllowedMethod("fileExists", [String], { String path ->
|
|
||||||
return path.endsWith('.pipeline/config.properties')
|
|
||||||
})
|
|
||||||
|
|
||||||
stepRule.step.setupCommonPipelineEnvironment(script: nullScript, utils: getSWAMockedUtils())
|
|
||||||
|
|
||||||
assertEquals(Boolean.TRUE.toString(), swaOldConfigUsed)
|
|
||||||
assertEquals('.pipeline/config.properties', usedConfigFile)
|
|
||||||
assertNotNull(nullScript.commonPipelineEnvironment.configProperties)
|
|
||||||
assertEquals('value', nullScript.commonPipelineEnvironment.configProperties['key'])
|
|
||||||
}
|
|
||||||
|
|
||||||
private getSWAMockedUtils() {
|
|
||||||
new Utils() {
|
|
||||||
void pushToSWA(Map payload, Map config) {
|
|
||||||
SetupCommonPipelineEnvironmentTest.this.swaOldConfigUsed = payload.stepParam5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ import com.sap.piper.ConfigurationLoader
|
|||||||
import com.sap.piper.ConfigurationMerger
|
import com.sap.piper.ConfigurationMerger
|
||||||
|
|
||||||
class commonPipelineEnvironment implements Serializable {
|
class commonPipelineEnvironment implements Serializable {
|
||||||
Map configProperties = [:]
|
|
||||||
|
|
||||||
//stores version of the artifact which is build during pipeline run
|
//stores version of the artifact which is build during pipeline run
|
||||||
def artifactVersion
|
def artifactVersion
|
||||||
@ -44,7 +43,6 @@ class commonPipelineEnvironment implements Serializable {
|
|||||||
appContainerProperties = [:]
|
appContainerProperties = [:]
|
||||||
artifactVersion = null
|
artifactVersion = null
|
||||||
|
|
||||||
configProperties = [:]
|
|
||||||
configuration = [:]
|
configuration = [:]
|
||||||
|
|
||||||
gitCommitId = null
|
gitCommitId = null
|
||||||
@ -74,17 +72,6 @@ class commonPipelineEnvironment implements Serializable {
|
|||||||
return appContainerProperties[property]
|
return appContainerProperties[property]
|
||||||
}
|
}
|
||||||
|
|
||||||
def setConfigProperty(property, value) {
|
|
||||||
configProperties[property] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
def getConfigProperty(property) {
|
|
||||||
if (configProperties[property] != null)
|
|
||||||
return configProperties[property].trim()
|
|
||||||
else
|
|
||||||
return configProperties[property]
|
|
||||||
}
|
|
||||||
|
|
||||||
// goes into measurement jenkins_data
|
// goes into measurement jenkins_data
|
||||||
def setInfluxCustomDataEntry(field, value) {
|
def setInfluxCustomDataEntry(field, value) {
|
||||||
influxCustomData[field] = value
|
influxCustomData[field] = value
|
||||||
|
@ -1,26 +1,80 @@
|
|||||||
import static com.sap.piper.Prerequisites.checkScript
|
import static com.sap.piper.Prerequisites.checkScript
|
||||||
|
|
||||||
import com.sap.piper.ConfigurationHelper
|
import com.sap.piper.ConfigurationHelper
|
||||||
|
import com.sap.piper.GenerateDocumentation
|
||||||
import com.sap.piper.Utils
|
import com.sap.piper.Utils
|
||||||
import groovy.text.SimpleTemplateEngine
|
import groovy.text.SimpleTemplateEngine
|
||||||
import groovy.transform.Field
|
import groovy.transform.Field
|
||||||
|
|
||||||
@Field String STEP_NAME = getClass().getName()
|
@Field String STEP_NAME = getClass().getName()
|
||||||
@Field Set GENERAL_CONFIG_KEYS = ['gitSshKeyCredentialsId']
|
@Field Set GENERAL_CONFIG_KEYS = [
|
||||||
@Field Set STEP_CONFIG_KEYS = [
|
/**
|
||||||
'projectName',
|
* Only if `notifyCulprits` is set:
|
||||||
'buildResult',
|
* Credentials if the repository is protected.
|
||||||
'gitUrl',
|
* @possibleValues Jenkins credentials id
|
||||||
'gitCommitId',
|
*/
|
||||||
'gitSshKeyCredentialsId',
|
'gitSshKeyCredentialsId'
|
||||||
'wrapInNode',
|
|
||||||
'notifyCulprits',
|
|
||||||
'notificationAttachment',
|
|
||||||
'notificationRecipients',
|
|
||||||
'numLogLinesInBody'
|
|
||||||
]
|
]
|
||||||
|
@Field Set STEP_CONFIG_KEYS = GENERAL_CONFIG_KEYS.plus([
|
||||||
|
/**
|
||||||
|
* Set the build result used to determine the mail template.
|
||||||
|
* default `currentBuild.result`
|
||||||
|
*/
|
||||||
|
'buildResult',
|
||||||
|
/**
|
||||||
|
* Only if `notifyCulprits` is set:
|
||||||
|
* Defines a dedicated git commitId for culprit retrieval.
|
||||||
|
* default `commonPipelineEnvironment.getGitCommitId()`
|
||||||
|
*/
|
||||||
|
'gitCommitId',
|
||||||
|
/**
|
||||||
|
* Only if `notifyCulprits` is set:
|
||||||
|
* Repository url used to retrieve culprit information.
|
||||||
|
* default `commonPipelineEnvironment.getGitSshUrl()`
|
||||||
|
*/
|
||||||
|
'gitUrl',
|
||||||
|
/**
|
||||||
|
* defines if the console log file should be attached to the notification mail.
|
||||||
|
* @possibleValues `true`, `false`
|
||||||
|
*/
|
||||||
|
'notificationAttachment',
|
||||||
|
/**
|
||||||
|
* A space-separated list of recipients that always get the notification.
|
||||||
|
*/
|
||||||
|
'notificationRecipients',
|
||||||
|
/**
|
||||||
|
* Notify all committers since the last successful build.
|
||||||
|
* @possibleValues `true`, `false`
|
||||||
|
*/
|
||||||
|
'notifyCulprits',
|
||||||
|
/**
|
||||||
|
* Number of log line which are included in the email body.
|
||||||
|
*/
|
||||||
|
'numLogLinesInBody',
|
||||||
|
/**
|
||||||
|
* The project name used in the email subject.
|
||||||
|
* default `currentBuild.fullProjectName`
|
||||||
|
*/
|
||||||
|
'projectName',
|
||||||
|
/**
|
||||||
|
* Needs to be set to `true` if step is used outside of a node context, e.g. post actions in a declarative pipeline script.
|
||||||
|
* default `false`
|
||||||
|
* @possibleValues `true`, `false`
|
||||||
|
*/
|
||||||
|
'wrapInNode'
|
||||||
|
])
|
||||||
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS
|
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends notifications to all potential culprits of a current or previous build failure and to fixed list of recipients.
|
||||||
|
* It will attach the current build log to the email.
|
||||||
|
*
|
||||||
|
* Notifications are sent in following cases:
|
||||||
|
*
|
||||||
|
* * current build failed or is unstable
|
||||||
|
* * current build is successful and previous build failed or was unstable
|
||||||
|
*/
|
||||||
|
@GenerateDocumentation
|
||||||
void call(Map parameters = [:]) {
|
void call(Map parameters = [:]) {
|
||||||
handlePipelineStepErrors (stepName: STEP_NAME, stepParameters: parameters, allowBuildFailure: true) {
|
handlePipelineStepErrors (stepName: STEP_NAME, stepParameters: parameters, allowBuildFailure: true) {
|
||||||
def script = checkScript(this, parameters) ?: this
|
def script = checkScript(this, parameters) ?: this
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import static com.sap.piper.Prerequisites.checkScript
|
import static com.sap.piper.Prerequisites.checkScript
|
||||||
|
|
||||||
import com.sap.piper.ConfigurationHelper
|
import com.sap.piper.ConfigurationHelper
|
||||||
|
import com.sap.piper.GenerateDocumentation
|
||||||
import com.sap.piper.GitUtils
|
import com.sap.piper.GitUtils
|
||||||
import com.sap.piper.Utils
|
import com.sap.piper.Utils
|
||||||
import groovy.text.SimpleTemplateEngine
|
import groovy.text.SimpleTemplateEngine
|
||||||
@ -11,58 +12,61 @@ import groovy.transform.Field
|
|||||||
@Field Set GENERAL_CONFIG_KEYS = STEP_CONFIG_KEYS
|
@Field Set GENERAL_CONFIG_KEYS = STEP_CONFIG_KEYS
|
||||||
|
|
||||||
@Field Set STEP_CONFIG_KEYS = [
|
@Field Set STEP_CONFIG_KEYS = [
|
||||||
/**
|
/** @see dockerExecute */
|
||||||
* Docker image for code execution.
|
|
||||||
*/
|
|
||||||
'dockerImage',
|
'dockerImage',
|
||||||
/**
|
/**
|
||||||
* Defines the behavior, in case tests fail.
|
* Defines the behavior, in case tests fail.
|
||||||
* @possibleValues `true`, `false`
|
* @possibleValues `true`, `false`
|
||||||
*/
|
*/
|
||||||
'failOnError',
|
'failOnError',
|
||||||
/**
|
/**
|
||||||
* see `testRepository`
|
* Only if `testRepository` is provided: Branch of testRepository, defaults to master.
|
||||||
*/
|
*/
|
||||||
'gitBranch',
|
'gitBranch',
|
||||||
/**
|
/**
|
||||||
* see `testRepository`
|
* Only if `testRepository` is provided: Credentials for a protected testRepository
|
||||||
*/
|
* @possibleValues Jenkins credentials id
|
||||||
|
*/
|
||||||
'gitSshKeyCredentialsId',
|
'gitSshKeyCredentialsId',
|
||||||
/**
|
/**
|
||||||
* The test collection that should be executed. This could also be a file pattern.
|
* The test collection that should be executed. This could also be a file pattern.
|
||||||
*/
|
*/
|
||||||
'newmanCollection',
|
'newmanCollection',
|
||||||
/**
|
/**
|
||||||
* Specify an environment file path or URL. Environments provide a set of variables that one can use within collections.
|
* Specify an environment file path or URL. Environments provide a set of variables that one can use within collections.
|
||||||
* see also [Newman docs](https://github.com/postmanlabs/newman#newman-run-collection-file-source-options)
|
* see also [Newman docs](https://github.com/postmanlabs/newman#newman-run-collection-file-source-options)
|
||||||
*/
|
*/
|
||||||
'newmanEnvironment',
|
'newmanEnvironment',
|
||||||
/**
|
/**
|
||||||
* Specify the file path or URL for global variables. Global variables are similar to environment variables but have a lower precedence and can be overridden by environment variables having the same name.
|
* Specify the file path or URL for global variables. Global variables are similar to environment variables but have a lower precedence and can be overridden by environment variables having the same name.
|
||||||
* see also [Newman docs](https://github.com/postmanlabs/newman#newman-run-collection-file-source-options)
|
* see also [Newman docs](https://github.com/postmanlabs/newman#newman-run-collection-file-source-options)
|
||||||
*/
|
*/
|
||||||
'newmanGlobals',
|
'newmanGlobals',
|
||||||
/**
|
/**
|
||||||
* The shell command that will be executed inside the docker container to install Newman.
|
* The shell command that will be executed inside the docker container to install Newman.
|
||||||
*/
|
*/
|
||||||
'newmanInstallCommand',
|
'newmanInstallCommand',
|
||||||
/**
|
/**
|
||||||
* The newman command that will be executed inside the docker container.
|
* The newman command that will be executed inside the docker container.
|
||||||
*/
|
*/
|
||||||
'newmanRunCommand',
|
'newmanRunCommand',
|
||||||
/**
|
/**
|
||||||
* If specific stashes should be considered for the tests, you can pass this via this parameter.
|
* If specific stashes should be considered for the tests, you can pass this via this parameter.
|
||||||
*/
|
*/
|
||||||
'stashContent',
|
'stashContent',
|
||||||
/**
|
/**
|
||||||
* In case the test implementation is stored in a different repository than the code itself, you can define the repository containing the tests using parameter `testRepository` and if required `gitBranch` (for a different branch than master) and `gitSshKeyCredentialsId` (for protected repositories).
|
* Define an additional repository where the test implementation is located.
|
||||||
* For protected repositories the `testRepository` needs to contain the ssh git url.
|
* For protected repositories the `testRepository` needs to contain the ssh git url.
|
||||||
*/
|
*/
|
||||||
'testRepository'
|
'testRepository'
|
||||||
]
|
]
|
||||||
|
|
||||||
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS
|
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This script executes [Postman](https://www.getpostman.com) tests from a collection via the [Newman](https://www.getpostman.com/docs/v6/postman/collection_runs/command_line_integration_with_newman) command line tool.
|
||||||
|
*/
|
||||||
|
@GenerateDocumentation
|
||||||
void call(Map parameters = [:]) {
|
void call(Map parameters = [:]) {
|
||||||
handlePipelineStepErrors(stepName: STEP_NAME, stepParameters: parameters) {
|
handlePipelineStepErrors(stepName: STEP_NAME, stepParameters: parameters) {
|
||||||
|
|
||||||
|
@ -27,9 +27,7 @@ void call(Map parameters = [:]) {
|
|||||||
(parameters.utils ?: new Utils()).pushToSWA([
|
(parameters.utils ?: new Utils()).pushToSWA([
|
||||||
step: STEP_NAME,
|
step: STEP_NAME,
|
||||||
stepParamKey4: 'customDefaults',
|
stepParamKey4: 'customDefaults',
|
||||||
stepParam4: parameters.customDefaults?'true':'false',
|
stepParam4: parameters.customDefaults?'true':'false'
|
||||||
stepParamKey5: 'legacyConfig',
|
|
||||||
stepParam5: Boolean.toString( ! (script?.commonPipelineEnvironment?.getConfigProperties() ?: [:]).isEmpty())
|
|
||||||
], config)
|
], config)
|
||||||
|
|
||||||
script.commonPipelineEnvironment.setInfluxStepData('build_url', env.BUILD_URL)
|
script.commonPipelineEnvironment.setInfluxStepData('build_url', env.BUILD_URL)
|
||||||
@ -37,28 +35,11 @@ void call(Map parameters = [:]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isYaml(String fileName) {
|
|
||||||
return fileName.endsWith(".yml") || fileName.endsWith(".yaml")
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isProperties(String fileName) {
|
|
||||||
return fileName.endsWith(".properties")
|
|
||||||
}
|
|
||||||
|
|
||||||
private loadConfigurationFromFile(script, String configFile) {
|
private loadConfigurationFromFile(script, String configFile) {
|
||||||
|
|
||||||
String defaultPropertiesConfigFile = '.pipeline/config.properties'
|
|
||||||
String defaultYmlConfigFile = '.pipeline/config.yml'
|
String defaultYmlConfigFile = '.pipeline/config.yml'
|
||||||
|
|
||||||
if (configFile?.trim()?.length() > 0 && isProperties(configFile)) {
|
if (configFile) {
|
||||||
Map configMap = readProperties(file: configFile)
|
|
||||||
script.commonPipelineEnvironment.setConfigProperties(configMap)
|
|
||||||
} else if (fileExists(defaultPropertiesConfigFile)) {
|
|
||||||
Map configMap = readProperties(file: defaultPropertiesConfigFile)
|
|
||||||
script.commonPipelineEnvironment.setConfigProperties(configMap)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configFile?.trim()?.length() > 0 && isYaml(configFile)) {
|
|
||||||
script.commonPipelineEnvironment.configuration = readYaml(file: configFile)
|
script.commonPipelineEnvironment.configuration = readYaml(file: configFile)
|
||||||
} else if (fileExists(defaultYmlConfigFile)) {
|
} else if (fileExists(defaultYmlConfigFile)) {
|
||||||
script.commonPipelineEnvironment.configuration = readYaml(file: defaultYmlConfigFile)
|
script.commonPipelineEnvironment.configuration = readYaml(file: defaultYmlConfigFile)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import static com.sap.piper.Prerequisites.checkScript
|
import static com.sap.piper.Prerequisites.checkScript
|
||||||
|
|
||||||
import com.sap.piper.ConfigurationHelper
|
import com.sap.piper.ConfigurationHelper
|
||||||
|
import com.sap.piper.GenerateDocumentation
|
||||||
import com.sap.piper.Utils
|
import com.sap.piper.Utils
|
||||||
import groovy.transform.Field
|
import groovy.transform.Field
|
||||||
import groovy.text.SimpleTemplateEngine
|
import groovy.text.SimpleTemplateEngine
|
||||||
@ -9,14 +10,44 @@ import groovy.text.SimpleTemplateEngine
|
|||||||
|
|
||||||
@Field Set GENERAL_CONFIG_KEYS = []
|
@Field Set GENERAL_CONFIG_KEYS = []
|
||||||
@Field Set STEP_CONFIG_KEYS = GENERAL_CONFIG_KEYS.plus([
|
@Field Set STEP_CONFIG_KEYS = GENERAL_CONFIG_KEYS.plus([
|
||||||
|
/**
|
||||||
|
* Allows overriding the Slack Plugin Integration Base Url specified in the global configuration.
|
||||||
|
*/
|
||||||
'baseUrl',
|
'baseUrl',
|
||||||
|
/**
|
||||||
|
* Allows overriding of the default massaging channel from the plugin configuration.
|
||||||
|
*/
|
||||||
'channel',
|
'channel',
|
||||||
|
/**
|
||||||
|
* Defines the message color`color` defines the message color.
|
||||||
|
* @possibleValues one of `good`, `warning`, `danger`, or any hex color code (eg. `#439FE0`)
|
||||||
|
*/
|
||||||
'color',
|
'color',
|
||||||
|
/**
|
||||||
|
* The credentials id for the Slack token.
|
||||||
|
* @possibleValues Jenkins credentials id
|
||||||
|
*/
|
||||||
'credentialsId',
|
'credentialsId',
|
||||||
|
/**
|
||||||
|
* Send a custom message into the Slack channel.
|
||||||
|
*/
|
||||||
'message'
|
'message'
|
||||||
])
|
])
|
||||||
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS
|
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends notifications to the Slack channel about the build status.
|
||||||
|
*
|
||||||
|
* Notification contains:
|
||||||
|
*
|
||||||
|
* * Build status;
|
||||||
|
* * Repo Owner;
|
||||||
|
* * Repo Name;
|
||||||
|
* * Branch Name;
|
||||||
|
* * Jenkins Build Number;
|
||||||
|
* * Jenkins Build URL.
|
||||||
|
*/
|
||||||
|
@GenerateDocumentation
|
||||||
void call(Map parameters = [:]) {
|
void call(Map parameters = [:]) {
|
||||||
handlePipelineStepErrors (stepName: STEP_NAME, stepParameters: parameters) {
|
handlePipelineStepErrors (stepName: STEP_NAME, stepParameters: parameters) {
|
||||||
def utils = parameters.juStabUtils ?: new Utils()
|
def utils = parameters.juStabUtils ?: new Utils()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user