Рубрики
Без рубрики

Автоматизация для разработчиков Java – советы и фрагменты

Автоматизация для разработчиков Java – советы и фрагменты – по крайней мере, тот, который я использую чаще всего. С тегами java, разработчик, автоматизация, сниппеты.

Автоматизация – это то, что может сэкономить вашему будущему “я” много времени. Это не срочное дело, но очень важное. Это даст вам время поработать над бизнес-логикой, выполнить некоторые скучные вещи, защитить вас от себя и других при изменении кода, получать уведомления на ранней стадии, когда что-то сломано, предоставить пользователю лучший опыт (с меньшим количеством ошибок) и, наконец, даст вам свободу не беспокоиться о техническом дерьме низкого уровня и больше наслаждаться жизнью.

Использование ароматов . Это предопределенные константы, параметры, даже код (хотя лучше, чтобы он был минимальным) для разных сред ваше приложение будет запущено. На рабочем столе Java и сервере стандартный способ сделать это в основном с файлами .properties. Все, что отличается – подключения к базе данных, пути в файловых системах, параметры JVM, команды и т.д., Может быть размещено за пределами кода. Это позже сводит к минимуму необходимость дополнительных изменений при перемещении приложения в новое место (хотя это меньше проблем с контейнерами).

На Android -устройствах являются гражданами первого класса. Система выполнения выбирает ресурсы, изображения, меню, файлы компоновки, значения, цвета из настроек текущей среды операционной системы. Во время компиляции также может быть определен вкус. Создание той же файловой структуры из основной исходной папки – с перезаписью некоторых определенных файлов может заменить конечные точки URL, учетные данные для доступа к данным, сертификаты подписи, ресурсы и код. И когда вы компилируете, вы выбираете, какой вариант будет включен в установочный пакет.

Давайте перейдем к некоторым конкретным техническим фрагментам, которые я использую:

Я использовал SSHJ https://github.com/hierynomus/sshj для загрузки или выгрузки файлов на удаленные серверы:

try (SSHClient ssh = new SSHClient()) {
 ssh.loadKnownHosts();        
 ssh.addHostKeyVerifier("some-key");
 ssh.connect(host);
 ssh.authPassword(user, pass);
 ssh.newSCPFileTransfer().upload(localFilePath, remoteFilePath);
 ssh.disconnect();
}

Я использовал sshxcute https://code.google.com/archive/p/sshxcute/ для выполнения множества задач на сервере – копирования определенных файлов в нужное место, архивирования каталогов, создания резервной копии базы данных, удаления старых файлов и т.д.

CustomTask task = new ExecCommand("some command");
ConnBean cb = new ConnBean(host, user, pass);
SSHExec ssh1 = SSHExec.getInstance(cb);
ssh1.connect();
ssh1.exec(task);
ssh1.disconnect();

Я использовал Java Process API для выполнения некоторого скрипта или команды в подпроцессе, и из возвращенного результата, в зависимости от необходимости, я впоследствии выполнил другой код.

processBuilder = new ProcessBuilder(list of commands);
processBuilder.directory(working directory);
processBuilder.inheritIO();
process = processBuilder.start();
int waitFor = process.waitFor();
if (waitFor == 0) {
//something
} else {
//something else 
}

При выполнении сборок или в нескольких других местах я заменяю файлы конфигурации разными вариантами для разных сред с помощью этого фрагмента:

Files.copy(sourceFile.toPath(), destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);

Сами сборки выполняются с помощью Gradle, Maven и/или Ant. Расположение этих инструментов и иногда их параметры указываются в файлах свойств, поэтому перенос сборки на новую машину – это всего лишь замена некоторых строк в файле .properties.

Из этих 3 инструментов мне больше всего нравится Ant, потому что он дает вам полный контроль над процессом сборки, не требуя от него слишком многого. Другие очень хороши в управлении зависимостями, но их процесс создания осуществляется с помощью плагинов, и иногда некоторые шаги остаются скрытыми, что может быть хорошо, но иногда это может быть плохо (особенно если что-то не работает) или вы хотите что-то настроить.

Я использовал в нескольких местах API Eclipse JGit для доступа к локальным и удаленным репозиториям. Я использовал в нескольких местах API Eclipse JGit для доступа к локальным и удаленным репозиториям.

    SshSessionFactory.setInstance(new JschConfigSessionFactory()
    {
        @Override
        protected void configure(Host arg0, Session session)
        {
            session.setPassword("the password of a user");
        }
    });
    File file = new File("local directory");
    delete(file);
    Git.cloneRepository().setURI("user@someaddr:/remoteaddr")
    .setDirectory(file).call();

Я использовал Java Zip API для упаковки некоторых файлов в zip.

    Path sourceDir = Paths.get(dirPath);
    String zipFileName = "some file name;
    try {
        ZipOutputStream outputStream = new 
ZipOutputStream(new FileOutputStream(zipFileName));
        Files.walkFileTree(sourceDir, new SimpleFileVisitor() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
                try {
                    Path targetFile = sourceDir.relativize(file);
                    outputStream.putNextEntry(new ZipEntry(targetFile.toString()));
                    byte[] bytes = Files.readAllBytes(file);
                    outputStream.write(bytes, 0, bytes.length);
                    outputStream.closeEntry();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return FileVisitResult.CONTINUE;
            }
        });
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

Некоторые из вышеперечисленных действий могут быть выполнены с небольшой настройкой с помощью приложения Дженкинс или какой-либо команды из инструментов (например, в некоторых случаях я использовал Ant для некоторых вещей), но я считаю полезным смешивать функции дженкинса со стандартными командами и исполняемыми приложениями java, закодированными мной, делая то, что мне нужно было сделать, когда я мог найти функцию или плагин в этом инструменте. В конфигурации задач этого приложения CI/CD я специально использовал:

  • Начинайте сборку каждые X минут/в определенный промежуток времени с помощью планировщика задач Cron.
  • Выполнение сборки с помощью крючка фиксации git https://stackoverflow.com/questions/12794568/how-to-configure-git-post-commit-hook
  • Выполнить команду с терминала после успешного завершения сборки

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

Оригинал: “https://dev.to/tomavelev/automation-for-java-developers—tips-and-snippets-433p”