Программно запускаемое приложение-функция не работает без описательного вывода - PullRequest
0 голосов
/ 26 апреля 2019

Конечная цель - я хочу запустить приложение Function локально для автоматического тестирования.Я не знаю, как это сделать без использования func.exe.Вот моя попытка:

    /// <summary>
    /// Setup environment for running integration tests on MyApp APIs
    /// </summary>
    /// <param name="testContext"></param>
    [ClassInitialize]
    public static void RunFileHubLocally(TestContext testContext)
    {
        // Do the programmatic equivalent of right-click "Debug -> Start new instance" on API.
        // This uses Azure Functions Core CLI to deploy the Function App locally.
        azureFunctionsCliShell = new Process();

        azureFunctionsCliShell.StartInfo.UseShellExecute = false;
        azureFunctionsCliShell.StartInfo.RedirectStandardOutput = true;
        azureFunctionsCliShell.StartInfo.CreateNoWindow = true;

        azureFunctionsCliShell.StartInfo.FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\lib\azure-functions-core-tools\func.exe"); ;
        var fileInTargettedWorkingDirectory = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\..\..\..\src\MyApp.Api\bin\Debug\netcoreapp2.1\host.json"));
        azureFunctionsCliShell.StartInfo.WorkingDirectory = fileInTargettedWorkingDirectory.Directory.FullName;
        int port = FreeTcpPort();
        azureFunctionsCliShell.StartInfo.Arguments = $"host start --port {port}";
        apiUrl = $"http://localhost:{port}/api";
        azureFunctionsCliShell.Start();

        // Wait for "Application started", the line in the output that indicates the
        // application is listening to the port
        const string specialPhrase = "Application started";
        for ( ; ; )
        {
            string line = azureFunctionsCliShell.StandardOutput.ReadLine();

            Console.WriteLine(line);

            if (line.Contains(specialPhrase))
            {
                break;
            }

            if (azureFunctionsCliShell.StandardOutput.EndOfStream)
            {
                throw new Exception($"Output did not contain special phrase '{specialPhrase}'. Last line: '{line}'.");
            }
        }

        // Hold instance of HttpClient to be disposed of during cleanup
        httpClient = new HttpClient();
    }

Сбой при выводе

ваша рабочая среда не установлена.Начиная с версии 2.0.1-beta.26 требуется рабочая настройка времени выполнения.Пожалуйста, запустите func settings add FUNCTIONS_WORKER_RUNTIME <option> или добавьте FUNCTIONS_WORKER_RUNTIME к вашему local.settings.json Доступные параметры: точка, узел, питон, powershell

              %%%%%%
             %%%%%%
        @   %%%%%%    @
      @@   %%%%%%      @@
   @@@    %%%%%%%%%%%    @@@
 @@      %%%%%%%%%%        @@
   @@         %%%%       @@
     @@      %%%       @@
       @@    %%      @@
            %%
            %

Основные инструменты функций Azure (2.6.666 хеш коммита: 2ea98edb55cd2fc249765fcf3ftimec0e2930): 2.0.12408.0 Приложение закрывается ...

Когда я запускаю ту же команду через консоль, она завершается успешно с

, ваша рабочая среда не установлена.Начиная с версии 2.0.1-beta.26 требуется рабочая настройка времени выполнения.Пожалуйста, запустите func settings add FUNCTIONS_WORKER_RUNTIME <option> или добавьте FUNCTIONS_WORKER_RUNTIME в ваш local.settings.json Доступные параметры: точка, узел, питон, powershell

              %%%%%%
             %%%%%%
        @   %%%%%%    @
      @@   %%%%%%      @@
   @@@    %%%%%%%%%%%    @@@
 @@      %%%%%%%%%%        @@
   @@         %%%%       @@
     @@      %%%       @@
       @@    %%      @@
            %%
            %

Основные инструменты функций Azure (2.6.666 хеш коммита: 2ea98edb55cd2fc249765fcf3ftimec0e2930): 2.0.12408.0 [26.04.2009 14:29:18] Запуск службы инициализации Rpc.[26.04.2009 14:29:18] Инициализация RpcServer…… Теперь слушаем: http://0.0.0.0:63819 Приложение запущено.Нажмите Ctrl + C, чтобы выключить.

1 Ответ

0 голосов
/ 01 мая 2019

CLI func сам по себе является оболочкой для функций Azure Runtime .

Вместо того, чтобы писать еще одну оболочку вокруг func CLI, вы могли бы вместо этого пойти по маршруту docker , который был бы так же близок, как запуск его на самом Azure.

С помощью докера вы значительно упростите общий конвейер CI, поскольку большинство серверов CI изначально поддерживают выполнение рабочих процессов с контейнерами.

Кроме того, при желании вы также можете развернуть эти контейнеры в Azure , но обратите внимание, что Linux еще не поддерживается для плана потребления, поэтому вам придется использовать План обслуживания приложений Linux вместо.

...