#!/usr/bin/env groovy

// Copyright (C) 2025 The Android Open Source Project
//
// 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 KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

pipeline {
    agent { label 'gerrit-release-bazel' }

    parameters {
        password(name: 'GCLOUD_AUTH_TOKEN', defaultValue: '', description: "Gcloud Auth token obtained via 'gcloud auth login' and then 'gcloud auth print-access-token'")
        password(name: 'GPG_PASSPHRASE', defaultValue: '', description: "GPG key passphrase")
        string(name: 'VERSION',           defaultValue: '', description: 'Gerrit semantic release number')
        string(name: 'BRANCH',            defaultValue: '', description: 'Gerrit branch name where the release must be cut')
        string(name: 'NEXT_VERSION',      defaultValue: '', description: 'Next SNAPSHOT version after release')
        string(name: 'MIGRATION_VERSION', defaultValue: '', description: 'Test migration from an earlier Gerrit version')
    }
    environment {
        GCLOUD_AUTH_TOKEN = "${params.GCLOUD_AUTH_TOKEN}"
        GPG_PASSPHRASE = "${params.GPG_PASSPHRASE}"
    }
    stages {

        stage('Gerrit Release') {
            steps {
                withCredentials([
                        usernamePassword(
                                credentialsId: 'ossrh-staging-api.central.sonatype.com',
                                usernameVariable: 'OSSHR_USER',
                                passwordVariable: 'OSSHR_TOKEN'
                        ),
                        usernamePassword(
                                credentialsId: 'gerrit.googlesource.com',
                                usernameVariable: 'GS_GIT_USER',
                                passwordVariable: 'GS_GIT_PASS'
                        ),
                        string(credentialsId: 'gpg-key',     variable: 'GPG_KEY'),
                ]) {
                    sh "gerrit-release.sh ${params.BRANCH} ${params.VERSION} ${params.NEXT_VERSION} ${params.MIGRATION_VERSION}"
                }
            }
        }

        stage('Confirm and push tag') {
            steps {
                dir('gerrit') {
                    script {
                        timeout(time: 5, unit: 'HOURS') {
                            input message: "Push tag v${params.VERSION} to origin (including submodules)?", ok: 'Yes, push'
                        }
                        sh '''
                            TAG="v${VERSION}"
                            echo "Pushing ${TAG} to origin..."
                            git push origin "${TAG}"
                            echo "Pushing ${TAG} to submodules (ignore failures)..."
                            git submodule foreach bash -c 'git push origin '"${TAG}"' || true'
                        '''
                    }
                }
            }
        }
    }
}
