2017-01-12 29 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。 –

    相關問題