diff --git a/.github/actions/extract-version/action.yml b/.github/actions/extract-version/action.yml new file mode 100644 index 0000000..207236d --- /dev/null +++ b/.github/actions/extract-version/action.yml @@ -0,0 +1,17 @@ +name: Извлечение версии +description: Извлечение версии из исходников +inputs: + path: + description: 'Путь к исходникам' + required: true +outputs: + version: + description: 'Версия' + value: ${{ steps.extract_version.outputs.version }} +runs: + using: "composite" + steps: + - name: Извлечение версии + shell: bash + run: echo "version=$(cat ${{ inputs.path }}/Configuration/Configuration.mdo | grep -oP '(?<=)[\d.]+')" >> $GITHUB_OUTPUT + id: extract_version \ No newline at end of file diff --git a/.github/actions/load-extension/action.yml b/.github/actions/load-extension/action.yml new file mode 100644 index 0000000..fd93daa --- /dev/null +++ b/.github/actions/load-extension/action.yml @@ -0,0 +1,18 @@ +name: Загрузка расширения +description: Загрузка расширения в информационную базу с использованием ibcmd +inputs: + name: + description: 'Имя загружаемого расширения' + required: true + path: + description: 'Путь к файлу расширения' + required: true +runs: + using: "composite" + steps: + - name: Загрузка расширения ${{inputs.name}} + shell: bash + run: | + ibcmd infobase config load --db-path=file-db --extension=${{inputs.name}} --force ${{inputs.path}} + ibcmd infobase config apply --db-path=file-db --extension=${{inputs.name}} --force + ibcmd infobase config extension update --db-path=file-db --name=${{inputs.name}} --safe-mode=no --unsafe-action-protection=no \ No newline at end of file diff --git a/.github/workflows/perform-tests.yml b/.github/workflows/perform-tests.yml new file mode 100644 index 0000000..a64bf63 --- /dev/null +++ b/.github/workflows/perform-tests.yml @@ -0,0 +1,67 @@ +name: Тестирование +on: + push: + branches: + - feature/** + - develop + paths: + - '.github/workflows/**' + - 'exts/**' + - 'tests/**' + - 'fixtures/**' + + pull_request_target: + branches: [ develop ] + paths: + - '.github/workflows/**' + - 'exts/**' + - 'tests/**' + - 'fixtures/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.number }}-main + cancel-in-progress: true + +permissions: + contents: write + checks: write + id-token: write + +jobs: + export_to_designer: + name: Конвертация исходников + uses: ./.github/workflows/step-export-xml.yml + with: + edt_version: 2023.1.2 + artifact_name: designer-src + secrets: inherit + + build_artifacts: + name: Сборка + uses: ./.github/workflows/step-build-artifacts-windows.yml + needs: export_to_designer + with: + v8_version: 8.3.21.1895 + secrets: inherit + + tests: + name: Тест + strategy: + fail-fast: false + matrix: + version: + - 8.3.21.1895 + locale: + - ru_RU + - en_US + os: + - windows-latest + - ubuntu-22.04 + + uses: ./.github/workflows/step-run-tests.yml + needs: build_artifacts + with: + v8_version: ${{ matrix.version }} + locale: ${{ matrix.locale }} + os: ${{ matrix.os }} + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/step-build-artifacts-windows.yml b/.github/workflows/step-build-artifacts-windows.yml new file mode 100644 index 0000000..71e8fd9 --- /dev/null +++ b/.github/workflows/step-build-artifacts-windows.yml @@ -0,0 +1,85 @@ +name: Сборка артефактов +on: + workflow_call: + inputs: + v8_version: + type: string + required: true + + src_artifact_name: + type: string + required: false + default: designer-src + + artifact_name: + type: string + required: false + default: build-artifacts + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.number }}-build + cancel-in-progress: true + +jobs: + build: + name: Сборка + runs-on: windows-latest + defaults: + run: + shell: pwsh + steps: + + - name: Установка 1С:Предприятие + uses: 1CDevFlow/onec-setup-action@main + with: + type: onec + onec_version: ${{ inputs.v8_version }} + cache: true + env: + ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} + ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} + timeout-minutes: 10 + + - name: Загрузка исходников в формате конфигуратора + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.src_artifact_name }} + + - name: Распаковка исходников + run: | + mkdir export + mkdir binary + cd export + 7z x ../export.7z -y + + - name: Создание информационной базы + run: ibcmd infobase create --db-path=file-db --import=export\configuration --apply --force + timeout-minutes: 5 + + - name: Импорт rat из исходников + run: ibcmd infobase config import --db-path=file-db --extension=RAT export\rat + timeout-minutes: 5 + + - name: Импорт тестов из исходников + run: ibcmd infobase config import --db-path=file-db --extension=tests export\tests + timeout-minutes: 5 + + - name: Сохрание расширения rat + run: ibcmd infobase config save --db-path=file-db --extension=RAT binary\rat.cfe + timeout-minutes: 5 + + - name: Сохрание расширения с тестами + run: ibcmd infobase config save --db-path=file-db --extension=tests binary\tests.cfe + timeout-minutes: 5 + + - name: Сохрание тестовой конфигурации + run: ibcmd infobase config save --db-path=file-db binary\configuration.cf + timeout-minutes: 5 + + - name: Публикация артефактов + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.artifact_name }} + path: binary\*.* + if-no-files-found: error + retention-days: 1 diff --git a/.github/workflows/step-export-xml.yml b/.github/workflows/step-export-xml.yml new file mode 100644 index 0000000..a720ab4 --- /dev/null +++ b/.github/workflows/step-export-xml.yml @@ -0,0 +1,99 @@ +name: Конвертация исходников в формат конфигуратора +on: + workflow_call: + inputs: + edt_version: + type: string + required: true + + artifact_name: + type: string + required: true + + engine_only: + type: boolean + required: false + default: false + outputs: + rat_version: + value: ${{ jobs.export.outputs.rat_version }} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.number }}-export + cancel-in-progress: true + +jobs: + export: + name: Конвертация + runs-on: ubuntu-22.04 + outputs: + rat_version: ${{ steps.extract_version.outputs.version }} + + steps: + - name: Извлечение исходников PR + if: github.event_name == 'pull_request_target' || github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + ref: refs/pull/${{ github.event.number }}/merge # Для поддержки pull_request и pull_request_target + + - name: Извлечение исходников ветки ${{ github.ref_name }} + if: github.event_name == 'push' + uses: actions/checkout@v4 + + - name: Извлечение версии rat + uses: ./.github/actions/extract-version + with: + path: ./exts/rat/src + id: extract_version + + - name: Установка 1C:EDT + uses: 1CDevFlow/onec-setup-action@main + with: + type: edt + edt_version: ${{ inputs.edt_version }} + cache: true + env: + ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} + ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} + timeout-minutes: 30 + + - name: Ковертация исходников конфигурации + if: ${{ !inputs.engine_only }} + uses: alkoleft/onec-edtcli-command-action@main + with: + export: true + from: fixtures/configuration + to: export/configuration + timeout: 15 + timeout-minutes: 15 + + - name: Ковертация исходников тестов + uses: alkoleft/onec-edtcli-command-action@main + with: + export: true + from: exts/rat + to: export/rat + timeout: 15 + timeout-minutes: 15 + + - name: Ковертация исходников тестов + uses: alkoleft/onec-edtcli-command-action@main + with: + export: true + from: tests + to: export/tests + timeout: 15 + timeout-minutes: 15 + + - name: Упаковка исходников в архив + run: | + cd export + 7za a -t7z ../export.7z ./ + + - name: Публикация исходников в формате конфигуратора + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.artifact_name }} + path: export.7z + if-no-files-found: error + retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/step-run-tests.yml b/.github/workflows/step-run-tests.yml new file mode 100644 index 0000000..8c3cb43 --- /dev/null +++ b/.github/workflows/step-run-tests.yml @@ -0,0 +1,213 @@ +name: Тестирование + +on: + workflow_call: + inputs: + v8_version: + description: 'Версия 1С:Предприятие' + type: string + required: true + + locale: + type: string + required: false + default: ru_RU + + artifact_name: + type: string + required: false + default: build-artifacts + + fail_on_failure: + type: boolean + required: false + default: true + + os: + type: string + required: true + +permissions: + contents: read + checks: write + id-token: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }}-${{ inputs.v8_version }}-${{ inputs.locale }}-${{ github.event.number }}-${{inputs.os}} + cancel-in-progress: true + +jobs: + execute-tests: + name: Тестирование + runs-on: ${{inputs.os}} + steps: + + - name: Загрузка артифактов + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.artifact_name }} + path: binary + + - name: Подготовка окружения (Linux) + if: runner.os == 'Linux' + run: | + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y locales + sudo ln -s /usr/lib/x86_64-linux-gnu/libenchant-2.so.2 /usr/lib/libenchant.so.1 + sudo localedef -i ${{ inputs.locale }} -c -f UTF-8 -A /usr/share/locale/locale.alias ${{ inputs.locale }}.UTF-8 + + mkdir -p ~/.1cv8/1C/1cv8/conf/ + echo "DisableUnsafeActionProtection=.*" >>~/.1cv8/1C/1cv8/conf/conf.cfg + + - name: Установка xvfb и зависимостей (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y xvfb x11-utils net-tools libgstreamer-plugins-base1.0-0 gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly + sudo ldconfig + + - name: Подготовка окружения (Windows) + if: runner.os == 'Windows' + run: | + mkdir -p "C:\Program Files\1cv8\conf" + "DisableUnsafeActionProtection=.*" | Out-File -FilePath "C:\Program Files\1cv8\conf\conf.cfg" -Encoding Unicode -Append + + - name: Определение "короткой" локали + id: short_locale + shell: pwsh + run: | + Write-Output "substring=$('${{ inputs.locale }}'.Substring(0, 2))" >> $Env:GITHUB_OUTPUT + + - name: Установка 1С:Предприятие + uses: 1CDevFlow/onec-setup-action@main + with: + type: onec + onec_version: ${{ inputs.v8_version }} + cache: ${{runner.os == 'Windows'}} + env: + ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} + ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} + timeout-minutes: 10 + + - name: Создание информационной базы + shell: bash + run: | + ibcmd infobase create --db-path=file-db --load=binary/configuration.cf --apply --force + timeout-minutes: 5 + + - name: Загрузка расширения c rat + uses: 1CDevFlow/workflows/actions/load-extension@main + with: + name: RAT + path: binary/rat.cfe + + - name: Загрузка расширения c тестами + uses: 1CDevFlow/workflows/actions/load-extension@main + with: + name: tests + path: binary/tests.cfe + + - name: Создание файла конфигурации тестирования + uses: DamianReeves/write-file-action@master + with: + path: yaxunit-config.json + contents: | + { + "reportFormat": "jUnit", + "reportPath": "report.xml", + "closeAfterTests": true, + "exitCode": "exit-code.txt", + "logging": { + "console": true, + "file": "log.txt" + } + } + + - name: Запуск тестирования (Linux) + if: runner.os == 'Linux' + run: | + # Запуск ibsrv в фоне + ibsrv --db-path=file-db --daemon & + sleep 5 + + # Проверка, что сервер запустился + echo "Проверка состояния ibsrv..." + ps aux | grep ibsrv || echo "ibsrv не найден в процессах" + + # Проверка доступности порта + netstat -tlnp | grep 8314 || echo "Порт 8314 не прослушивается" + + # Запуск тестов через xvfb-run + echo "Запуск тестов через xvfb-run..." + xvfb-run -a -s "-screen 0 1024x768x24" 1cv8c /WS "http://localhost:8314" /C"RunUnitTests=yaxunit-config.json" /L ${{ steps.short_locale.outputs.substring }} /VL ${{ inputs.locale }} /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out output.log + + # Проверка результата выполнения + echo "Код завершения тестов: $?" + env: + LANG: "${{ inputs.locale }}.UTF-8" + DISPLAY: ":99" + timeout-minutes: 10 + + - name: Запуск тестирования (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + # Запуск ibsrv в фоне + Start-Process ibsrv.exe -ArgumentList "--db-path=file-db" -WindowStyle Hidden + Start-Sleep -Seconds 5 + # Проверка, что сервер запустился + Write-Host "Проверка состояния ibsrv..." + Get-Process ibsrv -ErrorAction SilentlyContinue | Select-Object ProcessName, Id, CPU + # Запуск тестов + Write-Host "Запуск тестов..." + $result = Start-Process -NoNewWindow -PassThru -Wait 1cv8c.exe -ArgumentList '/WS "http://localhost:8314" /C"RunUnitTests=yaxunit-config.json" /L ${{ steps.short_locale.outputs.substring }} /VL ${{ inputs.locale }} /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out output.log' + # Проверка результата выполнения + Write-Host "Код завершения тестов: $($result.ExitCode)" + if ($result.ExitCode -ne 0) { exit $result.ExitCode } + timeout-minutes: 10 + + - name: Сохранение файла отчета + uses: actions/upload-artifact@v4 + if: always() + with: + name: Отчет о тестировании. ${{runner.os}} ${{ inputs.v8_version }} ${{ inputs.locale }} + path: report.xml + + - name: Публикация отчета о тестировании + uses: 1CDevFlow/action-onec-junit-report@main + if: always() + with: + job_name: Тестирование + check_name: Отчет о тестировании. ${{runner.os}} ${{ inputs.v8_version }} ${{ inputs.locale }} + report_paths: report.xml + fail_on_failure: true + require_passed_tests: true + + - name: Лог выполнения + if: always() + continue-on-error: true + run: cat log.txt + + - name: Лог платформы + if: always() + run: cat output.log + continue-on-error: true + + - name: Очистка процессов (Linux) + if: always() && runner.os == 'Linux' + run: | + echo "Очистка процессов ibsrv..." + pkill -f ibsrv || echo "Процессы ibsrv не найдены" + pkill -f xvfb || echo "Процессы xvfb не найдены" + + - name: Очистка процессов (Windows) + if: always() && runner.os == 'Windows' + shell: pwsh + run: | + Write-Host "Очистка процессов ibsrv..." + try { + Get-Process ibsrv -ErrorAction SilentlyContinue | Stop-Process -Force + Write-Host "Процессы ibsrv остановлены" + } catch { + Write-Host "Ошибка остановки процессов ibsrv: $_" + } + \ No newline at end of file