Управляем фичами: Feature Toggles в GitLab

ba280966af57226ea4b734ea13f65bb5.png

Привет, коллеги! Сегодня мы рассмотрим одну из самых полезных практик, которая спасла мне не один проект — 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».

© Habrahabr.ru