void call(parameters) {
    pipeline {
        agent none
        triggers {
            issueCommentTrigger('.*/piper ([a-z]*).*')
        }
        options {
            skipDefaultCheckout()
            timestamps()
        }
        stages {
            stage('Init') {
                steps {
                    library 'piper-lib-os'
                    piperPipelineStageInit script: parameters.script, customDefaults: ['com.sap.piper/pipeline/stageOrdinals.yml'].plus(parameters.customDefaults ?: [])
                }
            }
            stage('Pull-Request Voting') {
                when { anyOf { branch 'PR-*'; branch parameters.script.commonPipelineEnvironment.getStepConfiguration('piperPipelineStagePRVoting', 'Pull-Request Voting').customVotingBranch } }
                steps {
                    piperPipelineStagePRVoting script: parameters.script
                }
            }
            stage('Build') {
                when {branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch}
                steps {
                    piperPipelineStageBuild script: parameters.script
                }
            }
            stage('Additional Unit Tests') {
                when {allOf {branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch; expression {return parameters.script.commonPipelineEnvironment.configuration.runStage?.get(env.STAGE_NAME)}}}
                steps {
                    piperPipelineStageAdditionalUnitTests script: parameters.script
                }
            }
            stage('Integration') {
                when {allOf {branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch; expression {return parameters.script.commonPipelineEnvironment.configuration.runStage?.get(env.STAGE_NAME)}}}
                steps {
                    piperPipelineStageIntegration script: parameters.script
                }
            }
            stage('Acceptance') {
                when {allOf {branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch; expression {return parameters.script.commonPipelineEnvironment.configuration.runStage?.get(env.STAGE_NAME)}}}
                steps {
                    piperPipelineStageAcceptance script: parameters.script
                }
            }
            stage('Security') {
                when {allOf {branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch; expression {return parameters.script.commonPipelineEnvironment.configuration.runStage?.get(env.STAGE_NAME)}}}
                steps {
                    piperPipelineStageSecurity script: parameters.script
                }
            }
            stage('Performance') {
                when {allOf {branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch; expression {return parameters.script.commonPipelineEnvironment.configuration.runStage?.get(env.STAGE_NAME)}}}
                steps {
                    piperPipelineStagePerformance script: parameters.script
                }
            }
            stage('Compliance') {
                when {allOf {branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch; expression {return parameters.script.commonPipelineEnvironment.configuration.runStage?.get(env.STAGE_NAME)}}}
                steps {
                    piperPipelineStageCompliance script: parameters.script
                }
            }
            stage('Confirm') {
                agent none
                when {allOf {expression { env.BRANCH_NAME ==~ parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch }; anyOf {expression {return (currentBuild.result == 'UNSTABLE')}; expression {return parameters.script.commonPipelineEnvironment.getStepConfiguration('piperInitRunStageConfiguration', env.STAGE_NAME).manualConfirmation}}}}
                steps {
                    piperPipelineStageConfirm script: parameters.script
                }
            }
            stage('Promote') {
                when { branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch}
                steps {
                    piperPipelineStagePromote script: parameters.script
                }
            }
            stage('Release') {
                when {allOf {branch parameters.script.commonPipelineEnvironment.getStepConfiguration('', '').productiveBranch; expression {return parameters.script.commonPipelineEnvironment.configuration.runStage?.get(env.STAGE_NAME)}}}
                steps {
                    piperPipelineStageRelease script: parameters.script
                }
            }
        }
        post {
            /* https://jenkins.io/doc/book/pipeline/syntax/#post */
            success {buildSetResult(currentBuild)}
            aborted {buildSetResult(currentBuild, 'ABORTED')}
            failure {buildSetResult(currentBuild, 'FAILURE')}
            unstable {buildSetResult(currentBuild, 'UNSTABLE')}
            cleanup {
                piperPipelineStagePost script: parameters.script
            }
        }
    }
}
