Досталась по работе задача прикрутить к CI поддержку нескольких веток разработки. Например ветка development это текущий код, который давно поддерживается, но уже есть планы перевести его в разряд наследия и начать с чистого листа в лучших AI практиках.
Разработчики заводят новую ветку development-X.Y в которую заливается код "не имеющий ничего общего" с кодом в ветке development. Проблема в том что CI не поддерживает такой сценарий и как только будет выпущена версия X.Y.0, то собьётся версионирование в ветке development чего нужно избежать.
За версионирование в CI отвечает shell портянка строк на 200. Благо к ней есть тесты, написанные для bats и это большое благо, иначе количество сюрпризов повысилось бы кратно.
Вот несколько интересных граблей, на которые наступил в процессе:
Добавил новый параметр для фильтрации версий local filter="$10" - тесты отвалились, т.к. в значении переменной filter было "имя_сценария0", а не "0.[0-9]+" как должно было быть. Дело в том что bash трактует "$10" как обращение к первому параметру к которому в строке добавили ноль. Чтобы этого не происходило нужно писать local filter="${10}". Забавно что shellcheck на такое не ругается.
Когда добрался до сравнения версий, которое было сделано в виде хака version() { echo "$@" | awk -F. '{ printf("%d%03d%03d\n", $1,$2,$3); }'; } нашёл "спящую" ошибку, которая проявится спустя какое-то время. При использовании такой функции версия 0.48.0 на выходе имела вид 0048000, но если в начале числа стоит 0, то bash воспринимает его как восьмеричное число и ловит ошибку -bash: [[: 0048000: value too great for base (error token is "0048000").




