/*
  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/MON', 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/mon', 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"
            }
        }
    }
}

