декабря 21, 2025
15 мин. чтения

Вопросы для собеседования на должность младшего Site Reliability Engineer: Полное руководство

interview
career-advice
job-search
entry-level
Вопросы для собеседования на должность младшего Site Reliability Engineer: Полное руководство
MB

Milad Bonakdar

Автор

Освойте основы SRE с помощью подробных вопросов для собеседования, охватывающих мониторинг, реагирование на инциденты, SLO, автоматизацию, устранение неполадок Linux и методы обеспечения надежности для младших специалистов SRE.


Введение

Site Reliability Engineering (SRE) сочетает в себе разработку программного обеспечения и администрирование систем для создания и эксплуатации крупномасштабных, надежных систем. В качестве начинающего SRE вы будете сосредоточены на мониторинге, реагировании на инциденты, автоматизации и изучении практик обеспечения надежности, которые обеспечивают бесперебойную работу сервисов.

Это руководство охватывает основные вопросы для собеседования для начинающих SRE, организованные по темам, чтобы помочь вам эффективно подготовиться. Каждый вопрос включает подробные ответы, практические примеры и практические сценарии.


Основы SRE

1. Что такое Site Reliability Engineering и чем она отличается от DevOps?

Ответ: SRE — это подход Google к надежной эксплуатации производственных систем в масштабе.

Основные принципы:

  • Рассматривать операции как программную проблему
  • Максимум 50% времени на операционную работу (тяжелый труд)
  • Бюджеты ошибок для балансировки надежности и скорости
  • Беспристрастные посмертные анализы
  • Постепенные развертывания и автоматизированные откаты

SRE против DevOps:

АспектSREDevOps
ФокусНадежность и масштабируемостьСотрудничество и автоматизация
МетрикиSLI, SLO, бюджеты ошибокЧастота развертывания, время выполнения
ПодходПредписывающий (конкретные практики)Философия (культурное движение)
Тяжелый трудЯвно ограничено 50%Конкретно не определено

SRE реализует принципы DevOps с помощью конкретных практик и метрик.

Распространенность: Очень часто
Сложность: Легко


2. Объясните SLI, SLO и бюджеты ошибок.

Ответ: Это основные концепции SRE для измерения и управления надежностью:

SLI (Service Level Indicator):

  • Количественная мера уровня обслуживания
  • Примеры: Задержка, доступность, частота ошибок

SLO (Service Level Objective):

  • Целевое значение для SLI
  • Пример: "99,9% запросов выполняются успешно"

Бюджет ошибок:

  • Допустимая частота отказов (100% - SLO)
  • Используется для балансировки надежности и скорости разработки
# Пример расчета SLI/SLO
def calculate_error_budget(total_requests, failed_requests, slo_target=0.999):
    """
    Рассчитать потребление бюджета ошибок
    
    SLO: 99.9% успешных запросов
    Бюджет ошибок: 0.1% допустимых отказов
    """
    success_rate = (total_requests - failed_requests) / total_requests
    error_rate = failed_requests / total_requests
    
    # Бюджет ошибок: сколько из допустимых 0.1% мы использовали
    allowed_errors = total_requests * (1 - slo_target)
    budget_consumed = (failed_requests / allowed_errors) * 100
    
    return {
        'success_rate': success_rate,
        'error_rate': error_rate,
        'slo_target': slo_target,
        'slo_met': success_rate >= slo_target,
        'error_budget_consumed': budget_consumed,
        'remaining_budget': max(0, 100 - budget_consumed)
    }

# Пример
result = calculate_error_budget(
    total_requests=1000000,
    failed_requests=500,  # 0.05% частота ошибок
    slo_target=0.999
)

print(f"Успешность: {result['success_rate']:.4%}")
print(f"SLO достигнут: {result['slo_met']}")
print(f"Потребленный бюджет ошибок: {result['error_budget_consumed']:.1f}%")

Распространенность: Очень часто
Сложность: Средняя


3. Что такое тяжелый труд и как его уменьшить?

Ответ: Тяжелый труд — это повторяющаяся, ручная операционная работа, которая:

  • Является ручной (требует действий человека)
  • Является повторяющейся
  • Может быть автоматизирована
  • Не имеет долговременной ценности
  • Растет линейно с ростом сервиса

Примеры тяжелого труда:

  • Ручной перезапуск сервисов
  • Копирование файлов между серверами
  • Ручное масштабирование ресурсов
  • Повторяющиеся ответы на тикеты

