barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 16 января 2020 г.

GitLab и Kubernetes: не видны переменные $KUBE_URL и $KUBE_TOKEN

Проблема

Для группы проектов в GitLab настроена интеграция с единственным Kubernetes-кластером. Однако, внутри job-ов CI/CD переменные $KUBE_URL и $KUBE_TOKEN имеют пустые значения, из-за чего невозможно сконфигурировать kubectl для работы с кластером Kubernetes.

Решение

Для job'а, в котором нужны переменные $KUBE_URL и $KUBE_TOKEN, должен быть определен environment (любой, т.к. при единственном привязанном Kubernetes-кластере он применяется для любого environment'а). Например:
deploy:
  stage: deploy
  environment:
    name: production # needed for KUBE_* variables to be materialized
  script:
    - kubectl config set-cluster mycluster --server="$KUBE_URL" --certificate-authority="$KUBE_CA_PEM_FILE"
    - kubectl config set-credentials gitlab-admin --token="$KUBE_TOKEN"
    - kubectl config set-context default --cluster=mycluster --user=gitlab-admin
    - kubectl config use-context default
    - echo "Deployment started"
    - kubectl apply -f my-deployment.yaml
    - echo "Deployment succeeded"
  only:
    - master

пятница, 6 декабря 2019 г.

SpringFox и Spring Boot 2.2.1

SpringFox версии 2.9.2 (самый актуальный релиз на 06.12.2019) несовместима со Spring Boot 2.2.0 и выше из-за изменения API Spring, используемого SpringFox. На это заведен тикет https://github.com/springfox/springfox/issues/2932, однако, на текущий момент SpringFox 3.0.0-SNAPSHOT из основной ветки разработки так и не переведен на актуальный Spring Boot.
Поэтому пришлось форкнуться и внести необходимые корректировки самостоятельно: https://github.com/barbitoff/springfox/tree/2.9.2-boot-2.2.1. На первый взгляд - работает, но тесты из swagger-contract-tests пришлось проигнорировать, т.к. они падали. Однако, падали они и в оригинальной 2.9.2.

пятница, 22 ноября 2019 г.

Oracle ATG: <print-item> в dynadmin

Если попытаться получить все item'ы по определенному item-descriptor в dynadmin с помощью:
<print-item item-descriptor="xxx"/>
то будет выведено только 100 item-ов. Для получения абсолютно всех item'ов необходимо воспользоваться:
<query-items item-descriptor="xxx">all</query-items>
Правда, если item'ов очень много, они все равно могут все не напечататься, вывод обрезается в произвольном месте. Workaround - запрашивать частями с использованием RANGE:
<query-items item-descriptor="xxx">
all RANGE +30000
</query-items>
затем
<query-items item-descriptor="xxx">
all RANGE 30000+30000
</query-items>
и т.п. 

среда, 20 ноября 2019 г.

grep: поиск по всем файлам в папке по наличию некой подстроки внутри CDATA-секции

Задача

Есть папка с xml-файлами, причем папка может содержать подпапки любой глубины вложенности. Нужно найти xml-файлы, содержащие некую подстроку внутри CDATA-секции.

Решение

grep -REil ".*<!\[CDATA\[([^\]]|(\][^\]])|(\]\][^>]))*ИСКОМАЯПОДСТРОКА.*" C:/sf_phoenix --include=*.xml
где ИСКОМАЯПОДСТРОКА - собственно та подстрока, которую ищем.

среда, 13 ноября 2019 г.

пятница, 25 октября 2019 г.

soapUI: "Trying XBeans path engine... Trying XQRL... Trying delegated path engine... FAILED on declare namespace..."

Проблема

В groovy-скрипте, использующем com.eviware.soapui.support.XmlHolder, при попытке выполнить xpath-поиск по XML
def requestXml = new XmlHolder(requestText);
def result = requestXml["//*[local-name() = 'xxx']"]
возникает ошибка:
Trying XBeans path engine... Trying XQRL... Trying delegated path engine... FAILED on declare namespace...
Решение

Добавить в classpath библиотеки saxon-x.x.x.jar и saxon-dom-x.x.x.jar из инсталляции soapUI.

пятница, 18 октября 2019 г.

Mockito: проверка, что метод был вызван несколько раз с определенными аргументами

Задача

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

Решение

Тут поможет argument capturing:
ArgumentCaptor<String> argsCaptor = ArgumentCaptor.forClass(String.class);
verify(myMockObj, atLeastOnce()).someMethod(argsCaptor .capture());
List<String> args= argsCaptor.getAllValues();
assertEquals(2, argsCaptor.size());       
assertTrue(argsCaptor.contains("arg1));
assertTrue(argsCaptor.contains("arg2));