diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 32a70d8..7447e19 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,3 +1,4 @@ + name: Публикация релиза on: @@ -10,7 +11,6 @@ jobs: release: uses: autumn-library/workflows/.github/workflows/release.yml@main with: - oscript_version: '1.8.4' package_mask: "vanessa-ci-scripts-*.ospx" secrets: PUSH_TOKEN: ${{ secrets.PUSH_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..b596a41 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,17 @@ + +name: Тестирование + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + test: + strategy: + fail-fast: false + matrix: + oscript_version: ['default'] + uses: autumn-library/workflows/.github/workflows/test.yml@main + with: + oscript_version: ${{ matrix.oscript_version }} diff --git a/.gitignore b/.gitignore index 14571c4..f6b65ad 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,9 @@ [Oo]ut bdd-*.xml -[Cc]overage/* +[Cc]overage +*.log *.ospx oscript_modules/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6dad138..28cb0c6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,32 +3,154 @@ before_script: - CHCP 65001 stages: - - .pre - build + - test - report - release -install-oscript: +health check: stage: .pre + variables: + GIT_STRATEGY: none + when: on_success + tags: + - OneS + script: + - choco list + - scoop list + timeout: 10m + +install-chocolatey: + stage: .pre + variables: + GIT_STRATEGY: none when: manual tags: - OneScript + script: + - Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) + timeout: 10m + +install-chocolatey-curl-dependencies: + stage: .pre variables: - OVM_DOWNLOAD_URL: https://github.com/oscript-library/ovm/releases/download/v1.2.1/ovm.exe + GIT_STRATEGY: none + when: manual + tags: + - OneScript + script: + - choco install -r --no-progress curl -y + timeout: 10m + needs: + - job: install-chocolatey + +install-chocolatey-java-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneScript + script: + - choco install -r --no-progress libericajdk -y + timeout: 10m + needs: + - job: install-chocolatey + +install-scoop: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneScript + script: + - Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser; + Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression + timeout: 10m + +install-scoop-allure-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneScript + script: + - scoop install allure + timeout: 10m + needs: + - job: install-scoop + +install-scoop-sonar-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneScript + script: + - scoop install sonar-scanner + timeout: 10m + needs: + - job: install-scoop + +install-scoop-git-cliff-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneScript + script: + - scoop install git-cliff + timeout: 10m + needs: + - job: install-scoop + +install-scoop-releasecli-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneScript + script: + - scoop install gitlab-release-cli + timeout: 10m + needs: + - job: install-scoop + +install-oscript: + stage: .pre + variables: + GIT_STRATEGY: none + OVM_DOWNLOAD_URL: https://github.com/oscript-library/ovm/releases/download/v1.2.2/ovm.exe OPM_DOWNLOAD_URL: https://github.com/oscript-library/opm/releases/download/v1.0.4/opm-1.0.4.ospx + when: manual + tags: + - OneScript script: - tools\scripts\install-oscript-local.bat timeout: 10m + needs: + - job: install-chocolatey + - job: install-chocolatey-curl-dependencies install-package-dependencies: stage: .pre + variables: + GIT_STRATEGY: none when: manual tags: - OneScript script: - - opm install opm; - opm install + # устанавливаем 'opm' и устанавливаем зависимости 'vanessa-ci-scripts' из 'packagedef' + - opm install opm; + opm install timeout: 10m + needs: + - job: install-oscript build: stage: build @@ -37,7 +159,7 @@ build: tags: - OneScript script: - - tools\scripts\build-package.bat + - opm run build # get the job id and save it as environment statement - echo BUILD_JOB_ID=$CI_JOB_ID >> CI_JOB_ID.env timeout: 10m @@ -52,23 +174,137 @@ build: dotenv: CI_JOB_ID.env expire_in: 30 day +1testrunner: + stage: test + variables: + GIT_STRATEGY: none + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^develop/' + - changes: + - src/* + - features/* + - tasks/* + - tests/* + tags: + - OneScript + script: + - opm run test + timeout: 10m + artifacts: + reports: + junit: + out/junit/*.xml + paths: + - out/junit/ + expire_in: 30 day + +coverage: + stage: test + variables: + GIT_STRATEGY: none + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + - changes: + - src/* + - features/* + - tasks/* + - tests/* + tags: + - OneScript + script: + - opm run coverage + timeout: 10m + artifacts: + reports: + coverage_report: + coverage_format: cobertura + path: coverage/coverage.xml + junit: + out/genericexec/*.xml + paths: + - coverage/ + - out/genericexec/ + expire_in: 30 day + needs: + - job: 1testrunner + SonarQube: stage: report - rules: - - !reference [build, rules] variables: GIT_STRATEGY: clone SONAR_SCANNER_OPTS: "-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Xmx6G" allow_failure: true + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + - changes: + - src/* + - features/* + - tasks/* + - tests/* + tags: + - OneScript + script: + # - $VERSION = sls -Path .\opm-metadata.xml -Pattern "(?\d\.\d\.\d)" -All | % { $_.Matches.Groups } | ? {$_.Name -eq "ver" } | % Value + # - sonar-scanner -D sonar.token=$SONAR_TOKEN -D sonar.projectVersion=$VERSION + - opm run sonar-scanner + timeout: 10m + needs: + - job: coverage + artifacts: true + +Allure: + stage: report + variables: + GIT_STRATEGY: none + allow_failure: true + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^develop/' + - changes: + - src/* + - features/* + - tasks/* + - tests/* + tags: + - OneScript + script: + - opm run allure-generate + timeout: 10m + artifacts: + paths: + - out/allure-report + needs: + - job: 1testrunner + +pages: + stage: report + variables: + GIT_STRATEGY: none + allow_failure: true + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + - changes: + - src/* + - features/* + - tasks/* + - tests/* tags: - OneScript script: - - $VERSION = sls -Path .\opm-metadata.xml -Pattern "(?\d\.\d\.\d)" -All | % { $_.Matches.Groups } | ? {$_.Name -eq "ver" } | % Value - - echo $VERSION - - sonar-scanner -D sonar.token=$SONAR_TOKEN -D sonar.projectVersion=$VERSION + - mkdir public; + move out/allure-report public + timeout: 10m + artifacts: + paths: + - public + needs: + - job: Allure + artifacts: true + - job: SonarQube package: stage: release + variables: + GIT_STRATEGY: none rules: - !reference [build, rules] tags: @@ -87,6 +323,8 @@ package: release: stage: release + variables: + GIT_STRATEGY: none rules: - !reference [build, rules] tags: diff --git a/.vscode/launch.json b/.vscode/launch.json index 813b5d1..29f1485 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -28,6 +28,18 @@ "runtimeArgs": [], "debugPort": 2801 }, + { + "name": "Отладка 1Script: generate", + "type": "oscript", + "request": "launch", + "program": "${workspaceFolder}\\src\\main.os", + "args": ["g"], + "cwd": "${workspaceRoot}", + "env": {}, + "runtimeExecutable": null, + "runtimeArgs": [], + "debugPort": 2801 + }, { "name": "Отладка 1Script: prestage", "type": "oscript", @@ -45,7 +57,31 @@ "type": "oscript", "request": "launch", "program": "${workspaceFolder}\\src\\main.os", - "args": ["run", "test"], + "args": ["run", "hello-world"], + "cwd": "${workspaceRoot}", + "env": {}, + "runtimeExecutable": null, + "runtimeArgs": [], + "debugPort": 2801 + }, + { + "name": "Отладка 1Script: run session-lock env.dev.json", + "type": "oscript", + "request": "launch", + "program": "${workspaceFolder}\\tools\\CI\\scripts\\session-lock.os", + "args": ["${workspaceFolder}\\env.dev.json"], + "cwd": "${workspaceRoot}", + "env": {}, + "runtimeExecutable": null, + "runtimeArgs": [], + "debugPort": 2801 + }, + { + "name": "Отладка 1Script: run hello-world-args fixtures\\env.dev.json", + "type": "oscript", + "request": "launch", + "program": "${workspaceFolder}\\tools\\CI\\scripts\\hello-world-args.os", + "args": ["${workspaceFolder}\\fixtures\\env.dev.json"], "cwd": "${workspaceRoot}", "env": {}, "runtimeExecutable": null, @@ -63,6 +99,18 @@ "runtimeExecutable": null, "runtimeArgs": [], "debugPort": 2801 + }, + { + "name": "Отладка 1Script: tests", + "type": "oscript", + "request": "launch", + "program": "${workspaceFolder}\\tasks\\test.os", + "args": [], + "cwd": "${workspaceRoot}", + "env": {}, + "runtimeExecutable": null, + "runtimeArgs": [], + "debugPort": 2801 } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index ffa7e06..f5433c5 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,34 @@ + # vanessa-ci-scripts -Набор скриптов Continuous Integration for 1C. Устанавливается как библиотека OScript на компьютер с ролью gitlab-runner. -Предназначена для быстрого перехода к использованию gitlab pipeline. +- [vanessa-ci-scripts](#vanessa-ci-scripts) + - [Введение](#введение) + - [Файловая структура](#файловая-структура) + - [Установка](#установка) + - [Использование](#использование) + - [Взаимосвязи заданий](#взаимосвязи-заданий) + - [Шаг ".pre"](#шаг-pre) + - [Шаг "deploy" для вашего проекта](#шаг-deploy-для-вашего-проекта) + - [Настройка](#настройка) + - [Выполнение](#выполнение) + - [Доступные команды](#доступные-команды) + - [Глобальные переменные окружения](#глобальные-переменные-окружения) + - [Возможности доработки](#возможности-доработки) + - [Публикация релиза](#публикация-релиза) + - [Включение отладки](#включение-отладки) + - [Благодарность](#благодарность) + +## Введение -![preview-pipeline](./doc/image/preview-pipeline.png "preview-pipeline") +Набор скриптов Continuous Integration for 1C. Устанавливается как приложение OScript на компьютер с ролью Gitlab-runner. +Предназначена для быстрого перехода к использованию Gitlab pipeline. -## Использование библиотеки +Все требуемые библиотеки и приложения уже есть внутри VCI, по этому для работы pipeline достаточно выполнить установку приложения, чтобы gitsync, vanessa runner etc. выполнялись на runner. + +**parent**: +![preview-pipeline-parent](./doc/image/preview-pipeline-parent.jpg "preview-pipeline-parent") +**child**: +![preview-pipeline-child](./doc/image/preview-pipeline-child.jpg "preview-pipeline-child") Проект опирается на структуру каталогов и файлов настроек из проектов: @@ -15,70 +38,270 @@ **Важно! Если ваш проект отличается от описанных шаблонов, то pipeline выполнится с ошибками.** -В каталоге [```template\test-vci.zip```](./template/test-vci.zip) хранится пример пустого проекта, в котором можно посмотреть структуру и файлы настроек которые требуются для работы ```vanessa-ci-scripts``` +### Файловая структура -### Порядок установки +```shell +├── .vscode/ # Полезные команды и настройки для VSC + ├── settings.json + ├── tasks.json +├── build/ # * Каталог с артефактами + ├── allure-report/ # Сгенерированный отчет allure framework + ├── cfe/ + ├── epf/ + ├── erf/ + ├── ib/ + ├── 1Cv8.cf +├── coverage/ # * Каталог с результатами замеров покрытия кода +├── doc/ # Документация +├── examples/ # Примеры тестов, скриптов или обработок +├── features/ # Сценарии BDD тестирования +├── fixtures/ # Основные зависимости +├── lib/ # Для хранения внешних отчетов и обработок необходимых для работы продукта, разработанные в рамках создания продукта и не являющиеся сторонними разработками +├── out/ # * Каталог с артефактами выполнения тестов +├── public/ # * Каталог для работы GitLab pages +├── src/ # Исходный код проекта + ├── cf/ # Код из конфигурации + ├── cfe/ # Код из расширений + ├── <имя расширения> # + ├── epf/ # Внешние обработки + ├── erf/ # Внешние отчеты +├── tasks/ # Основные таски (opm run <имя-скрипта>) +├── template/ # Эталонные файлы + ├── 1Cv8.dt # Выгрузка эталонной ИБ для тестов +├── tests/ # Модульные тесты (TDD) +└── tools/ # + ├── JSON/ # Файлы настроек для runner'ов etc + ├── vanessabddConf.json # Настройки vanessa add (BDD, vanessa) + ├── vanessatddConf.json # Настройки vanessa add (TDD, xunit) + ├── vaparams.json # Настройки vanessa automation (BDD, vanessa) + ├── scripts/ # Служебные и пользовательские скрипты + ├── install-oscript-local.bat # Скрипт установки OScript + └── syntax-check-excludes.txt # Настройки исключений для синтаксического контроля +├── vendor/ # Для хранения внешних зависимостей - библиотек, конфигураций etc +├── .gitlab-ci.yml # Конфигурационный файл для gitlab pipeline +├── cliff.toml # Настройки формирование CHANGELOG с помощью git-cliff +├── env.json # Параметры окружения для локальной/эталонной ИБ (только для прохождения pipeline) +├── env.prod.json # ** Параметры окружения production ИБ (Используются для шага Deploy) +├── env.dev1.json # ** Параметры окружения dev1 ИБ (Используются для шага Deploy) +├── env.user-testin.json # ** Параметры окружения user-testing ИБ (Используются для шага Deploy) +├── sonar-project.properties # Параметры работы SonarQube +└── README.md # Описание репозитория +``` -Скачайте и установите библиотеку через hub.oscript с помощью скрипта: +`*` - Создается в процессе работы pipeline +`**` - Может быть неограниченное количество. [Смотрите пункт Deploy](#шаг-deploy-для-вашего-проекта) -- [```tools\scripts\install-package-from-hub.bat```](./tools/scripts/install-package-from-hub.bat) +### Установка + +Из hub.oscript: + +```Shell +opm install vanessa-ci-scripts +``` -Или собрав и установив библиотеку из пакета в формате ```.*ospx``` с помощью скриптов: +Или собрав и установив приложение из пакета в формате `.*ospx` с помощью команд: -- [```tools\scripts\build-package.bat```](./tools/scripts/build-package.bat) -- [```tools\scripts\install-package-from-ospx.bat```](./tools/scripts/install-package-from-ospx.bat) +```Shell +opm run build +opm run install +``` -### Порядок использования +### Использование -Чтобы начать работу, нужно клонировать ваш удаленный репозиторий с сервера ```https://gitlab.com/```. +Чтобы начать работу, нужно клонировать ваш удаленный репозиторий с сервера `https://gitlab.com/`. Открыть командную строку в проекте. -И выполните команду: +Выполните команду инициализации: ```Shell vci init ``` -В корне проекта будет создан файл ```.gitlab-ci.yml``` +В корне проекта будет создан файл `.gitlab-ci.yml` и `tools\scripts\install-oscript-local.bat` + Отправьте изменения в удаленный репозиторий, чтобы запустить pipeline +```Shell +git add .gitlab-ci.yml +git add tools\\scripts\\install-oscript-local.bat +git commit -m "ci(vci): Инициализированы файлы настроек pipeline" +git push +``` + +Настройте график выполнения синхронизации с хранилищем +В веб интерфейсе репозитория перейдите в "Build" - "Pipeline schedules" и создайте новое расписание + +![edit-pipeline-schedule](./doc/image/edit-pipeline-schedule.jpg "edit-pipeline-schedule") + +Запустите Pipeline +В веб интерфейсе репозитория перейдите в "Build" - "Pipeline" и нажмите "Run pipeline" +В открывшемся окне выберите branch или tag для запуска и нажмите "Run pipeline" + +### Взаимосвязи заданий + +**parent**: +![needs-pipeline-parent](./doc/image/needs-pipeline-parent.jpg "needs-pipeline-parent") +**child**: +![needs-pipeline-child](./doc/image/needs-pipeline-child.jpg "needs-pipeline-child") + +#### Шаг ".pre" + +Перед началом работы вашего pipeline требуется установить на runner только [git-scm.com](https://git-scm.com/downloads) +Для упрощения, в файл `.gitlab-ci.yml` включен шаг `.pre`, выполните его последовательно и ваш gitlab runner будет готов к работе. + +**Важно! Некоторые программы из шага требуют перезапуска службы gitlab-runner, поэтому, если шаг `install-chocolatey` выполнился успешно, а подчиненные шаги сообщают об ошибке, то перезапустите службы.** + +**Важно2! Служба gitlab-runner должна исполняться из под пользователя Windows (То есть не системная учетная запись).** + +### Шаг "deploy" для вашего проекта + +Отдельно стоит упомянуть о такой части жизненного цикла как `Deploy`. +Это размещение готовой версии программного обеспечения на платформе доступной для использования. + +#### Настройка + +Скачайте в корень вашего проекта файлы с переменными окружения (может быть несколько) + +```Shell +cd <каталог-вашего-проекта> +curl -o env.production.json -O https://raw.githubusercontent.com/vanessa-opensource/vanessa-bootstrap/master/env.json +``` + +Переключите переменные окружения на использование Vanessa-automation + +```Shell +vci run switch-vanessa "env.production.json" +``` + +Имена файлов с переменными окружения должны быть составлены по шаблону `env.*.json`, где `*` - имя окружения (понятное Вам и коллегам), например: + +- `env.production.json` +- `env.user-test.json` +- `env.dev.json` + +Измените значения переменных окружения в соответствии с настройками ваших серверов и ИБ, блок `default` + +```JSON +{ + "$schema": "https://raw.githubusercontent.com/vanessa-opensource/vanessa-runner/develop/vanessa-runner-schema.json", + "default": { + "--ibconnection": "/Fbuild/ib", + "--db-user": "", + "--db-pwd": "", + "--root": ".", + "--workspace": ".", + "--v8version": "8.3.16", + "--locale": "ru", + "--language": "ru", + "--additional": "/DisplayAllFunctions /Lru /iTaxi /TESTMANAGER", + "--ordinaryapp": "-1" + } +} +``` + +Отправьте изменения в удаленный репозиторий + +```Shell +git add env.production.json +git commit -m "ci(vci): Инициализироваы файлы окружения" +git push +``` + +Установите компоненту RAS на серверах 1С и зарегистрируйте как службу ([Ссылка на инструкцию по установки](https://its.1c.ru/db/freshex2/content/509/hdoc)) +Установите компоненту RAC на зарегистрированные gitlab runner + +#### Выполнение + +В веб интерфейсе репозитория перейдите в "Build" - "Pipeline" и нажмите "Run pipeline" +В открывшемся окне: + +- выберите branch, который указан по умолчанию для вашего репозитория +- добавьте переменную с типом "variable", именем "deploy" и значением 1 +- нажмите "Run pipeline" + +![run-pipeline-deploy-variable](./doc/image/run-pipeline-deploy-variable.jpg "run-pipeline-deploy-variable") + +Создастся pipeline с шагами deploy* по количеству файлов переменных окружения в репозитории вашего проекта + +![execute-pipeline-deploy-env](./doc/image/execute-pipeline-deploy-env.jpg "execute-pipeline-deploy-env") + +Выполните его последовательно контролируя результат + +### Доступные команды + +Генерация pipeline: + ```Shell vci generate ``` +**[DEPRECATED]** Подготовка окружения (Скачать ovm, установка локального oscript и библиотек): + ```Shell vci prepare ``` +Выполнение простых команд в рабочей области + ```Shell -vci run +vci run ``` -### Переменные окружения +Доступные имена скриптов: + + +- ```hello-world``` - проверить работоспособность; +- ```create-base``` - создать служебную ИБ из шаблона (```template\1Cv8.dt```) и обновить актуальными исходниками (```src\cf```) в служебном каталоге (```build\ib```); +- ```open``` - открыть клиент предприятия; +- ```designer``` - открыть конфигуратор; +- ```update``` - обновить служебную ИБ из исходных файлов; +- ```compilecf``` - собрать файл конфигурации из исходных файлов; +- ```compilecfe``` - собрать все расширения из исходных файлов; +- ```compileepf``` - собрать внешние отчеты и обработки из исходных файлов; +- ```syntax-check``` - запустить синтаксический контроль конфигурации; +- ```xunit``` - запустить дымовые тесты из ```$addroot\smoke```; +- ```xunit-tests``` - запустить модульные тесты из каталога ```tests```; +- ```vanessa``` - запустить сценарные тесты из каталога ```features```; +- ```coverage``` - ```пока не реализовано```; +- ```allure``` - генерация отчета allure; +- ```allure-open``` - открыть отчет allure; +- ```gitsync-plugins-init``` - включить плагины gitsync; +- ```sync``` - запустить синхронизацию 1С Хранилища и git репозитория проекта (Смотрите переменные окружения, без них не запустится); +- ```close-all-1c-process``` - закрыть сеансы 1С; +- ```sonar``` - запустить sonar-scanner; +- ```generate-changelog``` - сгенерировать 'CHANGELOG.md'; +- ```pages``` - опубликовать страницу GitLab (Только для pipeline). -Используются переменные: +### Глобальные переменные окружения -- GROUP_ACCESS_TOKEN, токен с правами "read_repository, write_repository", для использования [gitsync](https://github.com/oscript-library/gitsync). - -- SONAR_HOST_URL, хост SonarQube -- SONAR_TOKEN, токен доступа к SonarQube -- GITSYNC_V8VERSION, версия 1С Предприятия (Например 8.3.23.1782) -- GITSYNC_STORAGE_USER, GITSYNC_STORAGE_PASSWORD, пользователь и пароль к 1С Хранилищу для синхронизации с git (Например ci-bot) -- GITSYNC_STORAGE_PATH, адрес 1С Хранилища -- GITSYNC_WORKDIR, рабочий каталог в git репозитории для выгрузки исходников конфигурации (Например "./src/cf/") +| Имя | Описание | +|----------------------------|------------------------------------------------------------------------------------------------------------------------------| +| `VCI_GROUP_ACCESS_TOKEN` | токен с правами "read_repository, write_repository", для использования [gitsync](https://github.com/oscript-library/gitsync) | +| `OVM_INSTALL_VERSION` | устанавливаемая версия OScript | +| `OVM_USE_VERSION` | используемая версия OScript | +| `GITSYNC_V8VERSION` | версия 1С Предприятия (Например 8.3.23.1782) | +| `GITSYNC_STORAGE_PATH` | адрес хранилища 1С | +| `GITSYNC_STORAGE_USER` | пользователь к хранилищу 1С для синхронизации с git (Например ci-bot) | +| `GITSYNC_STORAGE_PASSWORD` | пароль к хранилищу 1С для синхронизации с git (Например ci-bot) | +| `GITSYNC_WORKDIR` | рабочий каталог в git репозитории для выгрузки исходников конфигурации (Например "./src/cf/") | +| `GITSYNC_VERBOSE` | вывод отладочной информации в процессе выполнения | +| `SONAR_HOST_URL` | хост SonarQube | +| `SONAR_TOKEN` | токен доступа к проекту SonarQube | +| `VCI_UCCODE` | код разрешения для входа в 1С | +| `VCI_CLUSTER_ADMIN` | администратор кластера 1С | +| `VCI_CLUSTER_PWD` | пароль администратора кластера 1С | +| `VCI_VERBOSE` | вывод отладочной информации в процессе выполнения | -## Возможности доработки библиотеки +## Возможности доработки - откройте issue - если вам не хватает какого то функционала для вашего pipeline -- войдите в чат Телеграм - чтобы задать дополнительные вопросы [![telegram](https://img.shields.io/badge/telegram-chat-green.svg)](https://t.me/oscript_library) +- войдите в чат Телеграм - чтобы задать дополнительные вопросы [![Telegram](https://img.shields.io/badge/telegram-chat-green.svg)](https://t.me/oscript_library) - сделайте fork, внесите изменения и выполните pull request с предлагаемыми вами изменениями (fork и pull request - это кнопки на GitHub|GitLab.) ## Публикация релиза -После внесения изменений требуется изменить версию библиотеки: +После внесения изменений требуется изменить версию приложения: - Изменить функцию ```Версия``` в файле [```src\Модули\ПараметрыПриложения.os```](./src/Модули/ПараметрыПриложения.os) - - Добавить информацию об изменениях в файл [```CHANGELOG.md```](./CHANGELOG.md) - добавить ```tag``` командой ```git tag -a 1.0.1 -m "version 1.0.1"``` и отправить в удаленный репозиторий ```git push origin --tags``` ([Подсказка по работе с тэгами](./doc/git-tag.md)) @@ -89,6 +312,6 @@ vci run ## Благодарность - Opensource сообществу 1C и OneScript -- [Сергею Голованову](https://t.me/GolovanoffSergio) за презентацию на "Infostart Event 2023" +- [Сергею Голованову](https://t.me/GolovanoffSergio) за доклад на "Infostart Event 2023" с темой "Эволюция нашего Gitlab CI человекообразный плейстоцен" - [Никите Федькину](https://t.me/nixel2007) за ответы на вопросы - Всем кто отвечал на мои вопросы diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..43678ef --- /dev/null +++ b/cliff.toml @@ -0,0 +1,89 @@ +# git-cliff ~ default configuration file +# https://git-cliff.org/docs/configuration +# +# Lines starting with "#" are comments. +# Configuration options are organized into tables and keys. +# See documentation for more information on available options. + +[changelog] +# changelog header +header = """ +# Журнал изменений\n +Все заметные изменения в этом проекте будут задокументированы в этом файле.\n +""" +# template for the changelog body +# https://keats.github.io/tera/docs/#introduction +body = """ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | striptags | trim | upper_first }} + {% for commit in commits %} + - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ + {% if commit.breaking %}[**breaking**] {% endif %}\ + {{ commit.message }}\ + {% endfor %} +{% endfor %}\n +""" +# template for the changelog footer +footer = """ + +""" +# remove the leading and trailing s +trim = true +# postprocessors +postprocessors = [ + # { pattern = '', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL +] + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = true +# filter out the commits that are not conventional +filter_unconventional = true +# process each line of a commit as an individual commit +split_commits = false +# regex for preprocessing the commit messages +commit_preprocessors = [ + # Replace issue numbers + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit with https://github.com/crate-ci/typos + # If the spelling is incorrect, it will be automatically fixed. + #{ pattern = '.*', replace_command = 'typos --write-changes -' }, +] +# regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "🚀 Features" }, + { message = "^fix", group = "🐛 Bug Fixes" }, + { message = "^doc", group = "📚 Documentation" }, + { message = "^perf", group = "⚡ Performance" }, + { message = "^refactor", group = "🚜 Refactor" }, + { message = "^style", group = "🎨 Styling" }, + { message = "^test", group = "🧪 Testing" }, + { message = "^chore\\(release\\): prepare for", skip = true }, + { message = "^chore\\(deps.*\\)", skip = true }, + { message = "^chore\\(pr\\)", skip = true }, + { message = "^chore\\(pull\\)", skip = true }, + { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, + { body = ".*security", group = "🛡️ Security" }, + { message = "^revert", group = "◀️ Revert" }, +] +# protect breaking changes from being skipped due to matching a skipping commit_parser +protect_breaking_commits = false +# filter out the commits that are not matched by commit parsers +filter_commits = true +# regex for matching git tags +tag_pattern = "[0-9].*" +# regex for skipping tags +# skip_tags = "" +# regex for ignoring tags +# ignore_tags = "" +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "newest" +# limit the number of commits included in the changelog. +# limit_commits = 42 diff --git a/doc/README.md b/doc/README.md index 95295df..d85d232 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,3 +1,4 @@ + # Каталог docs Предназначен для хранения файлов документации в формате Markdown diff --git a/doc/image/edit-pipeline-schedule.jpg b/doc/image/edit-pipeline-schedule.jpg new file mode 100644 index 0000000..3208c2e Binary files /dev/null and b/doc/image/edit-pipeline-schedule.jpg differ diff --git a/doc/image/execute-pipeline-deploy-env.jpg b/doc/image/execute-pipeline-deploy-env.jpg new file mode 100644 index 0000000..78d0736 Binary files /dev/null and b/doc/image/execute-pipeline-deploy-env.jpg differ diff --git a/doc/image/needs-pipeline-child.jpg b/doc/image/needs-pipeline-child.jpg new file mode 100644 index 0000000..cbd197e Binary files /dev/null and b/doc/image/needs-pipeline-child.jpg differ diff --git a/doc/image/needs-pipeline-parent.jpg b/doc/image/needs-pipeline-parent.jpg new file mode 100644 index 0000000..00d7191 Binary files /dev/null and b/doc/image/needs-pipeline-parent.jpg differ diff --git a/doc/image/preview-pipeline-child.jpg b/doc/image/preview-pipeline-child.jpg new file mode 100644 index 0000000..6ea9da8 Binary files /dev/null and b/doc/image/preview-pipeline-child.jpg differ diff --git a/doc/image/preview-pipeline-parent.jpg b/doc/image/preview-pipeline-parent.jpg new file mode 100644 index 0000000..1832bea Binary files /dev/null and b/doc/image/preview-pipeline-parent.jpg differ diff --git a/doc/image/preview-pipeline.png b/doc/image/preview-pipeline.png deleted file mode 100644 index d1baac2..0000000 Binary files a/doc/image/preview-pipeline.png and /dev/null differ diff --git a/doc/image/run-pipeline-deploy-variable.jpg b/doc/image/run-pipeline-deploy-variable.jpg new file mode 100644 index 0000000..109a1aa Binary files /dev/null and b/doc/image/run-pipeline-deploy-variable.jpg differ diff --git a/template/README.md b/example/README.md similarity index 99% rename from template/README.md rename to example/README.md index 1ed44f2..3adb711 100644 --- a/template/README.md +++ b/example/README.md @@ -1,3 +1,4 @@ + # Каталог с примером структуры репозитория проекта Описывает основную структуру каталога проекта для работы vanessa-ci-scripts diff --git a/features/README.md b/features/README.md index 7ca9baa..9048e32 100644 --- a/features/README.md +++ b/features/README.md @@ -1,4 +1,4 @@ + # Каталог features Компоненты и функциональность продукта и автоматизированные сценарии проверки структурированные по подсистемам и объектам продукта - diff --git a/fixtures/README.md b/fixtures/README.md new file mode 100644 index 0000000..2d6c991 --- /dev/null +++ b/fixtures/README.md @@ -0,0 +1,28 @@ + +# Каталог fixtures + +Тестовые данные, макеты, настройки, используемые при выполнении автоматических тестов\сценариев поведения + +- `allow.values.predefined.cicd.var.json`, разрешенные значения предопределенных переменных CI\CD: + +| Ключ | Описание | Тип | +|--------------------|--------------------------------------------------------------------------------------|--------| +| VCI_VERBOSE | Признак, что этот шаг испольуется в сценарии отладки | Булево | +| CI_PIPELINE_SOURCE | Список источников запуска pipeline которые доступны шагу | Строка | +| CI_COMMIT_TAG | Регулярное выражение, если тег коммита совпадает с выражением, то шаг будет добавлен | Строка | +| DEPLOY | Признак, что это шаг используется в сценарии деплоя | Булево | +| | | | + +Доступные сценарии: + +| Имя | Шаги | Описание | +|-------------------|-------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Parent pipeline | .pre - templating - perfomance - child pipeline | Хранится в корне каждого из проектов, генерирует нисходящий пайплайн с динамическим набором шагов | +| Общий | common - .pre - * - .post | Набор общих шагов, которые выполняются для всех нисходящих пайплайнов | +| Отладка | common - .pre - verbose - * - .post | Добавляется шаг с отладкой, который выводит значение переменных окружения (внутри нисходящего пайплайна, так как они могут отличаться от вышестоящего пайплайна). Включить с помощью переменной окружения `VCI_VERBOSE` или командой `vci -v generate` | +| Запуск по графику | common - .pre - schedules - .post | Запуск по графику выгрузки из хранилища 1С в git репозиторий | +| Основной | common - .pre - build - test - report - .post | Собрать проект, собрать внешние файлы, создать эталонную ИБ, запустить синтаксические, дымовые, сценарные и модульные тесты, передать в sonarqube, сформировать allure, оформить gitlab pages, заполнить changelog.md | +| Деплой | common - .pre - deploy.env.*.json - .post | Прочитать параметры окружения из корня Вашего проекта, сформировать по ним задания на блокировку пользователей, обновление ИБ и запуск пост-обновления | +| | | | + +- `env.dev.json`, используется для `ТестДолжен_ПроверитьЗапускСкрипта_ПриветМир_СПараметром` diff --git a/fixtures/allow.values.predefined.cicd.var.json b/fixtures/allow.values.predefined.cicd.var.json new file mode 100644 index 0000000..0acb882 --- /dev/null +++ b/fixtures/allow.values.predefined.cicd.var.json @@ -0,0 +1,86 @@ +{ + "common.yml": { + "PREDEFINED": true, + "CI_PIPELINE_SOURCE": [] + }, + ".pre.yml": { + "PREDEFINED": true, + "CI_PIPELINE_SOURCE": [] + }, + "verbose.yml": { + "VCI_VERBOSE": true, + "CI_PIPELINE_SOURCE": [] + }, + "schedules.yml": { + "CI_PIPELINE_SOURCE": [ + "schedule", + "api" + ], + "CI_COMMIT_TAG": "" + }, + "build.yml": { + "CI_PIPELINE_SOURCE": [ + "merge_request_event", + "web" + ], + "CI_COMMIT_TAG": "*" + }, + "syntax-check.yml": { + "CI_PIPELINE_SOURCE": [ + "merge_request_event", + "web" + ], + "CI_COMMIT_TAG": "*" + }, + "tests.yml": { + "CI_PIPELINE_SOURCE": [ + "merge_request_event", + "web" + ], + "CI_COMMIT_TAG": "*" + }, + "sonar.yml": { + "CI_PIPELINE_SOURCE": [ + "merge_request_event", + "web" + ], + "CI_COMMIT_TAG": "*" + }, + "coverage.yml": { + "CI_PIPELINE_SOURCE": [ + "merge_request_event", + "web" + ], + "CI_COMMIT_TAG": "*" + }, + "allure.yml": { + "CI_PIPELINE_SOURCE": [ + "merge_request_event", + "web" + ], + "CI_COMMIT_TAG": "*" + }, + "pages.yml": { + "CI_PIPELINE_SOURCE": [ + "merge_request_event", + "web" + ], + "CI_COMMIT_TAG": "*" + }, + "changelog.yml": { + "CI_PIPELINE_SOURCE": [ + "merge_request_event", + "web" + ], + "CI_COMMIT_TAG": "*" + }, + "deployment.yml": { + "CI_PIPELINE_SOURCE": [], + "CI_COMMIT_TAG": "*", + "DEPLOY": true + }, + ".post.yml": { + "PREDEFINED": true, + "CI_PIPELINE_SOURCE": [] + } +} diff --git a/fixtures/env.dev.json b/fixtures/env.dev.json new file mode 100644 index 0000000..62b81e0 --- /dev/null +++ b/fixtures/env.dev.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://raw.githubusercontent.com/vanessa-opensource/vanessa-runner/develop/vanessa-runner-schema.json", + "default": { + "--ibconnection": "/Sserver/ib", + "--db-user": "", + "--db-pwd": "", + "--root": ".", + "--workspace": ".", + "--v8version": "8.3.16", + "--locale": "ru", + "--language": "ru", + "--additional": "/DisplayAllFunctions /Lru /iTaxi /TESTMANAGER", + "--ordinaryapp": "-1" + }, + "vanessa": { + "--vanessasettings": "./tools/JSON/vanessaBddConf.json" + }, + "xunit": { + "--xddConfig": "./tools/JSON/vanessaTddConf.json", + "testsPath": "$addRoot/tests/smoke", + "--reportsxunit": "ГенераторОтчетаJUnitXML{out/smoke/junit/junit.xml};ГенераторОтчетаAllureXMLВерсия2{out/smoke/allure/allure.xml}", + "--xddExitCodePath": "./build/xddExitCodePath.txt" + }, + "syntax-check": { + "--groupbymetadata": true, + "--exception-file": "tools/syntax-check-excludes.txt", + "--junitpath": "out/syntax-check/junit/junit.xml", + "--allure-results2": "out/syntax-check/allure", + "--mode": [ + "-ExtendedModulesCheck", + "-ThinClient", + "-WebClient", + "-Server", + "-ExternalConnection", + "-ThickClientOrdinaryApplication" + ] + } +} diff --git a/oscript.cfg b/oscript.cfg new file mode 100644 index 0000000..62e2034 --- /dev/null +++ b/oscript.cfg @@ -0,0 +1,14 @@ +#Конфигурационный файл OneScript + +# # Корневой каталог системных библиотек +# lib.system = ../oscript_modules + +#Дополнительные каталоги поиска библиотек +lib.additional = ../oscript_modules + +# Настройки кодировок. +# Можно указывать стандартное имя кодировки, либо значение default для выбора системной кодировки + +encoding.script = utf-8 + +systemlanguage = ru diff --git a/packagedef b/packagedef index cb1eeaa..ad59bdc 100644 --- a/packagedef +++ b/packagedef @@ -1,15 +1,61 @@ -//////////////////////////////////////////////////////////// +Перем ПараметрыПриложения; + +//////////////////////////////////////////////////////////// // Описание пакета для сборки и установки // Полную документацию см. на hub.oscript.io/packaging // -Процедура ПередСборкой(Знач РабочийКаталог) Экспорт - ФС.ОбеспечитьПустойКаталог(ОбъединитьПути(РабочийКаталог, "oscript_modules")); +/////////////////////////////////////////////////////////////////// +// Процедуры установки пакета с клиентской машины +/////////////////////////////////////////////////////////////////// + +// Вызывается пакетным менеджером перед установкой пакета на клиентскую машину. +// +// Параметры: +// КаталогУстановкиПакета - строка. Путь в который пакетный менеджер устанавливает текущий пакет. +// ЧтениеZipФайла - ЧтениеZipФайла. Архив пакета. +// +Процедура ПередУстановкой(Знач КаталогУстановкиПакета, Знач ЧтениеZipФайла) Экспорт + + Сообщить("Перед установкой удаляю все epf-файлы из каталога пакета " + КаталогУстановкиПакета); + МассивФайлов = НайтиФайлы(КаталогУстановкиПакета, "*.epf", Истина); + Для каждого Файл Из МассивФайлов Цикл + УдалитьФайлы(Файл.ПолноеИмя); + КонецЦикла; + +КонецПроцедуры + +// Вызывается пакетным менеджером после распаковки пакета на клиентскую машину. +// +// Параметры: +// КаталогУстановкиПакета - строка. Путь в который пакетный менеджер устанавливает текущий пакет. +// +Процедура ПриУстановке(Знач КаталогУстановкиПакета, СтандартнаяОбработка) Экспорт +КонецПроцедуры - //Лог.Информация("Установка локальных зависимостей библиотек"); - КомандаOpm = Новый Команда; +/////////////////////////////////////////////////////////////////// +// Процедуры сборки пакета +/////////////////////////////////////////////////////////////////// - КомандаOpm.УстановитьКоманду("opm"); +// Вызывается пакетным менеджером перед началом сборки пакета. +// +// Параметры: +// РабочийКаталог - Строка - Текущий рабочий каталог с исходниками пакета. +// +Процедура ПередСборкой(Знач РабочийКаталог) Экспорт + + ФС.ОбеспечитьПустойКаталог(ОбъединитьПути(РабочийКаталог, "oscript_modules")); + + СистемнаяИнформация = Новый СистемнаяИнформация; + ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + Если ЭтоWindows Тогда + ИмяУтилиты = КаталогПрограммы() + "\opm.bat"; + Иначе + ИмяУтилиты = "opm"; + КонецЕсли; + + КомандаOpm = Новый Команда; + КомандаOpm.УстановитьКоманду(ИмяУтилиты); КомандаOpm.ДобавитьПараметр("install -l"); КомандаOpm.ДобавитьЛогВыводаКоманды("task.build"); @@ -18,7 +64,50 @@ Если КодВозврата <> 0 Тогда ВызватьИсключение КомандаOpm.ПолучитьВывод(); КонецЕсли; - + +КонецПроцедуры + +// Вызывается пакетным менеджером после помещения файлов в пакет. +// +// Параметры: +// РабочийКаталог - Строка - Текущий рабочий каталог с исходниками пакета. +// АрхивПакета - ЗаписьZIPФайла - ZIP-архив с содержимым пакета (включаемые файлы). +// +Процедура ПриСборке(Знач РабочийКаталог, Знач АрхивПакета) Экспорт +КонецПроцедуры + +// Вызывается пакетным менеджером после сборки пакета. +// +// Параметры: +// РабочийКаталог - Строка - Текущий рабочий каталог с исходниками пакета. +// ПутьКФайлуПакета - Строка - Полный путь к собранному файлу пакета. +// +Процедура ПослеСборки(Знач РабочийКаталог, Знач ПутьКФайлуПакета) Экспорт + + Файл = Новый Файл(ОбъединитьПути(РабочийКаталог, "content.zip")); + Если Файл.Существует() Тогда + УдалитьФайлы(Файл.ПолноеИмя); + КонецЕсли; + + ВерсияПриложения = ПараметрыПриложения.Версия(); + + ФайлКонечный = Новый Файл(ОбъединитьПути(РабочийКаталог, "build", СтрШаблон("vanessa-ci-scripts-%1.zip", ВерсияПриложения))); + Если ФайлКонечный.Существует() Тогда + УдалитьФайлы(ФайлКонечный.ПолноеИмя); + КонецЕсли; + + АрхивПакета = Новый ЧтениеZipФайла(ПутьКФайлуПакета); + Элемент = АрхивПакета.Элементы.Найти(Файл.Имя); + Ожидаем.Что(Элемент, "Не сформирован файл " + ФайлКонечный.ПолноеИмя) + .ЭтоНе().Равно(Неопределено); + АрхивПакета.Извлечь(Элемент, РабочийКаталог); + + ПереместитьФайл(Файл.ПолноеИмя, ФайлКонечный.ПолноеИмя); + + Ожидаем.Что(ФайлКонечный.Существует(), "Не сформирован файл " + ФайлКонечный.ПолноеИмя) + .ЭтоИстина(); + + Сообщить("ИНФОРМАЦИЯ - Создан файл релиза " + ФайлКонечный.ПолноеИмя); КонецПроцедуры ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os"); @@ -30,38 +119,47 @@ .АдресАвтора("karlo@gloria-jeans.ru") .Описание("Набор скриптов Continuous Integration for 1C. Устанавливается как библиотека OScript на компьютер с ролью gitlab-runner.") - .ВерсияСреды("1.8.4") + .ВерсияСреды("1.9.0") + .ВключитьФайл("doc") + .ВключитьФайл("fixtures") + .ВключитьФайл("oscript_modules") .ВключитьФайл("src") .ВключитьФайл("tools/CI") + .ВключитьФайл("tools/scripts") .ВключитьФайл("tools/README.md") - // .ВключитьФайл("oscript_modules") + .ВключитьФайл("CHANGELOG.md") + .ВключитьФайл("LICENSE") .ВключитьФайл("packagedef") .ВключитьФайл("README.md") - .ЗависитОт("cli", "0.10.2") - .ЗависитОт("tempfiles", "1.0.0") - .ЗависитОт("1connector", "2.3.2") - .ЗависитОт("1commands", "1.5.0") - .ЗависитОт("asserts", "1.3.0") // .ЗависитОт("1bdd", "1.13.0") + .ЗависитОт("1commands", "1.5.0") + .ЗависитОт("1connector", "2.3.2") // .ЗависитОт("1testrunner", "1.8.0") .ЗависитОт("add", "6.8.0") + .ЗависитОт("asserts", "1.3.0") + .ЗависитОт("cli", "0.10.2") .ЗависитОт("configor", "0.8.1") .ЗависитОт("coverage", "0.6.1") .ЗависитОт("gitrules", "1.1.2") .ЗависитОт("gitsync", "3.4.1") + .ЗависитОт("json", "1.1.1") .ЗависитОт("oscript-config", "0.1.0") .ЗависитОт("precommit4onec", "21.09") + .ЗависитОт("tempfiles", "1.0.0") .ЗависитОт("vanessa-automation", "1.2.040") .ЗависитОт("vanessa-runner", "1.11.11") + .ЗависитОт("yaml", "0.5.1") .РазработкаЗависитОт("1bdd") + .РазработкаЗависитОт("1commands") .РазработкаЗависитОт("1testrunner") .РазработкаЗависитОт("asserts") + .РазработкаЗависитОт("configor") .РазработкаЗависитОт("coverage") - .РазработкаЗависитОт("1commands") .РазработкаЗависитОт("fs") + .РазработкаЗависитОт("yaml") .ОпределяетКласс("КомандаGenerateConfig", "src/Классы/КомандаGenerateConfig.os") .ОпределяетКласс("КомандаInit", "src/Классы/КомандаInit.os") diff --git a/sonar-project.properties b/sonar-project.properties index 371bb64..9ca7ff7 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,18 +1,22 @@ + # адрес сервера SonarQube, по умолчанию текущий компьютер -# sonar.host.url=http://<АдресВашегоСервераSonar>.ru:9000/ +# sonar.host.url=http://localhost:9000/ # ключ проекта sonar.projectKey=project_1s8-enterprise_vanessa-ci-scripts_AYymsp-_5QvOfDnRo5aB # имя проекта -# sonar.projectName=<...> +#sonar.projectName= # версия проекта -# sonar.projectVersion=1.0.1 +# sonar.projectVersion=1.0.0.1 # относительный или абсолютный путь к каталогу с исходными кодом sonar.sources=./src +# относительный или абсолютный путь к каталогу с тестами +sonar.tests=./tests + # кодировка sonar.sourceEncoding=UTF-8 @@ -29,8 +33,11 @@ sonar.scm.exclusions.disabled=true # путь к внешним отчетам # sonar.externalIssuesReportPaths=./out/acc-generic-issue.json -# путь к папке с данными покрытия тестами -# sonar.coverageReportPaths=./tools/coverage/result/genericCoverage.xml +# список путей к папке с данными покрытия тестами +sonar.coverageReportPaths=./coverage/genericCoverage.xml + +# cписок путей к отчетам о выполнении в общем формате тестовых данных +sonar.testExecutionReportPaths=./out/genericexec/tests.xml # настройки плагина bsl ls server # пропустить расчет диагностик в зависимости от режима поддержки модуля. Только при наличии конфигурации поставщика. В файле sonar-project.properties значения указываются без кавычек. @@ -40,4 +47,10 @@ sonar.scm.exclusions.disabled=true # never по умолчанию - модули не пропускаются; # sonar.bsl.languageserver.skipSupport=with support -#sonar.qualitygate.wait=true +# проверка доступности Sonar, при недоступность - сбой работы/пайплайна +# sonar.qualitygate.wait=true + +# sonar.links.homepage=https://ourportal.mycompany.com/sharepoint-or-confluense-or-some-kb +# sonar.links.scm=https://ourgit.mycompany.com/ones-projects/ones-information-system-id +# sonar.links.issue=https://ourpmo.mycompany.com/jira-or-kaiten-or-sppr/ + diff --git a/src/README.md b/src/README.md index ef7e8b0..e4d0069 100644 --- a/src/README.md +++ b/src/README.md @@ -1,7 +1,8 @@ + # Каталог src Предназначен для хранения исходных текстов решения созданных на платформе 1С:Предприятие, содержит: исходные коды разработанные с помощью проекта Graphite исходные коды интегрированные их хранилища 1С с помощью проекта vanessa-unpack -исходные коды обработок интегрированные с помошью проекта precommit1C +исходные коды обработок интегрированные с помощью проекта precommit1C diff --git a/src/main.os b/src/main.os index 5ff54dc..1a1fed3 100644 --- a/src/main.os +++ b/src/main.os @@ -29,13 +29,14 @@ Новый КомандаGenerateConfig); Приложение.ДобавитьКоманду("prepare p", - "Подготовка окружения: скачивание OVM, установка Oscript и всех необходимых библиотек", + "[DEPRECATED] Подготовка окружения: скачивание OVM, установка Oscript и всех необходимых библиотек", Новый КомандаPrepare); Приложение.ДобавитьКоманду("run r", "Запуск скрипта из набора Vanessa CI Scripts", Новый КомандаRun); + Приложение.УстановитьДействиеПередВыполнением(ЭтотОбъект, "ПередВыполнениемКоманды"); Приложение.Запустить(АргументыКоманднойСтроки); КонецПроцедуры // ВыполнитьПриложение() @@ -61,6 +62,15 @@ КонецФункции // ЭтоТест() +Процедура ПередВыполнениемКоманды(Знач Команда) Экспорт + + ВыводДополнительнойИнформации = Команда.ЗначениеОпции("verbose"); + ПараметрыПриложения.УстановитьРежимОтладки(ВыводДополнительнойИнформации); + + Лог.Отладка("Устанавливаю общие параметры"); + +КонецПроцедуры + /////////////////////////////////////////////////////// Лог = ПараметрыПриложения.Лог(); @@ -78,4 +88,4 @@ ЗавершитьРаботу(1); КонецЕсли; -КонецПопытки; \ No newline at end of file +КонецПопытки; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260GenerateConfig.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260GenerateConfig.os" index 86df09e..f5df4c4 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260GenerateConfig.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260GenerateConfig.os" @@ -1,45 +1,75 @@ #Использовать fs +#Использовать strings #Область ОписаниеПеременных Перем Лог; // Объект записи лога приложения Перем КаталогШаблонов; // Строка - каталог с шаблонами pipeline Перем КаталогСборки; // Строка - каталог сборки +Перем ФактИсполненияПайплайн; // Переменные среды (CI_PIPELINE_SOURCE, CI_COMMIT_TAG etc) +Перем ТаблицаНастройкиШагов; // Таблица с настройками для формирования шагов pipeline #КонецОбласти #Область ПрограммныйИнтерфейс -Процедура ВыполнитьКоманду(Знач Команда) Экспорт - - Лог = ПараметрыПриложения.Лог(); +// Добавить опции и аргументы для команды +// +// Параметры: +// ПараметрыКоманды - Структура - Соответствие ключей командной строки и их значений +// +Процедура ОписаниеКоманды(ПараметрыКоманды) Экспорт + + ВыходнойФайл = ОбъединитьПути(КаталогСборки, "generate-config.yml"); + ПараметрыКоманды.Опция("p path", "", "путь к сохранению сформированного сценария pipeline") + .ТСтрока() + .ВОкружении("VCI_PATH_GENERATE_PIPELINE") + .ПоУмолчанию(ВыходнойФайл); + +КонецПроцедуры + +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Структура - Соответствие ключей командной строки и их значений +// +Процедура ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт + Лог = ПараметрыПриложения.Лог(); Лог.Информация("Генерация сборочной линии..."); + + ВыводДополнительнойИнформации = ПараметрыКоманды.ЗначениеОпции("verbose"); + ФактИсполненияПайплайн.Вставить("ВыводДополнительнойИнформации", ВыводДополнительнойИнформации); + + ВыходнойФайл = ПараметрыКоманды.ЗначениеОпции("path"); - Pipeline = ТекстЭтапа(КаталогШаблонов, "stages.yml"); + Pipeline = Символы.ПС + "$stages" + Символы.ПС; Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "common.yml"); + Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, ".pre.yml"); + Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "verbose.yml"); Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "schedules.yml"); - // TODO - // Шаги для установки OneScript и связанных пакетов из хаба - // Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "pre.yml"); - Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "build.yml"); - Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "syntax-check.yml"); + Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "syntax-check.yml"); Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "tests.yml"); Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "sonar.yml"); Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "coverage.yml"); Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "allure.yml"); - Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "pages.yml"); + Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, "changelog.yml"); - ФС.ОбеспечитьКаталог(КаталогСборки); + // TODO + СоставитьЗадачиРазвертывания(Pipeline, КаталогШаблонов); - ВыходнойФайл = ОбъединитьПути(КаталогСборки, "generate-config.yml"); + Pipeline = Pipeline + ТекстЭтапа(КаталогШаблонов, ".post.yml"); + + СоставитьПланЭтапов(Pipeline); + + ФС.ОбеспечитьКаталог(КаталогСборки); Общие.СохранитьТекст(Pipeline, ВыходнойФайл); ТекстСообщения = СтрШаблон("Сборочная линия сохранена в %1", ВыходнойФайл); @@ -51,8 +81,23 @@ #КонецОбласти +#Область СлужебныеПроцедурыИФункции + +// Прочитать шаблон и добавить к общему тексту Pipeline +// +// Параметры: +// Каталог - Строка - Путь к каталогу шаблонов с шагами pipeline +// ИмяФайла - Строка - Имя файла шаблона из каталога с шаблонами +// +// Возвращаемое значение: +// Строка - Текст этапа +// Функция ТекстЭтапа(Каталог, ИмяФайла) + Если Не СоответствуетПлануИсполненияПайплайна(ИмяФайла) Тогда + Возврат ""; + КонецЕсли; + ПутьКФайлу = ОбъединитьПути(Каталог, ИмяФайла); ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8); @@ -63,5 +108,121 @@ КонецФункции +// Проверка доступен ли шаг для указанных переменных среды +// +// Параметры: +// ИмяФайла - Строка - Имя файла шаблона из каталога с шаблонами +// +// Возвращаемое значение: +// Булево - Проверка пройдена +// +Функция СоответствуетПлануИсполненияПайплайна(ИмяФайла) + + ПланИсполненияПайплайн = ТаблицаНастройкиШагов.Получить(ИмяФайла); + + Предустановленный = Общие.ПолучитьЗначениеСвойства(ПланИсполненияПайплайн, "PREDEFINED"); + ВыводДополнительнойИнформацииПлан = Общие.ПолучитьЗначениеСвойства(ПланИсполненияПайплайн, "VCI_VERBOSE"); + ИсточникиПайплайнПлан = Общие.ПолучитьЗначениеСвойства(ПланИсполненияПайплайн, "CI_PIPELINE_SOURCE"); + // МеткаПлан = Общие.ПолучитьЗначениеСвойства(ПланИсполненияПайплайн, "CI_COMMIT_TAG"); + ЭтоДеплойПлан = Общие.ПолучитьЗначениеСвойства(ПланИсполненияПайплайн, "DEPLOY"); + + ВыводДополнительнойИнформацииФакт = Общие.ПолучитьЗначениеСвойства(ФактИсполненияПайплайн, "ВыводДополнительнойИнформации"); + ИсточникПайплайнФакт = Общие.ПолучитьЗначениеСвойства(ФактИсполненияПайплайн, "CI_PIPELINE_SOURCE"); + // МеткаФакт = Общие.ПолучитьЗначениеСвойства(ФактИсполненияПайплайн, "CI_COMMIT_TAG"); + ЭтоДеплойФакт = Общие.ПолучитьЗначениеСвойства(ФактИсполненияПайплайн, "DEPLOY"); + + Если Предустановленный = Истина Тогда + Возврат Истина; + КонецЕсли; + + Если ВыводДополнительнойИнформацииПлан + И ВыводДополнительнойИнформацииФакт Тогда + Возврат Истина; + КонецЕсли; + + Если ЭтоДеплойФакт Тогда + Если ЭтоДеплойПлан И ЭтоДеплойФакт Тогда + Возврат Истина; + КонецЕсли; + Иначе + ИсточникПайплайнНайден = ?(ИсточникиПайплайнПлан.Найти(ИсточникПайплайнФакт)=Неопределено, Ложь, Истина); + Если ИсточникПайплайнНайден Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + + // // TODO придумать как обрабатывать коммит тега, регулярное выражение вставить + // Если МеткаПлан = "*" Тогда + // Результат = Истина; + // ИначеЕсли МеткаПлан = "" И МеткаФакт = "" Тогда + // Результат = Истина; + // КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Составить план развертывания на все среды (prod, stage, test etc) +// +// Параметры: +// Pipeline - Строка - Инструкция для исполнения в gitlab pipeline +// КаталогШаблонов - Строка - Путь к каталогу шаблонов с шагами pipeline +// +Процедура СоставитьЗадачиРазвертывания(Pipeline, КаталогШаблонов) + + ШаблонЭтапа = ТекстЭтапа(КаталогШаблонов, "deployment.yml"); + + ТекущийКаталог = ПараметрыПриложения.ТекущийКаталог(); + НайденныеСредыОкружения = НайтиФайлы(ТекущийКаталог, "env.*.json", Ложь); + Для Каждого СредаОкружения Из НайденныеСредыОкружения Цикл + + Структура = Новый Структура; + Структура.Вставить("job" , СтрЗаменить(СредаОкружения.ИмяБезРасширения, "env.", "")); + Структура.Вставить("stage" , СтрШаблон("deploy.%1", СредаОкружения.Имя)); + Структура.Вставить("setting", СредаОкружения.Имя); + + Pipeline = Pipeline + СтроковыеФункции.ВставитьПараметрыВСтроку(ШаблонЭтапа, Структура); + + КонецЦикла; + +КонецПроцедуры + +// Составить план этапов и поместить его вначале +// +// Параметры: +// Pipeline - Строка - Инструкция для исполнения в gitlab pipeline +// +Процедура СоставитьПланЭтапов(Pipeline) + + Массив = Новый Массив; + + РегулярноеВыражение = Новый РегулярноеВыражение("stage:[\s]?[\s]?[\s]?(\S+)"); + РегулярноеВыражение.Многострочный = Истина; + Совпадения = РегулярноеВыражение.НайтиСовпадения(Pipeline); + + Для Каждого Совпадение Из Совпадения Цикл + НаименованиеЭтапа = Совпадение.Группы[1].Значение; + Если СтрНачинаетсяС(НаименованиеЭтапа, ".") Тогда + Продолжить; + КонецЕсли; + Если Массив.Найти(НаименованиеЭтапа) = Неопределено Тогда + Массив.Добавить(НаименованиеЭтапа); + КонецЕсли; + КонецЦикла; + + СтрокаСШагами = СтрШаблон("stages:%1", Символы.ПС); + Для Каждого ЭлементМассива Из Массив Цикл + СтрокаСШагами = СтрокаСШагами + СтрШаблон("%1 - %2%3", " ", ЭлементМассива, Символы.ПС); + КонецЦикла; + + Pipeline = СтрЗаменить(Pipeline, "$stages", СтрокаСШагами); + +КонецПроцедуры + +#КонецОбласти + КаталогШаблонов = ПараметрыПриложения.КаталогШаблоновCI(); -КаталогСборки = ПараметрыПриложения.КаталогСборки(); +КаталогСборки = ПараметрыПриложения.КаталогСборки(); + +ФактИсполненияПайплайн = ПараметрыПриложения.ПолучитьПеременныеСреды(); +ТаблицаНастройкиШагов = ПараметрыПриложения.ПолучитьТаблицуНастройкиШагов(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Init.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Init.os" index 8eddcfd..e142c3f 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Init.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Init.os" @@ -1,3 +1,5 @@ + +#Использовать fs #Использовать yaml #Область ОписаниеПеременных @@ -10,16 +12,22 @@ #Область ПрограммныйИнтерфейс -Процедура ВыполнитьКоманду(Знач Команда) Экспорт +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Структура - Соответствие ключей командной строки и их значений +// +Процедура ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт Лог = ПараметрыПриложения.Лог(); - ТекущийКаталогSrc = ОбъединитьПути(ТекущийКаталог(), "src"); - СтартовыйКаталогSrc = СтартовыйСценарий().Каталог; - Если ТекущийКаталогSrc = СтартовыйКаталогSrc Тогда - Лог.Ошибка("Невозможно выполнить сценарий в каталоге исходного проекта"); - Возврат; + Если Общие.ПроверитьЧтоЭтоКаталогИсходногоПроекта() Тогда + Возврат; КонецЕсли; + + ПутьКСкриптуУстановкиOScript = ОбъединитьПути(КаталогПриложения, "tools", "scripts", "install-oscript-local.bat"); + ЦелевойПутьКСкриптуУстановкиOScript = ОбъединитьПути(РабочийКаталог, "tools", "scripts", "install-oscript-local.bat"); + ФС.ОбеспечитьКаталог(ОбъединитьПути(РабочийКаталог, "tools", "scripts")); ПутьКФайлуШаблонаCI = ОбъединитьПути(КаталогПриложения, "tools", "CI", ".gitlab-ci.yml"); ПутьКФайлуCI = ОбъединитьПути(РабочийКаталог, ".gitlab-ci.yml"); @@ -42,6 +50,10 @@ ТекстСообщения = СтрШаблон("Файл настроек pipeline сохранен в %1", ПутьКФайлуCI); Лог.Информация(ТекстСообщения); + КопироватьФайл(ПутьКСкриптуУстановкиOScript, ЦелевойПутьКСкриптуУстановкиOScript); + ТекстСообщения = СтрШаблон("Скрипт установки OneScript сохранен в %1", ЦелевойПутьКСкриптуУстановкиOScript); + Лог.Информация(ТекстСообщения); + Лог.Информация("Инициализация завершена"); КонецПроцедуры // ВыполнитьКоманду diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Prepare.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Prepare.os" index 269da7c..56d6b04 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Prepare.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Prepare.os" @@ -1,3 +1,4 @@ + #Использовать 1commands #Использовать 1connector #Использовать fs @@ -12,7 +13,12 @@ #Область ПрограммныйИнтерфейс -Процедура ВыполнитьКоманду(Знач Команда) Экспорт +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Структура - Соответствие ключей командной строки и их значений +// +Процедура ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт Лог = ПараметрыПриложения.Лог(); ЛокальныеВременныеФайлы = Новый МенеджерВременныхФайлов(); @@ -28,7 +34,6 @@ // Скачиваем OneScript Version Manager - // TODO перенести значение репозитория ovm в env.json РезультатЗапроса = КоннекторHTTP.Get("https://github.com/oscript-library/ovm/releases/download/v1.2.1/ovm.exe"); Если РезультатЗапроса.КодСостояния = 200 Тогда ДвоичныеДанные = РезультатЗапроса.ДвоичныеДанные(); @@ -42,7 +47,7 @@ МассивПараметров = Новый Массив; МассивПараметров.Добавить("use"); - МассивПараметров.Добавить("--install stable"); // TODO перенести значение stable в env.json + МассивПараметров.Добавить("--install stable"); Общие.ВыполнитьСтороннююКоманду(ПутьOVM, МассивПараметров); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Run.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Run.os" index c23cce1..2b38001 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Run.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Run.os" @@ -1,26 +1,48 @@ + #Использовать 1commands Перем Лог; // Объект записи лога приложения -Процедура ОписаниеКоманды(Команда) Экспорт - - Команда.Аргумент("SCRIPT", "", "Имя скрипта который нужно запустить.") - .ТСтрока() - .ВОкружении("VCI_NAME_SCRIPT") - .Обязательный(Истина) - .ПоУмолчанию(ПараметрыПриложения.КаталогПриложения()); - +// Добавить опции и аргументы для команды +// +// Параметры: +// ПараметрыКоманды - Структура - Соответствие ключей командной строки и их значений +// +Процедура ОписаниеКоманды(ПараметрыКоманды) Экспорт + + ПараметрыКоманды.Аргумент("SCRIPT", "", "Имя скрипта который нужно запустить.") + .ТСтрока() + .ВОкружении("VCI_NAME_SCRIPT") + .Обязательный(Истина) + .ПоУмолчанию(ПараметрыПриложения.КаталогПриложения()); + + ПараметрыКоманды.Аргумент("ARGS", "", "Коллекция параметров, передаваемых задаче") + .ТМассивСтрок() + .Обязательный(Ложь); + КонецПроцедуры -Процедура ВыполнитьКоманду(Знач Команда) Экспорт - +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Структура - Соответствие ключей командной строки и их значений +// +Процедура ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт + Лог = ПараметрыПриложения.Лог(); + + // Если Общие.ПроверитьЧтоЭтоКаталогИсходногоПроекта() Тогда + // Возврат; + // КонецЕсли; + Лог.Информация("Выполнение скрипта..."); // Поиск скрипта по имени - ИмяСкрипта = Команда.ЗначениеАргумента("SCRIPT") + ".os"; - + ИмяСкрипта = ПараметрыКоманды.ЗначениеАргумента("SCRIPT") + ".os"; + // СтрокаНастройки = ПараметрыКоманды.ЗначениеОпции("settings"); + ПараметрыЗадачи = ПараметрыКоманды.ЗначениеАргумента("ARGS"); + Если ПустаяСтрока(ИмяСкрипта) Тогда Лог.Ошибка("Невозможно выполнить сценарий: Не указано имя скрипта"); Возврат; @@ -41,6 +63,9 @@ МассивПараметров = Новый Массив(); МассивПараметров.Добавить(ПараметрВыполненияСкрипта); + Для Каждого Параметр Из ПараметрыЗадачи Цикл + МассивПараметров.Добавить(Параметр); + КонецЦикла; Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); Лог.Информация("Выполнение скрипта завершено"); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\270\320\265.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\270\320\265.os" index 8fd559b..4f6f3c1 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\270\320\265.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\270\320\265.os" @@ -4,22 +4,48 @@ #Область ОписаниеПеременных -Перем Лог; // Объект записи лога приложения +Перем Лог; // Объект записи лога приложения #КонецОбласти + +Функция ОбъединитьПутиВСтроку(Путь1, Путь2 = "", Путь3 = "", Путь4 = "") Экспорт + + НовыйПуть = ОбъединитьПути(Путь1, Путь2, Путь3, Путь4); + Возврат СтрШаблон("""%1""", НовыйПуть); + +КонецФункции + +// Проверить что текущий каталог это каталог исходного проекта +// +// Возвращаемое значение: +// Булево - Это каталог исходного проекта VCI +// +Функция ПроверитьЧтоЭтоКаталогИсходногоПроекта() Экспорт + + ТекущийКаталогSrc = ОбъединитьПути(ТекущийКаталог(), "src"); + СтартовыйКаталогSrc = СтартовыйСценарий().Каталог; + Если ТекущийКаталогSrc = СтартовыйКаталогSrc Тогда + Лог.Ошибка("Невозможно выполнить сценарий в каталоге исходного проекта"); + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + // Сохранить текст в выходной файл // // Параметры: // Пайплайн - Строка - Текст пайплайна -// ВыходнойФайл - Строка - Путь выходного файла куда сохраняем +// ВыходнойФайл - Строка - Путь выходного файла куда сохраняем // Процедура СохранитьТекст(Пайплайн, ВыходнойФайл) Экспорт - + ЗаписьТекста = Новый ЗаписьТекста(ВыходнойФайл, КодировкаТекста.UTF8); ЗаписьТекста.ЗаписатьСтроку(Пайплайн); ЗаписьТекста.Закрыть(); - + КонецПроцедуры // Выполнить стороннюю команду @@ -30,22 +56,129 @@ // МассивПараметров - Массив - Массив параметров выполнения команды ОС // Процедура ВыполнитьСтороннююКоманду(ИмяКоманды, МассивПараметров) Экспорт - + Лог.Вывести("%1 %2", УровниЛога.Информация, ИмяКоманды, СтрСоединить(МассивПараметров, " ")); - + Команда = Новый Команда; Команда.УстановитьКоманду(ИмяКоманды); - + Команда.ДобавитьПараметры(МассивПараметров); - + Команда.ДобавитьЛогВыводаКоманды(Лог); Команда.ПоказыватьВыводНемедленно(Истина); - + Команда.УстановитьПравильныйКодВозврата(0); Команда.Исполнить(); + +КонецПроцедуры + +// Читаем содержимое файла env.*.json из репозитория проекта +// +// Параметры: +// ПутьКФайлу - Путь - путь к файлу настроек который нужно прочитать +// +// Возвращаемое значение: +// Соответствие - позволяет обращаться к значениям параметров окружения +// +Функция ПрочитатьПеременныеОкруженияИзФайла(ПутьКФайлу) Экспорт + + Соответствие = ПрочитатьJSONИзФайла(ПутьКФайлу, Истина); + ДополнитьПеременныеОкружения(Соответствие); + Возврат Соответствие; + +КонецФункции + +// Дополняем не стандартными параметрами: db, ras etc +// +// Параметры: +// Соответствие - Соответствие - Получен из функции "ПрочитатьПеременныеОкруженияИзФайла" +// +Процедура ДополнитьПеременныеОкружения(Соответствие) + + ibconnection = Соответствие.Получить("default").Получить("--ibconnection"); + // Лог.Вывести(ibconnection, УровниЛога.Информация); + + Если СтрНачинаетсяС(ibconnection, "/S") Тогда + СтрокаСРазделителем = СтрЗаменить(ibconnection, "/S", ""); + МассивПараметров = СтрРазделить(СтрокаСРазделителем, "/"); + + server_name = МассивПараметров[0]; + db_name = МассивПараметров[1]; + Иначе + server_name = ""; + db_name = ""; + КонецЕсли; + + Соответствие.Вставить("server_name", server_name); + Соответствие.Вставить("db_name", db_name); + +КонецПроцедуры + +// Считывает значение из JSON-файла. JSON-текст должен быть корректным. +// +// Параметры: +// ПутьКФайлу - Строка - JSON-файл. +// ВСоответствие - Булево - Если установлено Истина, чтение объекта JSON будет выполнено в Соответствие. Если установлено Ложь, объекты будут считываться в объект типа Структура. Значение по умолчанию: Ложь. +// +// Возвращаемое значение: +// Соответствие/Структура - Значения параметров +// +Функция ПрочитатьJSONИзФайла(ПутьКФайлу, ВСоответствие) Экспорт + + Чтение = Новый ЧтениеJSON; + Чтение.ОткрытьФайл(ПутьКФайлу); + Параметры = ПрочитатьJSON(Чтение, ВСоответствие); + Чтение.Закрыть(); + + Возврат Параметры; + +КонецФункции + +// Записывает значение из параметров в JSON-файл +// +// Параметры: +// Параметры - Структура/Соответствие - Параметры для записи +// ПутьКФайлу - Строка - JSON-файл. +// +Процедура ЗаписатьJSONВФайл(Параметры, ПутьКФайлу) Экспорт + + Запись = Новый ЗаписьJSON; + Запись.ОткрытьФайл(ПутьКФайлу); + ЗаписатьJSON(Запись, Параметры); + Запись.Закрыть(); КонецПроцедуры +// Получить знаечние свойства из соответствия +// +// Параметры: +// Соответствие - Соответствие - таблица с соответствиями ключей и значений +// Имя - Строка - Ключ свойства +// +// Возвращаемое значение: +// Произвольный - значение свойства из соответствия +// +Функция ПолучитьЗначениеСвойства(Соответствие, Имя) Экспорт + + ВремЗначение = Соответствие.Получить(Имя); + + МассивБулевоИстина = СтрРазделить("1,true,истина", ",", Ложь); + МассивБулевоЛожь = СтрРазделить("0,false,ложь", ",", Ложь); + + Если Не МассивБулевоИстина.Найти(НРег(ВремЗначение)) = Неопределено Тогда + Значение = Истина; + ИначеЕсли Не МассивБулевоЛожь.Найти(НРег(ВремЗначение)) = Неопределено Тогда + Значение = Ложь; + ИначеЕсли ВремЗначение = Неопределено Тогда + Значение = Ложь; + Иначе + Значение = ВремЗначение; + КонецЕсли; + + Возврат Значение; + +КонецФункции + // Получить свойства конфигурации из исходного кода // Пытаемся прочитать файл Configuration.xml и его свойства (Name, Vendor, Version etc) // @@ -57,26 +190,26 @@ // Структура - Значения свойств конфигурации // Функция ПолучитьСвойстваКонфигурации(КаталогИсходогоКода = "./src/cf") Экспорт - + Свойства = Новый Структура("Name, Vendor, Version"); - + ПутьКФайлу = ОбъединитьПути(КаталогИсходогоКода, "Configuration.xml"); Если ФС.ФайлСуществует(ПутьКФайлу) Тогда Текст = ПрочитатьФайлВТексте(ПутьКФайлу); Значение = РазобратьСПомощьюРВ(Текст, "(?<=).*?(?=)"); Свойства.Name = Значение; - + Значение = РазобратьСПомощьюРВ(Текст, "(?<=).*?(?=)"); Свойства.Vendor = Значение; - + Значение = РазобратьСПомощьюРВ(Текст, "(?<=).*?(?=)"); Свойства.Version = Значение; - + КонецЕсли; - + Возврат Свойства; - + КонецФункции // Прочитать файл в тексте @@ -98,7 +231,7 @@ Иначе Возврат ""; КонецЕсли; - + КонецФункции // Разобрать с помощью регулярного выражения @@ -111,7 +244,7 @@ // Строка - Найденное значение // Функция РазобратьСПомощьюРВ(Текст, ТекстРВ) - + РегулярноеВыражение = Новый РегулярноеВыражение(ТекстРВ); РегулярноеВыражение.Многострочный = Истина; Совпадения = РегулярноеВыражение.НайтиСовпадения(Текст); @@ -120,7 +253,7 @@ Иначе Возврат ""; КонецЕсли; - + КонецФункции Лог = ПараметрыПриложения.Лог(); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index c6cb2d8..41b5150 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -1,16 +1,17 @@ -#Использовать logos -#Использовать tempfiles + #Использовать fs +#Использовать logos +#Использовать tempfiles + +#Область ОписаниеПеременных Перем ЛогПриложения; // Объект - объект записи лога приложения Перем ОбщиеПараметры; // Структура - общие параметры приложения -Перем СохраненныйКаталогПриложения; // Строка - текущий каталог приложения -Перем СохраненныйТекущийКаталог; // Строка - текущий рабочий каталог -Перем СохраненныйКаталогШаблоновCI; // Строка - каталог шаблонов ci -Перем СохраненныйКаталогСборки; // Строка - каталог сборки Перем ЭтоПриложениеEXE; // Булево - Истина - выполняется скомпилированный скрипт Перем ЭтоWindows; // Булево - Истина - скрипт выполняется в среде Windows +#КонецОбласти + #Область СлужебныйПрограммныйИнтерфейс // Функция - проверяет, что скрипт выполняется в среде Windows @@ -50,36 +51,30 @@ // Строка - текущий каталог приложения // Функция КаталогПриложения() Экспорт - - Если Не СохраненныйКаталогПриложения = Неопределено Тогда - Возврат СохраненныйКаталогПриложения; - КонецЕсли; - ПутьККаталогу = ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); - ФайлКаталога = Новый Файл(ПутьККаталогу); - СохраненныйКаталогПриложения = ФайлКаталога.ПолноеИмя; - - Возврат СохраненныйКаталогПриложения; - + Возврат ФайлКаталога.ПолноеИмя; КонецФункции // КаталогПриложения() +// Функция - при необходтимости, определяет и возвращает текущий каталог приложения источник +// +// Возвращаемое значение: +// Строка - текущий каталог приложения источник +// +Функция КаталогПриложенияИсточник() Экспорт + ПутьККаталогу = ОбъединитьПути(ТекущийСценарий().Источник, "..", "..", ".."); + ФайлКаталога = Новый Файл(ПутьККаталогу); + Возврат ФайлКаталога.ПолноеИмя; +КонецФункции // КаталогПриложенияИсточник() + // Функция - при необходимости, определяет и возвращает текущий каталог запуска // // Возвращаемое значение: // Строка - текущий каталог запуска // Функция ТекущийКаталог() Экспорт - - Если Не СохраненныйТекущийКаталог = Неопределено Тогда - Возврат СохраненныйТекущийКаталог; - КонецЕсли; - ФайлКаталога = Новый Файл(ТекущийКаталог()); - СохраненныйТекущийКаталог = ФайлКаталога.ПолноеИмя; - - Возврат СохраненныйТекущийКаталог; - + Возврат ФайлКаталога.ПолноеИмя; КонецФункции // Функция - при необходимости, определяет и возвращает каталог шаблонов ci @@ -88,18 +83,9 @@ // Строка - каталог шаблонов ci // Функция КаталогШаблоновCI() Экспорт - - Если Не СохраненныйКаталогШаблоновCI = Неопределено Тогда - Возврат СохраненныйКаталогШаблоновCI; - КонецЕсли; - ПутьККаталогу = ОбъединитьПути(КаталогПриложения(), "tools", "CI", "templates"); - ФайлКаталога = Новый Файл(ПутьККаталогу); - СохраненныйКаталогШаблоновCI = ФайлКаталога.ПолноеИмя; - - Возврат СохраненныйКаталогШаблоновCI; - + Возврат ФайлКаталога.ПолноеИмя; КонецФункции // Функция - при необходимости, определяет и возвращает каталог сборки @@ -108,18 +94,81 @@ // Строка - каталог сборки // Функция КаталогСборки() Экспорт + ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "build"); + ФайлКаталога = Новый Файл(ПутьККаталогу); + Возврат ФайлКаталога.ПолноеИмя; +КонецФункции - Если Не СохраненныйКаталогСборки = Неопределено Тогда - Возврат СохраненныйКаталогСборки; +// Собираем все параметры запуска pipeline в структуру +// +// Возвращаемое значение: +// Соответствие - переменные среды запуска pipeline +// +Функция ПолучитьПеременныеСреды() Экспорт + + // TODO... + Если Ложь Тогда + УстановитьПеременнуюСреды("VCI_VERBOSE" , "false"); + УстановитьПеременнуюСреды("CI_PIPELINE_SOURCE", "web"); + // УстановитьПеременнуюСреды("CI_COMMIT_TAG" , "1.0.0.1"); + УстановитьПеременнуюСреды("DEPLOY" , "0"); КонецЕсли; + // ...убрать + + Соответствие = Новый Соответствие; + + // push, web, schedule, api, external, chat, webide, + // merge_request_event, external_pull_request_event, + // parent_pipeline, trigger, or pipeline + Соответствие.Вставить("CI_PIPELINE_SOURCE", ПолучитьПеременнуюСреды("CI_PIPELINE_SOURCE")); + + // // "1.0.0.1", "2.2.1.5" etc + // Соответствие.Вставить("CI_COMMIT_TAG" , ПолучитьПеременнуюСреды("CI_COMMIT_TAG")); + + // "1" - запускаем или "0" - по умолчанию + Соответствие.Вставить("DEPLOY" , ?(ПолучитьПеременнуюСреды("DEPLOY")="1", Истина, Ложь)); + + Возврат Соответствие; - ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "build"); +КонецФункции - ФайлКаталога = Новый Файл(ПутьККаталогу); - СохраненныйКаталогСборки = ФайлКаталога.ПолноеИмя; - - Возврат СохраненныйКаталогСборки; +// Функция - при необходимости, возвращает таблицу с настройками для шагов pipeline +// +// Возвращаемое значение: +// Таблица - настройки для формирования шагов pipeline +// +Функция ПолучитьТаблицуНастройкиШагов() Экспорт + ПутьКФайлу = ОбъединитьПути(КаталогПриложения(), "fixtures", "allow.values.predefined.cicd.var.json"); + Соответствие = ПрочитатьJSONИзФайла(ПутьКФайлу, Истина); // TODO перенести в "Общие.os" + + Возврат Соответствие; +КонецФункции + +// Возвращает путь к модулю gitsync +// +// Возвращаемое значение: +// Строка - относительный путь до gitsync +// +Функция ВернутьПутьGitSync() Экспорт + Возврат "oscript_modules\gitsync\src\cmd\gitsync.os"; +КонецФункции + +// Возвращает путь к модулю vrunner +// +// Возвращаемое значение: +// Строка - относительный путь до vanessa-runner +// +Функция ВернутьПутьVrunner() Экспорт + Возврат "oscript_modules\vanessa-runner\src\main.os"; +КонецФункции +// Возвращает путь к обработке vanessa-automation +// +// Возвращаемое значение: +// Строка - относительный путь до обработки vanessa-automation.epf +// +Функция ВернутьПутьVAutomation() Экспорт + Возврат "oscript_modules\vanessa-automation\vanessa-automation.epf"; КонецФункции // Функция - возвращает текущий уровень лога приложения @@ -141,9 +190,7 @@ Процедура УстановитьРежимОтладки(Знач РежимОтладки) Экспорт Если РежимОтладки Тогда - Лог().УстановитьУровень(УровниЛога.Отладка); - КонецЕсли; КонецПроцедуры // УстановитьРежимОтладки() @@ -224,6 +271,28 @@ КонецПроцедуры // Инициализация() +// TODO перенести в "Общие.os" +// +// Считывает значение из JSON-файла. JSON-текст должен быть корректным. +// +// Параметры: +// ПутьКФайлу - Строка - JSON-файл. +// ВСоответствие - Булево - Если установлено Истина, чтение объекта JSON будет выполнено в Соответствие. Если установлено Ложь, объекты будут считываться в объект типа Структура. Значение по умолчанию: Ложь. +// +// Возвращаемое значение: +// Соответствие/Структура - Значения параметров +// +Функция ПрочитатьJSONИзФайла(ПутьКФайлу, ВСоответствие) Экспорт + + Чтение = Новый ЧтениеJSON; + Чтение.ОткрытьФайл(ПутьКФайлу); + Параметры = ПрочитатьJSON(Чтение, ВСоответствие); + Чтение.Закрыть(); + + Возврат Параметры; + +КонецФункции + #КонецОбласти // СлужебныеПроцедурыИФункции Инициализация(); diff --git a/tasks/allure-generate.os b/tasks/allure-generate.os new file mode 100644 index 0000000..67b94b8 --- /dev/null +++ b/tasks/allure-generate.os @@ -0,0 +1,9 @@ + +#Использовать ".." +#Использовать 1commands + +Команда = Новый Команда; +Команда.УстановитьПравильныйКодВозврата(0); +Команда.ПоказыватьВыводНемедленно(Истина); +Команда.УстановитьСтрокуЗапуска("allure generate out/junit -c -o out/allure-report"); +КодВозврата = Команда.Исполнить(); diff --git a/tasks/allure-open.os b/tasks/allure-open.os new file mode 100644 index 0000000..5bb7728 --- /dev/null +++ b/tasks/allure-open.os @@ -0,0 +1,9 @@ + +#Использовать ".." +#Использовать 1commands + +Команда = Новый Команда; +Команда.УстановитьПравильныйКодВозврата(0); +Команда.ПоказыватьВыводНемедленно(Истина); +Команда.УстановитьСтрокуЗапуска("allure generate out -c -o out/allure-report && allure open out/allure-report"); +КодВозврата = Команда.Исполнить(); diff --git a/tasks/build.os b/tasks/build.os new file mode 100644 index 0000000..e49816a --- /dev/null +++ b/tasks/build.os @@ -0,0 +1,36 @@ + +#Использовать ".." +#Использовать 1commands + +ФС.ОбеспечитьПустойКаталог("build"); + +Команда = Новый Команда; +Команда.УстановитьПравильныйКодВозврата(0); +Команда.ПоказыватьВыводНемедленно(Истина); +Команда.УстановитьСтрокуЗапуска("opm build --mf .\packagedef --out .\build"); +КодВозврата = Команда.Исполнить(); + +Если КодВозврата = 0 Тогда + ТекстСообщения = " + |@@@@@@BYB@@@@@@@@@@@@@@@@@@@@@@BYB@@@@@@ + |@@@@@&YY5&@@@@@@@@@@@@@@@@@@@@&5YY&@@@@@ + |@@@@@PYYYP@@@@@@@@@@@@@@@@@@@@PYYY5@@@@@ + |@@@@GYYYYYB@@@@@@@@@@@@@@@@@@BYYYYYG@@@@ + |@@@#YYYYYYY#@@@@@@@@@@@@@@@@#YYYYYYY#@@@ + |@@@5YYYYYYY5@@@@@@@@@@@@@@@@5YYYYYYY5@@@ + |@@5JJJJJJJJJ5BBBBBBBBBBBBBB5JJJJJJJJJ5@@ + |@G!!?????????JYYYYYYYYYYYYJ?????????!!G@ + |#7!!!7????????YYYYYYYYYYYY????????7!!!7# + |?!!!!!!7??????JYYYYYYYYYYJ??????7!!!!!!? + |PJ!!!!!!!??????JYYYYYYYYJ??????7!!!!!!JP + |@@#P?!!!!!7?????YYYYYYYY?????7!!!!!?P#@@ + |@@@@@#P?!!!!7????YYYYYY????7!!!!?P#@@@@@ + |@@@@@@@@#P?!!!7??JYYYYJ??7!!!?P#@@@@@@@@ + |@@@@@@@@@@@#P?!!??YYYY??!!?P#@@@@@@@@@@@ + |@@@@@@@@@@@@@@#P?7?YY?7?P#@@@@@@@@@@@@@@ + |@@@@@@@@@@@@@@@@@#5YY5#@@@@@@@@@@@@@@@@@"; +Иначе + ТекстСообщения = "Ожидали код возврата равным 0"; +КонецЕсли; + +Сообщить(ТекстСообщения); diff --git a/tasks/coverage.os b/tasks/coverage.os new file mode 100644 index 0000000..7225025 --- /dev/null +++ b/tasks/coverage.os @@ -0,0 +1,40 @@ + +#Использовать ".." +#Использовать 1commands +#Использовать fs +#Использовать coverage + +ИмяКаталогаФайловПокрытия = "coverage"; +ИмяОбщегоФайлаПокрытия = "stat.json"; +ШаблонИменФайловПокрытия = "*.json"; + +ФС.ОбеспечитьПустойКаталог(ИмяКаталогаФайловПокрытия); +ПутьКСтат = ОбъединитьПути(ИмяКаталогаФайловПокрытия, ИмяОбщегоФайлаПокрытия); + +СистемнаяИнформация = Новый СистемнаяИнформация; +ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + +Команда = Новый Команда; +Команда.УстановитьКоманду("oscript"); +Если НЕ ЭтоWindows Тогда + Команда.ДобавитьПараметр("-encoding=utf-8"); +КонецЕсли; +Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); +Команда.ДобавитьПараметр("tasks/test.os coverage"); +Команда.ПоказыватьВыводНемедленно(Истина); + +КодВозврата = Команда.Исполнить(); + +Файл_Стат = Новый Файл(ПутьКСтат); + +ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); + +ПроцессорГенерации.ОтносительныеПути() + .РабочийКаталог(ИмяКаталогаФайловПокрытия) + .ИмяФайлаСтатистики(ШаблонИменФайловПокрытия) + .ФайлСтатистики(Файл_Стат.ПолноеИмя) + .GenericCoverage() + .Cobertura() + .Сформировать(); + +ЗавершитьРаботу(КодВозврата); diff --git a/tasks/install.os b/tasks/install.os new file mode 100644 index 0000000..c47939e --- /dev/null +++ b/tasks/install.os @@ -0,0 +1,21 @@ + +#Использовать ".." +#Использовать 1commands + +МассивФайлов = НайтиФайлы("build", "vanessa-ci-scripts-*.ospx", Ложь); +Если МассивФайлов.Количество() > 0 Тогда + + ПутьКПакету = ОбъединитьПути("build", МассивФайлов[0].Имя); + СтрокаЗапуска = СтрШаблон("opm install -f %1", ПутьКПакету); + + Сообщить("Найден файл по пути: " + ПутьКПакету); + + Команда = Новый Команда; + Команда.УстановитьПравильныйКодВозврата(0); + Команда.ПоказыватьВыводНемедленно(Истина); + Команда.УстановитьСтрокуЗапуска(СтрокаЗапуска); + КодВозврата = Команда.Исполнить(); + +Иначе + ВызватьИсключение "Неудалось найти пакет для установки!"; +КонецЕсли; diff --git a/tasks/oscript.cfg b/tasks/oscript.cfg new file mode 100644 index 0000000..4101683 --- /dev/null +++ b/tasks/oscript.cfg @@ -0,0 +1 @@ +lib.additional=../oscript_modules diff --git a/tasks/sonar-scanner.os b/tasks/sonar-scanner.os new file mode 100644 index 0000000..12fa39c --- /dev/null +++ b/tasks/sonar-scanner.os @@ -0,0 +1,11 @@ + +#Использовать "..\src\" + +// sonar-scanner: запуск статической проверки кода + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить("-D sonar.token=" + ПолучитьПеременнуюСреды("SONAR_TOKEN")); +МассивПараметров.Добавить("-D sonar.projectVersion=" + ПараметрыПриложения.Версия()); + +Общие.ВыполнитьСтороннююКоманду("sonar-scanner", МассивПараметров); + diff --git a/tasks/test.os b/tasks/test.os new file mode 100644 index 0000000..740dbdb --- /dev/null +++ b/tasks/test.os @@ -0,0 +1,82 @@ + +#Использовать 1testrunner +#Использовать fs + +Перем ИмяКаталогаФайловПокрытия; +Перем ИспользуетсяПокрытиеКода; +Перем КаталогФайловПокрытия; + +Функция ПрогнатьТесты(Знач ПутьКТестам = "tests", Знач ПутьКОтчетуJUnit = "out") + + Тестер = Новый Тестер; + + Если ИспользуетсяПокрытиеКода Тогда + Тестер.ВключитьСборСтатистикиСкриптовOnescript(Новый Файл(КаталогФайловПокрытия)); + Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec); + КонецЕсли; + + ПутьКОтчетуJUnit = Новый Файл(ПутьКОтчетуJUnit).ПолноеИмя; + + ФС.ОбеспечитьПустойКаталог(ПутьКОтчетуJUnit); + + РезультатТестирования = Тестер.ТестироватьКаталог( + Новый Файл(ПутьКТестам), + Новый Файл(ПутьКОтчетуJUnit) + ); + + Успешно = РезультатТестирования = 0; + + Возврат Успешно; + +КонецФункции // ПрогнатьТесты() + +// Основной код + +Процедура ОсновнаяРабота() + + ТекущийКаталог = ТекущийКаталог(); + + КаталогФайловПокрытия = ОбъединитьПути(ТекущийКаталог, ИмяКаталогаФайловПокрытия); + ФС.ОбеспечитьПустойКаталог(КаталогФайловПокрытия); + + ИспользуетсяПокрытиеКода = Ложь; + Для каждого Элемент Из АргументыКоманднойСтроки Цикл + Если Элемент = "coverage" Тогда + ИспользуетсяПокрытиеКода = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ИспользуетсяПокрытиеКода Тогда + ПутьКОтчетуJUnit = "out/genericexec"; + Иначе + ПутьКОтчетуJUnit = "out/junit"; + КонецЕсли; + + Попытка + ТестыПрошли = ПрогнатьТесты(, ПутьКОтчетуJUnit); + Исключение + ТестыПрошли = Ложь; + ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОписаниеОшибки = ОписаниеОшибки(); + ТекстСообщения = СтрШаблон("Тесты через 1testrunner выполнены неудачно + |%1 + |%2", ПредставлениеОшибки, ОписаниеОшибки); + Сообщить(ТекстСообщения); + КонецПопытки; + + УстановитьТекущийКаталог(ТекущийКаталог); + + Если Не ТестыПрошли Тогда + ВызватьИсключение "Тестирование завершилось неудачно!"; + Иначе + ТекстСообщения = СтрШаблон("Результат прогона тестов <%1> + |", ТестыПрошли); + Сообщить(ТекстСообщения); + КонецЕсли; + +КонецПроцедуры + +ИмяКаталогаФайловПокрытия = "coverage"; + +ОсновнаяРабота(); diff --git a/template/test-vci.zip b/template/test-vci.zip deleted file mode 100644 index 7f7ff8a..0000000 Binary files a/template/test-vci.zip and /dev/null differ diff --git a/tests/README.md b/tests/README.md index 0703dab..e1f6f7b 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,3 +1,4 @@ + # Каталог tests Автоматизированные сценарии проверки структурированные по подсистемам и объектам продукта в виде тестов кодом, в т.ч. и дымовые тесты diff --git "a/tests/\320\237\321\200\320\270\320\274\320\265\321\200 \321\202\320\265\321\201\321\202\320\260.os" "b/tests/\320\237\321\200\320\270\320\274\320\265\321\200 \321\202\320\265\321\201\321\202\320\260.os" deleted file mode 100644 index b984a62..0000000 --- "a/tests/\320\237\321\200\320\270\320\274\320\265\321\200 \321\202\320\265\321\201\321\202\320\260.os" +++ /dev/null @@ -1,24 +0,0 @@ -#Использовать asserts -// #Использовать ".." - -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - ВсеТесты = Новый Массив; - ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПолученВерныйТекстСообщения"); - - Возврат ВсеТесты; -КонецФункции - -Процедура ПередЗапускомТеста() Экспорт -КонецПроцедуры - -Процедура ПослеЗапускаТеста() Экспорт -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьЧтоПолученВерныйТекстСообщения() Экспорт - Результат = ПолучитьТекстСообщения(); - Ожидаем.Что(Результат, "Ожидаем, что 'Hello world!'").Равно("Hello world!"); -КонецПроцедуры - -Функция ПолучитьТекстСообщения() - Возврат "Hello world!"; -КонецФункции diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213.os" "b/tests/\320\242\320\265\321\201\321\202\321\213.os" new file mode 100644 index 0000000..ac9cefe --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213.os" @@ -0,0 +1,342 @@ +#Использовать 1commands +#Использовать asserts +#Использовать fs +#Использовать yaml + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + ВсеТесты = Новый Массив; + + // vci init + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКопируется_ФайлИнициализации"); + + // vci generate + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздается_Простой_ФайлГенерации"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздается_Простой_ФайлГенерации_ВУказанномКаталоге"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздается_ГрафикВыполнения_ФайлГенерации"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздается_Сборка_ФайлГенерации"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздается_Развертка_ФайлГенерации"); + // ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСоздается_Тэг_ФайлГенерации"); + + // vci run <имя-скрипта> + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапускСкрипта_ПриветМир"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапускСкрипта_ПриветМир_СПараметром"); + + Возврат ВсеТесты; + +КонецФункции + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьВременныйКаталог() + УИД = Строка(Новый УникальныйИдентификатор()); + КаталогФайлов = ОбъединитьПути(КаталогВременныхФайлов(), УИД); + СоздатьКаталог(КаталогФайлов); + Возврат КаталогФайлов; +КонецФункции + +Процедура УдалитьВременныйКаталог(КаталогФайлов) + УдалитьФайлы(КаталогФайлов, "*.*"); + УдалитьФайлы(КаталогФайлов); +КонецПроцедуры + +#КонецОбласти + +#Область МетодИнициализация + +Процедура ТестДолжен_ПроверитьЧтоКопируется_ФайлИнициализации() Экспорт + + КаталогВременныхФайлов = СоздатьВременныйКаталог(); + + Команда = Новый Команда(); + Команда.УстановитьРабочийКаталог(КаталогВременныхФайлов); + Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр(Путь); + Команда.ДобавитьПараметр("init"); + КодВозврата = Команда.Исполнить(); + Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + + МассивФайлов = НайтиФайлы(КаталогВременныхФайлов, ".gitlab-ci.yml"); + Ожидаем.Что(МассивФайлов.Количество(), "Ожидаем, что создан файл '.gitlab-ci.yml'").Равно(1); + + МассивФайлов = НайтиФайлы(КаталогВременныхФайлов, "tools\scripts\install-oscript-local.bat"); + Ожидаем.Что(МассивФайлов.Количество(), "Ожидаем, что создан файл 'tools\scripts\install-oscript-local.bat'").Равно(1); + + УдалитьВременныйКаталог(КаталогВременныхФайлов); + +КонецПроцедуры + +#КонецОбласти + +#Область МетодГенерация + +Процедура ТестДолжен_ПроверитьЧтоСоздается_Простой_ФайлГенерации() Экспорт + + КаталогВременныхФайлов = СоздатьВременныйКаталог(); + + Команда = Новый Команда(); + Команда.УстановитьРабочийКаталог(КаталогВременныхФайлов); + Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр(Путь); + Команда.ДобавитьПараметр("generate"); + КодВозврата = Команда.Исполнить(); + Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + + ПутьККаталогуСборки = ОбъединитьПути(КаталогВременныхФайлов, "build"); + МассивФайлов = НайтиФайлы(ПутьККаталогуСборки, "generate-config.yml"); + Ожидаем.Что(МассивФайлов.Количество(), "Ожидаем, что создан файл 'generate-config.yml'").Равно(1); + + Для каждого Файл Из МассивФайлов Цикл + + ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.UTF8); + ТекстФайла = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + ПарсерYAML = Новый ПарсерYAML; + РезультатЧтения = ПарсерYAML.ПрочитатьYaml(ТекстФайла); + + МассивШагов = РезультатЧтения.Получить("stages"); + Ожидаем.Что(МассивШагов, "Ожиидаем, что шагов в 'stages' не найдено").Равно(Неопределено); + + КонецЦикла; + + УдалитьВременныйКаталог(КаталогВременныхФайлов); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоСоздается_Простой_ФайлГенерации_ВУказанномКаталоге() Экспорт + + КаталогВременныхФайлов = СоздатьВременныйКаталог(); + + ПроизвольныйКаталог = "build"; + ПроизвольноеИмяФайла = "test_generate-config.yml"; + ПроизвольныйАртефакт = ОбъединитьПути(ПроизвольныйКаталог, ПроизвольноеИмяФайла); + + Команда = Новый Команда(); + Команда.УстановитьРабочийКаталог(КаталогВременныхФайлов); + Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр(Путь); + Команда.ДобавитьПараметр("generate"); + Команда.ДобавитьПараметр("-p " + ПроизвольныйАртефакт); + КодВозврата = Команда.Исполнить(); + Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + + ПутьККаталогуСборки = ОбъединитьПути(КаталогВременныхФайлов, ПроизвольныйКаталог); + МассивФайлов = НайтиФайлы(ПутьККаталогуСборки, ПроизвольноеИмяФайла); + Ожидаем.Что(МассивФайлов.Количество(), "Ожидаем, что создан файл 'generate-config.yml' с произвольным именем").Равно(1); + + Для каждого Файл Из МассивФайлов Цикл + + ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.UTF8); + ТекстФайла = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + ПарсерYAML = Новый ПарсерYAML; + РезультатЧтения = ПарсерYAML.ПрочитатьYaml(ТекстФайла); + + МассивШагов = РезультатЧтения.Получить("stages"); + Ожидаем.Что(МассивШагов, "Ожиидаем, что шагов в 'stages' не найдено").Равно(Неопределено); + + КонецЦикла; + + УдалитьВременныйКаталог(КаталогВременныхФайлов); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоСоздается_ГрафикВыполнения_ФайлГенерации() Экспорт + + УстановитьПеременнуюСреды("CI_PIPELINE_SOURCE", "schedule"); + + КаталогВременныхФайлов = СоздатьВременныйКаталог(); + + Команда = Новый Команда(); + Команда.УстановитьРабочийКаталог(КаталогВременныхФайлов); + Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр(Путь); + Команда.ДобавитьПараметр("generate"); + КодВозврата = Команда.Исполнить(); + Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + + ПутьККаталогуСборки = ОбъединитьПути(КаталогВременныхФайлов, "build"); + МассивФайлов = НайтиФайлы(ПутьККаталогуСборки, "generate-config.yml"); + Для Каждого Файл Из МассивФайлов Цикл + + ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.UTF8); + ТекстФайла = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + ПарсерYAML = Новый ПарсерYAML; + РезультатЧтения = ПарсерYAML.ПрочитатьYaml(ТекстФайла); + + МассивШагов = РезультатЧтения.Получить("stages"); + Ожидаем.Что(МассивШагов.Количество(), "Ожиидаем, что шагов в 'stages' > 0").Больше(0); + + Для Каждого ЭлементЧтения Из РезультатЧтения Цикл + + Ожидаем.Что(СтрНайти(ЭлементЧтения.Ключ, "("), "Ожидаем, что в именах job символ '(' не найден").Равно(0); + Ожидаем.Что(СтрНайти(ЭлементЧтения.Ключ, ")"), "Ожидаем, что в именах job символ ')' не найден").Равно(0); + КонецЦикла; + + КонецЦикла; + + УдалитьВременныйКаталог(КаталогВременныхФайлов); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоСоздается_Сборка_ФайлГенерации() Экспорт + + УстановитьПеременнуюСреды("CI_PIPELINE_SOURCE", "web"); + + КаталогВременныхФайлов = СоздатьВременныйКаталог(); + + Команда = Новый Команда(); + Команда.УстановитьРабочийКаталог(КаталогВременныхФайлов); + Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр(Путь); + Команда.ДобавитьПараметр("generate"); + КодВозврата = Команда.Исполнить(); + Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + + ПутьККаталогуСборки = ОбъединитьПути(КаталогВременныхФайлов, "build"); + МассивФайлов = НайтиФайлы(ПутьККаталогуСборки, "generate-config.yml"); + Для Каждого Файл Из МассивФайлов Цикл + + ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.UTF8); + ТекстФайла = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + ПарсерYAML = Новый ПарсерYAML; + РезультатЧтения = ПарсерYAML.ПрочитатьYaml(ТекстФайла); + + МассивШагов = РезультатЧтения.Получить("stages"); + Ожидаем.Что(МассивШагов.Количество(), "Ожиидаем, что шагов в 'stages' > 0").Больше(0); + + Для Каждого ЭлементЧтения Из РезультатЧтения Цикл + Ожидаем.Что(СтрНайти(ЭлементЧтения.Ключ, "("), "Ожидаем, что в именах job символ '(' не найден").Равно(0); + Ожидаем.Что(СтрНайти(ЭлементЧтения.Ключ, ")"), "Ожидаем, что в именах job символ ')' не найден").Равно(0); + КонецЦикла; + + КонецЦикла; + + УдалитьВременныйКаталог(КаталогВременныхФайлов); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоСоздается_Развертка_ФайлГенерации() Экспорт + + УстановитьПеременнуюСреды("DEPLOY", "1"); + + КаталогВременныхФайлов = СоздатьВременныйКаталог(); + ФС.КопироватьСодержимоеКаталога(".\fixtures\", КаталогВременныхФайлов); + + Команда = Новый Команда(); + Команда.УстановитьРабочийКаталог(КаталогВременныхФайлов); + Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр(Путь); + Команда.ДобавитьПараметр("generate"); + КодВозврата = Команда.Исполнить(); + Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + + ПутьККаталогуСборки = ОбъединитьПути(КаталогВременныхФайлов, "build"); + МассивФайлов = НайтиФайлы(ПутьККаталогуСборки, "generate-config.yml"); + Для Каждого Файл Из МассивФайлов Цикл + + ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.UTF8); + ТекстФайла = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + ПарсерYAML = Новый ПарсерYAML; + РезультатЧтения = ПарсерYAML.ПрочитатьYaml(ТекстФайла); + + МассивШагов = РезультатЧтения.Получить("stages"); + Ожидаем.Что(МассивШагов.Количество(), "Ожиидаем, что шагов в 'stages' > 0").Больше(0); + + Для Каждого ЭлементЧтения Из РезультатЧтения Цикл + Ожидаем.Что(СтрНайти(ЭлементЧтения.Ключ, "("), "Ожидаем, что в именах job символ '(' не найден").Равно(0); + Ожидаем.Что(СтрНайти(ЭлементЧтения.Ключ, ")"), "Ожидаем, что в именах job символ ')' не найден").Равно(0); + КонецЦикла; + + КонецЦикла; + + УдалитьВременныйКаталог(КаталогВременныхФайлов); + +КонецПроцедуры + +// Процедура ТестДолжен_ПроверитьЧтоСоздается_Тэг_ФайлГенерации() Экспорт + +// УстановитьПеременнуюСреды("CI_COMMIT_TAG", "1.0.0.1"); + +// КаталогВременныхФайлов = СоздатьВременныйКаталог(); + +// Команда = Новый Команда(); +// Команда.УстановитьРабочийКаталог(КаталогВременныхФайлов); +// Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); +// Команда.УстановитьКоманду("oscript"); +// Команда.ДобавитьПараметр(Путь); +// Команда.ДобавитьПараметр("generate"); +// КодВозврата = Команда.Исполнить(); +// Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + +// ПутьККаталогуСборки = ОбъединитьПути(КаталогВременныхФайлов, "build"); +// МассивФайлов = НайтиФайлы(ПутьККаталогуСборки, "generate-config.yml"); +// Для Каждого Файл Из МассивФайлов Цикл + +// ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.UTF8); +// ТекстФайла = ЧтениеТекста.Прочитать(); +// ЧтениеТекста.Закрыть(); + +// ПарсерYAML = Новый ПарсерYAML; +// РезультатЧтения = ПарсерYAML.ПрочитатьYaml(ТекстФайла); + +// МассивШагов = РезультатЧтения.Получить("stages"); +// Ожидаем.Что(МассивШагов.Количество(), "Ожиидаем, что шагов в 'stages' > 0").Больше(0); + +// Для Каждого ЭлементЧтения Из РезультатЧтения Цикл +// Ожидаем.Что(СтрНайти(ЭлементЧтения.Ключ, "("), "Ожидаем, что в именах job символ '(' не найден").Равно(0); +// Ожидаем.Что(СтрНайти(ЭлементЧтения.Ключ, ")"), "Ожидаем, что в именах job символ ')' не найден").Равно(0); +// КонецЦикла; + +// КонецЦикла; + +// УдалитьВременныйКаталог(КаталогВременныхФайлов); + +// КонецПроцедуры + +#КонецОбласти + +#Область МетодЗапуск + +Процедура ТестДолжен_ПроверитьЗапускСкрипта_ПриветМир() Экспорт + + Команда = Новый Команда(); + Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр(Путь); + Команда.ДобавитьПараметр("run"); + Команда.ДобавитьПараметр("hello-world"); + КодВозврата = Команда.Исполнить(); + Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЗапускСкрипта_ПриветМир_СПараметром() Экспорт + + Команда = Новый Команда(); + Путь = ОбъединитьПути(ТекущийКаталог(), "src", "main.os"); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр(Путь); + Команда.ДобавитьПараметр("run"); + Команда.ДобавитьПараметр("hello-world-args"); + Команда.ДобавитьПараметр("fixtures\env.dev.json"); + КодВозврата = Команда.Исполнить(); + Ожидаем.Что(КодВозврата, "Ожидаем, что код возврата команды = 0").Равно(0); + +КонецПроцедуры + +#КонецОбласти diff --git a/tools/CI/.gitlab-ci.yml b/tools/CI/.gitlab-ci.yml index 111de03..af09373 100644 --- a/tools/CI/.gitlab-ci.yml +++ b/tools/CI/.gitlab-ci.yml @@ -1,3 +1,4 @@ + stages: - schedules - templating @@ -7,19 +8,200 @@ default: before_script: - CHCP 65001 -gitsync: - stage: schedules - only: - - schedules +health check: + stage: .pre + variables: + GIT_STRATEGY: none + when: on_success + tags: + - OneS + script: + - $chocover = chocolatey --version; + Write-Host ('chocolatey version', $chocover) -Separator " -> "; + Write-Host ' '; + + scoop --version; + Write-Host ' '; + + Write-Host "java version"; + java --version; + Write-Host ' '; + + $allurever = allure --version; + Write-Host ('allure version', $allurever) -Separator " -> "; + Write-Host ' '; + + Write-Host 'sonar-scanner version'; + sonar-scanner --version; + Write-Host ' '; + + git-cliff --version; + Write-Host ' '; + + choco list; + Write-Host ' '; + + Write-Host 'SCOOP'; + scoop list; + Write-Host ' '; + # TODO проверка версии 1С, onescript и vci + timeout: 10m + +install-chocolatey: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneS + script: + - Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) + timeout: 10m + +install-chocolatey-curl-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneS + script: + - choco install -r --no-progress curl -y --force + timeout: 10m + needs: + - job: install-chocolatey + +install-chocolatey-java-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneS + script: + - choco install -r --no-progress libericajdk -y --force + timeout: 10m + needs: + - job: install-chocolatey + +install-scoop: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneS + script: + # # not admin + # - Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser; + # Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression + # + # # run as admin https://github.com/ScoopInstaller/Install#for-admin + - irm get.scoop.sh -outfile 'install.ps1'; + .\install.ps1 -RunAsAdmin + # I don't care about other parameters and want a one-line command + - iex "& {$(irm get.scoop.sh)} -RunAsAdmin" + timeout: 10m + +install-scoop-allure-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneS + script: + - scoop install allure + timeout: 10m + needs: + - job: install-scoop + +install-scoop-sonar-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneS script: - - vci run sync + - scoop install sonar-scanner + timeout: 10m + needs: + - job: install-scoop -Генерация пайплайна: - except: - - schedules +install-scoop-git-cliff-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneS + script: + - scoop install git-cliff + timeout: 10m + needs: + - job: install-scoop + +install-scoop-releasecli-dependencies: + stage: .pre + variables: + GIT_STRATEGY: none + when: manual + tags: + - OneS + script: + - scoop install gitlab-release-cli + timeout: 10m + needs: + - job: install-scoop + +install-oscript: + stage: .pre + variables: + GIT_STRATEGY: none + OVM_DOWNLOAD_URL: https://github.com/oscript-library/ovm/releases/download/v1.2.2/ovm.exe + OPM_DOWNLOAD_URL: https://github.com/oscript-library/opm/releases/download/v1.0.4/opm-1.0.4.ospx + when: manual + tags: + - OneS + script: + - tools\scripts\install-oscript-local.bat + timeout: 10m + needs: + - job: install-chocolatey + - install-chocolatey-curl-dependencies + +install-oscript-vci-dependencies: + stage: .pre variables: - GIT_DEPTH: 2 + GIT_STRATEGY: none + when: manual + tags: + - OneS + script: + - echo "value = '${VCI_INSTALL_FROM_HUB}'" + - 'if (${VCI_INSTALL_FROM_HUB} -eq "true") { echo ''включена установку vci из hub.oscript.io''; opm install vanessa-ci-scripts; } else { echo ''включена установку vci из локального пакета!''; opm install -f C:\tools\vanessa-ci-scripts-1.0.1.ospx; }' + - vci run gitsync-plugins-init + timeout: 10m + needs: + - job: install-oscript + +Генерация пайплайна: stage: templating + variables: + GIT_DEPTH: "1000" # Tells git to fetch all the branches of the project, required by the analysis task + rules: + - if: '$CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "api"' + - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH' + when: never + - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/' + when: manual + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + when: manual + - when: never + tags: + - OneS script: - vanessa-ci-scripts generate timeout: 5m @@ -28,9 +210,17 @@ gitsync: - build/generate-config.yml Исполнение: - except: - - schedules stage: performance + rules: + - if: '$CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "api"' + - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH' + when: never + - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/' + when: manual + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + when: manual + - when: never trigger: include: - artifact: build/generate-config.yml diff --git a/tools/CI/scripts/allure.os b/tools/CI/scripts/allure-generate.os similarity index 66% rename from tools/CI/scripts/allure.os rename to tools/CI/scripts/allure-generate.os index 4f73aca..49d1ef6 100644 --- a/tools/CI/scripts/allure.os +++ b/tools/CI/scripts/allure-generate.os @@ -5,9 +5,9 @@ МассивПараметров = Новый Массив; МассивПараметров.Добавить("generate"); -МассивПараметров.Добавить("build/out/syntax-check/allure"); -МассивПараметров.Добавить("build/out/smoke/allure"); -МассивПараметров.Добавить("build/out/bdd/allure"); +МассивПараметров.Добавить("out/syntax-check/allure"); +МассивПараметров.Добавить("out/smoke/allure"); +МассивПараметров.Добавить("out/bdd/allure"); МассивПараметров.Добавить("--clean"); МассивПараметров.Добавить("--output build/allure-report"); diff --git a/tools/CI/scripts/compilecf.os b/tools/CI/scripts/compilecf.os index 099db9d..4b3e163 100644 --- a/tools/CI/scripts/compilecf.os +++ b/tools/CI/scripts/compilecf.os @@ -1,6 +1,9 @@ + #Использовать fs #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + // fs: создать отсутствующие каталоги ФС.ОбеспечитьКаталог("./build"); @@ -9,8 +12,9 @@ // vrunner: компиляция cf файлов МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("compile"); МассивПараметров.Добавить("--src ./src/cf"); МассивПараметров.Добавить("--out ./build/1Cv8.cf"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/compilecfe.os b/tools/CI/scripts/compilecfe.os index 5c6e620..609e83e 100644 --- a/tools/CI/scripts/compilecfe.os +++ b/tools/CI/scripts/compilecfe.os @@ -1,6 +1,9 @@ + #Использовать fs #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + // fs: создать отсутствующие каталоги ФС.ОбеспечитьКаталог("./build/cfe"); @@ -18,23 +21,24 @@ // vrunner: компиляция cfe файлов МассивПараметров = Новый Массив; + МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("compileexttocfe"); МассивПараметров.Добавить("--src ./src/cfe/" + ИмяРасширения); МассивПараметров.Добавить("--out ./build/cfe/" + ИмяРасширенияСТипом); - Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); + Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); // vrunner: запуск команды загрузки cfe в толстом клиенте СтрокаПарам1 = СтрШаблон("--command ""$workspaceRoot/%1,build/loadExt.log""", ИмяРасширенияСТипом); МассивПараметров = Новый Массив; + МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("run"); МассивПараметров.Добавить(СтрокаПарам1); МассивПараметров.Добавить("--execute $runnerRoot\epf\ЗагрузитьРасширение.epf"); - МассивПараметров.Добавить("--settings tools/JSON/vrunner.json"); - Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); + Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); КонецЦикла; КонецЕсли; diff --git a/tools/CI/scripts/compileepf.os b/tools/CI/scripts/compileepf.os index a4fefa4..68a60d0 100644 --- a/tools/CI/scripts/compileepf.os +++ b/tools/CI/scripts/compileepf.os @@ -2,6 +2,8 @@ #Использовать fs #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + // fs: создать отсутствующие каталоги ФС.ОбеспечитьКаталог("./build"); @@ -13,35 +15,39 @@ // vrunner: компиляция epf файлов МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("compileepf"); МассивПараметров.Добавить("./src/epf"); МассивПараметров.Добавить("./build/epf"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); // vrunner: компиляция erf файлов МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("compileepf"); МассивПараметров.Добавить("./src/erf"); МассивПараметров.Добавить("./build/erf"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); // vrunner: компиляция служебных epf файлов МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("compileepf"); МассивПараметров.Добавить("./src/tools"); МассивПараметров.Добавить("./tools/epf"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); // vrunner: компиляция tdd epf файлов МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("compileepf"); МассивПараметров.Добавить("./src/tests"); МассивПараметров.Добавить("./tests/smoke"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/create-base.os b/tools/CI/scripts/create-base.os index 098001d..f7b5538 100644 --- a/tools/CI/scripts/create-base.os +++ b/tools/CI/scripts/create-base.os @@ -2,9 +2,12 @@ #Использовать fs #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + // vrunner: Инициализация ИБ из шаблона и исходников МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("init-dev"); ВыгрузкаЭталоннойИБСуществует = ФС.ФайлСуществует(".\template\1Cv8.dt"); @@ -13,16 +16,5 @@ КонецЕсли; МассивПараметров.Добавить("--src src/cf"); -МассивПараметров.Добавить("--settings tools/JSON/vrunner.json"); - -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); - -// vrunner: Запуск обновления ИБ - -МассивПараметров = Новый Массив; -МассивПараметров.Добавить("run"); -МассивПараметров.Добавить("--command ""ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;"""); -МассивПараметров.Добавить("--execute $runnerRoot/epf/ЗакрытьПредприятие.epf"); -МассивПараметров.Добавить("--settings tools/JSON/vrunner.json"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/designer.os b/tools/CI/scripts/designer.os new file mode 100644 index 0000000..377bb94 --- /dev/null +++ b/tools/CI/scripts/designer.os @@ -0,0 +1,13 @@ + +#Использовать "..\..\..\src\" + +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + +// vrunner: Запуск конфигуратора + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить("designer"); +МассивПараметров.Добавить("--no-wait"); + +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/generate-changelog.os b/tools/CI/scripts/generate-changelog.os new file mode 100644 index 0000000..2776b73 --- /dev/null +++ b/tools/CI/scripts/generate-changelog.os @@ -0,0 +1,53 @@ + +#Использовать "..\..\..\src\" + +СвойстваКонфигурации = Общие.ПолучитьСвойстваКонфигурации(); + +// https: получение url строки репозитория + +Протокол = ?(ПолучитьПеременнуюСреды("CI_SERVER_PORT") = "443", "https", "http"); +АдресРепозитория = СтрШаблон("%1://token:%2@%3/%4", + Протокол, + ПолучитьПеременнуюСреды("VCI_GROUP_ACCESS_TOKEN"), + ПолучитьПеременнуюСреды("CI_SERVER_HOST"), + ПолучитьПеременнуюСреды("CI_PROJECT_PATH")); +ВеткаРепозитория = СтрШаблон("HEAD:%1", ПолучитьПеременнуюСреды("CI_COMMIT_BRANCH")); + +// git: получение тэгов + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить("fetch"); +МассивПараметров.Добавить(АдресРепозитория); +МассивПараметров.Добавить("--tags"); +МассивПараметров.Добавить("-f"); + +Общие.ВыполнитьСтороннююКоманду("git", МассивПараметров); + +// git-cliff: Генерация файла журнала изменений из истории Git + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить("--output CHANGELOG.md"); + +Общие.ВыполнитьСтороннююКоманду("git-cliff", МассивПараметров); + +// git: add & commit & push журнал изменений в репозиторий + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить("add"); +МассивПараметров.Добавить("CHANGELOG.md"); + +Общие.ВыполнитьСтороннююКоманду("git", МассивПараметров); + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить("commit"); +МассивПараметров.Добавить(СтрШаблон("-m ""chore(release): prepare for %1 - update CHANGELOG.md""", СвойстваКонфигурации.Version)); + +Общие.ВыполнитьСтороннююКоманду("git", МассивПараметров); + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить("push"); +МассивПараметров.Добавить(АдресРепозитория); +МассивПараметров.Добавить(ВеткаРепозитория); +МассивПараметров.Добавить("--tags"); + +Общие.ВыполнитьСтороннююКоманду("git", МассивПараметров); diff --git a/tools/CI/scripts/gitsync-plugins-init.os b/tools/CI/scripts/gitsync-plugins-init.os new file mode 100644 index 0000000..3db304a --- /dev/null +++ b/tools/CI/scripts/gitsync-plugins-init.os @@ -0,0 +1,26 @@ + +#Использовать "..\..\..\src\" + +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьGitSync()); + +// gitsync: инициализация плагинов в локальном каталоге + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить("plugins"); +МассивПараметров.Добавить("init"); + +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); + +// gitsync: включение плагинов + +МассивПлагинов = СтрРазделить("check-authors,increment,limit,replace-authors,smart-tags,sync-remote,unpackForm", ",", Ложь); +Для Каждого ИмяПлагина Из МассивПлагинов Цикл + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(ИсполняемыйФайл); + МассивПараметров.Добавить("plugins"); + МассивПараметров.Добавить("enable"); + МассивПараметров.Добавить(ИмяПлагина); + + Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); +КонецЦикла; diff --git a/tools/CI/scripts/hello-world-args.os b/tools/CI/scripts/hello-world-args.os new file mode 100644 index 0000000..fda0280 --- /dev/null +++ b/tools/CI/scripts/hello-world-args.os @@ -0,0 +1,14 @@ + +#Использовать "..\..\..\src\" + +// Тестовый файл, чтобы проверить работу команды "vci run hello-world-args" + +Если АргументыКоманднойСтроки.Количество() > 0 Тогда + ПараметрыИзФайла = Общие.ПрочитатьПеременныеОкруженияИзФайла(АргументыКоманднойСтроки[0]); +Иначе + ВызватьИсключение "Ошибка, не передан путь к файлу настроек окружения: env.*.json"; +КонецЕсли; + +Сообщить(ПараметрыИзФайла.Получить("server_name")); +Сообщить("У меня все хорошо"); +Сообщить(СтрШаблон("Версия приложения %1", ПараметрыПриложения.Версия())); diff --git a/tools/CI/scripts/test.os b/tools/CI/scripts/hello-world.os similarity index 86% rename from tools/CI/scripts/test.os rename to tools/CI/scripts/hello-world.os index 97a0a00..2697523 100644 --- a/tools/CI/scripts/test.os +++ b/tools/CI/scripts/hello-world.os @@ -1,7 +1,7 @@ #Использовать "..\..\..\src\" -// Тестовый файл, чтобы проверить работу команды "vci run test" +// Тестовый файл, чтобы проверить работу команды "vci run hello-world" Сообщить("У меня все хорошо"); Сообщить(СтрШаблон("Версия приложения %1", ПараметрыПриложения.Версия())); diff --git a/tools/CI/scripts/launch-IB-update.os b/tools/CI/scripts/launch-IB-update.os new file mode 100644 index 0000000..046505f --- /dev/null +++ b/tools/CI/scripts/launch-IB-update.os @@ -0,0 +1,15 @@ + +#Использовать fs +#Использовать "..\..\..\src\" + +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + +// vrunner: Запуск обновления ИБ в режиме предприятия + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить("run"); +МассивПараметров.Добавить("--command ""ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;"""); +МассивПараметров.Добавить("--execute $runnerRoot/epf/ЗакрытьПредприятие.epf"); + +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/loadrepo.os b/tools/CI/scripts/loadrepo.os new file mode 100644 index 0000000..b2b43a8 --- /dev/null +++ b/tools/CI/scripts/loadrepo.os @@ -0,0 +1,29 @@ + +#Использовать "..\..\..\src\" + +// vrunner: Загрузка конфигурации из хранилища + +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + +param_settings = СтрШаблон("--settings ""%1""", АргументыКоманднойСтроки[0]); + +storage_name = СтрШаблон("--storage-name ""%1""" , ПолучитьПеременнуюСреды("GITSYNC_STORAGE_PATH")); +storage_user = СтрШаблон("--storage-user ""%1""" , ПолучитьПеременнуюСреды("GITSYNC_STORAGE_USER")); +storage_pwd = СтрШаблон("--storage-pwd ""%1""" , ПолучитьПеременнуюСреды("GITSYNC_STORAGE_PASSWORD")); + +uccode = ПолучитьПеременнуюСреды("VCI_UCCODE"); +Если Не ПустаяСтрока(uccode) Тогда + param_uccode = СтрШаблон("--uccode ""%1""", uccode); +КонецЕсли; + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить("loadrepo"); +МассивПараметров.Добавить(param_settings); +МассивПараметров.Добавить(param_uccode); +МассивПараметров.Добавить(storage_name); +МассивПараметров.Добавить(storage_user); +МассивПараметров.Добавить(storage_pwd); + + +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/open.os b/tools/CI/scripts/open.os new file mode 100644 index 0000000..e0232e7 --- /dev/null +++ b/tools/CI/scripts/open.os @@ -0,0 +1,13 @@ + +#Использовать "..\..\..\src\" + +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + +// vrunner: Запуск клиента предприятия + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить("run"); +МассивПараметров.Добавить("--no-wait"); + +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/pages.os b/tools/CI/scripts/pages.os index 5bc7a87..3ca11b4 100644 --- a/tools/CI/scripts/pages.os +++ b/tools/CI/scripts/pages.os @@ -6,9 +6,11 @@ // pages: публикация артефактов +ФС.ОбеспечитьПустойКаталог("public"); + КаталогАллюр = "build/allure-report"; Если ФС.КаталогСуществует(КаталогАллюр) Тогда ФС.КопироватьСодержимоеКаталога(КаталогАллюр, "public"); Иначе - Лог.Ошибка("Не найден каталог с результатами allure: %1", КаталогАллюр); + Лог.Информация("Не найден каталог с результатами allure: %1", КаталогАллюр); КонецЕсли; diff --git a/tools/CI/scripts/session-kill.os b/tools/CI/scripts/session-kill.os new file mode 100644 index 0000000..e406b33 --- /dev/null +++ b/tools/CI/scripts/session-kill.os @@ -0,0 +1,45 @@ + +#Использовать "..\..\..\src\" + +Лог = ПараметрыПриложения.Лог(); + +delay = 10; + +Если АргументыКоманднойСтроки.Количество() > 0 Тогда + ПараметрыИзФайла = Общие.ПрочитатьПеременныеОкруженияИзФайла(АргументыКоманднойСтроки[0]); +Иначе + ВызватьИсключение "Ошибка, не передан путь к файлу настроек окружения: env.*.json"; +КонецЕсли; + +// vrunner: завершение сеансов + +ЗапускаемоеПриложение = "oscript"; +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); +КомандаSession = "session"; + +param_settings = СтрШаблон("--settings ""%1""", АргументыКоманднойСтроки[0]); +param_ras = СтрШаблон("--ras ""%1""" , ПараметрыИзФайла.Получить("server_name")); +param_db = СтрШаблон("--db ""%1""" , ПараметрыИзФайла.Получить("db_name")); + +cluster_admin = ПолучитьПеременнуюСреды("VCI_CLUSTER_ADMIN"); +cluster_pwd = ПолучитьПеременнуюСреды("VCI_CLUSTER_PWD"); +Если Не ПустаяСтрока(CLUSTER_ADMIN) Тогда + param_cluster_admin = СтрШаблон("--cluster-admin ""%1""", cluster_admin); + param_cluster_pwd = СтрШаблон("--cluster-pwd ""%1""" , cluster_pwd); +КонецЕсли; + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить(КомандаSession); +МассивПараметров.Добавить("kill"); +МассивПараметров.Добавить(param_settings); +МассивПараметров.Добавить("--with-nolock"); +МассивПараметров.Добавить(param_ras); +МассивПараметров.Добавить(param_db); +МассивПараметров.Добавить(param_cluster_admin); +МассивПараметров.Добавить(param_cluster_pwd); + +Общие.ВыполнитьСтороннююКоманду(ЗапускаемоеПриложение, МассивПараметров); + +Лог.Отладка("Пауза %1 секунд", delay); +Приостановить(delay); diff --git a/tools/CI/scripts/session-lock.os b/tools/CI/scripts/session-lock.os new file mode 100644 index 0000000..ad5bcde --- /dev/null +++ b/tools/CI/scripts/session-lock.os @@ -0,0 +1,55 @@ + +#Использовать "..\..\..\src\" + +Лог = ПараметрыПриложения.Лог(); + +delay = 10; + +Если АргументыКоманднойСтроки.Количество() > 0 Тогда + ПараметрыИзФайла = Общие.ПрочитатьПеременныеОкруженияИзФайла(АргументыКоманднойСтроки[0]); +Иначе + ВызватьИсключение "Ошибка, не передан путь к файлу настроек окружения: env.*.json"; +КонецЕсли; + +// vrunner: блокировка сеансов + +ЗапускаемоеПриложение = "oscript"; +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); +КомандаSession = "session"; + +param_settings = СтрШаблон("--settings ""%1""", АргументыКоманднойСтроки[0]); +param_ras = СтрШаблон("--ras ""%1""" , ПараметрыИзФайла.Получить("server_name")); +param_db = СтрШаблон("--db ""%1""" , ПараметрыИзФайла.Получить("db_name")); + +cluster_admin = ПолучитьПеременнуюСреды("VCI_CLUSTER_ADMIN"); +cluster_pwd = ПолучитьПеременнуюСреды("VCI_CLUSTER_PWD"); +Если Не ПустаяСтрока(CLUSTER_ADMIN) Тогда + param_cluster_admin = СтрШаблон("--cluster-admin ""%1""", cluster_admin); + param_cluster_pwd = СтрШаблон("--cluster-pwd ""%1""" , cluster_pwd); +КонецЕсли; + +uccode = ПолучитьПеременнуюСреды("VCI_UCCODE"); +Если Не ПустаяСтрока(uccode) Тогда + param_uccode = СтрШаблон("--uccode ""%1""", uccode); +КонецЕсли; + +param_lockmessage = СтрШаблон("--lockmessage ""%1""", "Плановое обновление ИБ, подождите или обратитесь в тех. поддержку."); + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить(КомандаSession); +МассивПараметров.Добавить("lock"); +МассивПараметров.Добавить(param_settings); +МассивПараметров.Добавить(param_ras); +МассивПараметров.Добавить(param_db); +МассивПараметров.Добавить(param_cluster_admin); +МассивПараметров.Добавить(param_cluster_pwd); +МассивПараметров.Добавить(param_uccode); +МассивПараметров.Добавить(param_lockmessage); +МассивПараметров.Добавить("--lockendclear"); +МассивПараметров.Добавить("--try 3"); + +Общие.ВыполнитьСтороннююКоманду(ЗапускаемоеПриложение, МассивПараметров); + +Лог.Отладка("Пауза %1 секунд", delay); +Приостановить(delay); diff --git a/tools/CI/scripts/session-unlock.os b/tools/CI/scripts/session-unlock.os new file mode 100644 index 0000000..b4b87a6 --- /dev/null +++ b/tools/CI/scripts/session-unlock.os @@ -0,0 +1,44 @@ + +#Использовать "..\..\..\src\" + +Лог = ПараметрыПриложения.Лог(); + +delay = 10; + +Если АргументыКоманднойСтроки.Количество() > 0 Тогда + ПараметрыИзФайла = Общие.ПрочитатьПеременныеОкруженияИзФайла(АргументыКоманднойСтроки[0]); +Иначе + ВызватьИсключение "Ошибка, не передан путь к файлу настроек окружения: env.*.json"; +КонецЕсли; + +// vrunner: снятие блокировки сеанса + +ЗапускаемоеПриложение = "oscript"; +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); +КомандаSession = "session"; + +param_settings = СтрШаблон("--settings ""%1""", АргументыКоманднойСтроки[0]); +param_ras = СтрШаблон("--ras ""%1""" , ПараметрыИзФайла.Получить("server_name")); +param_db = СтрШаблон("--db ""%1""" , ПараметрыИзФайла.Получить("db_name")); + +cluster_admin = ПолучитьПеременнуюСреды("VCI_CLUSTER_ADMIN"); +cluster_pwd = ПолучитьПеременнуюСреды("VCI_CLUSTER_PWD"); +Если Не ПустаяСтрока(CLUSTER_ADMIN) Тогда + param_cluster_admin = СтрШаблон("--cluster-admin ""%1""", cluster_admin); + param_cluster_pwd = СтрШаблон("--cluster-pwd ""%1""" , cluster_pwd); +КонецЕсли; + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить(КомандаSession); +МассивПараметров.Добавить("unlock"); +МассивПараметров.Добавить(param_settings); +МассивПараметров.Добавить(param_ras); +МассивПараметров.Добавить(param_db); +МассивПараметров.Добавить(param_cluster_admin); +МассивПараметров.Добавить(param_cluster_pwd); + +Общие.ВыполнитьСтороннююКоманду(ЗапускаемоеПриложение, МассивПараметров); + +Лог.Отладка("Пауза %1 секунд", delay); +Приостановить(delay); diff --git a/tools/CI/scripts/sonar.os b/tools/CI/scripts/sonar.os index ff1b88e..aae9e06 100644 --- a/tools/CI/scripts/sonar.os +++ b/tools/CI/scripts/sonar.os @@ -1,10 +1,10 @@ #Использовать "..\..\..\src\" -// sonar-scanner: запуск статической проверки кода - СвойстваКонфигурации = Общие.ПолучитьСвойстваКонфигурации(); +// sonar-scanner: запуск статической проверки кода + МассивПараметров = Новый Массив; МассивПараметров.Добавить("-D sonar.token=" + ПолучитьПеременнуюСреды("SONAR_TOKEN")); МассивПараметров.Добавить("-D sonar.projectVersion=" + СвойстваКонфигурации.Version); diff --git a/tools/CI/scripts/switch-vanessa.os b/tools/CI/scripts/switch-vanessa.os new file mode 100644 index 0000000..95ffed3 --- /dev/null +++ b/tools/CI/scripts/switch-vanessa.os @@ -0,0 +1,12 @@ + +#Использовать "..\..\..\src\" +#Использовать asserts + +Ожидаем.Что(АргументыКоманднойСтроки.Количество(), "Должен быть строго один параметр с именем файла переменной окружения").Равно(1); +ПутьКФайлу = АргументыКоманднойСтроки[0]; + +Соответствие = Общие.ПрочитатьJSONИзФайла(ПутьКФайлу, Истина); +Соответствие.Получить("vanessa").Вставить("--vanessasettings", "./tools/JSON/VAParams.json"); +Соответствие.Получить("vanessa").Вставить("--pathvanessa", "C:/Program Files/OneScript/lib/vanessa-automation/vanessa-automation.epf"); + +Общие.ЗаписатьJSONВФайл(Соответствие, ПутьКФайлу); diff --git a/tools/CI/scripts/sync.os b/tools/CI/scripts/sync.os index 58ece5e..8bff843 100644 --- a/tools/CI/scripts/sync.os +++ b/tools/CI/scripts/sync.os @@ -1,19 +1,22 @@ #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьGitSync()); + // gitsync: запуск синхронизации хранилища 1С МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("sync"); -Общие.ВыполнитьСтороннююКоманду("gitsync", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); // git: отправка изменений в репозиторий Протокол = ?(ПолучитьПеременнуюСреды("CI_SERVER_PORT") = "443", "https", "http"); АдресРепозитория = СтрШаблон("%1://token:%2@%3/%4", Протокол, - ПолучитьПеременнуюСреды("GROUP_ACCESS_TOKEN"), // TODO Переименовать переменную + ПолучитьПеременнуюСреды("VCI_GROUP_ACCESS_TOKEN"), ПолучитьПеременнуюСреды("CI_SERVER_HOST"), ПолучитьПеременнуюСреды("CI_PROJECT_PATH")); ВеткаРепозитория = СтрШаблон("HEAD:%1", ПолучитьПеременнуюСреды("CI_COMMIT_BRANCH")); @@ -22,5 +25,6 @@ МассивПараметров.Добавить("push"); МассивПараметров.Добавить(АдресРепозитория); МассивПараметров.Добавить(ВеткаРепозитория); +МассивПараметров.Добавить("--tags"); Общие.ВыполнитьСтороннююКоманду("git", МассивПараметров); diff --git a/tools/CI/scripts/syntax-check.os b/tools/CI/scripts/syntax-check.os index c57a13c..4025548 100644 --- a/tools/CI/scripts/syntax-check.os +++ b/tools/CI/scripts/syntax-check.os @@ -1,10 +1,12 @@ #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + // vrunner: Синтаксический контроль МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("syntax-check"); -МассивПараметров.Добавить("--settings tools/JSON/vrunner.json"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/update.os b/tools/CI/scripts/update.os new file mode 100644 index 0000000..9a56c2d --- /dev/null +++ b/tools/CI/scripts/update.os @@ -0,0 +1,23 @@ + +#Использовать "..\..\..\src\" + +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + +// vrunner: Обновление из исходных файлов + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить("update-dev"); +МассивПараметров.Добавить("--src src/cf"); + +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); + +// vrunner: Запуск обновления ИБ + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить("run"); +МассивПараметров.Добавить("--command ""ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;"""); +МассивПараметров.Добавить("--execute $runnerRoot/epf/ЗакрытьПредприятие.epf"); + +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/updatedb.os b/tools/CI/scripts/updatedb.os new file mode 100644 index 0000000..01871b1 --- /dev/null +++ b/tools/CI/scripts/updatedb.os @@ -0,0 +1,21 @@ + +#Использовать "..\..\..\src\" + +// vrunner: Загрузка конфигурации из хранилища + +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + +param_settings = СтрШаблон("--settings ""%1""", АргументыКоманднойСтроки[0]); + +uccode = ПолучитьПеременнуюСреды("VCI_UCCODE"); +Если Не ПустаяСтрока(uccode) Тогда + param_uccode = СтрШаблон("--uccode ""%1""", uccode); +КонецЕсли; + +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); +МассивПараметров.Добавить("updatedb"); +МассивПараметров.Добавить(param_settings); +МассивПараметров.Добавить(param_uccode); + +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/vanessa.os b/tools/CI/scripts/vanessa.os index 9c830cb..39c2422 100644 --- a/tools/CI/scripts/vanessa.os +++ b/tools/CI/scripts/vanessa.os @@ -1,10 +1,14 @@ #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); +ПутьVanessaAutomation = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVAutomation()); + // vrunner: Запуск сценарных тестов МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("vanessa"); -МассивПараметров.Добавить("--settings tools/JSON/vrunner.json"); +МассивПараметров.Добавить("--pathvanessa " + ПутьVanessaAutomation); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/verbose.os b/tools/CI/scripts/verbose.os new file mode 100644 index 0000000..271dd03 --- /dev/null +++ b/tools/CI/scripts/verbose.os @@ -0,0 +1,7 @@ +#Использовать "..\..\..\src\" + +Лог = ПараметрыПриложения.Лог(); +Лог.Вывести(Символы.ПС, УровниЛога.Информация); +Для Каждого Переменная Из ПеременныеСреды() Цикл + Лог.Вывести("%1 = %2%3", УровниЛога.Информация, Переменная.Ключ, Переменная.Значение, Символы.ПС); +КонецЦикла; diff --git a/tools/CI/scripts/xunit-tests.os b/tools/CI/scripts/xunit-tests.os index a91ae68..37f4022 100644 --- a/tools/CI/scripts/xunit-tests.os +++ b/tools/CI/scripts/xunit-tests.os @@ -1,11 +1,13 @@ #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + // vrunner: Запуск модульных тестов МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("xunit"); МассивПараметров.Добавить("tests"); -МассивПараметров.Добавить("--settings tools/JSON/vrunner.json"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/scripts/xunit.os b/tools/CI/scripts/xunit.os index 28fc682..7bb4f75 100644 --- a/tools/CI/scripts/xunit.os +++ b/tools/CI/scripts/xunit.os @@ -1,10 +1,12 @@ #Использовать "..\..\..\src\" +ИсполняемыйФайл = Общие.ОбъединитьПутиВСтроку(ПараметрыПриложения.КаталогПриложенияИсточник(), ПараметрыПриложения.ВернутьПутьVrunner()); + // vrunner: Запуск дымовых тестов МассивПараметров = Новый Массив; +МассивПараметров.Добавить(ИсполняемыйФайл); МассивПараметров.Добавить("xunit"); -МассивПараметров.Добавить("--settings tools/JSON/vrunner.json"); -Общие.ВыполнитьСтороннююКоманду("vrunner", МассивПараметров); +Общие.ВыполнитьСтороннююКоманду("oscript", МассивПараметров); diff --git a/tools/CI/templates/.post.yml b/tools/CI/templates/.post.yml new file mode 100644 index 0000000..29ad4c1 --- /dev/null +++ b/tools/CI/templates/.post.yml @@ -0,0 +1,12 @@ + +post: + stage: .post + variables: + GIT_STRATEGY: none + allow_failure: true + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + tags: + - OneS + script: + - vci run close-all-1c-process diff --git a/tools/CI/templates/.pre.yml b/tools/CI/templates/.pre.yml new file mode 100644 index 0000000..e8ba158 --- /dev/null +++ b/tools/CI/templates/.pre.yml @@ -0,0 +1,12 @@ + +pre: + stage: .pre + variables: + GIT_STRATEGY: none + allow_failure: true + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + tags: + - OneS + script: + - vci run close-all-1c-process diff --git a/tools/CI/templates/_deploy.yml b/tools/CI/templates/_deploy.yml deleted file mode 100644 index be8df18..0000000 --- a/tools/CI/templates/_deploy.yml +++ /dev/null @@ -1,42 +0,0 @@ - -Блокировка сеансов: - except: - - schedules - stage: deploy - variables: - GIT_STRATEGY: none - only: - refs: - - main - tags: - - OneS - script: - - echo 'Блокировка сеансов 1С предприятия testnew ИБ' - -Обновление ИБ: - except: - - schedules - stage: deploy - variables: - GIT_STRATEGY: none - only: - refs: - - main - tags: - - OneS - script: - - echo 'Обновление ИБ 1С предприятия testnew ИБ' - -Run: - except: - - schedules - stage: deploy - variables: - GIT_STRATEGY: none - only: - refs: - - main - tags: - - OneS - script: - - echo 'Запуск ИБ 1С предприятия testnew ИБ' diff --git a/tools/CI/templates/allure.yml b/tools/CI/templates/allure.yml index 184cef9..c767c77 100644 --- a/tools/CI/templates/allure.yml +++ b/tools/CI/templates/allure.yml @@ -1,18 +1,24 @@ Allure: - except: - - schedules stage: report variables: GIT_STRATEGY: none allow_failure: true - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + - changes: + - features/**/* + - fixtures/**/* + - src/**/* + - tests/**/* tags: - OneS script: - - vci run allure + - vci run allure-generate artifacts: paths: - build/allure-report + needs: + - job: Модульные тесты + - Сценарные тесты + - Дымовые тесты diff --git a/tools/CI/templates/build.yml b/tools/CI/templates/build.yml index efbd7ae..3493ee2 100644 --- a/tools/CI/templates/build.yml +++ b/tools/CI/templates/build.yml @@ -1,32 +1,34 @@ Создание тестовой базы: - except: - - schedules stage: build variables: GIT_STRATEGY: none -# GIT_DEPTH: "1000000" # Tells git to fetch all the branches of the project, required by the analysis task - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + - changes: + - features/**/* + - fixtures/**/* + - src/**/* + - tests/**/* tags: - OneS script: - vci run close-all-1c-process - vci run create-base + - vci run launch-IB-update Компиляция внешних файлов: - except: - - schedules stage: build variables: GIT_STRATEGY: none - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + - changes: + - src/**/* tags: - OneS script: + - vci run close-all-1c-process - vci run compilecf - vci run compilecfe - vci run compileepf diff --git a/tools/CI/templates/changelog.yml b/tools/CI/templates/changelog.yml new file mode 100644 index 0000000..4908621 --- /dev/null +++ b/tools/CI/templates/changelog.yml @@ -0,0 +1,28 @@ + +generate-changelog: + # before_script: + # # email и имя пользователя, от чьего имени будет создаваться коммит + # # - git config --global user.email "$GITLAB_USER_EMAIL" + # # - git config --global user.name "$GITLAB_USER_NAME" + # - git fetch --tags -f + stage: report + variables: + GIT_STRATEGY: none + allow_failure: true + # делаем автозапуск задачи только для мастер ветки. + # Так как мы не пушим напрямую в мастер, а используем merge request, то задача выполняется после слияния MR + # так же запрещаем задачу, если проставляем тег и для коммитов с "chore(release):" (значит, что команда уже была выполнена) + ## except: + ## refs: + ## - tags + ## variables: + ## - $CI_COMMIT_MESSAGE =~ /^chore\(release\):/ + rules: + - if: '$CI_COMMIT_MESSAGE =~ /^chore\(release\):/' + when: always + - if: '$CI_COMMIT_TAG' + when: never + tags: + - OneS + script: + - vci run generate-changelog diff --git a/tools/CI/templates/coverage.yml b/tools/CI/templates/coverage.yml index 8b0482d..ed5cbdf 100644 --- a/tools/CI/templates/coverage.yml +++ b/tools/CI/templates/coverage.yml @@ -1,15 +1,20 @@ Coverage: - except: - - schedules - stage: report + stage: test variables: GIT_STRATEGY: none allow_failure: true - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + - changes: + - features/**/* + - fixtures/**/* + - src/**/* + - tests/**/* tags: - OneS script: - vci run coverage + needs: + - job: Создание тестовой базы + - Компиляция внешних файлов diff --git a/tools/CI/templates/deployment.yml b/tools/CI/templates/deployment.yml new file mode 100644 index 0000000..f0a28e4 --- /dev/null +++ b/tools/CI/templates/deployment.yml @@ -0,0 +1,43 @@ + +1. Блокировка сеансов [job]: + stage: [stage] + variables: + GIT_STRATEGY: none + when: manual + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + tags: + - OneS + script: + - vci run session-lock [setting] + - vci run session-kill [setting] + +2. Обновление ИБ [job]: + stage: [stage] + variables: + GIT_STRATEGY: none + when: manual + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + tags: + - OneS + script: + - vci run loadrepo [setting] + - vci run updatedb [setting] + needs: + - job: 1. Блокировка сеансов [job] + +3. Запуск ИБ [job]: + stage: [stage] + variables: + GIT_STRATEGY: none + when: manual + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + tags: + - OneS + script: + - vci run launch-IB-update [setting] + - vci run session-unlock [setting] + needs: + - job: 1. Блокировка сеансов [job] diff --git a/tools/CI/templates/pages.yml b/tools/CI/templates/pages.yml index c2226ad..593229e 100644 --- a/tools/CI/templates/pages.yml +++ b/tools/CI/templates/pages.yml @@ -1,14 +1,11 @@ pages: - except: - - schedules - stage: deploy + stage: report variables: GIT_STRATEGY: none allow_failure: true - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" tags: - OneS script: @@ -16,3 +13,6 @@ pages: artifacts: paths: - public + needs: + - job: Allure + - SonarQube diff --git a/tools/CI/templates/schedules.yml b/tools/CI/templates/schedules.yml index 9e229e4..df32929 100644 --- a/tools/CI/templates/schedules.yml +++ b/tools/CI/templates/schedules.yml @@ -1,9 +1,12 @@ -# TODO pipeline при исполнении не видит этот шаг gitsync: stage: schedules - only: - - schedules + variables: + GIT_STRATEGY: none + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + tags: + - OneS script: - vci run close-all-1c-process - vci run sync diff --git a/tools/CI/templates/sonar.yml b/tools/CI/templates/sonar.yml index 13c13ef..79a4869 100644 --- a/tools/CI/templates/sonar.yml +++ b/tools/CI/templates/sonar.yml @@ -1,16 +1,20 @@ SonarQube: - except: - - schedules stage: report variables: - GIT_STRATEGY: none SONAR_SCANNER_OPTS: "-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Xmx6G" + GIT_STRATEGY: none allow_failure: true - only: - refs: - - main + rules: + - if: '$CI_PIPELINE_SOURCE != "schedule" && $CI_PIPELINE_SOURCE != "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + - changes: + - features/**/* + - fixtures/**/* + - src/**/* + - tests/**/* tags: - OneS script: - vci run sonar + needs: + - job: Allure diff --git a/tools/CI/templates/stages.yml b/tools/CI/templates/stages.yml deleted file mode 100644 index da755f1..0000000 --- a/tools/CI/templates/stages.yml +++ /dev/null @@ -1,7 +0,0 @@ - -stages: - - schedules - - build - - test - - report - - deploy diff --git a/tools/CI/templates/syntax-check.yml b/tools/CI/templates/syntax-check.yml index 25e83f6..07b8939 100644 --- a/tools/CI/templates/syntax-check.yml +++ b/tools/CI/templates/syntax-check.yml @@ -1,19 +1,19 @@ Синтаксический контроль: - except: - - schedules stage: test variables: GIT_STRATEGY: none allow_failure: true - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + - changes: + - src/**/* tags: - OneS script: - vci run syntax-check + timeout: 5h 00m artifacts: reports: junit: - build/out/syntax-check/junit/junit.xml + out/syntax-check/junit/junit.xml diff --git a/tools/CI/templates/tests.yml b/tools/CI/templates/tests.yml index c2306ec..a57aaf2 100644 --- a/tools/CI/templates/tests.yml +++ b/tools/CI/templates/tests.yml @@ -1,63 +1,71 @@ -Дымовые тесты: - except: - - schedules +Модульные тесты: stage: test variables: GIT_STRATEGY: none allow_failure: true - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + - changes: + - src/**/* + - tests/**/* tags: - OneS script: - - vci run xunit + - vci run xunit-tests artifacts: reports: junit: - build/out/smoke/junit/*.xml + out/tests/junit/*.xml paths: - - build/out/smoke/allure/ + - out/tests/allure/ + needs: + - job: Coverage -Модульные тесты: - except: - - schedules +Сценарные тесты: stage: test variables: GIT_STRATEGY: none allow_failure: true - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + - changes: + - features/**/* + - fixtures/**/* + - src/**/* tags: - OneS script: - - vci run xunit-tests + - vci run vanessa artifacts: reports: junit: - build/out/smoke/junit/*.xml + out/bdd/junit/*.xml paths: - - build/out/smoke/allure/ + - out/bdd/allure/ + needs: + - job: Coverage -Сценарные тесты: - except: - - schedules +Дымовые тесты: stage: test variables: GIT_STRATEGY: none allow_failure: true - only: - refs: - - main + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + - changes: + - src/**/* tags: - OneS script: - - vci run vanessa + - vci run xunit artifacts: reports: junit: - build/out/bdd/junit/*.xml + out/smoke/junit/*.xml paths: - - build/out/bdd/allure/ + - out/smoke/allure/ + needs: + - job: Coverage + - Модульные тесты + - Сценарные тесты diff --git a/tools/CI/templates/verbose.yml b/tools/CI/templates/verbose.yml new file mode 100644 index 0000000..07e2c4c --- /dev/null +++ b/tools/CI/templates/verbose.yml @@ -0,0 +1,11 @@ + +Отладка: + stage: verbose + variables: + GIT_STRATEGY: none + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + tags: + - OneS + script: + - vci run verbose diff --git a/tools/README.md b/tools/README.md index 5832d1a..f042eed 100644 --- a/tools/README.md +++ b/tools/README.md @@ -1,3 +1,4 @@ -### Каталог tools + +# Каталог tools Предназначен для хранения любых сторонних утилит, необходимых для настройки проекта или для дополнительно установки diff --git a/tools/scripts/build-package.bat b/tools/scripts/build-package.bat deleted file mode 100644 index 83b74f0..0000000 --- a/tools/scripts/build-package.bat +++ /dev/null @@ -1,6 +0,0 @@ - -chcp 65001 - -@REM Собрать пакет OScript -call mkdir ".\build" -call opm build --mf .\packagedef --out .\build diff --git a/tools/scripts/install-oscript-local.bat b/tools/scripts/install-oscript-local.bat index c2ca1be..cf509c5 100644 --- a/tools/scripts/install-oscript-local.bat +++ b/tools/scripts/install-oscript-local.bat @@ -12,10 +12,10 @@ chcp 65001 @REM # - opm install -f ".\tools\onescript-version-manager\opm.ospx" call mkdir ".\tools\onescript-version-manager" -call choco install -r --no-progress curl -y +@REM call choco install -r --no-progress curl -y call curl.exe -L %OVM_DOWNLOAD_URL% --output ".\tools\onescript-version-manager\ovm.exe" call .\tools\onescript-version-manager\ovm install -c %OVM_INSTALL_VERSION% call .\tools\onescript-version-manager\ovm use %OVM_USE_VERSION% call .\tools\onescript-version-manager\ovm which current @REM call curl -L %OPM_DOWNLOAD_URL% --output ".\tools\onescript-version-manager\opm.ospx" -@REM call opm install -f ".\tools\onescript-version-manager\opm.ospx" \ No newline at end of file +@REM call opm install -f ".\tools\onescript-version-manager\opm.ospx" diff --git a/tools/scripts/install-package-from-hub.bat b/tools/scripts/install-package-from-hub.bat deleted file mode 100644 index f6bb7c4..0000000 --- a/tools/scripts/install-package-from-hub.bat +++ /dev/null @@ -1,5 +0,0 @@ - -chcp 65001 - -@REM Установить пакет OScript из hub.oscript -call opm install vanessa-ci-scripts diff --git a/tools/scripts/install-package-from-ospx.bat b/tools/scripts/install-package-from-ospx.bat deleted file mode 100644 index 438c78d..0000000 --- a/tools/scripts/install-package-from-ospx.bat +++ /dev/null @@ -1,5 +0,0 @@ - -chcp 65001 - -@REM Установить пакет OScript из .*ospx -call opm install -f .\build\vanessa-ci-scripts-1.0.1.ospx