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

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

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

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

Общий вид конфигурации политики в .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_all_changes устарело. Вместо него используйте связку правил prevent_creation и prevent_update.

    • prevent_deletion — нельзя удалять ветку или тег.

    • prevent_creation — нельзя создавать ветку или тег.

    • prevent_update — нельзя вносить изменения в ветку или тег после создания (запрещены push, force push, удаление и слияние через предложение изменений).

Подробнее на странице Настроить политику веток в репозитории 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.

Совет

Для групповой фильтрации рекомендуется использовать паттерн **, поскольку простой паттерн * не предусматривает совпадения в выражениях с /.

Совет

Настройка и просмотр конфигураций репозитория доступны в интерфейсе SourceCraft в разделе Настройки репозитория в секции Конфигурации. Подробнее в инструкции Настроить конфигурации репозитория в виде кода.

Автоматическое удаление веток после слияния

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

Правила задаются в секции pull_request.branch_cleanup.matches с помощью фильтров по путям, например:

pull_request:
  branch_cleanup:
    matches: ["**", "!hotfix/**", "!chore/**", "!release/**"]

В этом примере автоматическое удаление включено для всех веток, кроме веток hotfix/**, chore/** и release/**.

Конфигурация в файле .sourcecraft/branches.yaml задает поведение по умолчанию на уровне репозитория. В отдельном предложении изменений этот параметр можно переопределить с помощью опции Удалять ветку-источник после слияния в блоке Настройки слияния. Подробнее на странице Работа с предложениями изменений в SourceCraft.

Схема политики веток в формате 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. The 'prevent_all_changes' value is deprecated; use 'prevent_creation' together with 'prevent_update' instead.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "prevent_force_push",
          "prevent_non_pr_changes",
          "prevent_all_changes",
          "prevent_deletion",
          "prevent_creation",
          "prevent_update"
        ]
      }
    },
    "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"
  ]
}

Важно

Правило prevent_all_changes устарело. Вместо него используйте связку правил prevent_creation и prevent_update.

Полезные ссылки