barbitoff programmer`s blog

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

пятница, 31 января 2020 г.

bash: ожидание, пока не будет открыт порт

Задача

В bash-скрипте нужно подождать, пока не станет доступен определенный tcp-порт, но ждать нужно не более определенного времени.

Решение
for ((i=0;  i< 10; i++)) do if(nc -q0 localhost 8080 < /dev/null > /dev/null 2>&1) then break; fi; echo "sleeping"; sleep 2; done

Раз в 2 секунды проверяем открытость localhost:8080, но не более 10 проверок. Такой вариант работает в Ubuntu 18.04, а вот с CentOS пришлось убрать -q0 опцию, т.к. она там не поддерживается.

вторник, 28 января 2020 г.

Grafana в Kubernetes: автоматизация развертывания дашбордов

Задача 

Есть JSON/YAML-описания дашбордов для графаны, выкладываемые разработчиками в gitlab. Необходимо в CI/CD-пайплайне автоматизировать развертывание этих дашборд на окружении при условии, что графана установлена внутри Kubernetes.

Решение

На тему автоматизации развертывания дашбордов в случае, когда Grafana работает в Kubernetes, есть отличная статья: https://medium.com/@chris_linguine/how-to-monitor-your-kubernetes-cluster-with-prometheus-and-grafana-2d5704187fc8. В целом, сценарий выглядит следующим образом:
  1. Описания дашбордов пакуем внутрь ConfigMap-объектов Kubernetes и разворачиваем эти объекты в кластере (делаем kubectl apply -f ... внутри нашего CI/CD pipeline)
  2. Графану конфигурируем (путем установки необходимых значений в helm) таким образом, чтобы она разворачивалась с сайдкаром, который будет мониторить наличие ConfigMap-объектов с описаниям дашбордов и "скармливать" эти описания работающей графане.

понедельник, 20 января 2020 г.

bash: echo без перевода строки в конце

Задача

Выполнить echo таким образом, чтобы в конце строки не был добавлен символ line feed. Это бывает нужно, к примеру, если результат echo отправляется куда-то дальше, скажем, в base64, и важно, чтобы в принимающую команду вывод echo пришел в неизменном виде, без лишних переводов строк в конце.

Решение

echo -e "somestring\c"
т.е. включаем обработку управляющих символов, и используем \c, чтобы оставить каретку на текущей строке (см. https://www.opennet.ru/man.shtml?topic=echo&category=1).

пятница, 17 января 2020 г.

GitLab CI cache: WARNING: /home/usr1/.m2/repository/: no matching files

Проблема

Пытаюсь закэшировать репозиторий мавена для GitLab CI/CD пайплайна. Настраиваю:
  cache:
    key: m2_repo
    paths:
      - /home/usr1/.m2/repository/
    policy: pull-push
Однако, при сборке получаю:
WARNING: /root/.m2/repository/: no matching files
Причина 

Кэширование работает только для директорий внутри сборочной директории. Поэтому необходимо сделать так, чтобы репозиторий мавен размещался внутри неё (через -Dmaven.repo.local).

четверг, 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