Стратегии уменьшения тяжелого труда:

# Пример: Автоматизировать перезапуск сервиса
#!/bin/bash
# auto-restart-service.sh

SERVICE_NAME="myapp"
MAX_RETRIES=3
RETRY_DELAY=5

check_service() {
    systemctl is-active --quiet $SERVICE_NAME
    return $?
}

restart_service() {
    echo "$(date): Перезапуск $SERVICE_NAME"
    systemctl restart $SERVICE_NAME
    
    # Ждем, пока сервис стабилизируется
    sleep $RETRY_DELAY
    
    if check_service; then
        echo "$(date): $SERVICE_NAME успешно перезапущен"
        # Отправляем уведомление
        curl -X POST https://alerts.company.com/webhook \
          -d "{\"message\": \"$SERVICE_NAME автоматически перезапущен\"}"
        return 0
    else
        return 1
    fi
}

# Основная логика
if ! check_service; then
    echo "$(date): $SERVICE_NAME не работает"
    
    for i in $(seq 1 $MAX_RETRIES); do
        echo "Попытка $i из $MAX_RETRIES"
        if restart_service; then
            exit 0
        fi
        sleep $RETRY_DELAY
    done
    
    # Все попытки не удались - эскалируем
    echo "$(date): Не удалось перезапустить $SERVICE_NAME после $MAX_RETRIES попыток"
    curl -X POST https://pagerduty.com/api/incidents \
      -d "{\"service\": \"$SERVICE_NAME\", \"severity\": \"critical\"}"
    exit 1
fi

Цель SRE: Поддерживать тяжелый труд ниже 50% времени, автоматизировать остальное.

Распространенность: Очень часто
Сложность: Легко-Средняя


Мониторинг и наблюдаемость

4. В чем разница между мониторингом и наблюдаемостью?

Ответ: Мониторинг: Сбор предопределенных метрик и оповещений

  • Известные-неизвестные: Вы знаете, за чем следить
  • Панели мониторинга, оповещения, метрики
  • Примеры: ЦП, память, частота запросов

Наблюдаемость: Понимание состояния системы по выходным данным

  • Неизвестные-неизвестные: Отладка проблем, которые вы не предвидели
  • Объединенные журналы, метрики, трассировки
  • Можно ответить на произвольные вопросы
Loading diagram...

Три столпа наблюдаемости:

  1. Метрики: Агрегированные числа (ЦП, задержка)
  2. Журналы: Дискретные события
  3. Трассировки: Поток запросов через систему

Пример: Prometheus + Grafana + Loki

# Конфигурация сбора Prometheus
scrape_configs:
  - job_name: 'api-server'
    static_configs:
      - targets: ['localhost:8080']
    metrics_path: '/metrics'
    scrape_interval: 15s

Распространенность: Часто
Сложность: Средняя


5. Как настроить эффективные оповещения?

Ответ: Хорошие оповещения действенны, значимы и не вызывают усталости.

Рекомендации по оповещениям:

1. Оповещать о симптомах, а не о причинах:

# Плохо: Оповещение о высокой загрузке ЦП
- alert: HighCPU
  expr: cpu_usage > 80
  
# Хорошо: Оповещение о влиянии на пользователя
- alert: HighLatency
  expr: http_request_duration_seconds{quantile="0.95"} > 1
  for: 5m
  annotations:
    summary: "Задержка API высокая"
    description: "95-й процентиль задержки составляет {{ $value }}с"

2. Включить ссылки на runbook:

- alert: DatabaseConnectionPoolExhausted
  expr: db_connection_pool_active / db_connection_pool_max > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Пул подключений к базе данных почти исчерпан"
    runbook: "https://wiki.company.com/runbooks/db-connections"

3. Использовать соответствующие уровни серьезности:

# Заслуживает пейджинга (будит кого-то)
- alert: ServiceDown
  expr: up{job="api"} == 0
  for: 1m
  labels:
    severity: critical
    
# Заслуживает тикета (обработка в рабочее время)
- alert: DiskSpaceWarning
  expr: disk_free_percent < 20
  for: 30m
  labels:
    severity: warning

4. Избегать усталости от оповещений:

  • Использовать for: для избежания дребезжания
  • Группировать связанные оповещения
  • Устанавливать соответствующие пороги
  • Регулярно пересматривать и настраивать

