Gradle + Artifactory: логин и пароль динамически

Gradl’у нужны логины и пароли для некоторых действий, например для публикаций в Artifactory. Но мне не нравится хранить логины и пароли в текстовый файлах и без шифрования. Также, на мой взгляд, ввод логина и пароля при публикаций, коммитах и т.д. позволяет предотвратить большое количество из-за случайных или необдуманных действий.

Сразу хочу отметить, что пароль в коде ниже заворачивается в java.lang.String, что не допустимо с точки зрения ИБ, но мне этот аспект не важен. 

Ниже представлен простой способ ввода пароля из терминала или GUI-формы. Особенность работы с плагином Artifactory заключается в том, что все параметры нужно задать на этапе конфигурации жизненного цикла. Поэтому процесс запроса кода прям в задаче artifactroryPublish приведет к постоянным запросам логина и пароля при любом чихе, даже если задача artifactroryPublish не будет выполнятся на этапе выполнения жизненного цикла. Поэтому предложенный ниже способ будет конфигурировать artifactroryPublish только по необходимости (при наличии artifactroryPublish в графе задач):

Метод setArtifactoryUsernameAndPass пытается запросить данные из консоли, если таковой нет, то создает графическую форму. После проставляет полученные логин и пароль в соответствующие поля настроек плагина Artifactory:

Gradle + Artifactory: несколько artifactoryPublish

Плагин artifactory-4.0.0 для Gradle предоставляет свой DSL, имеющий ряд ограничений. Например, подразумевается одна задача artifactroryPublish на проект.

Но мне захотелось иметь несколько вариантов aritfactoryPublish (release и snapshot, а в некоторых случаях несколько билдов из одного проекта, которые я хочу публиковать не все сразу, а по частям).

Поиск не дал внятного ответа, поэтому выкатываю свой велосипед на эту тему.

Для начала добавляем минимальную обвязку проекта: зависимости сборочного скрипта, плагины для artifactory (ему для публикации понадобится также maven-publish) и работы с java кодом:

В моем окружении всего один сервер Artifactory (думаю очень популярный вариант):

Я предпочитаю публиковать не из конфигураций, а из заданных публикаций. Ниже приведены две бессмысленные публикации для демонстрации:

Далее я создаю две маркерных задачи, при выполнении artifactroryPublishSnapshot публикация snapshot будет публиковаться в репозиторий ‘libs-snapshot-local’, при выполении artifactroryPublishRelease публикация release будет публиковаться в репозиторий ‘libs-release -local’. Маркерные они потому, что в зависимости от того, какая из них будет запускаться artifactoryPublish должна быть сконфигурирована по-разному. В теле этих задач конфигурировать artifactoryPublish нельзя, потому что если задавать параметры на этапе выполнения, то это не возымеет эффекта (особенности artifactoryPublish), а если задавать параметры на этапе конфигурации, то они выполнятся для обоих задач и одна из них перетрет параметры другой (свойства Gradle). Поэтому придется применять небольшой финт. Также в самой artifactoryPublish я задаю логин и пароль, которые на зависят от публикации:

Теперь, собственно, суть. После запуска (двойной клик по задаче в окне Gradle в Intellij Idea) любой задачи сразу после построения графа задач проверяем, нет ли одной из этих маркерных задач в графе. Если есть, то настраиваем в зависимости от задачи  artifactoryPublish

Вот и все. Ниже все сразу:

 

TP-LINK TL-WR741ND: переделываем WAN в LAN

Сеть у меня дома собрана из подручных устройств — 3 маршрутизатора и 5 коммутаторов (топология оставляет желать лучшего, но это совсем другая тема).

В основном шкафу у меня находится 3 маршрутизатора, причем функцию маршрутизации выполнят лишь один, остальные служат как простые коммутаторы. Выглядит все так:

DSC02287 DSC02286

И в один прекрасный день мне не хватило свободного порта, причем в двух из трех маршрутизаторах WAN’ы были свободны, что не давало мне покоя.

