sql-server - 如何让 MSSQL 服务容器在 Azure DevOps 管道中工作?

标签 sql-server docker azure-devops automated-tests azure-pipelines

描述
我正在试用 服务容器集成数据库测试在 azure devops 管道中。
根据这个开源的虚拟 ci cd 管道项目 https://dev.azure.com/funktechno/_git/dotnet%20ci%20pipelines .我正在试验 azure devops service containers用于集成管道测试。我让 postgress 和 mysql 工作。我在使用 时遇到问题微软 SQL Server .
.yml 文件

resources:
  containers:
  - container: mssql
    image: mcr.microsoft.com/mssql/server:2017-latest
    ports: 
      # - 1433
      - 1433:1433
    options: -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -e 'MSSQL_PID=Express'

- job: unit_test_db_mssql
  # condition: eq('${{ variables.runDbTests }}', 'true')
  # continueOnError: true
  pool:
    vmImage: 'ubuntu-latest'
  services:
    localhostsqlserver: mssql
  steps:
    - task: UseDotNet@2
      displayName: 'Use .NET Core sdk 2.2'
      inputs:
        packageType: sdk
        version: 2.2.207
        installationPath: $(Agent.ToolsDirectory)/dotnet
    - task: NuGetToolInstaller@1
    - task: NuGetCommand@2
      inputs:
        restoreSolution: '$(solution)'
    - task: Bash@3
      inputs:
        targetType: 'inline'
        script: 'env | sort'

        #  echo Write your commands here...
        #   echo ${{agent.services.localhostsqlserver.ports.1433}}
        #   echo Write your commands here end...
    - task: CmdLine@2
      displayName: 'enabledb'
      inputs:
        script: |
          cp ./MyProject.Repository.Test/Data/appSettings.devops.mssql.json ./MyProject.Repository.Test/Data/AppSettings.json
    - task: DotNetCoreCLI@2
      inputs:
        command: 'test'
        workingDirectory: MyProject.Repository.Test
        arguments: '--collect:"XPlat Code Coverage"'

    - task: PublishCodeCoverageResults@1
      inputs:
        codeCoverageTool: 'Cobertura'
        summaryFileLocation: '$(Agent.TempDirectory)\**\coverage.cobertura.xml'
数据库连接字符串
{
    "sqlserver": {
        "ConnectionStrings": {
            "Provider": "sqlserver",
            "DefaultConnection": "User ID=sa;Password=yourStrong(!)Password;Server=localhost;Database=mockDb;Pooling=true;"
        }
    }
}
调试
  • 我能说的最多的是,当我运行 Bash@3 来检查环境变量 postgres 和 mysql 打印类似于
    /bin/bash --noprofile --norc /home/vsts/work/_temp/b9ec7d77-4bc2-47ab-b767-6a5e95ec3ea6.sh
        "id": "b294d39b9cc1f0d337bdbf92fb2a95f0197e6ef78ce28e9d5ad6521496713708"
      "pg11": {
      }
    
  • 而 mssql 无法打印 ID

  • ========================== Starting Command Output ===========================
    /bin/bash --noprofile --norc /home/vsts/work/_temp/70ae8517-5199-487f-9067-aee67f8437bb.sh
      }
    }
    
  • 更新 使用 ubuntu-latest 时不会发生这种情况,但仍然存在 mssql 连接问题

  • 数据库错误日志记录。
  • 我目前在管道中收到此错误

  • Error Message:
      Failed for sqlserver
        providername:Microsoft.EntityFrameworkCore.SqlServer m:A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server)
    
  • 在 TestDbContext.cs 中,我的错误消息是这样的。如果人们有获取更多详细信息的指针,将不胜感激。

  • catch (System.Exception e)
       {
                    var assertMsg = "Failed for " + connectionStrings.Provider + "\n" + " providername:" + dbContext.Database.ProviderName + " m:";
                    if (e.InnerException != null)
                        assertMsg += e.InnerException.Message;
                    else
                        assertMsg += e.Message;
                    _exceptionMessage = assertMsg;
        }
    

    示例管道:https://dev.azure.com/funktechno/dotnet%20ci%20pipelines/_build/results?buildId=73&view=logs&j=ce03965c-7621-5e79-6882-94ddf3daf982&t=a73693a5-1de9-5e3d-a243-942c60ab4775
    笔记
  • 我已经知道 azure devops 管道 mssql 服务器在 windows 代理 b/c 中不起作用,它们是 windows server 2019,并且 mssql server 的 windows 容器版本没有得到很好的支持,仅适用于 windows server 2016。它在初始化时失败当我这样做时,容器步骤。
  • 我为 unit_test_db_mssql 尝试了几件事,更改 ubuntu 版本,更改参数,更改 mssql 服务器版本,都给出了相同的错误。
  • 如果人们知道在 linux 中工作的命令行方法来测试 mssql docker 实例是否准备好,这也可能有所帮助。

  • 进度更新
  • 得到 mssql 工作github 操作 gitlab 管道 迄今为止。
  • postgres mysql 上工作正常azure devops bitbucket 管道 .
  • 仍然没有运气获得 mssql 正在处理 azure devops .bitbucket 不能很好地工作,尽管它确实提供了正在运行的数据库的许多 docker 详细信息,但是再一次没有人真正关心 bitbucket 管道,因为它们只有 50 分钟。您可以在引用的存储库中看到所有这些管道,它们都是公开的,拉取请求也是可能的,因为它是开源的。
  • 最佳答案

    根据来自 Starain Chen [MSFT] 的帮助在 https://developercommunity.visualstudio.com/content/problem/1159426/working-examples-using-service-container-of-sql-se.html .看起来需要 10 秒的延迟才能等待容器准备就绪。
    添加

      - task: PowerShell@2
        displayName: 'delay 10'
        inputs:
          targetType: 'inline'
          script: |
            # Write your PowerShell commands here.
            
            start-sleep -s 10
    
    获取数据库连接工作。我假设到那时 mssql docker 容器可能已经准备好了。

    关于sql-server - 如何让 MSSQL 服务容器在 Azure DevOps 管道中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63538477/

    相关文章:

    sql - 如果 Varchar 超过 999,则算术溢出错误,为什么?

    sql-server - 为什么整数变量不能按顺序用作START WITH的值

    node.js - macos 上用于 sails js 开发的 Docker 图像挂起

    azure - 在 Azure DevOps 项目中 Repos 未显示

    c# - SonarQube:无法为带有 <X 行的文件的文件的 X 行创建度量

    azure-devops - 为什么没有从上游源下载特定版本的 npm 包?

    sql-server - 而不是SQL Server中的触发器丢失SCOPE_IDENTITY?

    sql-server - 具有 UNIQUE 索引的列中存在多个 NULL 值

    docker - Docker卷是分区还是子目录?

    sql-server - 从 Docker 容器中连接到 SQL Server Express 时在评估密码时出现错误