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

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

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

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

Совет

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

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

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

Важно

Обойти правила политики веток, например чтобы поправить конфигурацию в .src.ci.yaml, могут только пользователи с ролью Repository admin.

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

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

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"
  ]
}

См. также