Поэтому вот инструкция, как превратить маршрутизатор TP-LINK TL-WR741ND в пятипортовый коммутатор.

  1. Освобождаем в сети адрес 192.168.1.1;
  2. Обновляем наш маршрутизатор на последнюю официальную версию прошивки;
  3. Сбрасываем настройки на заводские и логинимся по адресу 192.168.1.1;
  4. Скачиваем нужную версию прошивки OpenWRT для своего маршрутизатора. Так как мой маршрутизатор версии 1, то мне подходит Backfire 10.03.1. Версию можно узнать на днище маршрутизатора. Советую выбрать сборку, включающую веб-интерфейс;
  5. Логинимся по адресу 192.168.1.1. Меняем адрес маршрутизатора на требуемый (у меня 192.168.1.4) и добавляем в системных настройках пароль для SSH;
  6. Заходим по SSH на маршрутизатор, например с помощью putty. Логин: root, пароль: тот, что только что меняли в системных настройках.
  7. Теперь нам необходимо сменить ряд настроек, начнем с настроек сети. Открываем файл конфигурации:
  8. Коментируем или удаляем секцию WAN, начинается так:
  9. Теперь нам нужно объединить 4 lan-порта и wan-порт. Под капотом наш маршрутизатор имеет очень своеобразное устройство — есть три интерфейса (Wi-Fi и два проводных), однако один проводной из них никак не задействован. Зато на задействованном проводном создаются интерфейсы eth0 (по-умолчанию для lan, не тэгированный) и eth1 (для wan, тэгированный). Поэтому нам нужно объединить в мост eth0, eth1, vlan для eth0 (в который мы добавим все пять портов) и Wi-Fi. Конфигурация должна выглядеть подобным образом:
  10. После этого для vlan’а на eth0 сконфигурируем все пять портов, тэгированные порты отмечаются символом  t  после номера. Таким образом конфигурация для vlan и портов будет выглядить следующим образом:
  11. Теперь нужно выключить DHCP, делается это в три команды:
  12. И firewall:
  13. Полная перезагрузка кнопкой, через веб-интерфейс или командой:

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

Собираем OpenJDK 8

Для начала необходимо получить исходные коды из которых собирается OpenJDK. Проект OpenJDK использует Mercurial в качестве системы контроля версий.  Для работы с различными CVS я предпочитаю использовать ПО с графическим пользовательским интерфейсом. В данном случае это будет TortoiseHg.

1. Клонируем репозиторий http://hg.openjdk.java.net/jdk8/jdk8

Также необходим Cygwin (можно и MinGW MSYS, но это другая история). Не достаточно установить дефолтовый набор инструментов. Обязательно следует добавить следующие инструменты:

Binary Name Category Package Description
ar.exe Devel binutils The GNU assembler, linker and binary utilities
make.exe Devel make The GNU version of the ‘make’ utility built for CYGWIN
m4.exe Interpreters m4 GNU implementation of the traditional Unix macro processor
cpio.exe Utils cpio A program to manage archives of files
gawk.exe Utils awk Pattern-directed scanning and processing language
file.exe Utils file Determines file type using ‘magic’ numbers
zip.exe Archive zip Package and compress (archive) files
unzip.exe Archive unzip Extract compressed files in a ZIP archive
free.exe System procps Display amount of free and used memory in the system

2. Открываем терминал Cygwin, переходим в папку с клонированным репозиторием и выполняем команду  ./get_sources.sh . Ждать придется порядка 10 минут. По результатам выполнения данной команды мы получим все необходимые репозитории:

Репозиторий Содержание
. (root) Конфигурация и сценарии сборки
hotspot Исходный код и сборочные файлы виртуальной машины OpenJDK Hotspot
langtools Исходный код компилятора javac и другие инструменты для работы с языком
jdk Исходный код и сборочные файлы библиотек среды выполнения и другие файлы
jaxp Исходный код JAXP
jaxws Исходный код JAX-WS
corba Исходный код Corba 
nashorn Исходный код  реализации JavaScript

3. Теперь надо подготовить конфигурацию командой ./configure . Но у меня ничего не вышло с первого раза из-за ошибки о том, что мой Cygwin устарел (нужен версии 1.7.х, а у меня 2.3.х =).

3.1. Переходим в папку .\common\autoconf  и открываем примерно 7220 строку. В ней есть запись вроде такой:

Меняем её на следующую (которая зависит от версии нашего Cygwin’а):

Первый затык пройден. Но на этом мои приключения не закончились. x64…

3.2. Конфигуратор ругнулся на несовместимую по архитектуре версию freetype (библиотека шрифтов). Пришлось собирать свою версию.

3.2.1. Для этого устанавливаем Microsoft Visual Studio 2010, подойдет любая, даже Express. Нужна только часть C/C++.

