Я жду подтверждения моей стратегии интеграционного тестирования, которая требует, чтобы процесс тестирования выполнялся полностью автоматически без какого-либо ручного вмешательства. Другими словами, после того, как я отправил свой код в 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% автоматизировано - ручная подготовка не допускается.