├── .github ├── dependabot.yml ├── workflows │ ├── deploy-docs.yml │ ├── release.yml │ ├── test.yml │ └── sonar.yml └── copilot-instructions.md └── README.md /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "github-actions" 9 | directory: "/" 10 | schedule: 11 | interval: "daily" 12 | 13 | -------------------------------------------------------------------------------- /.github/workflows/deploy-docs.yml: -------------------------------------------------------------------------------- 1 | name: Публикация документации 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | github_repository: 7 | required: true 8 | type: string 9 | os_version: 10 | description: Operating system to run deployment on 11 | type: string 12 | required: false 13 | default: "ubuntu-latest" 14 | secrets: 15 | TRIGGER_DOCS_DEPLOY_TOKEN: 16 | required: true 17 | description: "Токен для триггера начала сборки документации. Должен иметь scope repo и доступ к autumn-library/autumn-library.github.io" 18 | 19 | jobs: 20 | deploy: 21 | if: (github.repository == ${{ inputs.github_repository }} ) && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name) 22 | runs-on: ${{ inputs.os_version }} 23 | 24 | steps: 25 | - name: Event Dispatch 26 | uses: peter-evans/repository-dispatch@v4 27 | with: 28 | token: ${{ secrets.TRIGGER_DOCS_DEPLOY_TOKEN }} 29 | repository: autumn-library/autumn-library.github.io 30 | event-type: deploy 31 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # Copyright (C) 2020 Tymko Oleg and contributors 3 | # All rights reserved. 4 | 5 | name: Подготовка релиза и публикация в хабе 6 | 7 | on: 8 | workflow_call: 9 | inputs: 10 | oscript_version: 11 | required: false 12 | type: string 13 | default: "default" 14 | opm_version: 15 | description: Version of OPM to install (e.g., "1.1.0"). If empty, installs the latest version without version specification 16 | required: false 17 | default: "" 18 | type: string 19 | package_mask: 20 | required: false 21 | type: string 22 | default: "*.ospx" 23 | dotnet_version: 24 | description: Version of .NET to install 25 | type: string 26 | required: false 27 | default: "" 28 | os_version: 29 | description: Operating system to run release on 30 | type: string 31 | required: false 32 | default: "ubuntu-latest" 33 | secrets: 34 | PUSH_TOKEN: 35 | required: false 36 | 37 | env: 38 | PACKAGE_MASK: ${{ inputs.package_mask }} 39 | 40 | jobs: 41 | build: 42 | runs-on: ${{ inputs.os_version }} 43 | steps: 44 | # Загрузка проекта 45 | - name: Актуализация 46 | uses: actions/checkout@v6.0.1 47 | 48 | - name: Установка .NET 49 | if: inputs.dotnet_version != '' 50 | uses: actions/setup-dotnet@v5 51 | with: 52 | dotnet-version: ${{ inputs.dotnet_version }} 53 | 54 | - name: Вычисление версии OneScript 55 | shell: bash 56 | id: extract_oscript_version 57 | run: | 58 | set -ex 59 | if [ "${{ inputs.oscript_version }}" = "default" ] 60 | then 61 | extracted_version=$(cat packagedef | grep ".ВерсияСреды(" | sed 's|[^"]*"||' | sed -r 's/".+//' || true) 62 | version="${extracted_version:-stable}" 63 | else 64 | version="${{ inputs.oscript_version }}" 65 | fi 66 | echo "version=$version" >> $GITHUB_OUTPUT 67 | 68 | - name: Установка OneScript 69 | uses: otymko/setup-onescript@v1.5.1 70 | with: 71 | version: ${{ steps.extract_oscript_version.outputs.version }} 72 | 73 | # Установка зависимостей пакета 74 | - name: Установка зависимостей (Windows) 75 | if: runner.os == 'Windows' 76 | shell: pwsh 77 | run: | 78 | if ("${{ inputs.opm_version }}" -ne "") { 79 | opm install opm@${{ inputs.opm_version }} 80 | } else { 81 | opm install opm 82 | } 83 | opm install -l 84 | 85 | - name: Установка зависимостей (Linux/macOS) 86 | if: runner.os != 'Windows' 87 | shell: bash 88 | run: | 89 | if [ -n "${{ inputs.opm_version }}" ]; then 90 | opm install opm@${{ inputs.opm_version }} 91 | else 92 | opm install opm 93 | fi 94 | opm install -l 95 | 96 | - name: Сборка пакета 97 | run: opm build . 98 | 99 | - name: Заливка артефактов 100 | uses: actions/upload-artifact@v6 101 | with: 102 | name: package.zip 103 | path: ./${{ env.PACKAGE_MASK }} 104 | 105 | #- name: Заливка в релиз 106 | # uses: AButler/upload-release-assets@v2.0.2 107 | # with: 108 | # files: ./${{ env.PACKAGE_MASK }} 109 | # repo-token: ${{ secrets.GITHUB_TOKEN }} 110 | 111 | - name: Публикация в hub.oscript.io 112 | shell: bash 113 | env: 114 | GITHUB_OAUTH_TOKEN: ${{ secrets.PUSH_TOKEN }} 115 | OPM_HUB_CHANNEL: stable 116 | run: opm push ${{ env.PACKAGE_MASK }} 117 | 118 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Тестирование 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | 7 | # General inputs 8 | oscript_version: 9 | required: false 10 | type: string 11 | default: "default" 12 | opm_version: 13 | description: Version of OPM to install (e.g., "1.1.0"). If empty, installs the latest version without version specification 14 | required: false 15 | default: "" 16 | type: string 17 | additional_oscript_packages: 18 | description: Package list to install, space separated. 19 | type: string 20 | required: false 21 | test_engine: 22 | description: Test engine to use. Can be one of 'oneunit', '1testrunner'. 23 | type: string 24 | required: false 25 | default: "1testrunner" 26 | dotnet_version: 27 | description: Version of .NET to install 28 | type: string 29 | required: false 30 | default: "" 31 | build_package: 32 | description: Execute 'opm build .' after installing dependencies 33 | type: boolean 34 | required: false 35 | default: false 36 | os_versions: 37 | description: Operating systems to run tests on, JSON array format. 38 | type: string 39 | required: false 40 | default: '["ubuntu-latest", "windows-latest", "macos-latest"]' 41 | 42 | # 1testrunner inputs 43 | test_script_path: 44 | required: false 45 | type: string 46 | default: ./tasks/test.os 47 | 48 | # OneUnit inputs 49 | oneunit_version: 50 | description: Version of OneUnit to install ("0.2.3", "0.3.0"). If empty, installs the latest version 51 | required: false 52 | type: string 53 | default: '' 54 | test_dir_paths: 55 | description: Comma-separated list of paths to test directories. 56 | required: false 57 | type: string 58 | test_file_paths: 59 | description: Comma-separated list of paths to test files. 60 | required: false 61 | type: string 62 | test_tags: 63 | description: Comma-separated list of tags to run. 64 | required: false 65 | type: string 66 | test_default_timeout: 67 | description: Timeout in seconds for each test. 68 | required: false 69 | type: number 70 | default: 0 71 | test_log_mod: 72 | description: Log mode for tests. 73 | required: false 74 | type: string 75 | default: "tree" 76 | 77 | jobs: 78 | build: 79 | runs-on: ${{ matrix.os }} 80 | strategy: 81 | fail-fast: false 82 | matrix: 83 | os: ${{ fromJSON(inputs.os_versions) }} 84 | oscript_version: 85 | - ${{ inputs.oscript_version }} 86 | test_engine: 87 | - ${{ inputs.test_engine }} 88 | 89 | steps: 90 | - name: Актуализация 91 | uses: actions/checkout@v6.0.1 92 | 93 | - name: Установка свойств git 94 | shell: bash 95 | run: | 96 | git config --global user.name "GitHub Actions" 97 | git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" 98 | 99 | - name: Установка .NET 100 | if: inputs.dotnet_version != '' 101 | uses: actions/setup-dotnet@v5 102 | with: 103 | dotnet-version: ${{ inputs.dotnet_version }} 104 | 105 | - name: Вычисление версии OneScript 106 | shell: bash 107 | id: extract_oscript_version 108 | run: | 109 | set -ex 110 | if [ "${{ inputs.oscript_version }}" = "default" ] 111 | then 112 | extracted_version=$(cat packagedef | grep ".ВерсияСреды(" | sed 's|[^"]*"||' | sed -r 's/".+//' || true) 113 | version="${extracted_version:-stable}" 114 | else 115 | version="${{ inputs.oscript_version }}" 116 | fi 117 | echo "version=$version" >> $GITHUB_OUTPUT 118 | 119 | - name: Установка OneScript 120 | uses: otymko/setup-onescript@v1.5.1 121 | with: 122 | version: ${{ steps.extract_oscript_version.outputs.version }} 123 | 124 | - name: Установка зависимостей (Windows) 125 | if: runner.os == 'Windows' 126 | shell: pwsh 127 | run: | 128 | if ("${{ inputs.opm_version }}" -ne "") { 129 | opm install opm@${{ inputs.opm_version }} 130 | } else { 131 | opm install opm 132 | } 133 | opm install -l --dev 134 | 135 | - name: Установка OneUnit (Windows) 136 | if: runner.os == 'Windows' && matrix.test_engine == 'oneunit' 137 | shell: pwsh 138 | run: | 139 | if ("${{ inputs.oneunit_version }}" -ne "") { 140 | opm install -l oneunit@${{ inputs.oneunit_version }} 141 | } else { 142 | opm install -l oneunit 143 | } 144 | 145 | - name: Установка зависимостей (Linux/macOS) 146 | if: runner.os != 'Windows' 147 | shell: bash 148 | run: | 149 | if [ -n "${{ inputs.opm_version }}" ]; then 150 | opm install opm@${{ inputs.opm_version }} 151 | else 152 | opm install opm 153 | fi 154 | opm install -l --dev 155 | 156 | - name: Установка OneUnit (Linux/macOS) 157 | if: runner.os != 'Windows' && matrix.test_engine == 'oneunit' 158 | shell: bash 159 | run: | 160 | if [ -n "${{ inputs.oneunit_version }}" ]; then 161 | opm install -l oneunit@${{ inputs.oneunit_version }} 162 | else 163 | opm install -l oneunit 164 | fi 165 | 166 | - name: Установка дополнительных пакетов 167 | if: inputs.additional_oscript_packages != '' 168 | run: opm install -l ${{ inputs.additional_oscript_packages }} 169 | 170 | - name: Сборка пакета 171 | if: inputs.build_package == true 172 | run: opm build . 173 | 174 | - name: Тестирование 175 | if: matrix.test_engine == '1testrunner' 176 | run: oscript ${{ inputs.test_script_path}} 177 | 178 | - name: Тестирование 179 | if: matrix.test_engine == 'oneunit' 180 | env: 181 | OPTS: ${{ format('{0} {1} {2}', inputs.test_dir_paths != '' && format('-d {0}', inputs.test_dir_paths) || '', inputs.test_file_paths != '' && format('-f {0}', inputs.test_file_paths) || '', inputs.test_tags != '' && format('-t {0}', inputs.test_tags) || '') }} 182 | run: ./oscript_modules/bin/oneunit e $OPTS --timeout ${{ inputs.test_default_timeout }} --mode ${{ inputs.test_log_mod }} 183 | -------------------------------------------------------------------------------- /.github/copilot-instructions.md: -------------------------------------------------------------------------------- 1 | # GitHub Actions Workflows for OneScript Libraries 2 | 3 | This repository contains a collection of reusable GitHub Actions workflows designed for OneScript libraries and applications. The workflows provide standardized build, test, and deployment processes. 4 | 5 | **ALWAYS reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the information here.** 6 | 7 | ## Working Effectively 8 | 9 | ### Repository Structure and Purpose 10 | - This repository contains ONLY reusable GitHub Actions workflows (`.github/workflows/*.yml`) 11 | - All workflows use `workflow_call` trigger - they are designed to be called by other repositories 12 | - NO builds, tests, or application code exist in this repository itself 13 | - The workflows are used by OneScript libraries like `autumn-library/annotations` 14 | 15 | ### Validation Commands 16 | - **YAML Linting**: `yamllint .github/workflows/*.yml` - validates workflow syntax (expect style warnings about line length and whitespace, but no syntax errors) 17 | - **Workflow Structure Check**: `grep -n "workflow_call" .github/workflows/*.yml` - confirms all workflows are reusable 18 | - **No Build Required**: This repository does not require building, testing, or running any application code 19 | - **No Tests to Run**: There are no unit tests or integration tests in this repository 20 | - **NEVER try to run**: `opm install`, `oscript`, `npm install`, `dotnet build`, or similar build commands - they are not applicable 21 | - **Expected yamllint output**: Warnings about document-start, line-length, trailing-spaces are normal and acceptable 22 | 23 | ### Workflow Types Available 24 | 1. **Testing** (`.github/workflows/test.yml`): Matrix testing on Windows, Ubuntu, macOS with multiple OneScript versions 25 | 2. **Quality Control** (`.github/workflows/sonar.yml`): SonarQube analysis and Coveralls coverage reporting 26 | 3. **Release** (`.github/workflows/release.yml`): Package building and publishing to oscript hub 27 | 4. **Documentation** (`.github/workflows/deploy-docs.yml`): Documentation deployment trigger 28 | 29 | ### Timing Expectations - CRITICAL 30 | **NEVER CANCEL BUILDS OR TESTS** in workflows that use these: 31 | - OneScript installation: 2-5 minutes 32 | - `opm install -l --dev`: 5-15 minutes depending on dependencies 33 | - Test execution: 5-30 minutes depending on test suite size 34 | - SonarQube analysis: 10-20 minutes 35 | - Package builds: 2-10 minutes 36 | - **ALWAYS set timeouts to 60+ minutes** for any workflow job that runs these operations 37 | 38 | ## Common Workflow Usage Patterns 39 | 40 | ### Example Repository Structure (e.g., autumn-library/annotations) 41 | ``` 42 | packagedef # OneScript package definition with ВерсияСреды() 43 | tasks/ 44 | ├── test.os # Test execution script 45 | ├── coverage.os # Coverage collection script 46 | └── oscript.cfg # lib.additional=../oscript_modules 47 | .github/workflows/ 48 | ├── test.yml # Uses: autumn-library/workflows/.github/workflows/test.yml@v1 49 | ├── sonar.yml # Uses: autumn-library/workflows/.github/workflows/sonar.yml@v1 50 | └── release.yml # Uses: autumn-library/workflows/.github/workflows/release.yml@v1 51 | ``` 52 | 53 | ### Typical Workflow Implementation 54 | ```yaml 55 | name: Тестирование 56 | on: 57 | push: 58 | pull_request: 59 | workflow_dispatch: 60 | jobs: 61 | test: 62 | uses: autumn-library/workflows/.github/workflows/test.yml@v1 63 | with: 64 | oscript_version: default 65 | os_versions: '["ubuntu-latest", "windows-latest", "macos-latest"]' 66 | ``` 67 | 68 | ## Validation Scenarios 69 | 70 | ### When Making Changes to Workflows 71 | 1. **YAML Syntax**: Always run `yamllint .github/workflows/*.yml` and fix any syntax errors (style warnings are acceptable) 72 | 2. **Test in Real Repository**: Create a test branch in `autumn-library/annotations` and update workflow reference to test changes 73 | 3. **Verify Matrix Builds**: Ensure workflows run successfully on all target OS platforms (Windows, Ubuntu, macOS) 74 | 4. **Check OneScript Versions**: Test with `default`, `stable`, and `dev` OneScript versions 75 | 5. **Manual Testing Scenarios**: 76 | - Run `opm install -l --dev` to install dependencies 77 | - Execute `oscript tasks/test.os` to run tests 78 | - Verify `oscript tasks/coverage.os` generates coverage reports 79 | - Check package builds with `opm build .` 80 | 81 | ### Critical Validation Requirements 82 | - **NEVER CANCEL** long-running operations - OneScript builds can take 30+ minutes 83 | - **Test Timeout Settings**: Always verify timeout values are 60+ minutes for build steps 84 | - **Cross-Platform Compatibility**: Test workflows on Windows, Ubuntu, and macOS 85 | - **Dependency Installation**: Verify `opm install -l --dev` completes successfully 86 | 87 | ### Common Issues and Solutions 88 | 1. **"File not found: tasks/test.os"**: Consumer repository needs to create test scripts in tasks/ directory 89 | 2. **"ВерсияСреды method not found"**: packagedef must include `.ВерсияСреды("version")` call for `oscript_version: default` 90 | 3. **"Permission denied: hub.oscript.io"**: Release workflow needs `PUSH_TOKEN` secret for package publishing 91 | 4. **Long build times**: Expected behavior - OneScript dependency installation takes 15-30 minutes, NEVER cancel 92 | 5. **Matrix build failures**: Check OS-specific paths and line endings, verify OneScript version compatibility 93 | 94 | ### Testing Workflow Changes 95 | 1. **Local YAML validation**: `yamllint .github/workflows/test.yml` (fix syntax errors, ignore style warnings) 96 | 2. **Reference test repository**: Use `autumn-library/annotations` or similar for end-to-end testing 97 | 3. **Version testing strategy**: 98 | ```yaml 99 | # Test with your branch first 100 | uses: your-username/workflows/.github/workflows/test.yml@your-branch 101 | # Then test with main 102 | uses: autumn-library/workflows/.github/workflows/test.yml@main 103 | ``` 104 | 105 | ## Key Workflow Parameters 106 | 107 | ### Universal Parameters (All Workflows) 108 | - `oscript_version`: OneScript version (`default`, `stable`, `dev`, or specific version) 109 | - `additional_oscript_packages`: Space-separated list of extra packages to install 110 | - `dotnet_version`: .NET version for mixed-language projects 111 | - `build_package`: Whether to run `opm build .` before tests 112 | 113 | ### Test Workflow Specific 114 | - `test_script_path`: Path to test script (default: `./tasks/test.os`) 115 | - `os_versions`: JSON array of OS versions (default: `["ubuntu-latest", "windows-latest", "macos-latest"]`) 116 | 117 | ### Quality Control Workflow Specific 118 | - `github_repository`: Required - repository name in "owner/name" format 119 | - `test_script_path`: Coverage script path (default: `./tasks/coverage.os`) 120 | - `sonar_host_url`: SonarQube server URL (default: `https://sonar.openbsl.ru`) 121 | - `sonarqube`: Enable/disable SonarQube analysis (default: `true`) 122 | - `coveralls`: Enable/disable Coveralls reporting (default: `false`) 123 | 124 | ### Release Workflow Specific 125 | - `package_mask`: File pattern for built packages (default: `*.ospx`) 126 | 127 | ## Common File Locations and Content 128 | 129 | ### packagedef File Structure 130 | ``` 131 | Описание.Имя("package-name") 132 | .Версия("1.0.0") 133 | .ВерсияСреды("1.9.2") // Used by workflows when oscript_version="default" 134 | .ВключитьФайл("src") 135 | .ВключитьФайл("tasks") 136 | .РазработкаЗависитОт("1testrunner") 137 | .РазработкаЗависитОт("coverage") 138 | ``` 139 | 140 | ### tasks/oscript.cfg 141 | ```ini 142 | lib.additional=../oscript_modules 143 | ``` 144 | 145 | ### Required Test Scripts 146 | - `tasks/test.os`: Basic test runner using 1testrunner 147 | - `tasks/coverage.os`: Test runner with coverage collection using coverage package 148 | 149 | ## Dependabot Configuration 150 | - Always include `.github/dependabot.yml` for automatic workflow updates 151 | - Use `package-ecosystem: "github-actions"` to keep workflow versions current 152 | - Target versioned releases (`@v1`) for stability, `@main` for latest features 153 | 154 | ## Version Strategy 155 | - **Stable**: Use `@v1` tags for production repositories 156 | - **Development**: Use `@main` for testing new features 157 | - **Backward Compatibility**: Guaranteed within major versions 158 | - **Updates**: Use dependabot for automatic version updates -------------------------------------------------------------------------------- /.github/workflows/sonar.yml: -------------------------------------------------------------------------------- 1 | name: Контроль качества 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | github_repository: 7 | required: true 8 | type: string 9 | oscript_version: 10 | required: false 11 | default: 'default' 12 | type: string 13 | opm_version: 14 | description: Version of OPM to install (e.g., "1.1.0"). If empty, installs the latest version without version specification 15 | required: false 16 | default: "" 17 | type: string 18 | sonar_host_url: 19 | required: false 20 | default: 'https://sonar.openbsl.ru' 21 | type: string 22 | additional_oscript_packages: 23 | description: Package list to install, space separated. 24 | type: string 25 | required: false 26 | default: "" 27 | test_engine: 28 | description: Test engine to use. Can be one of 'oneunit', '1testrunner'. 29 | type: string 30 | required: false 31 | default: "1testrunner" 32 | sonarqube: 33 | required: false 34 | type: boolean 35 | default: true 36 | coveralls: 37 | required: false 38 | type: boolean 39 | default: false 40 | dotnet_version: 41 | description: Version of .NET to install 42 | type: string 43 | required: false 44 | default: "" 45 | build_package: 46 | description: Execute 'opm build .' after installing dependencies 47 | type: boolean 48 | required: false 49 | default: false 50 | os_version: 51 | description: Operating system to run quality control on 52 | type: string 53 | required: false 54 | default: "ubuntu-latest" 55 | 56 | # 1testrunner inputs 57 | test_script_path: 58 | required: false 59 | type: string 60 | default: ./tasks/coverage.os 61 | 62 | # OneUnit inputs 63 | oneunit_version: 64 | description: Version of OneUnit to install ("0.2.3", "0.3.0"). If empty, installs the latest version 65 | required: false 66 | type: string 67 | default: '' 68 | test_dir_paths: 69 | description: Comma-separated list of paths to test directories. 70 | required: false 71 | type: string 72 | test_file_paths: 73 | description: Comma-separated list of paths to test files. 74 | required: false 75 | type: string 76 | test_tags: 77 | description: Comma-separated list of tags to run. 78 | required: false 79 | type: string 80 | test_default_timeout: 81 | description: Timeout in seconds for each test. 82 | required: false 83 | type: number 84 | default: 0 85 | test_log_mod: 86 | description: Log mode for tests. 87 | required: false 88 | type: string 89 | default: "tree" 90 | 91 | secrets: 92 | SONAR_TOKEN: 93 | required: false 94 | 95 | jobs: 96 | 97 | test: 98 | runs-on: ${{ inputs.os_version }} 99 | 100 | steps: 101 | - name: Актуализация 102 | uses: actions/checkout@v6.0.1 103 | 104 | - name: Установка .NET 105 | if: inputs.dotnet_version != '' 106 | uses: actions/setup-dotnet@v5 107 | with: 108 | dotnet-version: ${{ inputs.dotnet_version }} 109 | 110 | - name: Вычисление версии OneScript 111 | shell: bash 112 | id: extract_oscript_version 113 | run: | 114 | set -ex 115 | if [ "${{ inputs.oscript_version }}" = "default" ] 116 | then 117 | extracted_version=$(cat packagedef | grep ".ВерсияСреды(" | sed 's|[^"]*"||' | sed -r 's/".+//' || true) 118 | version="${extracted_version:-stable}" 119 | else 120 | version="${{ inputs.oscript_version }}" 121 | fi 122 | echo "version=$version" >> $GITHUB_OUTPUT 123 | 124 | - name: Установка OneScript 125 | uses: otymko/setup-onescript@v1.5.1 126 | with: 127 | version: ${{ steps.extract_oscript_version.outputs.version }} 128 | 129 | - name: Установка зависимостей пакета (Windows) 130 | if: runner.os == 'Windows' 131 | shell: pwsh 132 | run: | 133 | if ("${{ inputs.opm_version }}" -ne "") { 134 | opm install opm@${{ inputs.opm_version }} 135 | } else { 136 | opm install opm 137 | } 138 | opm install -l --dev 139 | 140 | - name: Установка OneUnit (Windows) 141 | if: runner.os == 'Windows' && inputs.test_engine == 'oneunit' 142 | shell: pwsh 143 | run: | 144 | if ("${{ inputs.oneunit_version }}" -ne "") { 145 | opm install -l oneunit@${{ inputs.oneunit_version }} 146 | } else { 147 | opm install -l oneunit 148 | } 149 | 150 | - name: Установка зависимостей пакета (Linux/macOS) 151 | if: runner.os != 'Windows' 152 | shell: bash 153 | run: | 154 | if [ -n "${{ inputs.opm_version }}" ]; then 155 | opm install opm@${{ inputs.opm_version }} 156 | else 157 | opm install opm 158 | fi 159 | opm install -l --dev 160 | 161 | - name: Установка OneUnit (Linux/macOS) 162 | if: runner.os != 'Windows' && inputs.test_engine == 'oneunit' 163 | shell: bash 164 | run: | 165 | if [ -n "${{ inputs.oneunit_version }}" ]; then 166 | opm install -l oneunit@${{ inputs.oneunit_version }} 167 | else 168 | opm install -l oneunit 169 | fi 170 | 171 | - name: Установка дополнительных пакетов 172 | if: inputs.additional_oscript_packages != '' 173 | run: opm install -l ${{ inputs.additional_oscript_packages }} 174 | 175 | - name: Сборка пакета 176 | if: inputs.build_package == true 177 | run: opm build . 178 | 179 | - name: Запуск тестов 180 | if: inputs.test_engine == '1testrunner' 181 | run: oscript ${{ inputs.test_script_path}} 182 | 183 | - name: Запуск тестов 184 | if: inputs.test_engine == 'oneunit' 185 | env: 186 | OPTS: ${{ format('{0} {1} {2}', inputs.test_dir_paths != '' && format('-d {0}', inputs.test_dir_paths) || '', inputs.test_file_paths != '' && format('-f {0}', inputs.test_file_paths) || '', inputs.test_tags != '' && format('-t {0}', inputs.test_tags) || '') }} 187 | run: ./oscript_modules/bin/oneunit e $OPTS --timeout ${{ inputs.test_default_timeout }} --mode ${{ inputs.test_log_mod }} --genericExecution out/genericExecution.xml --genericCoverage out/genericCoverage.xml --cobertura out/coverage.xml 188 | 189 | - name: Сохранение артефактов покрытия 190 | uses: actions/upload-artifact@v6 191 | with: 192 | name: coverage 193 | path: | 194 | out/*overage*.xml 195 | out/genericExecution.xml 196 | if-no-files-found: ignore 197 | 198 | sonar: 199 | runs-on: ${{ inputs.os_version }} 200 | needs: [test] 201 | if: ${{ (inputs.sonarqube == true) && (github.repository == inputs.github_repository) && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name) }} 202 | steps: 203 | - name: Актуализация 204 | uses: actions/checkout@v6.0.1 205 | with: 206 | fetch-depth: 0 207 | 208 | - name: Вычисление имени ветки 209 | uses: nelonoel/branch-name@v1.0.1 210 | 211 | - name: Скачивание артефактов 212 | uses: actions/download-artifact@v7 213 | with: 214 | name: coverage 215 | path: out 216 | 217 | - name: Извлечение версии пакета 218 | shell: bash 219 | run: echo "version=`cat packagedef | grep ".Версия(" | sed 's|[^"]*"||' | sed -r 's/".+//'`" >> $GITHUB_OUTPUT 220 | id: extract_version 221 | 222 | - name: Настройка sonar-scanner 223 | uses: warchant/setup-sonar-scanner@v9 224 | 225 | - name: Анализ в SonarQube (branch) 226 | if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' 227 | env: 228 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 229 | SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 230 | run: sonar-scanner 231 | -Dsonar.host.url=${{ inputs.sonar_host_url }} 232 | -Dsonar.branch.name=${{ env.BRANCH_NAME }} 233 | -Dsonar.projectVersion=${{ steps.extract_version.outputs.version }} 234 | 235 | # https://docs.sonarqube.org/latest/analysis/pull-request/ 236 | - name: Анализ в SonarQube (pull-request) 237 | if: github.event_name == 'pull_request' 238 | env: 239 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 240 | SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 241 | run: sonar-scanner 242 | -Dsonar.host.url=${{ inputs.sonar_host_url }} 243 | -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} 244 | -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} 245 | -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} 246 | -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} 247 | 248 | coveralls: 249 | runs-on: ${{ inputs.os_version }} 250 | if: inputs.coveralls == true 251 | needs: [test] 252 | steps: 253 | - name: Актуализация 254 | uses: actions/checkout@v6.0.1 255 | - name: Скачивание артефактов 256 | uses: actions/download-artifact@v7 257 | with: 258 | name: coverage 259 | path: out 260 | - name: Отправка отчёта о покрытии в Coveralls 261 | uses: coverallsapp/github-action@v2 262 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # workflows 2 | 3 | Набор типовых сборочных линий GitHub Actions для библиотек и приложений OneScript. 4 | 5 | Во всех сборочных линиях используется локальная установка пакетов opm через `opm install --local`. 6 | Убедитесь, что рядом со скриптами запуска тестов (для `1testrunner`) или в каталоге тестов (для `OneUnit`) лежат файлы oscript.cfg с соответствующими настройками. 7 | Например, содержимое `oscript.cfg`, расположенного в каталоге `tasks`/`tests`: 8 | 9 | ```ini 10 | lib.system=../oscript_modules 11 | ``` 12 | 13 | В репозитории есть теги и гарантируется обратная совместимость в пределах мажорной версии. 14 | Для оперативного получения новых фич нацеливайтесь на `@main`, для стабильных версий workflow - на последний мажорный тег - в данный момент `@v1`. 15 | 16 | Для автообновления версий workflow рекомендуется использовать dependabot. 17 | Пример в репозитории autumn-library/annotations по [ссылке](https://github.com/autumn-library/annotations/blob/master/.github/dependabot.yml). 18 | 19 | - [workflows](#workflows) 20 | - [Тестирование](#тестирование) 21 | - [Использование](#использование) 22 | - [Контроль качества (SonarQube + Coveralls)](#контроль-качества-sonarqube--coveralls) 23 | - [Использование](#использование-1) 24 | - [Публикация релиза](#публикация-релиза) 25 | - [Использование](#использование-2) 26 | 27 | ## Тестирование 28 | 29 | Сборочная линия для выполнения тестирования библиотеки. Позволяет запустить матричную сборку на настраиваемом списке операционных систем (по умолчанию Windows, Ubuntu и macOS) на нескольких версиях движка OneScript. Поддерживается запуск из ветки, из pull request и ручной запуск из информации о конкретном workflow. 30 | 31 | Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/test.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/test.yml) 32 | 33 | Общие параметры: 34 | 35 | | Имя параметра | Описание | Значение по умолчанию | 36 | | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | 37 | | oscript_version | Версия движка в формате алиаса для [ovm](https://github.com/oscript-library/ovm).
Если имеет значение `default`, производится попытка вычисления версии среды на основании вызова метода ВерсияСреды() в packagedef.
Если вычислить версию не получается, используется версия stable. | `default` | 38 | | opm_version | Версия opm для установки (например, `1.1.0`).
Если не указано, устанавливается последняя версия без указания конкретной версии.
Используется для обеспечения совместимости с определенными версиями OneScript | | 39 | | additional_oscript_packages | Список дополнительных пакетов oscript для установки, разделенный пробелами | | 40 | | dotnet_version | Версия .NET для установки | | 41 | | build_package | Выполнить сборку пакета перед выполнением тестов | `false` | 42 | | os_versions | Список операционных систем для запуска тестов строкой в формате json-array | `["ubuntu-latest", "windows-latest", "macos-latest"]` | 43 | | test_engine | Фреймворк который будет использован для тестирования, может быть одним из `1testrunner`, `oneunit` | `1testrunner` | 44 | 45 | Параметры для `1testrunner` 46 | 47 | | Имя параметра | Описание | Значение по умолчанию | 48 | | ---------------- | ----------------------------- | --------------------- | 49 | | test_script_path | Путь к скрипту запуска тестов | `./tasks/test.os` | 50 | 51 | Параметры для `OneUnit` 52 | 53 | | Имя параметра | Описание | Значение по умолчанию | 54 | | -------------------- | --------------------------------------------------------------------------------------- | --------------------- | 55 | | oneunit_version | Версия OneUnit в формате `0.3.0` которая будет установлена для проведения тестирования | | 56 | | test_dir_paths | Пути к каталогам с тестами, разделённые запятыми, `tests, perf_tests` | | 57 | | test_file_paths | Пути к файлам тестов, разделённые запятыми, `Тест.os, Тест2.os` | | 58 | | test_tags | Список тегов для запуска, разделённые запятыми, `Повторяемый, Параметризованный` | | 59 | | test_default_timeout | Таймаут для выполнения каждого отдельного теста по умолчанию | `0` (неограниченно) | 60 | | test_log_mod | Режим вывода логов тестирования | `tree` | 61 | 62 | ### Использование 63 | 64 | 1) Запуск тестирования: 65 | 66 | ```yaml 67 | name: Тестирование 68 | 69 | on: 70 | push: 71 | pull_request: 72 | workflow_dispatch: 73 | 74 | jobs: 75 | test: 76 | uses: autumn-library/workflows/.github/workflows/test.yml@v1 77 | ``` 78 | 79 | Данный пример запустит задачу тестирования на операционных системах по умолчанию: Windows, Ubuntu и macOS. 80 | Если в файле packagedef вашей библиотеки есть вызов метода "ВерсияСреды", то будет взято значение из параметра метода. Если вызов ВерсияСреды отсутствует, то запуск тестирования будет проводиться на версии stable. 81 | 82 | При необходимости можно явно указать версию OneScript в параметре `oscript_version`: 83 | 84 | ```yaml 85 | ... 86 | uses: autumn-library/workflows/.github/workflows/test.yml@v1 87 | with: 88 | oscript_version: dev 89 | ``` 90 | 91 | 2) Запуск на нескольких версиях oscript в режиме матричной сборки 92 | 93 | ```yaml 94 | name: Тестирование 95 | 96 | on: 97 | push: 98 | pull_request: 99 | workflow_dispatch: 100 | 101 | jobs: 102 | test: 103 | strategy: 104 | fail-fast: false 105 | matrix: 106 | oscript_version: ['default', 'stable', 'dev'] 107 | uses: autumn-library/workflows/.github/workflows/test.yml@v1 108 | with: 109 | oscript_version: ${{ matrix.oscript_version }} 110 | ``` 111 | 112 | Данный пример запустит задачу на трех операционных системах с тремя разными версиями oscript - 1.8.4 (так как она указана в packagedef), последней релизной версии и последней ночной сборке. 113 | 114 | 3) Запуск тестирования на определенных операционных системах 115 | 116 | ```yaml 117 | name: Тестирование 118 | 119 | on: 120 | push: 121 | pull_request: 122 | workflow_dispatch: 123 | 124 | jobs: 125 | test: 126 | uses: autumn-library/workflows/.github/workflows/test.yml@v1 127 | with: 128 | os_versions: '["ubuntu-latest", "windows-latest"]' 129 | ``` 130 | 131 | Данный пример запустит задачу тестирования только на Ubuntu и Windows, исключив macOS. 132 | 133 | 4) Запуск тестирования только на одной операционной системе 134 | 135 | ```yaml 136 | name: Тестирование 137 | 138 | on: 139 | push: 140 | pull_request: 141 | workflow_dispatch: 142 | 143 | jobs: 144 | test: 145 | uses: autumn-library/workflows/.github/workflows/test.yml@v1 146 | with: 147 | os_versions: '["ubuntu-latest"]' 148 | ``` 149 | 150 | Данный пример запустит задачу тестирования только на Ubuntu. 151 | 152 | 5) Запуск с совместимой версией OPM для старых версий OneScript 153 | 154 | ```yaml 155 | name: Тестирование 156 | 157 | on: 158 | push: 159 | pull_request: 160 | workflow_dispatch: 161 | 162 | jobs: 163 | test: 164 | uses: autumn-library/workflows/.github/workflows/test.yml@v1 165 | with: 166 | oscript_version: "1.8.3" # Старая версия OneScript 167 | opm_version: "1.1.0" # Совместимая версия OPM 168 | os_versions: '["ubuntu-latest"]' 169 | ``` 170 | 171 | Данный пример запустит тестирование на Ubuntu с OneScript 1.8.3 и совместимой версией OPM 1.1.0 вместо последней версии, которая может требовать OneScript 1.8.4+. 172 | 173 | 6) Запуск тестов для разных версий OneScript с разными фреймворками тестирования 174 | 175 | ```yaml 176 | name: Тестирование 177 | 178 | on: 179 | push: 180 | pull_request: 181 | workflow_dispatch: 182 | 183 | jobs: 184 | test: 185 | strategy: 186 | matrix: 187 | # Для 1.x запускаем 1testrunner 188 | oscript_version: ['default', 'lts-dev'] 189 | test_engine: ['1testrunner'] 190 | # Добавим тестирование на 2.0 с помощью OneUnit 191 | include: 192 | - oscript_version: 'dev' 193 | test_engine: 'oneunit' 194 | uses: autumn-library/workflows/.github/workflows/test.yml@main 195 | with: 196 | oscript_version: ${{ matrix.oscript_version }} 197 | test_engine: ${{ matrix.test_engine }} 198 | ``` 199 | 200 | В данном примере будет запущено тестирование на версиях OneScript `default` и `lts-dev` фреймворком `1testrunner`, а для версии `dev` фреймворком `OneUnit` 201 | 202 | ## Контроль качества (SonarQube + Coveralls) 203 | 204 | Сборочная линия для выполнения анализа качества кода с помощью SonarQube и отправки данных о покрытии в [coveralls](https://coveralls.io). 205 | Поддерживается запуск из ветки, из pull request и ручной запуск из информации о конкретном workflow. 206 | > Анализ pull request из форков для задачи SonarQube пока не поддерживается. 207 | 208 | Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/sonar.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/sonar.yml) 209 | 210 | Параметры: 211 | 212 | | Имя параметра | Описание | Значение по умолчанию | 213 | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------- | 214 | | **github_repository** | Репозиторий проекта в GitHub, для которого будет выполняться анализ, в формате `имя_владельца/название` | | 215 | | oscript_version | Версия движка в формате алиаса для [ovm](https://github.com/oscript-library/ovm). Если имеет значение `default`, производится попытка вычисления версии среды на основании вызова метода `ВерсияСреды()` в `packagedef`.
Если вычислить версию не получается, используется версия `stable`. | `default` | 216 | | opm_version | Версия opm для установки (например, `1.1.0`).
Если не указано, устанавливается последняя версия без указания конкретной версии.
Используется для обеспечения совместимости с определенными версиями OneScript | | 217 | | additional_oscript_packages | Список дополнительных пакетов oscript для установки, разделенный пробелами | | 218 | | sonar_host_url | URL сервера SonarQube | `https://sonar.openbsl.ru` | 219 | | sonarqube | Флаг отправки результатов анализа на сервер SonarQube | `true` | 220 | | coveralls | Флаг отправки результатов покрытия на портал [coveralls](https://coveralls.io) | `false` | 221 | | dotnet_version | Версия .NET для установки | | 222 | | build_package | Выполнить сборку пакета перед выполнением тестов | `false` | 223 | | os_version | Операционная система для запуска контроля качества | `ubuntu-latest` | 224 | | test_engine | Фреймворк который будет использован для тестирования, может быть одним из `1testrunner`, `oneunit` | `1testrunner` | 225 | 226 | Параметры для `1testrunner` 227 | 228 | | Имя параметра | Описание | Значение по умолчанию | 229 | | ---------------- | ----------------------------- | --------------------- | 230 | | test_script_path | Путь к скрипту запуска тестов | `./tasks/coverage.os` | 231 | 232 | Параметры для `OneUnit` 233 | 234 | | Имя параметра | Описание | Значение по умолчанию | 235 | | -------------------- | --------------------------------------------------------------------------------------- | --------------------- | 236 | | oneunit_version | Версия OneUnit в формате `0.3.0` которая будет установлена для проведения тестирования | | 237 | | test_dir_paths | Пути к каталогам с тестами, разделённые запятыми, `tests, perf_tests` | | 238 | | test_file_paths | Пути к файлам тестов, разделённые запятыми, `Тест.os, Тест2.os` | | 239 | | test_tags | Список тегов для запуска, разделённые запятыми, `Повторяемый, Параметризованный` | | 240 | | test_default_timeout | Таймаут для выполнения каждого отдельного теста по умолчанию | `0` (неограниченно) | 241 | | test_log_mod | Режим вывода логов тестирования | `tree` | 242 | 243 | Секреты: 244 | 245 | | Имя секрета | Описание | Обязательный | 246 | | ----------- | ------------------------------------------ | ------------ | 247 | | SONAR_TOKEN | Токен для авторизации на сервере SonarQube | Нет | 248 | 249 | ### Использование 250 | 251 | Для использования сборочной линии необходимо предварительно подготовить файл `sonar-project.properties` и расположить его в корне проекта. 252 | Сборочная линия ожидает, что в репозитории есть скрипт `tasks/coverage.os` (для фреймворка `1testrunner` или ничего не ожидает для фреймворка `OneUnit`), с помощью которого запускаются тесты со сбором покрытия, однако это можно переопределить. 253 | Если ваш сервер SonarQube требует авторизацию, то необходимо передать в workflow секрет `SONAR_TOKEN`. 254 | 255 | ```yaml 256 | # С тестированием 1testrunner 257 | name: Контроль качества 258 | 259 | on: 260 | push: 261 | pull_request: 262 | workflow_dispatch: 263 | 264 | jobs: 265 | sonar: 266 | uses: autumn-library/workflows/.github/workflows/sonar.yml@v1 267 | with: 268 | github_repository: autumn-library/annotations # change me! 269 | secrets: 270 | SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 271 | ``` 272 | 273 | ```yaml 274 | # С тестированием OneUnit 275 | name: Контроль качества 276 | 277 | on: 278 | push: 279 | pull_request: 280 | workflow_dispatch: 281 | 282 | jobs: 283 | sonar: 284 | uses: autumn-library/workflows/.github/workflows/sonar.yml@main 285 | with: 286 | sonarqube: true 287 | github_repository: autumn-library/annotations # change me! 288 | oscript_version: 'dev' 289 | test_engine: 'oneunit' 290 | secrets: 291 | SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 292 | ``` 293 | 294 | ### Отключение анализа SonarQube 295 | 296 | По умолчанию анализ SonarQube включён, однако это можно изменить, выставив свойство `sonarqube: false`. 297 | 298 | ### Интеграция с Coveralls 299 | 300 | Перед выполнением первого анализа добавьте свой проект в сервис [coveralls](https://coveralls.io). Выставьте флаг `coveralls: true` и дождитесь результатов анализа. 301 | 302 | ```yaml 303 | name: Контроль качества 304 | 305 | on: 306 | push: 307 | pull_request: 308 | workflow_dispatch: 309 | 310 | jobs: 311 | sonar: 312 | uses: autumn-library/workflows/.github/workflows/sonar.yml@v1 313 | with: 314 | github_repository: autumn-library/annotations # change me! 315 | coveralls: true 316 | secrets: 317 | SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 318 | ``` 319 | 320 | ## Публикация релиза 321 | 322 | Сборочная линия для сборки и публикации пакета библиотеки в артефакты и хаб пакетов https://hub.oscript.io. Поддерживается автоматический запуск при публикации GitHub Release и ручной запуск из информации о конкретном workflow. 323 | 324 | Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/release.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/release.yml) 325 | 326 | Параметры: 327 | 328 | | Имя параметра | Описание | Значение по умолчанию | 329 | | --------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | 330 | | oscript_version | Версия движка в формате алиаса для https://github.com/oscript-library/ovm. Если имеет значение `default`, производится попытка вычисления версии среды на основании вызова метода ВерсияСреды() в packagedef. Если вычислить версию не получается, используется версия stable. | default | 331 | | opm_version | Версия opm для установки (например, "1.1.0"). Если не указано, устанавливается последняя версия без указания конкретной версии. Используется для обеспечения совместимости с определенными версиями OneScript | | 332 | | package_mask | Файловая маска собранного пакета. Несмотря на необязательность параметра, рекомендуется его передавать до исправления ошибки в шаге публикации в хаб | *.ospx | 333 | | dotnet_version | Версия .NET для установки | | 334 | | os_version | Операционная система для запуска релиза | ubuntu-latest | 335 | 336 | Секреты: 337 | 338 | | Имя секрета | Описание | Обязательный | 339 | | ----------- | --------------------------------------------- | ------------ | 340 | | PUSH_TOKEN | GitHub токен для публикации релизов в хаб opm | Нет | 341 | 342 | ### Использование 343 | 344 | Для использования сборочной линии необходимо создать новый релиз на вкладке GitHub Releases. Если ваш хаб пакетов использует токен для проверки прав на публикацию (hub.oscript.io использует), то необходимо передать в workflow секрет `PUSH_TOKEN`. 345 | 346 | ```yaml 347 | name: Публикация релиза 348 | 349 | on: 350 | release: 351 | types: 352 | - published 353 | workflow_dispatch: 354 | 355 | jobs: 356 | release: 357 | uses: autumn-library/workflows/.github/workflows/release.yml@v1 358 | with: 359 | package_mask: "annotations-*.ospx" # change me! 360 | secrets: 361 | PUSH_TOKEN: ${{ secrets.PUSH_TOKEN }} 362 | ``` 363 | --------------------------------------------------------------------------------