Переменная https_proxy вызывает конфликты с API Azure DevOps.

Мы разрабатываем расширение Azure DevOps с задачами конвейера. В качестве технологий мы используем пакеты typescript/node/npm. Одной из обязанностей этой задачи конвейера является сбор данных из внешнего источника с помощью встроенной оболочки API и создание рабочих элементов на основе собранных/составленных данных.

Высокоуровневая архитектура задачи приведена ниже.

Мы пытаемся поддержать пользователей, использующих прокси, передавая переменную https_proxy в оболочку (обертка предназначена для приема переменной https_proxy). Код похож на приведенный ниже.

          import * as tlib from 'azure-pipelines-task-lib/task';

    tlib.setVariable(“https_proxy”, “http://username:password@hostname:port” ,false);

Благодаря вышеописанной имплантации мы успешно смогли получить доступ к внешнему источнику через оболочку API и собрать необходимые данные.

Однако замечено, что наличие https_proxy в задаче конвейера нарушает связь между задачей конвейера и Azure DevOps API ('azure-devops-node-api), и мы получаем ошибку ниже.

          Error: tunneling socket could not be established, statusCode=407

Мы не можем определить основную причину этой проблемы и заметили, что определение переменной https_proxy означает настройку прокси-сервера в Azure (не уверен на 100 %, аналогично ли это и для Azure DevOps).

https://learn.microsoft.com/en-us/dotnet/azure/sdk/azure-sdk-configure-proxy?tabs=cmd

ps. Мы можем решить эту проблему, установив no_proxy, как показано ниже, после использования http_proxy для сбора данных. Но в этом подходе есть проблема, поскольку это может привести к отключению всех прокси. Например, предположим, что компьютер настроен на использование прокси-сервера A, но оболочка использует прокси-сервер B. При реализации no_proxy мы заставляем Azure DevOps API использовать no_proxy вместо прокси-сервера A. Следовательно, мы должны подумать об альтернативном решении.

          process.env["NO_PROXY"] = "*";

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

2 ответа

Переменные в Azure Pipelines передаются от агента к задачам, использующим среду. Таким образом, любая определенная вами переменная автоматически превратится в переменную среды в конвейере. Это задумано и не может быть изменено. Это также один из самых безопасных способов передачи переменных между процессами, поскольку он предотвращает все виды проблем с escape-символами.

И переменные, которые вы устанавливаете, определяют, как в целом работает конфигурация прокси для Node и многих инструментов на основе Unix.

Существует ряд волшебных переменных:HTTP_PROXY,HTTPS_PROXY,NO_PROXYи т. д. И как вы уже поняли, когда вы установите эти большинство инструментов, они автоматически подхватят их и начнут использовать для перенаправления трафика .

Если вы хотите временно изменить настройки прокси-сервера, вам необходимо сохранить исходные значения этих переменных, а затем восстановить их после завершения задачи.

Если вы хотите установить прокси-сервер только для текущей задачи, а не для остальной части конвейера, вы можете использовать process.env['name'] = valueсинтаксис.

В идеале настройка прокси делается для агента в целом, а не в задачах конкретно . Затем задача может использовать встроенные функции библиотеки задач для получения настроек прокси-сервера и передачи их дальше .

API узла Azure DevOps также должен позволять вам переопределять прокси-сервер для определенных запросов, что должно позволять вам общаться с API рабочих элементов Azure DevOps, даже если установлена ​​другая конфигурация прокси-сервера:

      let proxy = tl.getHttpProxyConfiguration();

let option: VsoBaseInterfaces.IRequestOptions = {
  // Override your proxu config if needed:
  proxy: {
    proxyUrl: proxy.proxyUrl,
    proxyUsername: proxy.proxyUsername,
    proxyPassword: proxy.proxyPassword,
    proxyBypassHosts: proxy.proxyBypassHosts
  },
   ignoreSslError: false
};
    
// Make a Rest call to VSTS/TFS
let vsts: api.WebApi = new api.WebApi(serverUrl, authHandler, option);
let connData: lim.ConnectionData = await vsts.connect();

Согласно ответу команды Microsoft, в настоящее время нет возможности добиться этого.

В качестве обходного пути мы использовали другое имя переменной вместо https_proxy, чтобы передавать данные прокси-сервера оболочке API.

Сообщение сообщества Microsoft:

https://developercommunity.visualstudio.com/t/https_proxy-variable-is-causing-conflict/10306599