mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-12 10:55:20 +02:00
e22671a9a0
* Update default_pipeline_environment.yml Add filterRegex parameter to jmeter configuration. Set it to an empty string as generated from pipelinesyntax reference in jenkins * Update testsPublishResults.groovy Add the filterRegex param to the publishJmeterReport plugin in testPublishResults * Update documentation to include filterRegex --------- Co-authored-by: Anil Keshav <anil.keshav@sap.com>
567 lines
17 KiB
YAML
567 lines
17 KiB
YAML
#
|
|
# ATTENTION: This file is part of the API, breaking changes here directly affect the consumers of the library.
|
|
# Please avoid breaking changes if possible.
|
|
#
|
|
|
|
#Project Setup
|
|
general:
|
|
collectTelemetryData: true
|
|
logFormat: 'plain'
|
|
changeManagement:
|
|
type: 'NONE' # SOLMAN, CTS, NONE
|
|
transportRequestLabel: 'TransportRequest\s?:'
|
|
changeDocumentLabel: 'ChangeDocument\s?:'
|
|
clientOpts: ''
|
|
credentialsId: 'CM'
|
|
git:
|
|
from: 'origin/master'
|
|
to: 'HEAD'
|
|
format: '%b'
|
|
solman:
|
|
docker:
|
|
image: 'ppiper/cm-client:2.0.1.0'
|
|
options: []
|
|
envVars: {}
|
|
pullImage: true
|
|
cts:
|
|
osDeployUser: 'node'
|
|
deployToolDependencies:
|
|
- '@ui5/cli'
|
|
- '@sap/ux-ui5-tooling'
|
|
- '@ui5/logger'
|
|
- '@ui5/fs'
|
|
deployConfigFile: 'ui5-deploy.yaml'
|
|
nodeDocker:
|
|
image: 'node'
|
|
options: []
|
|
envVars: {}
|
|
pullImage: true
|
|
docker:
|
|
image: 'ppiper/cm-client:2.0.1.0'
|
|
options: []
|
|
envVars: {}
|
|
pullImage: true
|
|
rfc:
|
|
docker:
|
|
image: 'rfc'
|
|
options: []
|
|
envVars: {}
|
|
pullImage: true
|
|
githubApiUrl: 'https://api.github.com'
|
|
githubServerUrl: 'https://github.com'
|
|
gitSshKeyCredentialsId: '' #needed to allow sshagent to run with local ssh key
|
|
globalExtensionsDirectory: '.pipeline/tmp/global_extensions/'
|
|
jenkinsKubernetes:
|
|
jnlpAgent: 'jenkins/inbound-agent:jdk11'
|
|
securityContext:
|
|
# Setting security context globally is currently not working with jaas
|
|
# runAsUser: 1000
|
|
# fsGroup: 1000
|
|
manualConfirmation: true
|
|
manualConfirmationMessage: 'Shall we proceed to Promote & Release?'
|
|
manualConfirmationTimeout: 720 # 1 month
|
|
productiveBranch: 'master'
|
|
whitesource:
|
|
serviceUrl: 'https://saas.whitesourcesoftware.com/api'
|
|
dockerPullImage: true
|
|
sidecarPullImage: true
|
|
|
|
#Steps Specific Configuration
|
|
steps:
|
|
artifactSetVersion:
|
|
timestampTemplate: '%Y%m%d%H%M%S'
|
|
tagPrefix: 'build_'
|
|
commitVersion: true
|
|
gitPushMode: 'SSH'
|
|
verbose: false
|
|
gitHttpsCredentialsId: 'git'
|
|
gitDisableSslVerification: false
|
|
dub:
|
|
filePath: 'dub.json'
|
|
versioningTemplate: '${version}-${timestamp}${commitId?"+"+commitId:""}'
|
|
docker:
|
|
filePath: 'Dockerfile'
|
|
versioningTemplate: '${version}-${timestamp}${commitId?"_"+commitId:""}'
|
|
golang:
|
|
filePath: 'VERSION'
|
|
versioningTemplate: '${version}-${timestamp}${commitId?"+"+commitId:""}'
|
|
maven:
|
|
filePath: 'pom.xml'
|
|
versioningTemplate: '${version}-${timestamp}${commitId?"_"+commitId:""}'
|
|
mta:
|
|
filePath: 'mta.yaml'
|
|
versioningTemplate: '${version}-${timestamp}${commitId?"+"+commitId:""}'
|
|
npm:
|
|
filePath: 'package.json'
|
|
versioningTemplate: '${version}-${timestamp}${commitId?"+"+commitId:""}'
|
|
pip:
|
|
filePath: 'version.txt'
|
|
versioningTemplate: '${version}.${timestamp}${commitId?"."+commitId:""}'
|
|
sbt:
|
|
filePath: 'sbtDescriptor.json'
|
|
versioningTemplate: '${version}-${timestamp}${commitId?"+"+commitId:""}'
|
|
batsExecuteTests:
|
|
#TODO: check wheather defaults in here are still required
|
|
dockerImage: 'node:lts-buster'
|
|
dockerWorkspace: '/home/node'
|
|
envVars: {}
|
|
outputFormat: 'junit' # tap, junit
|
|
testPath: 'src/test'
|
|
failOnError: false
|
|
repository: 'https://github.com/bats-core/bats-core.git'
|
|
stashContent:
|
|
- 'tests'
|
|
testPackage: 'piper-bats'
|
|
checksPublishResults:
|
|
failOnError: false
|
|
tasks:
|
|
pattern: '**/*.java'
|
|
low: ''
|
|
normal: 'TODO,REVISE,XXX'
|
|
high: 'FIXME'
|
|
archive: true
|
|
active: false
|
|
qualityGates:
|
|
- threshold: 1
|
|
type: 'TOTAL_HIGH'
|
|
unstable: false
|
|
- threshold: 1
|
|
type: 'TOTAL_ERROR'
|
|
unstable: false
|
|
pmd:
|
|
pattern: '**/target/pmd.xml'
|
|
archive: true
|
|
active: false
|
|
qualityGates:
|
|
- threshold: 1
|
|
type: 'TOTAL_HIGH'
|
|
unstable: false
|
|
- threshold: 1
|
|
type: 'TOTAL_ERROR'
|
|
unstable: false
|
|
cpd:
|
|
pattern: '**/target/cpd.xml'
|
|
archive: true
|
|
active: false
|
|
qualityGates:
|
|
- threshold: 1
|
|
type: 'TOTAL_HIGH'
|
|
unstable: false
|
|
- threshold: 1
|
|
type: 'TOTAL_ERROR'
|
|
unstable: false
|
|
findbugs:
|
|
pattern: '**/target/findbugsXml.xml, **/target/findbugs.xml'
|
|
archive: true
|
|
active: false
|
|
qualityGates:
|
|
- threshold: 1
|
|
type: 'TOTAL_HIGH'
|
|
unstable: false
|
|
- threshold: 1
|
|
type: 'TOTAL_ERROR'
|
|
unstable: false
|
|
checkstyle:
|
|
pattern: '**/target/checkstyle-result.xml'
|
|
archive: true
|
|
active: false
|
|
qualityGates:
|
|
- threshold: 1
|
|
type: 'TOTAL_HIGH'
|
|
unstable: false
|
|
- threshold: 1
|
|
type: 'TOTAL_ERROR'
|
|
unstable: false
|
|
eslint:
|
|
pattern: '**/eslint.xml'
|
|
archive: true
|
|
active: false
|
|
qualityGates:
|
|
- threshold: 1
|
|
type: 'TOTAL_HIGH'
|
|
unstable: false
|
|
- threshold: 1
|
|
type: 'TOTAL_ERROR'
|
|
unstable: false
|
|
pylint:
|
|
pattern: '**/pylint.log'
|
|
archive: true
|
|
active: false
|
|
qualityGates:
|
|
- threshold: 1
|
|
type: 'TOTAL_HIGH'
|
|
unstable: false
|
|
- threshold: 1
|
|
type: 'TOTAL_ERROR'
|
|
unstable: false
|
|
archive: false
|
|
cloudFoundryDeploy:
|
|
cloudFoundry:
|
|
apiEndpoint: 'https://api.cf.eu10.hana.ondemand.com'
|
|
apiParameters: ''
|
|
loginParameters: ''
|
|
deployType: 'standard'
|
|
keepOldInstance: false
|
|
cfNativeDeployParameters: ''
|
|
mtaDeployParameters: '-f'
|
|
mtaExtensionDescriptor: ''
|
|
mtaPath: ''
|
|
smokeTestScript: 'blueGreenCheckScript.sh'
|
|
smokeTestStatusCode: 200
|
|
stashContent:
|
|
- 'deployDescriptor'
|
|
- 'pipelineConfigAndTests'
|
|
cf_native:
|
|
dockerImage: 'ppiper/cf-cli:latest'
|
|
dockerWorkspace: '/home/piper'
|
|
mtaDeployPlugin:
|
|
dockerImage: 'ppiper/cf-cli:latest'
|
|
dockerWorkspace: '/home/piper'
|
|
mta:
|
|
deployTool: 'mtaDeployPlugin'
|
|
maven:
|
|
deployTool: 'cf_native'
|
|
npm:
|
|
deployTool: 'cf_native'
|
|
docker:
|
|
deployTool: 'cf_native'
|
|
kaniko:
|
|
deployTool: 'cf_native'
|
|
debugReportArchive:
|
|
shareConfidentialInformation: false
|
|
dockerExecute:
|
|
stashContent: []
|
|
dockerExecuteOnKubernetes:
|
|
stashContent: []
|
|
stashIncludes:
|
|
workspace: '**/*'
|
|
stashExcludes:
|
|
workspace: 'nohup.out'
|
|
stashBack: '**/node_modules/**,nohup.out'
|
|
dubExecute:
|
|
dockerImage: 'dlang2/dmd-ubuntu:latest'
|
|
githubPublishRelease:
|
|
addClosedIssues: false
|
|
addDeltaToLastRelease: false
|
|
customFilterExtension: ''
|
|
excludeLabels:
|
|
- 'duplicate'
|
|
- 'invalid'
|
|
- 'question'
|
|
- 'wontfix'
|
|
gatlingExecuteTests:
|
|
stashContent:
|
|
- 'source'
|
|
gaugeExecuteTests:
|
|
buildTool: 'maven'
|
|
dockerEnvVars:
|
|
HUB: 'TRUE'
|
|
HUB_URL: 'http://localhost:4444/wd/hub'
|
|
failOnError: false
|
|
installCommand: 'curl -SsL https://downloads.gauge.org/stable | sh -s -- --location=$HOME/bin/gauge'
|
|
stashContent:
|
|
- 'buildDescriptor'
|
|
- 'tests'
|
|
maven:
|
|
dockerImage: 'maven:3.5-jdk-8'
|
|
dockerName: 'maven'
|
|
dockerWorkspace: ''
|
|
languageRunner: 'java'
|
|
runCommand: 'mvn test-compile gauge:execute'
|
|
testOptions: '-DspecsDir=specs'
|
|
npm:
|
|
#TODO: check wheather defaults in here are still required
|
|
dockerImage: 'node:lts-buster'
|
|
dockerName: 'npm'
|
|
dockerWorkspace: '/home/node'
|
|
languageRunner: 'js'
|
|
runCommand: 'gauge run'
|
|
testOptions: 'specs'
|
|
bundler:
|
|
dockerImage: 'ruby:2.5.3-stretch'
|
|
dockerName: 'bundler'
|
|
dockerWorkspace: ''
|
|
languageRunner: 'ruby'
|
|
runCommand: 'bundle install && bundle exec gauge run'
|
|
testOptions: 'specs'
|
|
hadolintExecute:
|
|
qualityGates:
|
|
- threshold: 1
|
|
type: 'TOTAL_ERROR'
|
|
unstable: false
|
|
reportFile: 'hadolint.xml'
|
|
reportName: 'HaDoLint'
|
|
stashContent:
|
|
- 'buildDescriptor'
|
|
handlePipelineStepErrors:
|
|
echoDetails: true
|
|
failOnError: true
|
|
libraryDocumentationUrl: 'https://sap.github.io/jenkins-library/'
|
|
libraryRepositoryUrl: 'https://github.com/SAP/jenkins-library/'
|
|
mandatorySteps: []
|
|
stepTimeouts: {}
|
|
healthExecuteCheck:
|
|
healthEndpoint: ''
|
|
influxWriteData:
|
|
influxServer: ''
|
|
karmaExecuteTests:
|
|
containerPortMappings:
|
|
'node:lts-buster':
|
|
- containerPort: 9876
|
|
hostPort: 9876
|
|
dockerEnvVars:
|
|
NO_PROXY: 'localhost,selenium,$NO_PROXY'
|
|
no_proxy: 'localhost,selenium,$no_proxy'
|
|
#TODO: check wheather defaults in here are still required
|
|
dockerImage: 'node:lts-buster'
|
|
dockerName: 'karma'
|
|
dockerWorkspace: '/home/node'
|
|
installCommand: 'npm install --quiet'
|
|
modules:
|
|
- '.'
|
|
runCommand: 'npm run karma'
|
|
sidecarEnvVars:
|
|
NO_PROXY: 'localhost,karma,$NO_PROXY'
|
|
no_proxy: 'localhost,karma,$no_proxy'
|
|
stashContent:
|
|
- buildDescriptor
|
|
- tests
|
|
mailSendNotification:
|
|
notificationAttachment: true
|
|
notifyCulprits: true
|
|
numLogLinesInBody: 100
|
|
wrapInNode: false
|
|
mavenExecute:
|
|
dockerImage: 'maven:3.5-jdk-7'
|
|
logSuccessfulMavenTransfers: false
|
|
buildExecute:
|
|
npmInstall: true
|
|
npmRunScripts: []
|
|
neoDeploy:
|
|
dockerImage: 'ppiper/neo-cli'
|
|
deployMode: 'mta'
|
|
warAction: 'deploy'
|
|
extensions: []
|
|
mavenDeploymentModule: '.'
|
|
neo:
|
|
size: 'lite'
|
|
credentialsId: 'CI_CREDENTIALS_ID'
|
|
credentialType: 'UsernamePassword'
|
|
portalLandscape: "cloudnwcportal"
|
|
multicloudDeploy:
|
|
cfTargets: []
|
|
neoTargets: []
|
|
enableZeroDowntimeDeployment: false
|
|
parallelExecution: false
|
|
npmExecute:
|
|
#TODO: check wheather defaults in here are still required
|
|
dockerImage: 'node:lts-buster'
|
|
npmExecuteScripts:
|
|
install: true
|
|
npmExecuteEndToEndTests:
|
|
runScript: 'ci-e2e'
|
|
whitesourceExecuteScan:
|
|
vulnerabilityReportFileName: 'piper_whitesource_vulnerability_report'
|
|
stashExcludes:
|
|
stashBack: '.pipeline/** whitesourceExecuteScan_*.* whitesource-reports/**'
|
|
pipelineExecute:
|
|
branch: 'master'
|
|
path: 'Jenkinsfile'
|
|
credentialsId: ''
|
|
pipelineRestartSteps:
|
|
sendMail: true
|
|
timeoutInSeconds: 900
|
|
stepMessage: 'Do you want to restart?'
|
|
pipelineStashFilesAfterBuild:
|
|
stashIncludes:
|
|
buildResult: '**/target/*.war, **/target/*.jar, **/*.mtar, **/*.jar.original, dist/**'
|
|
checkmarx: '**/*.js, **/*.scala, **/*.py, **/*.go, **/*.d, **/*.di, **/*.xml, **/*.html, **/*.ts'
|
|
checkmarxOne: '**/*.js, **/*.scala, **/*.py, **/*.go, **/*.d, **/*.di, **/*.xml, **/*.html, **/*.ts'
|
|
classFiles: '**/target/classes/**/*.class, **/target/test-classes/**/*.class'
|
|
sonar: '**/jacoco*.exec, **/sonar-project.properties'
|
|
stashExcludes:
|
|
buildResult: ''
|
|
checkmarx: '**/*.mockserver.js, node_modules/**/*.js'
|
|
checkmarxOne: '**/*.mockserver.js, node_modules/**/*.js'
|
|
classFiles: ''
|
|
sonar: ''
|
|
noDefaultExludes: []
|
|
pipelineStashFilesBeforeBuild:
|
|
stashIncludes:
|
|
buildDescriptor: '**/pom.xml, **/.mvn/**, **/assembly.xml, **/.swagger-codegen-ignore, **/package.json, **/requirements.txt, **/setup.py, **/mta*.y*ml, **/.npmrc, **/Dockerfile, .hadolint.yaml, **/VERSION, **/version.txt, **/Gopkg.*, **/dub.json, **/dub.sdl, **/build.sbt, **/sbtDescriptor.json, **/project/*, **/ui5.yaml, **/ui5.yml'
|
|
deployDescriptor: '**/manifest*.y*ml, **/*.mtaext.y*ml, **/*.mtaext, **/xs-app.json, helm/**, **/*.y*ml, **/*.tpl, **/*.tgz'
|
|
git: '.git/**'
|
|
opensourceConfiguration: '**/srcclr.yml, **/vulas-custom.properties, **/.nsprc, **/.retireignore, **/.retireignore.json, **/.snyk, **/wss-unified-agent.config, **/vendor/**/*'
|
|
pipelineConfigAndTests: '.pipeline/**'
|
|
securityDescriptor: '**/xs-security.json'
|
|
tests: '**/pom.xml, **/*.json, **/*.xml, **/src/**, **/node_modules/**, **/specs/**, **/env/**, **/*.js, **/tests/**, **/*.html, **/*.css, **/*.properties, **/*.cds'
|
|
checkmarx: '**/*.js, **/*.scala, **/*.py, **/*.go, **/*.xml, **/*.html, **/*.d, **/*.di, **/*.ts'
|
|
checkmarxOne: '**/*.js, **/*.scala, **/*.py, **/*.go, **/*.xml, **/*.html, **/*.d, **/*.di, **/*.ts'
|
|
stashExcludes:
|
|
buildDescriptor: '**/node_modules/**/package.json'
|
|
deployDescriptor: ''
|
|
git: ''
|
|
opensourceConfiguration: ''
|
|
pipelineConfigAndTests: ''
|
|
securityDescriptor: ''
|
|
tests: ''
|
|
checkmarx: '**/*.mockserver.js, node_modules/**/*.js'
|
|
checkmarxOne: '**/*.mockserver.js, node_modules/**/*.js'
|
|
noDefaultExludes:
|
|
- 'git'
|
|
piperPublishWarnings:
|
|
parserId: piper
|
|
parserName: Piper
|
|
parserPattern: '\[(INFO|WARNING|ERROR)\] (.*) \(([^) ]*)\/([^) ]*)\)'
|
|
parserScript: 'return builder.guessSeverity(matcher.group(1)).setMessage(matcher.group(2)).setModuleName(matcher.group(3)).setType(matcher.group(4)).buildOptional()'
|
|
recordIssuesSettings:
|
|
blameDisabled: true
|
|
enabledForFailure: true
|
|
seleniumExecuteTests:
|
|
buildTool: 'npm'
|
|
containerPortMappings:
|
|
'selenium/standalone-chrome':
|
|
- containerPort: 4444
|
|
hostPort: 4444
|
|
failOnError: true
|
|
sidecarImage: 'selenium/standalone-chrome'
|
|
sidecarName: 'selenium'
|
|
sidecarVolumeBind:
|
|
'/dev/shm': '/dev/shm'
|
|
stashContent:
|
|
- 'tests'
|
|
maven:
|
|
dockerImage: 'maven:3.5-jdk-8'
|
|
dockerName: 'maven'
|
|
dockerWorkspace: ''
|
|
npm:
|
|
dockerImage: 'node:lts-buster'
|
|
dockerName: 'npm'
|
|
dockerWorkspace: '/home/node'
|
|
bundler:
|
|
dockerImage: 'ruby:2.5.3-stretch'
|
|
dockerName: 'bundler'
|
|
dockerWorkspace: ''
|
|
slackSendNotification:
|
|
color: "${['SUCCESS': '#8cc04f', 'FAILURE': '#d54c53', 'ABORTED': '#949393', 'UNSTABLE': '#f6b44b', 'PAUSED': '#24b0d5', 'UNKNOWN': '#d54cc4'].get(buildStatus, '#d54cc4')}"
|
|
defaultMessage: "${buildStatus}: Job ${env.JOB_NAME} <${env.BUILD_URL}|#${env.BUILD_NUMBER}>"
|
|
snykExecute:
|
|
buildDescriptorFile: './package.json'
|
|
dockerImage: 'node:lts-buster'
|
|
exclude: []
|
|
monitor: true
|
|
scanType: 'npm'
|
|
stashContent:
|
|
- 'buildDescriptor'
|
|
- 'opensourceConfiguration'
|
|
toJson: false
|
|
toHtml: false
|
|
spinnakerTriggerPipeline:
|
|
certFileCredentialsId: 'spinnaker-client-certificate'
|
|
keyFileCredentialsId: 'spinnaker-client-key'
|
|
timeout: 60
|
|
testsPublishResults:
|
|
failOnError: false
|
|
junit:
|
|
pattern: '**/TEST-*.xml'
|
|
updateResults: false
|
|
allowEmptyResults: true
|
|
archive: false
|
|
active: false
|
|
jacoco:
|
|
pattern: '**/target/*.exec'
|
|
allowEmptyResults: true
|
|
archive: false
|
|
active: false
|
|
cobertura:
|
|
pattern: '**/target/coverage/**/cobertura-coverage.xml'
|
|
onlyStableBuilds: true
|
|
allowEmptyResults: true
|
|
archive: false
|
|
active: false
|
|
jmeter:
|
|
pattern: '**/*.jtl'
|
|
filterRegex: ''
|
|
errorFailedThreshold: 20
|
|
errorUnstableThreshold: 10
|
|
errorUnstableResponseTimeThreshold: ''
|
|
relativeFailedThresholdPositive: 0
|
|
relativeFailedThresholdNegative: 0
|
|
relativeUnstableThresholdPositive: 0
|
|
relativeUnstableThresholdNegative: 0
|
|
modeOfThreshold: false
|
|
modeThroughput: false
|
|
nthBuildNumber: 0
|
|
configType: 'PRT'
|
|
failBuildIfNoResultFile: false
|
|
compareBuildPrevious: true
|
|
allowEmptyResults: true
|
|
archive: false
|
|
active: false
|
|
cucumber:
|
|
pattern: '**/e2e/*.json'
|
|
allowEmptyResults: true
|
|
archive: false
|
|
active: false
|
|
htmlPublisher:
|
|
allowMissing: true
|
|
alwaysLinkToLastBuild: false
|
|
keepAll: true
|
|
reportDir: ""
|
|
pattern: "**/reports/coverage-reports/**/index.html"
|
|
reportName: "Results"
|
|
active: false
|
|
checkChangeInDevelopment:
|
|
failIfStatusIsNotInDevelopment: true
|
|
tmsUpload:
|
|
namedUser: 'Piper-Pipeline'
|
|
mtaVersion: '*'
|
|
stashContent:
|
|
- 'buildResult'
|
|
transportRequestCreate:
|
|
developmentSystemId: null
|
|
verbose: false
|
|
transportRequestUploadFile:
|
|
acceptUnixStyleLineEndings: true
|
|
codePage: 'UTF-8'
|
|
failOnWarning: true
|
|
verbose: false
|
|
transportRequestRelease:
|
|
verbose: false
|
|
transportRequestUploadRFC:
|
|
credentialsId: 'RFC_CREDENTIALS_ID'
|
|
writeTemporaryCredentials:
|
|
credentialsDirectories:
|
|
- './'
|
|
- 'integration-tests/src/test/resources'
|
|
|
|
#defaults for stage wrapper
|
|
piperStageWrapper:
|
|
projectExtensionsDirectory: '.pipeline/extensions/'
|
|
stageLocking: true
|
|
nodeLabel: ''
|
|
stashContent:
|
|
- 'pipelineConfigAndTests'
|
|
xsDeploy:
|
|
credentialsId: 'XS'
|
|
deployIdLogPattern: '^.*"xs bg-deploy -i (.*) -a .*".*$'
|
|
loginOpts: ''
|
|
deployOpts: ''
|
|
dockerPullImage: false
|
|
docker:
|
|
dockerImage: ''
|
|
dockerPullImage: false
|
|
mode: 'DEPLOY'
|
|
action: 'NONE'
|
|
xsSessionFile: '.xsconfig'
|
|
piperPipelineStageInit:
|
|
stepMappings:
|
|
checkmarx: 'checkmarxExecuteScan'
|
|
fortify: 'fortifyExecuteScan'
|
|
karma: 'karmaExecuteTests'
|
|
whitesource: 'whitesourceExecuteScan'
|
|
labelPrefix: pr_
|
|
cnbBuild:
|
|
stashIncludes:
|
|
stashBack: '**/target/*.exec, **/*.jtl, **/target/**/*.xml'
|