Распространенность: Очень часто
Сложность: Средняя


Реагирование на инциденты

6. Опишите свой процесс реагирования на инциденты.

Ответ: Структурированное реагирование на инциденты минимизирует воздействие и время восстановления:

Этапы реагирования на инциденты:

Loading diagram...

1. Обнаружение:

  • Срабатывает оповещение или пользователь сообщает о проблеме
  • Подтверждаем оповещение
  • Создаем канал инцидента

2. Триаж:

# Чек-лист быстрой оценки
- Каково влияние на пользователя?
- Сколько пользователей затронуто?
- Какие сервисы затронуты?
- Становится ли хуже?

3. Смягчение:

# Общие стратегии смягчения
- Откат недавнего развертывания
- Масштабирование ресурсов
- Отключение проблемной функции
- Переключение на резервную систему
- Ограничение скорости трафика

4. Разрешение:

  • Устранение первопричины
  • Проверка возврата метрик в норму
  • Мониторинг на предмет повторного возникновения

5. Посмертный анализ (Беспристрастный):

# Шаблон посмертного анализа инцидента

## Краткое содержание
Краткое описание того, что произошло

## Влияние
- Продолжительность: 2024-11-25 10:00 - 10:45 UTC (45 минут)
- Затронутые пользователи: ~10 000 (5% от общего числа)
- Затронутые сервисы: API, Web Frontend

## Первопричина
Пул подключений к базе данных исчерпан из-за медленных запросов

## Хронология
- 10:00: Сработало оповещение о высокой задержке API
- 10:05: Инженер на дежурстве подтвердил
- 10:10: База данных определена как узкое место
- 10:15: Увеличен размер пула подключений (смягчение)
- 10:30: Определены и убиты медленные запросы
- 10:45: Сервис полностью восстановлен

## Разрешение
- Немедленное: Увеличен пул подключений со 100 до 200
- Краткосрочное: Добавлен таймаут запроса (30 с)
- Долгосрочное: Оптимизировать медленные запросы, добавить мониторинг запросов

## Элементы действий
- [ ] Добавить оповещение для медленных запросов (Владелец: Алиса, Срок: 2024-12-01)
- [ ] Реализовать таймаут запроса в приложении (Владелец: Боб, Срок: 2024-12-05)
- [ ] Просмотреть и оптимизировать 10 самых медленных запросов (Владелец: Чарли, Срок: 2024-12-10)

## Извлеченные уроки
- Мониторинг пула подключений был недостаточным
- Ухудшение производительности запросов осталось незамеченным

Распространенность: Очень часто
Сложность: Средняя


7. Как вы устраняете неполадки сервиса, испытывающего высокую задержку?

Ответ: Систематический подход к отладке:

# 1. Проверяем проблему
curl -w "@curl-format.txt" -o /dev/null -s https://api.example.com/health

# curl-format.txt:
#     time_namelookup:  %{time_namelookup}s\n
#        time_connect:  %{time_connect}s\n
#     time_appconnect:  %{time_appconnect}s\n
#    time_pretransfer:  %{time_pretransfer}s\n
#       time_redirect:  %{time_redirect}s\n
#  time_starttransfer:  %{time_starttransfer}s\n
#                     ----------\n
#          time_total:  %{time_total}s\n

# 2. Проверяем метрики приложения
# - Частота запросов (внезапный скачок?)
# - Частота ошибок (ошибки, вызывающие повторные попытки?)
# - Использование ресурсов (ЦП, память)

# 3. Проверяем зависимости
# - Время запроса к базе данных
# - Вызовы внешних API
# - Частота попадания в кеш

# 4. Проверяем инфраструктуру
top  # Использование ЦП
free -h  # Память
iostat  # Дисковый ввод-вывод
netstat -s  # Сетевая статистика

# 5. Проверяем журналы на наличие ошибок
tail -f /var/log/app/error.log | grep -i "timeout\|slow\|error"

# 6. Профилируем приложение
# Пример Python
import cProfile
cProfile.run('my_function()')

# 7. Проверяем базу данных
# Журнал медленных запросов
SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;

# Активные запросы
SELECT pid, query, state, query_start 
FROM pg_stat_activity 
WHERE state = 'active';

Общие причины:

  • Медленные запросы к базе данных
  • Тайм-ауты внешних API
  • Нехватка памяти (паузы GC)
  • Сетевые проблемы
  • Исчерпание ресурсов
  • Неэффективные пути кода

