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
相关产品推荐
相关产品推荐