3.2.2. Идем на сайт freetype, скачиваем стабильный релиз и собираем по инструкции (с того же сайта) многопоточные динамическую и статическую версии библиотеки.

3.2.3. Запускаем конфигуратор со следующими параметрами:

Тут я решил перестраховаться и явно указал, что моя платформа 64-х битная и подсунул заведомо верную версию jdk (x64 и меньше чем 8).

4. Наконец-то можно выполнить make all , пойти укачать ребенка, поужинать или заняться еще чем-нибудь, пока собирается наша Ява.

5. Проверка:

Результат:

HelloWorld

Используемая JDK:

JDK

Все работает, ура!

Заметка 1. В клонированном репозитории есть замечательная инструкция  README-builds.html.

 

 

OpenHAB. Подробная инструкция по запуску.

Пришлось мне собрать проект OpenHAB, и на удивление официальная инструкция оказалась недостаточно подробной. Из-за того что в ней пропущено несколько важных моментов, с ходу собрать проект не удается, особенно тем, кто не пользуется Eclipse’ом в повседневной жизни. Поэтому вот моя версия инструкции:

  1. Скачать и установить Git и, опционально, TortoiseSVN — клиент Git с графическим пользовательским интерфейсом. Если не планируется в дальнейшем иметь дело с Git’ом, можно пропустить этот шаг и скачать исходные коды напрямую с Github (срава кнока «Download ZIP»). [Мои версии: Git-2.6.3-64-bit, TortoiseGit-1.8.16.0-64bit].
  2. Скачать и установить последнюю версию JDK [jdk-8u66-windows-x64].
  3. Скачать и установить Yoxos Installer [Yoxos_Installer-5.6.1-win32.win32.x86_64].
  4. Клонировать репозиторий.
  5. Выполнить с помощью Yoxos Installer файл OpenHAB.yoxos. В результате выполнения данного файла у Вас установится IDE Eclipse со всеми необходимыми плагинами.
  6. Импортировать клонированный репозиторий в Workspace  File Import General Existing Projects into Workspace . После чего следует дождаться выполнения индексирования кода и других задач (прогресс бар в правом нижнем углу Eclipse). На моем трехлетнем ноутбуке данный процесс занял порядка 10 минут.
  7. После импорта выбрать целевую платформу  Window Preferences Plug-in Development Target Platform openHAB  и обязательно нажать кнопку «Edit…». После этого начнет долгий процесс скачивания всех необходимых плагинов для openHAB. На моем ноутбуке данный процесс занял около 20 минут.
    Получение плагинов
  8. Не закрывая окно «Edit target defenition» рекомендую выбрать на вкладке Enviroment явно выбрать установленную в пункте 2 JRE.
    Выбор JRE для плагинов
  9. После нажать кнопку Finish (закроется текущее окно) и кнопку Apply в оставшемся окне.
  10. Также рекомендую явно выбрать Execution Enviroment Window Preferences Java Installed JREs Execution Enviroment .
    Execution enviroment
  11. Обязательно выбрать уровень языка 1.7  Window Preferences Java Installed JREs Compilier .
    Уровень языка
  12. После это следует сгенерировать недостающий код. Для этого следует выбрать модуль org.openhab.model.codegen и для всех файлов выполнить генерирование кода ( ПКМ Run As 1 ... ):
    1 Generate Items Model
    2 Generate Sitemap Model
    3 Generate Script Model
    4 Generate Rule Model
    5 Generate Persistence Model.
    При первом генерировании вы получите запрос на скачивание и установку генератора ANTLR. После этого необходимо ввести в консоле  y  и нажать Enter.
  13. После необходимо пересобрать Workspace. Для этого следует перейти в меню  Project Clean...
    008 Ребилд
    и в появившемся окне нажать Ok.
    009 Ребилд
  14. После чего начнется ребилд. Будет много предупреждений, но ошибок не будет. На этом сборка завершена.

Для запуска OpenHAB Runtime из IDE требуется выполнить следующие шаги:

  1. Выбрать  Window  Open Perspective  Other... .
    010 Выбор перспективы
  2. В появившемся окне выбрать Plug-in Development .
    011 Выбор перспективы
  3. Перейти в меню Run Configurations... .
    012 Конфигурация запуска
  4. В открывшемся окне выбрать openHAB Runtime  и нажать кнопку Run .
    013 Конфигурация запуска
  5. Runtime запущен! Вся информация в консоле.
    014 Запуск