Распространенность: Очень часто
Сложность: Средняя


Автоматизация и скрипты

8. Напишите скрипт для проверки работоспособности сервиса и его перезапуска при необходимости.

Ответ: Скрипт проверки работоспособности и автоматического восстановления:

#!/usr/bin/env python3
"""
Проверка работоспособности сервиса с возможностью автоматического перезапуска
"""
import requests
import subprocess
import time
import sys
from datetime import datetime

class ServiceMonitor:
    def __init__(self, service_name, health_url, max_retries=3):
        self.service_name = service_name
        self.health_url = health_url
        self.max_retries = max_retries
    
    def check_health(self):
        """Проверяем, работоспособен ли сервис"""
        try:
            response = requests.get(
                self.health_url,
                timeout=5
            )
            return response.status_code == 200
        except requests.exceptions.RequestException as e:
            print(f"{datetime.now()}: Проверка работоспособности не удалась: {e}")
            return False
    
    def restart_service(self):
        """Перезапускаем сервис с помощью systemctl"""
        try:
            print(f"{datetime.now()}: Перезапуск {self.service_name}")
            subprocess.run(
                ['systemctl', 'restart', self.service_name],
                check=True,
                capture_output=True
            )
            time.sleep(10)  # Ждем, пока сервис запустится
            return True
        except subprocess.CalledProcessError as e:
            print(f"{datetime.now()}: Перезапуск не удался: {e.stderr}")
            return False
    
    def send_alert(self, message, severity='warning'):
        """Отправляем оповещение в систему мониторинга"""
        try:
            requests.post(
                'https://alerts.company.com/webhook',
                json={
                    'service': self.service_name,
                    'message': message,
                    'severity': severity,
                    'timestamp': datetime.now().isoformat()
                },
                timeout=5
            )
        except Exception as e:
            print(f"Не удалось отправить оповещение: {e}")
    
    def monitor(self):
        """Основной цикл мониторинга"""
        if self.check_health():
            print(f"{datetime.now()}: {self.service_name} работоспособен")
            return 0
        
        print(f"{datetime.now()}: {self.service_name} неработоспособен")
        self.send_alert(f"{self.service_name} не работает", severity='warning')
        
        # Попытка перезапуска
        for attempt in range(1, self.max_retries + 1):
            print(f"Попытка перезапуска {attempt}/{self.max_retries}")
            
            if self.restart_service() and self.check_health():
                print(f"{datetime.now()}: Сервис восстановлен")
                self.send_alert(
                    f"{self.service_name} автоматически восстановился после перезапуска",
                    severity='info'
                )
                return 0
            
            time.sleep(5)
        
        # Все попытки не удались
        print(f"{datetime.now()}: Не удалось восстановить сервис")
        self.send_alert(
            f"{self.service_name} не удалось восстановить после {self.max_retries} попыток",
            severity='critical'
        )
        return 1

if __name__ == '__main__':
    monitor = ServiceMonitor(
        service_name='myapp',
        health_url='http://localhost:8080/health'
    )
    sys.exit(monitor.monitor())

Распространенность: Часто
Сложность: Средняя


Практики обеспечения надежности

9. Что такое runbook и почему он важен?

Ответ: Runbook — это документированная процедура для обработки операционных задач и инцидентов.

Структура Runbook:

# Runbook: Высокая задержка API

## Симптомы
- 95-й процентиль задержки API > 1 секунды
- Жалобы пользователей на медленную загрузку страниц
- Срабатывает оповещение: "HighAPILatency"

## Серьезность
**Предупреждение** — Ухудшает пользовательский опыт, но сервис функционален

## Этапы исследования

