Шаблоны CI/CD и конфигов качества
Минимальные каркасы конфигов для контура из стандарта «Исходники в git, линт и quality gate». Это скелеты для адаптации под инфраструктуру конкретного проекта, а не готовые к запуску файлы: пути, образы и команды деплоя нужно заменить на свои.
Схема пайплайна
Заголовок раздела «Схема пайплайна»flowchart LR
A[Push / MR] --> B[Pre-commit локально]
A --> C[CI: build pipeline]
C --> L[Lint: BSL LS + v8-code-style]
C --> T[Tests: unit/integration]
C --> S[Sonar analysis]
S --> Q{Quality Gate}
Q -->|fail| R[Мердж заблокирован]
Q -->|pass| M[Мердж в main]
M --> P[Артефакты: cf/cfe/dt]
P --> D1[Deploy: DEV/Test]
D1 --> D2{Ручное подтверждение}
D2 -->|да| D3[Deploy: PROD]
D2 -->|нет| STOP[Стоп]
D3 --> RB[План отката: dt backup/restore]
GitLab CI
Заголовок раздела «GitLab CI»stages: [lint, test, sonar, build, deploy]
variables: GIT_DEPTH: "50" SONAR_USER_HOME: "$CI_PROJECT_DIR/.sonar"
lint: stage: lint image: eclipse-temurin:21-jre script: - java -jar tools/bsl-language-server.jar -a . artifacts: when: always paths: - bsl-ls-report.xml allow_failure: false
test: stage: test script: - oscript tools/vrunner.os run --settings ./env.json --command "test" artifacts: when: always paths: - build/test-results/ allow_failure: false
sonar: stage: sonar image: sonarsource/sonar-scanner-cli:latest script: - sonar-scanner allow_failure: false
build: stage: build script: - oscript tools/vrunner.os compile --src ./src --out ./dist/1cv8.cf artifacts: paths: - dist/ only: - main
deploy_dev: stage: deploy script: - oscript tools/vrunner.os deploy --target dev --artifact ./dist/1cv8.cf when: manual only: - mainGitHub Actions
Заголовок раздела «GitHub Actions»name: ci
on: pull_request: push: branches: [ "main" ]
jobs: lint_test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Setup Java uses: actions/setup-java@v4 with: distribution: temurin java-version: "21"
- name: Lint (BSL LS) run: | java -jar tools/bsl-language-server.jar -a .
- name: Tests (vrunner) run: | oscript tools/vrunner.os run --settings ./env.json --command "test"
sonar_quality_gate: needs: lint_test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Sonar scan run: sonar-scanner - name: Quality gate uses: SonarSource/sonarqube-quality-gate-action@v1Конфиг SonarQube
Заголовок раздела «Конфиг SonarQube»Структура — по документации плагина:
sonar.projectKey=company-1c-projectsonar.projectName=Company 1C Projectsonar.sources=srcsonar.sourceEncoding=UTF-8sonar.language=bslКонфиг BSL Language Server
Заголовок раздела «Конфиг BSL Language Server»Файл кладётся в корень репозитория с исходниками 1С. Профиль ниже — стартовый
профиль диагностик, собранный из всех diagnostic:-ключей, на которые
ссылаются наши стандарты (каждый ключ проверен по документации BSL LS):
parameters гарантированно включает диагностику (даже если она выключена по
умолчанию), metadata поднимает серьёзность блокирующих. Остальные диагностики
BSL LS остаются в состоянии по умолчанию (mode: ON).
{ "$schema": "https://1c-syntax.github.io/bsl-language-server/configuration/schema.json", "language": "ru", "diagnostics": { "computeTrigger": "onSave", "mode": "ON", "parameters": { "BeginTransactionBeforeTryCatch": true, "CodeOutOfRegion": true, "CommentedCode": true, "CommitTransactionOutsideTryCatch": true, "CommonModuleNameClientServer": true, "CommonModuleNameServerCall": true, "CreateQueryInCycle": true, "DataExchangeLoading": true, "DisableSafeMode": true, "ExecuteExternalCode": true, "ExternalAppStarting": true, "FieldsFromJoinsWithoutIsNull": true, "IsInRoleMethod": true, "JoinWithSubQuery": true, "JoinWithVirtualTable": true, "LineLength": { "maxLineLength": 120 }, "LogicalOrInJoinQuerySection": true, "MethodSize": true, "MissingCodeTryCatchEx": true, "MissingParameterDescription": true, "MissingReturnedValueDescription": true, "MultilingualStringHasAllDeclaredLanguages": true, "NestedStatements": true, "NonStandardRegion": true, "PairingBrokenTransaction": true, "PublicMethodsDescription": true, "QueryNestedFieldsByDot": true, "ScheduledJobHandler": true, "ServerSideExportFormMethod": true, "TimeoutsInExternalResources": true, "TransferringParametersBetweenClientAndServer": true, "UsingExternalCodeTools": true, "UsingHardcodeSecretInformation": true, "WrongUseOfRollbackTransactionMethod": true }, "metadata": { "UsingHardcodeSecretInformation": { "severity": "BLOCKER" }, "DisableSafeMode": { "severity": "CRITICAL" }, "ExecuteExternalCode": { "severity": "CRITICAL" }, "PairingBrokenTransaction": { "severity": "CRITICAL" }, "CommitTransactionOutsideTryCatch": { "severity": "CRITICAL" } } }}Частая ошибка: ключа severityOverrides в схеме BSL LS нет — серьёзность
переопределяется через diagnostics.metadata (поля severity,
lspSeverity), а включение/выключение и параметры — через
diagnostics.parameters.
Соответствие «диагностика → стандарт»
Заголовок раздела «Соответствие «диагностика → стандарт»»Профиль выводится из стандартов, а не наоборот: диагностика попадает в список, только если на неё ссылается страница стандарта (замечание линтера ведёт к правилу «почему и как исправить»).
| Диагностика | Стандарт |
|---|---|
BeginTransactionBeforeTryCatch, CommitTransactionOutsideTryCatch, PairingBrokenTransaction, WrongUseOfRollbackTransactionMethod |
STD-GEN-001 Короткие транзакции |
NonStandardRegion, CodeOutOfRegion, CommentedCode |
STD-GEN-002 Структура модуля |
MissingCodeTryCatchEx |
STD-GEN-003 Обработка ошибок |
UsingHardcodeSecretInformation, ExecuteExternalCode |
STD-GEN-004 Секреты и техпользователь |
MultilingualStringHasAllDeclaredLanguages |
STD-GEN-005 НСтр и локализация |
NestedStatements, LineLength, MethodSize, CommentedCode |
STD-GEN-006 Код-стайл |
QueryNestedFieldsByDot |
STD-GEN-008 Паттерны БСП |
ServerSideExportFormMethod, TransferringParametersBetweenClientAndServer |
STD-GEN-010 Минимум серверных вызовов |
DataExchangeLoading |
STD-GEN-011 ОбменДанными.Загрузка |
IsInRoleMethod |
STD-GEN-013 Роли — минимальные привилегии |
ScheduledJobHandler |
STD-GEN-014 Регламентные задания |
CommonModuleNameClientServer, CommonModuleNameServerCall |
STD-GEN-015 Слои общих модулей |
DisableSafeMode, UsingExternalCodeTools |
STD-GEN-016 Внешние отчёты и обработки |
CreateQueryInCycle |
STD-OPT-001 Запросы не в цикле, STD-GEN-017 ВПФ |
JoinWithSubQuery, JoinWithVirtualTable, FieldsFromJoinsWithoutIsNull, LogicalOrInJoinQuerySection |
STD-OPT-006 Соединения в запросах |
TimeoutsInExternalResources |
STD-INT-005 Долгие операции — асинхронно |
ExternalAppStarting |
STD-INT-006 HTTP вместо COM |
PublicMethodsDescription, MissingParameterDescription, MissingReturnedValueDescription |
STD-PROC-003 Документация в задаче |
Процедура отката поставки
Заголовок раздела «Процедура отката поставки»Корпоративная норма из исследования — каждая поставка разворачивается из CI и имеет план отката:
- Перед применением релиза — резервная копия (
/DumpIBили бэкап СУБД). - Применение изменений:
ibcmd infobase config apply(при необходимости--dynamic) либо загрузка.cf/.cfeконфигуратором в пакетном режиме. - Smoke-набор после применения; не прошёл — откат на резервную копию.
Выгрузка исходников для git: /DumpConfigToFiles (формат фиксируется явно,
например Hierarchical), обратная загрузка — /LoadConfigFromFiles.
См. также
Заголовок раздела «См. также»- Исходники в git, линт и quality gate — стандарт, который эти конфиги реализуют.
- Источники и инструменты — ссылки на BSL LS, Sonar-плагин, vanessa-runner, шаблоны проектов.