Выполнение модульных тестов maven в среде Google Cloud SQL - PullRequest
0 голосов
/ 04 марта 2019

У меня в модуле Kubernetes Engine GCP работает модуль Jenkins, и я пытаюсь запустить модульный тест maven, который подключается к облачной базе данных Google google для выполнения указанного теста.Мой application.yaml для моего проекта выглядит следующим образом:

spring:
  cloud:
     gcp:
        project-id: <my_project_id>
     sql: 
        database-name: <my_database_name>
        instance-connection-name: <my_instance_connection_name>

  jpa:
     database-platform: org.hibernate.dialect.MySQL55Dialect
     hibernate:
        ddl-auto: create-drop

  datasource:
     continue-on-error: true
     driver-class-name: com.mysql.cj.jdbc.Driver
     username: <my_cloud_sql_username>
     password: <my_cloud_sql_password>

Текущий Jenkinsfile, связанный с этим проектом:

Jenkinsfile:

pipeline {
   agent any

   tools{
      maven 'Maven 3.5.2'
      jdk 'jdk8'
   }
   environment {
       IMAGE = readMavenPom().getArtifactId()
       VERSION = readMavenPom().getVersion()
       DEV_DB_USER = "${env.DEV_DB_USER}"
       DEV_DB_PASSWORD = "${env.DEV_DB_PASSWORD}"
    }

   stages {
      stage('Build docker image') {
        steps {
            sh 'mvn -Dmaven.test.skip=true clean package'
            script{
               docker.build '$IMAGE:$VERSION'
            }

        }
    }
       stage('Run unit tests') {

          steps {
            withEnv(['GCLOUD_PATH=/var/jenkins_home/google-cloud-sdk/bin']) {
                withCredentials([file(credentialsId: 'key-sa', variable: 'GC_KEY')]) {
                   sh("gcloud auth activate-service-account --key-file=${GC_KEY}")
                   sh("gcloud container clusters get-credentials <cluster_name> --zone northamerica-northeast1-a --project <project_id>")
                   sh 'mvn test'
                }
             }          
           }                
        }
    }
}

}

Моя проблема заключается в том, что конвейер фактически пытается запустить тест mvn с использованием вышеуказанной конфигурации (в моем application.yaml). Я получаю эту ошибку:

  Caused by: 
  com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 
  Forbidden
  {
     "code" : 403,
     "errors" : [ {
        "domain" : "global",
        "message" : "Insufficient Permission: Request had insufficient authentication scopes.",
        "reason" : "insufficientPermissions"
      } ],
     "message" : "Insufficient Permission: Request had insufficient authentication scopes."
  }

У меня есть два проекта Google Cloud:

  • Один с кластером Kubernetes, где работает модуль Дженкинса.

  • Другойпроект, в котором кластер K8s содержит мое реальное загрузочное приложение Spring и базу данных Cloud SQL, к которой я пытаюсь получить доступ.

Я также создал служебную учетную запись только в моем Spring Boot Project для Jenkins для использования с тремя ролями: Cloud SQL Editor, Kubernetes Engine Cluster Admin и владельцем проекта (чтобы убедиться, что учетная запись службыне виноват).

Я включил API-интерфейсы Cloud SQL, Cloud SQL и API Kubernetes в обоих проектах и ​​дважды проверил свои учетные данные Cloud SQL, и они в порядке.Кроме того, я аутентифицировал конвейер Jenkins, используя файл json, сгенерированный при создании учетной записи службы, следуя рекомендациям, которые обсуждались здесь :

Jenkinsfile (extract):

  ...
  withCredentials([file(credentialsId: 'key-sa', variable: 'GC_KEY')]) {
               sh("gcloud auth activate-service-account --key-file=${GC_KEY}")
               sh("gcloud container clusters get-credentials <cluster_name> --zone northamerica-northeast1-a --project <project_id>")
               sh 'mvn test'
   }
   ...

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Есть несколько вещей, которые вы должны проверить, чтобы это заработало.Я предполагаю, что вы используете Cloud SQL JDBC SocketFactory для Cloud SQL .

  1. Вам необходимо создать тестовую учетную запись службы и предоставить ей все необходимые разрешения для выполнения тестов.Для подключения к Cloud SQL требуется как минимум роль «Cloud SQL Client» для того же проекта, что и экземпляр Cloud SQL.
  2. Cloud SQL SF использует приложение Учетные данные по умолчанию (ADC) стратегия для определения того, какую аутентификацию использовать.Это означает, что первое место, где он ищет учетные данные, - это GOOGLE_APPLICATION_CREDENTIALS env var, который должен быть путем к ключу для учетной записи службы тестирования.
0 голосов
/ 05 марта 2019

Я не верю, что GCP Java SDK вообще использует gcloud CLI.Вместо этого он ищет переменную среды GOOGLE_APPLICATION_CREDENTIALS, которая указывает на файл ключа вашей учетной записи службы и GCLOUD_PROJECT (см. https://cloud.google.com/docs/authentication/getting-started).

Попробуйте добавить следующее:

sh("export GOOGLE_APPLICATION_CREDENTIALS=${GC_KEY}")
sh("export GCLOUD_PROJECT=<project_id>")
...