### 1. Проверяем текущие метрики
```bash
# Проверяем распределение задержки
curl -s http://prometheus:9090/api/v1/query?query='histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))'

# Проверяем частоту запросов
curl -s http://prometheus:9090/api/v1/query?query='rate(http_requests_total[5m])'

2. Определяем узкое место

  • Проверяем время запроса к базе данных
  • Проверяем вызовы внешних API
  • Проверяем частоту попадания в кеш
  • Просматриваем недавние развертывания

3. Проверяем зависимости

# Подключения к базе данных
mysql -e "SHOW PROCESSLIST;"

# Задержка Redis
redis-cli --latency

# Внешние API
curl -w "%{time_total}\n" -o /dev/null -s https://external-api.com/health

Этапы смягчения

Быстрые исправления (< 5 минут)

  1. Масштабируем экземпляры приложения
kubectl scale deployment api --replicas=10
  1. Временно увеличиваем TTL кеша
redis-cli CONFIG SET maxmemory-policy allkeys-lru

Если проблема не исчезнет

  1. Откатываем недавнее развертывание
kubectl rollout undo deployment/api
  1. Включаем ограничение скорости
kubectl apply -f rate-limit-config.yaml

Разрешение

  • Устраняем первопричину (медленный запрос, неэффективный код)
  • Развертываем исправление
  • Мониторим в течение 30 минут
  • Масштабируем обратно к нормальной емкости

Эскалация

Если не удается разрешить в течение 30 минут:

  • Эскалируем на: @backend-team
  • Канал Slack: #incidents
  • Дежурный: Используйте политику эскалации PagerDuty

Связанные


**Почему runbook важны:**
- Более быстрое реагирование на инциденты
- Последовательные процедуры
- Обмен знаниями
- Снижение стресса во время инцидентов
- Инструмент обучения для новых членов команды

**Распространенность:** Часто  
**Сложность:** Легко

---

### 10. Объясните концепцию изящной деградации.

**Ответ:**
**Изящная деградация** означает, что система продолжает работать с пониженной производительностью при отказе компонентов, а не полностью выходит из строя.

**Стратегии:**

**1. Feature Flags:**
```python
# Отключаем некритичные функции при высокой нагрузке
class FeatureFlags:
    def __init__(self):
        self.flags = {
            'recommendations': True,
            'analytics': True,
            'search_autocomplete': True
        }
    
    def is_enabled(self, feature):
        # Отключаем некритичные функции, если бюджет ошибок низкий
        if self.error_budget_low():
            non_critical = ['analytics', 'search_autocomplete']
            if feature in non_critical:
                return False
        return self.flags.get(feature, False)
    
    def error_budget_low(self):
        # Проверяем, если бюджет ошибок < 20%
        return get_error_budget() < 0.2

# Использование
flags = FeatureFlags()
if flags.is_enabled('recommendations'):
    show_recommendations()
else:
    # Изящная деградация - показываем статический контент
    show_popular_items()

2. Circuit Breaker:

from enum import Enum
import time

class CircuitState(Enum):
    CLOSED = "closed"  # Нормальная работа
    OPEN = "open"      # Сбой, отклоняем запросы
    HALF_OPEN = "half_open"  # Проверяем восстановление

class CircuitBreaker:
    def __init__(self, failure_threshold=5, timeout=60):
        self.failure_threshold = failure_threshold
        self.timeout = timeout
        self.failures = 0
        self.last_failure_time = None
        self.state = CircuitState.CLOSED
    
    def call(self, func, *args, **kwargs):
        if self.state == CircuitState.OPEN:
            if time.time() - self.last_failure_time > self.timeout:
                self.state = CircuitState.HALF_OPEN
            else:
                # Возвращаем fallback вместо вызова сбойного сервиса
                return self.fallback()
        
        try:
            result = func(*args, **kwargs)
            self.on_success()
            return result
        except Exception as e:
            self.on_failure()
            return self.fallback()
    
    def on_success(self):
        self.failures = 0
        self.state = CircuitState.CLOSED
    
    def on_failure(self):
        self.failures += 1
        self.last_failure_time = time.time()
        if self.failures >= self.failure_threshold:
            self.state = CircuitState.OPEN
    
    def fallback(self):
        # Возвращаем закешированные данные или ответ по умолчанию
        return {"status": "degraded", "data": []}

# Использование
breaker = CircuitBreaker()
result = breaker.call(external_api_call, user_id=123)

3. Timeouts and Retries:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

def create_resilient_session():
    session = requests.Session()
    
    # Стратегия повторных попыток
    retry = Retry(
        total=3,
        backoff_factor=0.3,
        status_forcelist=[500, 502, 503, 504]
    )
    
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    
    return session

# Использование с таймаутом
session = create_resilient_session()
try:
    response = session.get('https://api.example.com/data', timeout=5)
except requests.exceptions.Timeout:
    # Изящная деградация - используем закешированные данные
    response = get_cached_data()

Распространенность: Часто
Сложность: Средняя


Основы контейнеризации

