Как запустить тесты с живыми контейнерами docker (ядро. net) в сценарии конвейера teamcity - PullRequest
0 голосов
/ 01 мая 2020

Я жду подтверждения моей стратегии интеграционного тестирования, которая требует, чтобы процесс тестирования выполнялся полностью автоматически без какого-либо ручного вмешательства. Другими словами, после того, как я отправил свой код в GitHub, процесс teamcity ожидает сборки кода, одним из шагов которого является запуск моего интеграционного теста.

Настройка тестирования в teamcity (шаг выполнения теста ) по сути так:

sudo docker build -f Dockerfile.test -t mytest .
sudo docker run -v /var/run/docker.sock:/var/run/docker.sock mytest

первая строка создает образ, который выполняет тест NUnit как

ENTRYPOINT ["dotnet", "test", "Test.dll"]

, который также включает в себя загрузку и настройку docker .io так что я могу запустить docker команды из теста NUnit:

RUN apt-get -y install docker.io

вторая строка запускает mytest образ с аргументом ключа -v, чтобы включить команды docker, необходимые для теста Nunit

Тест NUnit отвечает за создание docker образа кода моего приложения и его запуск. Это приложение прослушивает сообщения Google Cloud Platform Pub / Sub для обработки. Я опускаю все это для ясности (и краткости).

Код интереса в IntegrationTest:

    private bool BuildImage()
    {
        bool success = false;

        // build image
        ProcessStartInfo startInfo = new ProcessStartInfo()
        {
            FileName = dockerSettings.ProcessFileName, // /bin/bash
            Arguments = TransformArguments(dockerSettings.BuildArguments), // "-c \"docker build -f Dockerfile -t subscriptionreader .\""
            CreateNoWindow = false,
            WorkingDirectory = dockerSettings.WorkingDirectory,
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
        };

        Process process = new Process()
        {
            StartInfo = startInfo
        };

        process.Start();

        output = process.StandardOutput.ReadToEnd();

        string error = process.StandardError.ReadToEnd();
        process.WaitForExit();

        success = output.Contains("Successfully tagged subscriptionreader:latest");
        Console.WriteLine("build image complete - " + success.ToString());

        return success;
    }
}

Затем другой метод, который я пропустил, запускает только что построенный контейнер, который, в свою очередь, ждет что-то сделать. Сообщение публикуется в pub / sub, после чего контейнер получает его для обработки. Если все хорошо, я ищу окончательное сообщение об успехе, разрываю и называю его день.

Хотя все это успешно работает локально, оно не работает на сервере Linux teamcity. Я разрабатываю на Windows 10, Docker 19.xy,. net core 3.1. Ошибка в teamcity:

ошибка: HTTP-запрос 'GET https://api.nuget.org/v3/index.json' истек по истечении 100000 мс.

Инженеры службы поддержки утверждают, что прокси-сервер не задействован. Кроме того, я заблудился в отношении устранения неполадок, хотя я попросил их попытаться перейти к URL-адресу на сервере и проверить версию Docker.

Если все это идет в дым, есть ли более чистый и элегантный способ достичь того же? Одной из ключевых особенностей моего метода является то, что я могу легко получить результаты регистрации консоли из моего работающего контейнера. Docker-файлы, созданные непосредственно TeamCity, успешно выполняются при восстановлении do tnet; Dockerfile, встроенный в мой тест, завершается неудачно при восстановлении nuget.

Я испробовал некоторые тактики, в которых я полагаюсь на выполнение этого в Dockerfile или на шаге teamcity, указанном выше:

RUN dotnet test /src/Test/Test.csproj  --logger "junit;LogFilePath=test-results/test-results.xml"

но главное - запустить контейнер приложения и получить его результаты. Все должно быть полностью свободным от рук, 100% автоматизировано - ручная подготовка не допускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...