Sql server 如何让MSSQL服务容器在Azure DevOps管道中工作? 描述

Sql server 如何让MSSQL服务容器在Azure DevOps管道中工作? 描述,sql-server,docker,azure-devops,automated-tests,azure-pipelines,Sql Server,Docker,Azure Devops,Automated Tests,Azure Pipelines,我正在azure devops管道中试用用于集成数据库测试的服务容器 根据这个开源虚拟ci cd管道项目。我在用azure devops进行集成管道测试。我有postgress和mysql来工作。我对microsoft sql server有问题 yml文件 resources: containers: - container: mssql image: mcr.microsoft.com/mssql/server:2017-latest ports: #

我正在azure devops管道中试用用于集成数据库测试的服务容器

根据这个开源虚拟ci cd管道项目。我在用azure devops进行集成管道测试。我有postgress和mysql来工作。我对microsoft 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”
    “第11页”:{
    }
    
    • 而mssql无法打印id
    ===========================================开始命令输出===========================
    /bin/bash--noprofile--norc/home/vsts/work/_temp/70ae8517-5199-487f-9067-aee67f8437bb.sh
    }
    }
    
    • 更新使用ubuntu最新版本时不会发生这种情况,但仍然存在mssql连接问题
  • 数据库错误日志记录

    • 我目前正在处理此错误
    错误消息:
    sqlserver失败
    providername:Microsoft.EntityFrameworkCore.SqlServer m:建立到SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。(提供程序:TCP提供程序,错误:40-无法打开到SQL Server的连接)
    
    • 在TestDbContext.cs中,我的错误消息如下。如果人们有获得更多细节的指针,将不胜感激
    catch(系统异常e)
    {
    var assertMsg=“对于“+ConnectionString.Provider+”\n“+”providername:“+dbContext.Database.providername+”m:”失败;
    如果(例如,InnerException!=null)
    assertMsg+=e.InnerException.Message;
    其他的
    assertMsg+=e.消息;
    _exceptionMessage=assertMsg;
    }
    
  • 示例管道: 笔记
    • 我已经知道azure devops管道mssql服务器在windows代理b/c中不起作用,它们是windows server 2019,mssql服务器的windows容器版本不受良好支持,仅适用于windows server 2016。当我这样做时,初始化容器步骤失败

    • 我尝试了几件关于单元测试的事情,改变ubuntu版本,改变参数,改变mssql服务器版本,都给出了相同的错误

    • 如果人们知道在linux中使用命令行方法来测试mssql docker实例是否准备就绪,这可能也会有所帮助

    进度更新
    • 到目前为止,已在github操作中使用mssqlgitlab管道
    • postgresmysqlazure devopsbitbucket管道上运行良好
    • azure devops上使用mssql仍然不走运。虽然bitbucket提供了很多运行数据库的docker详细信息,但也没有人真正关心bitbucket管道的50分钟。您可以在引用的存储库中看到所有这些管道,它们都是公共的,拉取请求也是可能的,因为它是开源的
    请参阅中的帮助。看起来需要10秒的延迟来等待容器准备就绪

    添加

      - task: PowerShell@2
        displayName: 'delay 10'
        inputs:
          targetType: 'inline'
          script: |
            # Write your PowerShell commands here.
            
            start-sleep -s 10
    

    获取要工作的数据库连接。我假设mssql docker容器到那时可能已经准备好了。

    我在过去几天里遇到了这个问题,并在您的帖子中找到了它。我也有同样的行为,然后有些事情发生了

    重要提示:如果在Windows上使用PowerShell运行这些命令,请使用双引号而不是单引号

    那张便条是我的

    我相信从

    选项:-e'ACCEPT_EULA=Y'-e'SA_PASSWORD=yourlstrong(!)PASSWORD'-e'MSSQL\u PID=Express'

    选项:-e“ACCEPT_EULA=Y”-e“SA_PASSWORD=yourlstrong(!)PASSWORD”-e“MSSQL_PID=Express”

    应该让它工作起来。我认为这也很有趣,在你上面发布的链接中,密码作为自己的一行传递进来,这可能解决了这个问题,不一定是10秒的延迟。(下面的例子)


    vmImage:'ubuntu-16.04'
    更改为
    vmImage:'ubuntu-latest'
    ,它将成功地在我的一侧打印ID。也许ubuntu-16.04有点旧。检查后,你是对的,这只是我调试的一个步骤。我已经添加了更多的细节,即使是在ubuntu最新版本中,我仍然得到一个sql连接错误。这与开发操作管道的所有实例无关,因为他们在linux机器上使用docker VM,所以powershell甚至没有使用。实际上,你不能在azure devops windows容器b/c中运行数据库docker。它们实际上不受支持(我认为它实际上是windows容器,而不是docker)。好吧,我无法使用单引号使其工作,但一旦我切换到双引号,它就开始工作了。也不需要10秒的延迟。这是在哪种环境下?github、azure devops、gitlab?azure devops管道
    - container: mssql
      image: mcr.microsoft.com/mssql/server:2017-latest
      env:
        ACCEPT_EULA: Y
        SA_PASSWORD: Password123
        MSSQL_PID: Express