Управляем фичами: Feature Toggles в GitLab
Привет, коллеги! Сегодня мы рассмотрим одну из самых полезных практик, которая спасла мне не один проект — Feature Toggles в GitLab CI/CD. Это те самые переключатели, которые позволяют активировать или деактивировать функции без повторного развертывания кода.
Основная польза:
Быстрое развертывание незавершенных фич: код в проде, но скрыт от пользователей.
A/B тестирование: включаем новую фичу для определенной группы пользователей.
Безопасное отключение: если что‑то пошло не так, можем быстро откатиться.
Перейдем сразу к реализации.
Реализация Feature Toggles в GitLab CI/CD
В настройках проекта GitLab переходим в Settings > CI/CD > Variables и добавляем переменную:
Не забудьте установить флажок «Protect variable», чтобы переменная была доступна только защищенным веткам.
Теперь в нашем приложении (предположим, на Python) мы можем использовать эту переменную:
import os
if os.getenv('FEATURE_NEW_COOL_STUFF') == 'true':
# Включаем новую фичу
def new_cool_feature():
print("Новая крутая фича активирована!")
else:
# Старое поведение
def new_cool_feature():
print("Старая добрая функциональность.")
Добавим использование переменной в наш CI/CD пайплайн:
stages:
- deploy
deploy_production:
stage: deploy
script:
- echo "Разворачиваем приложение..."
- echo "Переменная FEATURE_NEW_COOL_STUFF: $FEATURE_NEW_COOL_STUFF"
- python deploy.py
only:
- master
environment:
name: production
Делаем фичу динамически переключаемой
Хорошо, переменную задали, но что, если нам нужно менять состояние фичи без редеплоя? Тут на помощь приходит хранение конфигурации вне приложения, например, в Redis или базе данных.
Предположим, есть Redis‑сервер. Мы можем хранить состояния фичей там.
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
def is_feature_enabled(feature_name):
return r.get(feature_name) == b'true'
if is_feature_enabled('FEATURE_NEW_COOL_STUFF'):
def new_cool_feature():
print("Новая крутая фича активирована!")
else:
def new_cool_feature():
print("Старая добрая функциональность.")
Теперь можно переключать фичу, просто меняя значение в Redis, без перезагрузки приложения.
Безопасность превыше всего
Конечно, нельзя забывать о безопасности.
Не храните секреты в переменных окружения без защиты. Используйте защищенные переменные GitLab.
Валидируйте данные из внешних источников. Никогда не доверяйте данным из Redis или других хранилищ без проверки.
Логируйте изменения фичей. Так вы сможете отследить, кто и когда включил или отключил фичу.
Помимо этого
GitLab предоставляет встроенную поддержку Feature Flags, но она доступна в премиум‑версиях. Если вы счастливчик с такой лицензией, вот как можно это использовать.
Переходим в Operations > Feature Flags и создаем новый флаг:
GitLab использует LaunchDarkly для управления фичами. Нужно установить соответствующий SDK.
pip install launchdarkly-server-sdk
Используем в коде:
import ldclient
from ldclient.config import Config
ldclient.set_config(Config("YOUR_SDK_KEY"))
client = ldclient.get()
if client.variation("new_cool_feature", {"key": "user@example.com"}, False):
def new_cool_feature():
print("Новая крутая фича активирована через Feature Flag!")
else:
def new_cool_feature():
print("Старая функциональность через Feature Flag.")
Не забываем заменить "YOUR_SDK_KEY"
на реальный SDK ключ из LaunchDarkly.
Заключение
Feature Toggles — мощный инструмент, но, как и со всем мощным, с ним нужно обращаться осторожно. Не злоупотребляйте фичами: каждая новая фича добавляет сложность в ваш код. Регулярно проводите «генеральную уборку» — удаляйте ненужные переключатели, чтобы не превратить кодовую базу в спагетти‑код. И, конечно же, документируйте свои фичи. Ваши коллеги (и вы сами через пару месяцев) скажут вам спасибо. Или, по крайней мере, не будут на вас сердиться.
Если у вас есть свой опыт использования Feature Toggles в GitLab CI/CD, поделитесь им в комментариях!
А 16 декабря пройдет открытый урок «Настройка Gitlab runner так, чтобы не пожалеть». Записаться на занятие можно на странице курса «CI/CD на основе GitLab».