/*
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY, either express or
  implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

pipeline {
    agent none
    parameters {
        string(defaultValue: env.GERRIT_BRANCH, description: '', name: 'GERRIT_BRANCH')
        string(defaultValue: 'osm/RO', description: '', name: 'GERRIT_PROJECT')
        string(defaultValue: env.GERRIT_REFSPEC, description: '', name: 'GERRIT_REFSPEC')
        string(defaultValue: env.GERRIT_PATCHSET_REVISION, description: '', name: 'GERRIT_PATCHSET_REVISION')
        string(defaultValue: 'https://osm.etsi.org/gerrit', description: '', name: 'PROJECT_URL_PREFIX')
        booleanParam(defaultValue: false, description: '', name: 'TEST_INSTALL')
        // string(defaultValue: 'artifactory-osm', description: '', name: 'ARTIFACTORY_SERVER')
        // New parameters for Docker image build
        string(defaultValue: 'opensourcemano/ro', description: 'Docker Image Name', name: 'IMAGENAME')
        string(defaultValue: 'localhost:5000', description: 'Docker Registry', name: 'DOCKER_REGISTRY')
        string(defaultValue: 'http://', description: 'Docker Registry protocol', name: 'DOCKER_REGISTRY_PROTOCOL')
        string(defaultValue: '', description: 'ID of Docker Registry Credentials', name: 'DOCKER_CREDENTIALS') // `defaultValue` to be updated with actual ID in Jenkins whenever needed
    }
    stages {
        stage('TEST') {
            agent { label 'system' }
            steps {
                echo "HELLO"
            }
        }
    }
}