11. Что такое Docker и чем он отличается от виртуальных машин?

Ответ: Docker — это платформа контейнеризации, которая упаковывает приложения с их зависимостями.

Контейнеры против виртуальных машин:

Loading diagram...

Основные различия:

ФункцияКонтейнерыВиртуальные машины
Время запускаСекундыМинуты
РазмерМБГБ
Использование ресурсовЛегкоеТяжелое
ИзоляцияУровень процессаУровень оборудования
ОСОбщая ОС хостаОтдельная ОС для каждой ВМ

Основы Docker:

# Скачиваем образ
docker pull nginx:latest

# Запускаем контейнер
docker run -d \
  --name my-nginx \
  -p 8080:80 \
  nginx:latest

# Список запущенных контейнеров
docker ps

# Просмотр журналов
docker logs my-nginx

# Выполняем команду в контейнере
docker exec -it my-nginx bash

# Останавливаем контейнер
docker stop my-nginx

# Удаляем контейнер
docker rm my-nginx

Пример Dockerfile:

# Базовый образ
FROM python:3.9-slim

# Устанавливаем рабочий каталог
WORKDIR /app

# Копируем зависимости
COPY requirements.txt .

# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt

# Копируем код приложения
COPY . .

# Открываем порт
EXPOSE 8000

# Проверка работоспособности
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8000/health || exit 1

# Запускаем приложение
CMD ["python", "app.py"]

Сборка и запуск:

# Собираем образ
docker build -t myapp:1.0 .

# Запускаем с переменными окружения
docker run -d \
  --name myapp \
  -p 8000:8000 \
  -e DATABASE_URL=postgres://db:5432/mydb \
  -e LOG_LEVEL=info \
  myapp:1.0

# Просмотр использования ресурсов
docker stats myapp

Docker Compose (Multi-container):

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://db:5432/mydb
    depends_on:
      - db
      - redis
    restart: unless-stopped
  
  db:
    image: postgres:14
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
  
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

Запускаем с Docker Compose:

# Запускаем все сервисы
docker-compose up -d

# Просмотр журналов
docker-compose logs -f web

# Масштабируем сервис
docker-compose up -d --scale web=3

# Останавливаем все сервисы
docker-compose down

Рекомендации:

  • Используйте официальные базовые образы
  • Минимизируйте количество слоев
  • Не запускайте от имени root
  • Используйте .dockerignore
  • Правильно помечайте образы тегами
  • Сканируйте на наличие уязвимостей

Распространенность: Очень часто
Сложность: Легко-Средняя


Контроль версий и развертывание

12. Объясните рабочие процессы Git и как вы обрабатываете развертывания.

Ответ: Git необходим для контроля версий и автоматизации развертывания.

Общий рабочий процесс Git:

Loading diagram...

Основные команды Git:

# Клонируем репозиторий
git clone https://github.com/company/repo.git
cd repo

# Создаем ветку для фичи
git checkout -b feature/add-monitoring

# Вносим изменения и коммитим
git add .
git commit -m "Add Prometheus monitoring"

# Отправляем в удаленный репозиторий
git push origin feature/add-monitoring

# Обновляем из main
git checkout main
git pull origin main
git checkout feature/add-monitoring
git rebase main

# Сливаем фичу (после одобрения PR)
git checkout main
git merge feature/add-monitoring
git push origin main

Стратегия ветвления:

1. Gitflow:

  • main: Код, готовый к производству
  • develop: Ветка интеграции
  • feature/*: Новые фичи
  • release/*: Подготовка релиза
  • hotfix/*: Срочные исправления

2. Trunk-Based Development:

# Кратковременные ветки для фич
git checkout -b feature/quick-fix
# Работаем < 1 дня
git push origin feature/quick-fix
# Сливаем в main сразу
Newsletter subscription

Еженедельные советы по карьере, которые действительно работают

Получайте последние идеи прямо на вашу почту

Похожие посты

Decorative doodle

Создайте резюме, которое поможет вам устроиться на 60% быстрее

За несколько минут создайте персонализированное резюме, совместимое с ATS, которое доказано увеличивает количество собеседований в 6 раз.

Создать лучшее резюме

Поделиться этим постом

Сократите Время Написания Резюме на 90%

Средний соискатель тратит более 3 часов на форматирование резюме. Наш ИИ делает это менее чем за 15 минут, ускоряя переход к этапу подачи заявки в 12 раз.