Перейти к содержимому

Шаблоны 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.yml
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:
- main
.github/workflows/ci.yml
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

Структура — по документации плагина:

sonar-project.properties
sonar.projectKey=company-1c-project
sonar.projectName=Company 1C Project
sonar.sources=src
sonar.sourceEncoding=UTF-8
sonar.language=bsl

Файл кладётся в корень репозитория с исходниками 1С. Профиль ниже — стартовый профиль диагностик, собранный из всех diagnostic:-ключей, на которые ссылаются наши стандарты (каждый ключ проверен по документации BSL LS): parameters гарантированно включает диагностику (даже если она выключена по умолчанию), metadata поднимает серьёзность блокирующих. Остальные диагностики BSL LS остаются в состоянии по умолчанию (mode: ON).

.bsl-language-server.json
{
"$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 и имеет план отката:

  1. Перед применением релиза — резервная копия (/DumpIB или бэкап СУБД).
  2. Применение изменений: ibcmd infobase config apply (при необходимости --dynamic) либо загрузка .cf/.cfe конфигуратором в пакетном режиме.
  3. Smoke-набор после применения; не прошёл — откат на резервную копию.

Выгрузка исходников для git: /DumpConfigToFiles (формат фиксируется явно, например Hierarchical), обратная загрузка — /LoadConfigFromFiles.