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

Testcontainers失效时,如何在GitHub Actions Windows 2019代理启动ActiveMQ?

问题背景

Testcontainers在Windows 2019环境下无法正常工作,会抛出以下异常:

java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration
    at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:256)
    at java.base/java.util.Optional.orElseThrow(Optional.java:403)
    at org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:247)

需求是在GitHub Actions的windows-2019运行器上,启动JMS代理镜像symptoma/activemq:5.16.2,并让服务在系统的tcp://localhost:12345端口可用。

替代解决方案

GitHub Actions的windows-2019运行器默认预装了Docker,因此可以直接使用Docker命令手动启动容器,绕过Testcontainers的环境检测问题。具体操作如下:

1. 编写GitHub Actions工作流配置

在项目的.github/workflows目录下创建或修改工作流文件(比如test.yml),添加启动ActiveMQ容器的步骤:

jobs:
  run-tests:
    runs-on: windows-2019
    steps:
      # 检出代码(根据项目实际情况调整)
      - name: 检出代码
        uses: actions/checkout@v4

      # 可选:切换Docker到Linux容器模式(若运行Linux镜像出现问题时启用)
      - name: 切换Docker至Linux容器模式
        run: |
          & 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchLinuxEngine
          Start-Sleep -Seconds 10
        shell: pwsh

      # 启动ActiveMQ容器,映射端口12345到容器内默认TCP端口61616
      - name: 启动ActiveMQ容器
        run: |
          docker run -d -p 12345:61616 --name activemq symptoma/activemq:5.16.2
        shell: pwsh

      # 等待ActiveMQ完全启动,避免测试连接失败
      - name: 等待ActiveMQ启动完成
        run: |
          $timeout = 60
          $startTime = Get-Date
          do {
            # 检查端口是否开放
            $portOpen = Test-NetConnection localhost -Port 12345 -InformationLevel Quiet
            if ($portOpen) { break }
            Start-Sleep -Seconds 5
          } while ((Get-Date) -lt $startTime.AddSeconds($timeout))

          if (-not $portOpen) {
            Write-Error "ActiveMQ启动超时,端口12345未开放"
            exit 1
          }
        shell: pwsh

      # 运行测试(示例为Maven测试,根据项目构建工具调整)
      - name: 执行测试用例
        run: ./mvnw test
        shell: pwsh

2. 关键配置说明

  • 端口映射:-p 12345:61616将主机的12345端口绑定到容器内ActiveMQ的默认TCP通信端口61616,确保测试代码可以通过tcp://localhost:12345连接服务。
  • 启动等待逻辑:容器启动需要时间,直接执行测试可能出现连接失败,因此通过循环检查端口状态,等待服务完全就绪后再运行测试。也可以改为检查Docker日志中的启动完成标识(比如匹配Apache ActiveMQ 5.16.2 started字符串),替换等待步骤的代码:
    $timeout = 60
    $startTime = Get-Date
    do {
      $log = docker logs activemq
      if ($log -match "Apache ActiveMQ 5.16.2 started") { break }
      Start-Sleep -Seconds 5
    } while ((Get-Date) -lt $startTime.AddSeconds($timeout))
    
  • 容器模式切换:若运行Linux镜像出现兼容性问题,启用切换Docker至Linux容器模式步骤,确保Docker运行在Linux容器模式下。

3. 验证

提交工作流配置到GitHub后,触发Actions运行,查看步骤日志确认ActiveMQ容器正常启动,测试用例可以成功连接tcp://localhost:12345。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:13:59