You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Github Action测试中无法连接MSSQL数据库问题求助

GitHub Action中Spring Boot连接MSSQL测试失败的解决方法

问题背景

我有一个基于MSSQL数据库的Spring Boot应用,希望通过GitHub Action在拉取请求(pull request)及合并到master分支时运行测试,但测试过程中遇到无法连接数据库的问题。应用采用YAML配置,且为CI测试单独配置了文件。

工作流配置

name: Java CI with Maven

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  build:
    runs-on: ubuntu-latest
    services: 
      mssql:
        image: mcr.microsoft.com/mssql/server:2019-latest
        env:
          SA_PASSWORD: myPassword
          ACCEPT_EULA: 'Y'
          DBNAME: test
        ports:
        - 1433:1433
    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        cache: maven
    - name: Build with Maven
      run: mvn -ntp -U clean test -P junit-ci

junit-ci配置文件

spring:
  datasource:
    driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://mssql:1433;database=test;
    username: sa
    password: myPassword

报错信息

[main] ERROR com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Exception during pool initialization.
com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host mssql, port 1433 has failed. Error: "mssql. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:234)
    at com.microsoft.sqlserver.jdbc.SQLServerException.ConvertConnectExceptionToSQLServerException(SQLServerException.java:285)
    at com.microsoft.sqlserver.jdbc.SocketFinder.findSocket(IOBuffer.java:2434)

解决方案

1. 等待MSSQL服务完全启动

MSSQL容器启动需要时间,直接执行测试会因数据库未就绪导致连接失败。添加等待步骤,确保端口开放后再运行测试:

- name: Install netcat
  run: sudo apt-get update && sudo apt-get install -y netcat

- name: Wait for MSSQL to be ready
  run: |
    until nc -z mssql 1433; do
      echo "Waiting for MSSQL service..."
      sleep 5
    done

将上述步骤插入到Set up JDK 11和Build with Maven之间。

2. 使用符合复杂度要求的SA密码

MSSQL默认要求SA密码满足复杂度规则(至少8字符,包含大小写字母、数字、特殊字符),myPassword不符合要求会导致服务启动失败。修改密码为符合规则的字符串,比如MyPassw0rd!,同时更新工作流环境变量和junit-ci配置中的密码。

3. 手动创建测试数据库

MSSQL官方镜像不支持DBNAME环境变量自动创建数据库,需要手动初始化:

- name: Create test database
  run: |
    docker exec -i ${{ job.services.mssql.id }} /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P MyPassw0rd! -Q "CREATE DATABASE test;"

将此步骤放在等待MSSQL就绪之后,测试之前。

4. 验证连接URL的正确性

确保连接URL中的主机名mssql与工作流中定义的服务名一致,也可以尝试使用localhost(因为端口已映射到主机):

url: jdbc:sqlserver://localhost:1433;database=test;

内容的提问来源于stack exchange,提问作者Bonjean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:15:42