2019-01-31 10:16:34 +02:00
|
|
|
import com.sap.piper.ConfigurationHelper
|
|
|
|
import com.sap.piper.GenerateDocumentation
|
|
|
|
import com.sap.piper.GitUtils
|
|
|
|
import com.sap.piper.Utils
|
|
|
|
|
|
|
|
import groovy.text.SimpleTemplateEngine
|
|
|
|
import groovy.transform.Field
|
|
|
|
|
|
|
|
import static com.sap.piper.Prerequisites.checkScript
|
|
|
|
|
|
|
|
@Field String STEP_NAME = getClass().getName()
|
|
|
|
|
|
|
|
@Field Set GENERAL_CONFIG_KEYS = [
|
|
|
|
/**
|
|
|
|
* In case a `testRepository` is provided and it is protected, access credentials (as Jenkins credentials) can be provided with `gitSshKeyCredentialsId`. **Note: In case of using a protected repository, `testRepository` should include the ssh link to the repository.**
|
|
|
|
* @possibleValues Jenkins credentialId
|
|
|
|
*/
|
|
|
|
'gitSshKeyCredentialsId'
|
|
|
|
]
|
|
|
|
@Field Set STEP_CONFIG_KEYS = GENERAL_CONFIG_KEYS.plus([
|
|
|
|
/**
|
|
|
|
* A map of environment variables to set in the container, e.g. [http_proxy:'proxy:8080'].
|
|
|
|
*/
|
|
|
|
'dockerEnvVars',
|
|
|
|
/**
|
|
|
|
* The name of the docker image that should be used. If empty, Docker is not used and the command is executed directly on the Jenkins system.
|
|
|
|
*/
|
|
|
|
'dockerImage',
|
|
|
|
/**
|
|
|
|
* Only relevant for Kubernetes case: Specifies a dedicated user home directory for the container which will be passed as value for environment variable `HOME`.
|
|
|
|
*/
|
|
|
|
'dockerWorkspace',
|
|
|
|
/**
|
|
|
|
* With `failOnError` the behavior in case tests fail can be defined.
|
|
|
|
* @possibleValues `true`, `false`
|
|
|
|
*/
|
|
|
|
'failOnError',
|
|
|
|
/**
|
|
|
|
* In case a `testRepository` is provided the branch in this repository can be specified with `gitBranch`.
|
|
|
|
*/
|
|
|
|
'gitBranch',
|
|
|
|
/**
|
|
|
|
* The command that is executed to install the test tool.
|
|
|
|
*/
|
|
|
|
'installCommand',
|
|
|
|
/**
|
|
|
|
* The command that is executed to start the tests.
|
|
|
|
*/
|
|
|
|
'runCommand',
|
|
|
|
/**
|
|
|
|
* The host of the selenium hub, this is set automatically to `localhost` in a Kubernetes environment (determined by the `ON_K8S` environment variable) of to `selenium` in any other case. The value is only needed for the `runCommand`.
|
|
|
|
*/
|
|
|
|
'seleniumHost',
|
|
|
|
/**
|
|
|
|
* The port of the selenium hub. The value is only needed for the `runCommand`.
|
|
|
|
*/
|
|
|
|
'seleniumPort',
|
|
|
|
/**
|
|
|
|
* A map of environment variables to set in the sidecar container, similar to `dockerEnvVars`.
|
|
|
|
*/
|
|
|
|
'sidecarEnvVars',
|
|
|
|
/**
|
|
|
|
* The name of the docker image of the sidecar container. If empty, no sidecar container is started.
|
|
|
|
*/
|
|
|
|
'sidecarImage',
|
|
|
|
/**
|
|
|
|
* If specific stashes should be considered for the tests, their names need to be passed via the parameter `stashContent`.
|
|
|
|
*/
|
|
|
|
'stashContent',
|
|
|
|
/**
|
|
|
|
* This allows to set specific options for the UIVeri5 execution. Details can be found [in the UIVeri5 documentation](https://github.com/SAP/ui5-uiveri5/blob/master/docs/config/config.md#configuration).
|
|
|
|
*/
|
|
|
|
'testOptions',
|
|
|
|
/**
|
|
|
|
* With `testRepository` the tests can be loaded from another reposirory.
|
|
|
|
*/
|
2019-03-13 18:45:41 +02:00
|
|
|
'testRepository',
|
|
|
|
/**
|
|
|
|
* The `testServerUrl` is passed as environment variable `TARGET_SERVER_URL` to the test execution.
|
|
|
|
* The tests should read the host information from this environment variable in order to be infrastructure agnostic.
|
|
|
|
*/
|
|
|
|
'testServerUrl'
|
2019-01-31 10:16:34 +02:00
|
|
|
])
|
|
|
|
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS
|
|
|
|
|
|
|
|
/**
|
|
|
|
* With this step [UIVeri5](https://github.com/SAP/ui5-uiveri5) tests can be executed.
|
|
|
|
*
|
|
|
|
* UIVeri5 describes following benefits on its GitHub page:
|
|
|
|
*
|
|
|
|
* * Automatic synchronization with UI5 app rendering so there is no need to add waits and sleeps to your test. Tests are reliable by design.
|
|
|
|
* * Tests are written in synchronous manner, no callbacks, no promise chaining so are really simple to write and maintain.
|
|
|
|
* * Full power of webdriverjs, protractor and jasmine - deferred selectors, custom matchers, custom locators.
|
|
|
|
* * Control locators (OPA5 declarative matchers) allow locating and interacting with UI5 controls.
|
|
|
|
* * Does not depend on testability support in applications - works with autorefreshing views, resizing elements, animated transitions.
|
|
|
|
* * Declarative authentications - authentication flow over OAuth2 providers, etc.
|
|
|
|
* * Console operation, CI ready, fully configurable, no need for java (comming soon) or IDE.
|
|
|
|
* * Covers full ui5 browser matrix - Chrome,Firefox,IE,Edge,Safari,iOS,Android.
|
|
|
|
* * Open-source, modify to suite your specific neeeds.
|
|
|
|
*
|
|
|
|
* !!! note "Browser Matrix"
|
|
|
|
* With this step and the underlying Docker image ([selenium/standalone-chrome](https://github.com/SeleniumHQ/docker-selenium/tree/master/StandaloneChrome)) only Chrome tests are possible.
|
|
|
|
*
|
|
|
|
* Testing of further browsers can be done with using a custom Docker image.
|
|
|
|
*/
|
|
|
|
@GenerateDocumentation
|
|
|
|
void call(Map parameters = [:]) {
|
|
|
|
handlePipelineStepErrors (stepName: STEP_NAME, stepParameters: parameters) {
|
|
|
|
def script = checkScript(this, parameters) ?: this
|
|
|
|
def utils = parameters.juStabUtils ?: new Utils()
|
|
|
|
|
|
|
|
// load default & individual configuration
|
|
|
|
Map config = ConfigurationHelper.newInstance(this)
|
|
|
|
.loadStepDefaults()
|
|
|
|
.mixinGeneralConfig(script.commonPipelineEnvironment, GENERAL_CONFIG_KEYS)
|
|
|
|
.mixinStepConfig(script.commonPipelineEnvironment, STEP_CONFIG_KEYS)
|
|
|
|
.mixinStageConfig(script.commonPipelineEnvironment, parameters.stageName?:env.STAGE_NAME, STEP_CONFIG_KEYS)
|
|
|
|
.mixin(parameters, PARAMETER_KEYS)
|
|
|
|
.addIfEmpty('seleniumHost', isKubernetes()?'localhost':'selenium')
|
|
|
|
.use()
|
|
|
|
|
|
|
|
new Utils().pushToSWA([
|
|
|
|
step: STEP_NAME,
|
|
|
|
stepParamKey1: 'scriptMissing',
|
|
|
|
stepParam1: parameters?.script == null
|
|
|
|
], config)
|
|
|
|
|
|
|
|
config.stashContent = config.testRepository ? [GitUtils.handleTestRepository(this, config)] : utils.unstashAll(config.stashContent)
|
|
|
|
config.installCommand = SimpleTemplateEngine.newInstance().createTemplate(config.installCommand).make([config: config]).toString()
|
|
|
|
config.runCommand = SimpleTemplateEngine.newInstance().createTemplate(config.runCommand).make([config: config]).toString()
|
2019-03-13 18:45:41 +02:00
|
|
|
config.dockerEnvVars.TARGET_SERVER_URL = config.dockerEnvVars.TARGET_SERVER_URL ?: config.testServerUrl
|
2019-01-31 10:16:34 +02:00
|
|
|
|
|
|
|
seleniumExecuteTests(
|
|
|
|
script: script,
|
|
|
|
buildTool: 'npm',
|
|
|
|
dockerEnvVars: config.dockerEnvVars,
|
|
|
|
dockerImage: config.dockerImage,
|
|
|
|
dockerName: config.dockerName,
|
|
|
|
dockerWorkspace: config.dockerWorkspace,
|
|
|
|
sidecarEnvVars: config.sidecarEnvVars,
|
|
|
|
sidecarImage: config.sidecarImage,
|
|
|
|
stashContent: config.stashContent
|
|
|
|
) {
|
|
|
|
try {
|
|
|
|
sh "NPM_CONFIG_PREFIX=~/.npm-global ${config.installCommand}"
|
|
|
|
sh "PATH=\$PATH:~/.npm-global/bin ${config.runCommand} ${config.testOptions}"
|
|
|
|
} catch (err) {
|
|
|
|
echo "[${STEP_NAME}] Test execution failed"
|
|
|
|
script.currentBuild.result = 'UNSTABLE'
|
|
|
|
if (config.failOnError) throw err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean isKubernetes() {
|
|
|
|
return Boolean.valueOf(env.ON_K8S)
|
|
|
|
}
|