Web-сервисы. Просто о JAX-WS

Возникла идея структурировать свои знания в технологиях Java. Начать решил с простого — с веб-сервисов. О веб-сервисах написано множество статей, для чего они нужны, как с ними работать, о производительности, безопасности и удобстве использования тех или иных технологий.

Я же в свою очередь хотел попробовать донести основы понятным языком. Если удастся, то это будет означать, что я и сам разобрался в данной тематике.

Начнем с API JAX-WS (Java™ API for XML Web Services). Использование технологии JAX-WS  для проектирования и разработки Web-сервисов дает много преимуществ, включая упрощение создания Web-сервисов и их клиентов на языке Java, облегчение разработки и развертывания Web-сервисов, а также ускорение разработки Web-сервисов.

Перед тем как перейти к практическим примерам стоит подготовить небольшую теоретическую базу. Для этого стоит иметь основные понятия об XML, XML Schema, DTD и WSDL.

Также стоит немного ознакомиться с основными технологиями, используемыми в JAX-WS:

JAXB (Java Architecture for XML Binding) — реализует возможности связывания данных, предоставляя удобный способ отобразить XML-схему на представление в Java-коде.
SAAJ (SOAP with Attachments API for Java) — SAAJ обеспечивает стандартный способ работы с XML-вложениями, находящимися в SOAP-сообщении.

Итак, приступим. Для начала пойдем самым простым путем. Пусть мы собираемся использовать веб-сервисы для удаленного вызова методов. У нас есть класс с методом  getReverseString(final String string) , который возвращает перевернутую строку:

Веб-сервис. Серверная часть.

Для того чтобы превратить данный класс с единственным методом в сервис следует сделать всего три простых шага.

  1. Создать интерфейс, описывающий данный класс и пометить его специальными аннотациями. Интерфейс необходим из-за особенностей создания WSDL-описания сервиса с помощью JAX-WS. Создадим требуемый интерфейс IExample :

    Данный интерфейс мы пометили аннотацией @WebService , а метод(ы) в нём аннотацией @WebMethod .  Выглядит просто, не правда ли? Однако JAX-WS весьма гибкий инструмент, и с помощью аннотаций можно очень гибко управлять настройками. Тот же код (в рамках текущего примера) может выглядеть следующим образом:

    Следует понимать, что все аннотации и их параметры влияют лишь на отображение Java-кода в WSDL-описание веб-сервиса. Подробнее со всевозможными аннотациями, их параметрами и отображением на WSDL можно познакомиться, например, здесь. Также полезной будет следующая иллюстрация, описывающая элементы WSDL:

     WSDL_11vs20

  2.  Сделать первоначальный класс реализацией данного интерфейса и также пометить класс и метод(ы) соответствующими аннотациями:

    Все параметры аннотации   @Webservice .  serviceName — имя, под которым сервис будет опубликован;  targetNamespace — пространство имен для описания данного веб сервиса;  endpointInterface  — интерфейс данного сервиса.
  3. Опубликовать созданный сервис по определенному адресу:

    Вот и все, наш веб-сервис опубликован и функционирует. Проверить это можно с помощью браузера запросив WSDL-описание данного сервиса, которое находится по адресу  http://localhost:12346/ws/example?wsdl .

Веб-сервис. Клиентская часть.

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

Ура! Мы можем удаленно вызывать метод и получать результат (хотя и через localhost).

Есть и альтернативный вариант получить клиента для пользователей Intellij IDEA. Для этого можно воспользоваться утилитой «Generate Java Code From WSDL». Указываем данной утилите URL с WSDL   http://localhost:12346/ws/example?wsdl  и заполняем остальные поля по своему усмотрению. В результате получаем такой вот страшный чудо класс:

В принципе можно не разбираться в его устройстве, но такой подход очень полезен, т.к. открывает новые возможности, например, вызов методов с использованием фьючерсов. Чтобы получить функционал аналогичный написанному нами коду, следует дописать следующий  psvm:

Ну вот и все что я планировал для данной части. Теперь мы умеем публиковать веб-сервисы из кода и писать (или генерировать) клиенты к ним. В следующих частях подробнее будут освещены инструменты деплоймента веб-сервисов в Intellij IDEA и Java API JAX-RS для RESTfull сервисов.

Буду крайне благодарен за обратную связь!