在Google云SQL环境上执行maven单元测试

在Google云SQL环境上执行maven单元测试,maven,unit-testing,jenkins,kubernetes,google-cloud-sql,Maven,Unit Testing,Jenkins,Kubernetes,Google Cloud Sql,我在GCP的Kubernetes引擎中运行了一个Jenkins吊舱,我正在尝试运行一个maven单元测试,该测试连接到一个google cloud SQL数据库来执行上述测试。我的项目的应用程序.yaml如下所示: spring: cloud: gcp: project-id: <my_project_id> sql: database-name: <my_database_name> instan

我在GCP的Kubernetes引擎中运行了一个Jenkins吊舱,我正在尝试运行一个maven单元测试,该测试连接到一个google cloud SQL数据库来执行上述测试。我的项目的应用程序.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>
我有两个谷歌云项目:

  • 一个有Kubernetes星团的星团,Jenkins吊舱在那里运行

  • 另一个项目中,K8s集群包含我实际的Spring Boot应用程序和我试图访问的云SQL数据库

我还仅在Spring Boot项目中为Jenkins创建了服务帐户,用于三个角色:云SQL编辑器、Kubernetes引擎集群管理员和项目所有者(以验证服务帐户是否存在错误)

我在这两个项目中都启用了Cloud SQL、Cloud SQL admin和Kubernetes API,并且我仔细检查了我的Cloud SQL凭据,它们都正常。此外,我使用创建服务帐户时生成的json文件对Jenkins管道进行了身份验证,如下所述:

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'
                }
             }          
           }                
        }
    }
}
  ...
  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'
   }
   ...
。。。
withCredentials([文件(credentialId:'key sa',变量:'GC_key')){
sh(“gcloud auth activate service account--key file=${GC_key}”)
sh(“gcloud容器集群获取凭据--zone northamerica-northeast1-a--项目”)
sh‘mvn测试’
}
...

我认为GCP Java SDK根本不依赖gcloud CLI。相反,它会查找一个环境变量GOOGLE\u APPLICATION\u CREDENTIALS,该变量指向您的服务帐户密钥文件和GCLOUD\u项目(请参阅)

尝试添加以下内容:

sh("export GOOGLE_APPLICATION_CREDENTIALS=${GC_KEY}")
sh("export GCLOUD_PROJECT=<project_id>")
sh(“导出GOOGLE\u应用程序\u凭据=${GC\u KEY}”)
sh(“导出GCLOUD_项目=”)

我认为GCP Java SDK根本不依赖gcloud CLI。相反,它会查找一个环境变量GOOGLE\u APPLICATION\u CREDENTIALS,该变量指向您的服务帐户密钥文件和GCLOUD\u项目(请参阅)

尝试添加以下内容:

sh("export GOOGLE_APPLICATION_CREDENTIALS=${GC_KEY}")
sh("export GCLOUD_PROJECT=<project_id>")
sh(“导出GOOGLE\u应用程序\u凭据=${GC\u KEY}”)
sh(“导出GCLOUD_项目=”)

要使其正常工作,您需要验证两种不同的方法。我假设你正在使用

  • 您应该创建一个测试,并授予它执行测试所需的任何权限。要连接到云SQL,与云SQL实例相同的项目至少需要“云SQL客户端”角色。
  • 云SQL SF使用(ADC)策略来确定要使用的身份验证。这意味着它查找凭证的第一个位置是
    GOOGLE\u应用程序\u凭证
    env var,它应该是指向测试服务帐户密钥的路径
    要让它正常工作,您需要验证两种不同的方法。我假设你正在使用

  • 您应该创建一个测试,并授予它执行测试所需的任何权限。要连接到云SQL,与云SQL实例相同的项目至少需要“云SQL客户端”角色。
  • 云SQL SF使用(ADC)策略来确定要使用的身份验证。这意味着它查找凭证的第一个位置是
    GOOGLE\u应用程序\u凭证
    env var,它应该是指向测试服务帐户密钥的路径
    谢谢你的帮助。我试图导出凭证json文件路径,如链接所示。为此,我将Json文件放在我的kubernetes吊舱中。不过,在mvn测试之前,我仍然有相同的403错误,请尝试添加
    sh(“gcloud auth login”)
    没关系,这对Jenkins不起作用,因为它希望启动浏览器。您只能使用gcloud auth login在本地测试这不是服务帐户问题。感谢您的帮助。我试图导出凭证json文件路径,如链接所示。为此,我将Json文件放在我的kubernetes吊舱中。不过,在mvn测试之前,我仍然有相同的403错误,请尝试添加
    sh(“gcloud auth login”)
    没关系,这对Jenkins不起作用,因为它希望启动浏览器。您只能使用gcloud auth login在本地测试这不是服务帐户问题。