2017-01-12 30 views
3

我们正在TFS Online上运行我们的构建和测试过程。这工作正常,直到我们尝试连接到外部服务。在我们的例子中是SQL数据库。
关于我们应该嘲笑什么的讨论在这种情况下并不真正有用,因为目前我们需要这样做。连接到Visual Studio Online构建/测试任务中的外部服务

我们也尝试只是一个简单的ping,但即使不说是失控:

Test-Connection "172.217.18.100" #resolves to www.google.com 

Testing connection to computer '172.217.18.100' failed: Error due to lack of resources 

所以我们的印象中,最外面IP的/端口/等。可以锁定? 有没有办法打开它?如果是,如何?

我无法想象我们是第一个尝试这样的事情吗?从网站下载东西,制作REST等等?应该有可能,不是吗?

更新1:
我们有一些关于这个问题here更详细的问题,但想通这是一个比较通用的问题。

当我们连接到SQL Azure中的错误信息是

System.Data.SqlClient.SqlException: 
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: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)` 

但命名管道提供商部分missleading。如果您尝试连接到不存在的IP,您也会在本地收到此消息。

我们从C#NUnit测试中访问Azure SQL。

更新2:
我们尝试了从@ starain-MSFT的想法,并安装了SQL Azure中执行查询的步骤/任务。安装工作正常,但它似乎错过了一个组件。见下图。

没有代理可以与以下功能中找到:azureps, SQLPS,NPM,Node.js的,MSBuild的,VisualStudio的,vstest

基于installed apps名单上我以为这是azureps。

enter image description here

解决方案(部分):
好了,所以我们去了错误的路线一路。问题不在于防火墙(或者任何防火墙)。问题在于我们的app.config文件中没有正确的设置。
我们在单元测试中的App.config文件与我们的Web.config文件具有相同的设置。每个都有一个App.Debug.config和一个App.Release.config文件。虽然这对Web应用程序来说工作得很好,但这显然不适用于我们的单元测试。
我们仍然在这里寻找一个好的解决方案。 我发现this solution on how to add a transform task inside Visual Studio,但这并不完全是我们正在搜索的内容,因为我们不需要本地变换,但只能在Visual Studio团队中进行。

app。config在Visual Studio团队内转换
所以,我想我们终于明白了。通过ConfigTransform,我们现在可以在构建过程中转换我们的app.config文件。

enter image description here

+0

什么是ConnectionString?尝试通过SQL Server Management Studio进行连接并检查结果。 –

+0

是的,这是有效的。我们可以连接到SQL Server,否则没有任何问题。只是看起来,所有与外部的连接都被阻止在构建过程中。就像我说的那样。 – Remy

+0

如何配置Azure SQL Server可以从任何IP地址访问?关于防火墙规则,您可以添加Azure SQL执行查询步骤/任务,可以将规则添加构建代理IP地址,因此您可以在执行NUnit测试之前添加此步骤以执行简单脚本以将规则代理添加到构建代理IP(取消选中删除规则任务结束后)https://marketplace.visualstudio.com/items?itemName=geeklearningio.gl-vsts-tasks-azure&targetId=694f8310-2406-4022-b85e-97dd9106a4e9 –

回答

1

托管的Windows生成代理不会阻止出境1433。

  1. 如果要通过托管构建代理连接到SQL Azure,请确保已在SQL Azure防火墙设置中启用“允许访问Azure服务”。您不需要手动运行脚本。

SQL Azure Firewall settings

  • 确保您单元测试过程中使用正确的连接字符串。例如。在MSTest中,您需要将连接字符串添加到您的UnitTest项目的App.config中。
  • <connectionStrings> 
        <add name ="TestContext" providerName="System.Data.SqlClient" 
        connectionString="Server=tcp:[ServerName].database.windows.net,1433;Initial Catalog=[DB Name];Persist Security Info=False;User ID=[User];Password=[Password];MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"/> 
    </connectionStrings> 
    

    就是这样。我只用EF,SQL Azure &做了一个快速测试,VSTS托管代理和它的工作。

    +0

    干杯汤姆!非常尴尬。问题确实不是防火墙。问题在于我们的app.config文件没有经过web.config文件发布的转换。现在的问题是在你的TFS服务器上具有不同于本地的app.config文件的常见方法是什么?我看到有多篇文章介绍如何在VS中本地包含这种转换,但我们实际上并不想运行它来进行本地调试运行。只在VS Online上。 – Remy

    +0

    我们是否说不需要特定的防火墙规则?这是否意味着任何VSTS主机都可以访问Azure SQL服务器?还是仅对于已经关联到该VSTS实例的Azure实例? – Kevin

    0

    我假设你使用的是托管代理,这意味着该机许多VSTS账户(租户)之间共享资源和管理(并锁定)下降了微软。

    您可以轻松地在您自己的虚拟机上安装代理并在该处运行构建。虚拟机可以位于云中,也可以在您的选择中。你交易简单和廉价的完全控制。

    更新: 托管代理允许涵盖很多理由的HTTP(S)调用。虽然有用,但我不认为它解决了连接到SQL数据库的原始问题。

    +0

    没错,那将是一个选项。但是,如果围绕锁定有一个解决方法,宁愿不要这样做。 – Remy

    +0

    现在我们假设在构建代理上关闭了端口1433。但ps脚本不让我们改变任何东西。 – Remy

    2

    使用托管代理,SQL Server需要通过Internet访问才能从托管代理连接到SQL Server。

    处理这个问题的方法:

    1. 正如朱利奥说,建立一个内部部署生成代理,那么你只需要确保SQL Server实例可以从生成代理访问(可以是内联网)。
    2. 在互联网上应用SQL Server,例如可从互联网访问的Azure SQL Server。
    3. 配置您的SQL Server和网络,让您的SQL Server可以通过互联网访问。

    顺便说一句,关于您的简单的ping测试,该IP地址用于其网站和端口是80,您可以访问其他资源与该IP。您可以在服务器上打开另一个端口,并通过带端口的IP访问资源。

    更新1:

    参考这种方式来补充Azure的SQL Server防火墙规则:

    1. 检查允许脚本访问OAuth令牌选项(构建定义的选项)
    2. 添加Azure中的PowerShell构建(参数:-RestAddress https://[your vsts帐户] .vsdtl.visualstudio.com/DefaultCollection/_apis/vslabs/ipaddress -Token $(System.AccessToken)-RG [资源组] -Server [服务器名称(不带.database .windows.net)]

    脚本:

    param (
        [string]$RestAddress, 
        [string]$Token, 
        [string]$RG, 
        [string]$Server 
        ) 
    $basicAuth = ("{0}:{1}" -f 'test',$Token) 
    $basicAuth = [System.Text.Encoding]::UTF8.GetBytes($basicAuth) 
    $basicAuth = [System.Convert]::ToBase64String($basicAuth) 
    $headers = @{Authorization=("Basic {0}" -f $basicAuth)} 
    $result = Invoke-RestMethod -Uri $RestAddress -headers $headers -Method Get 
    Write-Host $result.value 
    New-AzureRmSqlServerFirewallRule -ResourceGroupName $RG -ServerName $Server -FirewallRuleName "UnitTestRule" -StartIpAddress "$($result.value)" -EndIpAddress "$($result.value)" 
    

    顺便说一句,你可以参考该脚本测试后删除防火墙规则。

    更新2:

    的SQL ConnectionString的是这样的:

    Server=tcp:[server name].database.windows.net,1433;Initial Catalog=sqlstarain1;Persist Security Info=False;User ID=[user name];Password=[password];MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30; 
    
    +0

    我们将Azure SQL服务器打开到所有IP地址(仅用于测试)。它仍然没有连接。我并没有真正理解你对Ping测试的回答。我敢肯定,如果我们自己托管我们的构建服务器,我们会让它工作,但我宁愿使用由Visual Studio Online提供的构建服务器。 – Remy

    +0

    @Remy连接到Azure数据库时,您获得的详细错误消息是什么?你在哪里访问Azure数据库? –

    +0

    通常,连接字符串指定SQL Server名称,当SQL数据库未通知其名称时,您会看到SQL失败。类似于DNS故障,但是特定于SQL Server。 –

    相关问题