Агент сборки Azure DevOps "Hosted 2017" не разрешает соединение SQL

У меня есть очень простой DacPac, который создается на основе сборки DevOps Azure и выпускается конвейером выпуска. Сборка работает нормально, но конвейер завершается с ошибкой подключения. Я проверил и перепроверил настройку. Правила брандмауэра правильно установлены на целевом сервере, учетные данные действительны, но выпуск просто не пройдет. Я пробовал много разных комбинаций, включая указание портов, но не могу подключить его. Если я пытаюсь инициировать соединение из PowerShell и Invoke-SqlCmd, я получаю похожую ошибку подключения.

Кто-нибудь может пролить свет?

Существуют ли какие-либо ограничения на порты (например, блокировка 1433) на агенте Hosted 2017?

Нужно ли обновлять агента?

Нужны ли дополнительные настройки для подключения SQL?

Спасибо

Я получаю ошибку:

Невозможно подключиться к целевому серверу.database.windows.net. Проверьте информацию о соединении, такую ​​как имя сервера, учетные данные для входа и правила брандмауэра для целевого сервера. Ошибка входа для данных пользователя...

2 ответа

Решение

Кажется, AD Auth не поддерживается стандартным действием публикации SQL. Пользовательский интерфейс позволяет вам предоставлять учетные данные только для пользователя SQL. Существует возможность указать строку подключения через /TargetConnectionString параметр для SqlPackage.exe однако это не работает, потому что пользовательский интерфейс требует учетных данных SQL, и их нельзя использовать вместе с /TargetConnectionString параметр.

Я работал над этой проблемой, запустив SqlPackage.exe из стандартного сценария выпуска PowerShell.

& "C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ Common7 \ IDE \ Extensions \ Microsoft \ SQLDB \ DAC \ 140 \ SqlPackage.exe" /SourceFile:"$(System.DefaultWorkingDirectory)/_MyProj. Сборка инфраструктуры /DBScripts/bin/Debug/MyProj.Database.dacpac" /Action:Publish /tcs:"Server=myprodsql.database.windows.net;Initial Catalog=OptimisedDb; Сохранять информацию о безопасности =False; ID пользователя ='$(adminUserEmail)';Password=' ​​$(adminUserPassword)';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False; Аутентификация = пароль Active Directory "

Я много боролся с той же проблемой. Мне удалось исправить это, выполнив следующие два шага

  1. Изменилось соединение с базой данных на другой сервер, и как только это будет успешным, я верну его обратно на текущий сервер.
  2. Уровень совместимости базы данных изменен до ниже 150.
  3. Создан свежий релиз

ниже ссылки мне помогли. Надеюсь это поможет.

https://geeklearning.io/dacpac-and-azure-sql-updates/

https://github.com/microsoft/azure-pipelines-tasks/blob/master/Tasks/SqlAzureDacpacDeploymentV1/README.md

Разрешение всех диапазонов IP-адресов для моей базы данных SQL Azure сделало это за меня. Теперь мне просто нужно выяснить и сузить, на каких IP-адресах работает мой агент сборки в моем конвейере сборки Azure DevOps.

Автоматическая установка правил брандмауэра в задаче сборки Azure DevOps не работает.

У меня была такая же проблема и раньше, самый простой способ обойти это - занести в белый список каждый IP-адрес, который есть у DevOps - к сожалению, этот список довольно велик в зависимости от вашей географии и меняется еженедельно.

Я написал сценарий PS1, чтобы проанализировать список и убедиться в наличии необходимых правил.

https://www.microsoft.com/en-nz/download/details.aspx?id=41653

Есть, однако, несколько очевидных (и еще меньше) проблем с этим...

Список IP-адресов для некоторых регионов огромен, настолько велик, что в базе данных Azure их не может быть все, он превышает лимит.

Открывая IP-адреса, вы (по крайней мере, теоретически) выставляете вектор атаки на свою базу данных. Если кто-то знает адрес вашего сервера, он может попытаться получить к нему доступ.

Поэтому я попытался установить 0.0.0.0/allow доступ к настройке Azure, но на самом деле это не сработало для DevOps.

Моим конечным решением было раскрутить виртуальную машину в Azure и установить на нее агент сборки. Не идеально, но это сработало.

Вам необходимо указать порт: xxx.database.windows.net,1433,