gradle 异常- GitHub工作流用于KotlinSpring Boot 项目w/ mysql数据库测试

lztngnrs  于 2022-11-30  发布在  Git
关注(0)|答案(1)|浏览(123)

我尝试在GitHub Actions中创建一个工作流,在我的Spring Boot 项目中运行我的集成测试,该项目用Kotlin编写,使用gradle打包,并使用mysql数据库。当到达构建和测试步骤时,我不断收到此错误,对于每个测试,运行./gradlew clean build

Caused by: java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:98
            Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1804
                Caused by: javax.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421
                    Caused by: org.hibernate.exception.JDBCConnectionException at SQLStateConversionDelegate.java:112
                        Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException at SQLError.java:174
                            Caused by: com.mysql.cj.exceptions.CJCommunicationsException at NativeConstructorAccessorImpl.java:-2
                                Caused by: java.net.ConnectException at PlainSocketImpl.java:-2

下面是我的gradle.yml

name: CI with Gradle

on: [push]

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest
    container: openjdk:11
    services:
      mysql:
        image: mysql:latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build & Test with Gradle
      uses: gradle/gradle-build-action@v2
      with:
          arguments: build

下面是我的application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/wct?useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=pw
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=mysql

server.port=8081

下面是我所有失败的JUnit测试之一的示例:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
internal class CustomerControllerTests(
    @Autowired val context: WebApplicationContext,
    @Autowired val mapper: ObjectMapper,
    @Autowired val customerRepository: CustomerRepository,
) {

    private val mvc: MockMvc = (MockMvcBuilders.webAppContextSetup(context).apply<DefaultMockMvcBuilder>(
        SecurityMockMvcConfigurers.springSecurity()).build())

    @Test
    fun `GET customers should return an empty list of customers and 200 OK if one of the required roles is provided`() {
        val response = mvc.perform(
            MockMvcRequestBuilders.get("/customers")
                .contentType(MediaType.APPLICATION_JSON)
        ).andExpect(MockMvcResultMatchers.status().isOk).andReturn().response

       response.contentLength shouldBe 0

    }
}

我在这里做错了什么/错过了什么?

5lhxktic

5lhxktic1#

我发现您的设置中至少存在四个问题:

1.数据源URL不正确

您使用localhost:3306作为连接url(spring.datasource.url)中的<hostname>:<port>,但根据GitHub操作文档:
当您在容器中运行作业时,GitHub会使用Docker的用户定义桥接网络将服务容器连接到作业。
在容器中运行作业和服务可简化网络访问。您可以使用在工作流中配置的标签访问服务容器。服务容器的主机名会自动Map到标签名称。
因此,在您的情况下,测试的url属性应该如下所示:

spring.datasource.url=jdbc:mysql://mysql:3306/wct?useSSL=true&serverTimezone=UTC
2.缺少MySql根密码

根据MySql Official Docker image page和GitHub Actions MySql设置的众多示例,您必须指定至少一个强制性env变量,即MYSQL_ROOT_PASSWORD
此变量是必需的,它指定将为MySQL root超级用户帐户设置的密码。
在您的情况下,将如下所示(在mysql服务的env块中):

MYSQL_ROOT_PASSWORD: pw
3.未创建请求的数据库

从连接字符串中可以看到,您正在尝试连接到wct数据库,但我没有看到该数据库正在您的配置中创建。要做到这一点,您必须根据MySql Official Docker image page使用MYSQL_DATABASE env变量。在env块中,它将如下所示:

MYSQL_DATABASE: wct
4.在MySql启动之前不等待它

根据官方的GitHub Actions Postgres示例,你最好等到你的MySql示例准备好为请求提供服务。

services:
      mysql:
        options: >-
          --health-cmd mysqladmin ping
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

因此,假设您在测试中使用root用户(根据您的代码),您的最终“gradle.yml“mysql部分将如下所示:

services:
      mysql:
        image: mysql:latest
        env:
          MYSQL_DATABASE: wct
          MYSQL_ROOT_PASSWORD: pw
        options: >-
          --health-cmd mysqladmin ping
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

不要忘记修复上面第一个“不正确的数据源URL”问题中概述的spring.datasource.url
同时,我相信它必须涵盖所有问题,或者至少是你配置中的主要问题。但是如果一些小的配置错误没有包含在这个答案中,我不会不感到惊讶。你可以让我知道它的进展。

相关问题