В некоторых случаях значение переменной окружения или какого-либо параметра не может быть использовано из-за содержания недопустимых символов
Чтобы учесть ограничения применяемые к именам Docker-образов, Helm-релизам и namespace в Kubernetes, werf при необходимости применяет широко используемый алгоритм слагификации (slug, slugify — преобразование текста к виду, удобному для восприятия человеком). Согласно этому алгоритму, недопустимые символы исключаются из текста, и в то же время гарантируется уникальность преобразованной строки и ее однозначное соответствие с исходной строкой.
werf три разных типа слагификации в следующих случаях:
- Слагификация имени Helm-релиза.
- Слагификация namespace Kubernetes.
- Слагификация Docker-тега.
Для использования каждого типа слагификации у werf есть отдельные команды, которые вы можете использовать по мере необходимости.
Базовый алгоритм
werf проверяет текст на соответствие требованиям и, если текст им удовлетворяет, то werf не изменяет его. Иначе, werf выполняет трансформацию текста таким образом, чтобы он соответствовал требованиям и добавляет через дефис хэш-суффикс, вычисленный на основе исходного текста. Алгоритм вычисления хэша — MurmurHash.
При выполнении трансформации текста для слагификации выполняются следующие шаги::
- Латинские символы в кодировке UTF-8 конвертируются в их соответствующие ASCII-коды;
- Специальные символы, такие как
~><+=:;.,[]{}()_&
, заменяются на знак дефиса-
; - Удаляются оставшиеся, не распознанные символы (остаются только буквенноцифровые символы в нижнем регистре и дефисы);
- Удаляются символы дефиса в начале и в конце текста;
- Последовательности символов дефиса сокращаются до одного.
- Получившийся текст обрезается для соответствия ограничению на длину строки.
Преобразования согласно базового алгоритма слагификации достаточно жесткие, удовлетворяют любым требованиям, и поэтому применяются при всех типах слагификации
Требования к именам Helm-релизов
- содержат только буквенноцифровые ASCII-символы, символы подчеркивания и дефисы;
- длина не более 53 байт.
Требования к namespace Kubernetes (являются требованиями к именам DNS)
- содержат только буквенноцифровые ASCII-символы и дефисы;
- длина не более 63 байт.
Требования к Docker-тегам
- содержат отображаемые ASCII-символы — буквенные в любом регистре, цифры, символы подчеркивания, точки и дефисы;
- длина не более 128 байт.
Использование
Слагификация может применяться к произвольному тексту с помощью команды werf slugify
.
Также, werf автоматически применяет слагификацию при работе с CI/CD системами, например GitLab CI. Читай про подключение CI/CD подробнее. Основные принципы:
- слагификация автоматически применяется к ресурсам, полученным от окружения CI/CD системы;
- слагификация не применяется автоматически к параметрам, указанным вручную с помощью опций
--tag-*
,--release
или--namespace
, но выполняется проверка на соответствие параметров требованиям слагификации.
Чтобы слагифицировать вручную параметры, указываемые с помощью опций --tag-*
, --release
или --namespace
, необходимо явно выполнить команду werf slugify
, например:
werf publish --tag-git-branch $(werf slugify --format docker-tag "Features/MyBranch#123") ...
werf deploy --release $(werf slugify --format helm-release "MyProject/1") --namespace $(werf slugify --format kubernetes-namespace "MyProject/1") ...