Содержимое файла внезапно меняется на Jenkins - PullRequest
1 голос
/ 03 апреля 2020

Эта проблема - настоящая головная боль. У меня есть некоторый код для извлечения ZIP-файла, который выглядит следующим образом:

    public File read(InputStream input) throws IOException {
        try (final BufferedInputStream bufferedInputStream = new BufferedInputStream(input);
                final ZipInputStream inputStream = new ZipInputStream(bufferedInputStream);) {

            final File outputFolder = Files.createTempDirectory(null).toFile();

            ZipEntry entry;
            while ((entry = inputStream.getNextEntry()) != null) {
                final File outputFile = new File(outputFolder, entry.getName());
                extractEntry(inputStream, outputFile);
            }
            return outputFolder;
        }
    }

    private void extractEntry(InputStream is, File outputFile) throws IOException {
        try (FileOutputStream fos = new FileOutputStream(outputFile);) {

            final byte[] buf = new byte[this.bufferSize];

            int length;
            while ((length = is.read(buf, 0, buf.length)) >= 0) {
                fos.write(buf, 0, length);
            }
        }
    }

Мои тесты для этого класса просто сравнивают содержимое файла, который я положил в ZIP-файл, с приведенным выше фрагментом кода:

Assert.assertArrayEquals(Files.readAllBytes(referenceFile), Files.readAllBytes(extractedFile)); 

Что должно работать в любом случае, верно? Это для меня. Длина файлов на моем компьютере составляет 973 байта.

Однако при запуске на Jenkins те же самые тесты с ошибками приводят к следующему исключению:

java.lang.AssertionError: array lengths differed, expected.length=996 actual.length=973

Фактические числа являются фиксированными, поэтому ожидаемая длина внезапно выше. Я понятия не имею, как это могло произойти. Когда я загружаю файлы, они, безусловно, выглядят одинаково, даже в байтовом сравнении.

В чем проблема?

Я убедился, что на обеих машинах запущен Open JDK 11.0.2, так что на этот раз проблема Java не должна быть проблемой.

1 Ответ

1 голос
/ 03 апреля 2020

Итак, я нашел решение, составляя вопрос, но я оставлю здесь ответ для себя и всех, кто имеет загадочные проблемы:

Это Git. Это всегда Git с такими проблемами. Почему это было бы что-то отличное от Git?

Иногда и без предупреждения Git решает, что ваши разрывы строк не достаточно хороши, и заменяет их другими словами. Я предполагаю, что так как количество байтов увеличилось, он добавил «\ r» до или после моего переноса строки «\ n». Думаю, Git потерял интерес, когда дело дошло до файлов ZIP, и изменил только справочные файлы.

Поэтому, когда мой код извлек ZIP-файлы, у них были оригинальные разрывы строк, но у справочных файлов был Git изменили, чтобы они не были идентичны.

И хотя вы, вероятно, могли бы привести аргумент в пользу "Git случайного добавления разрывов строк, это хорошо", но я не знаю, почему Git не делает ' добавить их в свой локальный репозиторий. Я нашел бы источник проблемы намного раньше, если бы только моя копия и копия Дженкинса были идентичны.

Примечание: Я нашел проблему, потому что думал, что это странное совпадение, что 23 байта появились на Jenkins, когда в моем файле было 23 строки. Поэтому, если у вас есть похожая проблема, попробуйте проверить что-то вроде этого.

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