Политики веток в 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"
]
}