Политики веток в SourceCraft

Политики веток — это набор правил и ограничений, которые применяются к определенным веткам и тегам в репозитории. С помощью политик вы можете контролировать процесс внесения изменений, обеспечивать ревью кода, соблюдать правильность именования и условия создания веток и тегов, а также защищать ветки от случайных коммитов или прямого пуша.

Например, можно настроить политику так, чтобы в основную ветку попадали только проверенные и одобренные изменения. Таким образом поддерживаются стабильность и качество кода, повышается прозрачность процесса разработки и минимизируется риск ошибок.

Конфигурация политик задается для конкретного репозитория и хранится в файле .sourcecraft/branches.yaml. Для всего репозитория действует конфигурация, которая размещена в основной ветке, например master или main.

Общий вид конфигурации политики в .sourcecraft/branches.yaml:

branch_protection:
          policies:
            - target: <тип_защищаемого_ресурса>
              matches: "<фильтр>"
              message: "<сообщение_пользователю_при_срабатывании>"
              rules:
                - <правило_1>
                - <правило_2>
        

Где:

  • target — тип защищаемого ресурса. Обязательный параметр. Возможные значения:
    • default_branch — основная ветка, например master или main.
    • branch — ветка.
    • tag — тег.
  • matches — фильтр или список фильтров по имени защищаемого ресурса. Обязательный параметр для target: branch и target: tag.
  • message — сообщение, которое будет показываться пользователю при срабатывании политики. Обязательный параметр.
  • rules — правило или список правил, которые будут применены к защищаемому ресурсу. Обязательный параметр. Возможные значения:
    • prevent_force_push — нельзя переписывать историю коммитов в ветке (выполнять force push).
    • prevent_non_pr_changes — нельзя напрямую вносить изменения в ветку (выполнять push), только через пул-реквесты.
    • prevent_all_changes — нельзя выполнять любые действия с веткой или тегом.
    • prevent_deletion — нельзя удалять ветку или тег.
    • prevent_creation — нельзя создавать ветку или тег.

Важно

Скоро перестанет поддерживаться хранение конфигурации CI/CD, правил ревью кода и политик веток в едином файле .src.ci.yaml в корне репозитория. Используйте отдельные файлы .sourcecraft/ci.yaml, .sourcecraft/review.yaml и .sourcecraft/branches.yaml.

Подробнее см. на странице Настроить политику веток в репозитории SourceCraft.

Важно

Обойти правила политики веток, например чтобы поправить конфигурацию в .sourcecraft/branches.yaml, могут только пользователи с ролью Администратор репозитория.

Подробнее см. в разделе Включить обход политики веток для администратора репозитория.

Пример конфигурации

branch_protection:
          policies:
            ## Запрет переписывания истории коммитов, внесения изменений без 
            ## пул-реквеста и удаления основной ветки
            - target: default_branch
              message: "Direct push into main branch is forbidden, create PR first"
              rules:
                - prevent_force_push
                - prevent_non_pr_changes
                - prevent_deletion
        
            ## Запрет создания веток с названиями, соответствующими фильтрам
            - target: branch
              matches: ["*", "!OO-*/**", "!hotfix/**", "!chore/**", "!release/**"]
              message: "Please use proper branch naming"
              rules:
                - prevent_creation
        
            ## Запрет создания тегов с названиями, соответствующими фильтрам
            - target: tag
              matches: "gitcore-*"
              message: "Manual tag creation is forbidden, please use Releaser"
              rules:
                - prevent_creation
        

Также см. пример политики веток в репозитории SourceCraft test-serverless-cube.

Схема политики веток в формате JSON

"branch_protection_policy": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "target": {
              "title": "Policy Target",
              "description": "Type of target this policy is applied to",
              "type": "string",
              "enum": [
                "default_branch",
                "branch",
                "tag"
              ]
            },
            "message": {
              "title": "Error message",
              "description": "Custom message that will be displayed if policy is violated",
              "type": "string"
            },
            "rules": {
              "title": "Rules",
              "description": "Set of rules",
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "prevent_force_push",
                  "prevent_non_pr_changes",
                  "prevent_all_changes",
                  "prevent_deletion",
                  "prevent_creation"
                ]
              }
            },
            "matches": {
              "title": "Glob Match",
              "description": "For tag and branch target, pattern matcher. See globstar patterns for the details",
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              ]
            }
          },
          "required": [
            "target",
            "message",
            "rules"
          ]
        }
        

См. также