├── .gitattributes ├── .github └── workflows │ ├── qa.yml │ ├── release.yml │ └── testing.yml ├── .gitignore ├── LICENSE ├── README.md ├── features └── .gitkeep ├── packagedef ├── sonar-project.properties ├── tasks ├── coverage.os └── test.os └── tests └── .gitkeep /.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | *.os eol=ls -------------------------------------------------------------------------------- /.github/workflows/qa.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # Copyright (C) 2020 Tymko Oleg and contributors 3 | # All rights reserved. 4 | 5 | name: Контроль качества 6 | # Любой пуш и pr в проекте но с фильтром по основному проекту 7 | on: [push, pull_request] 8 | jobs: 9 | build: 10 | if: github.repository == 'owner/project' 11 | runs-on: ${{ matrix.os }} 12 | strategy: 13 | fail-fast: false 14 | matrix: 15 | os: [ubuntu-latest] 16 | oscript_version: ['1.4.0'] 17 | 18 | steps: 19 | # Загрузка проекта 20 | - name: Актуализация 21 | uses: actions/checkout@v2 22 | 23 | # https://stackoverflow.com/questions/58033366/how-to-get-current-branch-within-github-actions 24 | - name: Извлечение имени текущей ветки 25 | shell: bash 26 | run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" 27 | id: extract_branch 28 | 29 | # Установка OneScript конкретной версии 30 | - name: Установка OneScript 31 | uses: otymko/setup-onescript@v1.1 32 | with: 33 | version: ${{ matrix.oscript_version }} 34 | 35 | # Установка зависимостей пакета 36 | - name: Установка зависимостей 37 | run: | 38 | opm install opm 39 | opm install --dev 40 | 41 | # Запуск тестов и сбор покрытия кода 42 | - name: Покрытие кода 43 | run: oscript ./tasks/coverage.os 44 | 45 | - name: Извлечение версии пакета 46 | shell: bash 47 | run: echo "##[set-output name=version;]`cat packagedef | grep ".Версия(" | sed 's|[^"]*"||' | sed -r 's/".+//'`" 48 | id: extract_version 49 | 50 | - name: Установка Sonar-scanner 51 | uses: warchant/setup-sonar-scanner@v1 52 | 53 | # Анализ проекта в SonarQube (ветка) 54 | - name: Анализ в SonarQube (branch) 55 | if: github.event_name == 'push' 56 | run: sonar-scanner 57 | -Dsonar.login=${{ secrets.SONARQUBE_TOKEN }} 58 | -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} 59 | -Dsonar.branch.name=${{ steps.extract_branch.outputs.branch }} 60 | -Dsonar.projectVersion=${{ steps.extract_version.outputs.version }} 61 | 62 | # Анализ проекта в SonarQube (PR) 63 | # https://docs.sonarqube.org/latest/analysis/pull-request/ 64 | - name: Анализ в SonarQube (pull-request) 65 | if: github.event_name == 'pull_request' 66 | run: sonar-scanner 67 | -Dsonar.login=${{ secrets.SONARQUBE_TOKEN }} 68 | -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} 69 | -Dsonar.branch.name=${{ steps.extract_branch.outputs.branch }} 70 | -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} 71 | -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} 72 | -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} 73 | -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} 74 | -------------------------------------------------------------------------------- /.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 | release: 9 | types: [published, edited] 10 | 11 | env: 12 | PACKAGE_MASK: project-*.ospx 13 | 14 | jobs: 15 | build: 16 | runs-on: ${{ matrix.os }} 17 | strategy: 18 | fail-fast: false 19 | matrix: 20 | os: [ubuntu-latest] 21 | oscript_version: ['1.4.0'] 22 | 23 | steps: 24 | # Загрузка проекта 25 | - name: Актуализация 26 | uses: actions/checkout@v2 27 | 28 | # Установка OneScript конкретной версии 29 | - name: Установка OneScript 30 | uses: otymko/setup-onescript@v1.1 31 | with: 32 | version: ${{ matrix.oscript_version }} 33 | 34 | # Установка зависимостей пакета 35 | - name: Установка зависимостей 36 | run: | 37 | opm install opm 38 | opm install 39 | 40 | - name: Сборка пакета 41 | run: opm build 42 | 43 | - name: Заливка артефактов 44 | uses: actions/upload-artifact@v2 45 | with: 46 | name: package.zip 47 | path: ./${{ env.PACKAGE_MASK }} 48 | 49 | - name: Заливка в релиз 50 | uses: AButler/upload-release-assets@v1.0 51 | with: 52 | files: ./${{ env.PACKAGE_MASK }} 53 | repo-token: ${{ secrets.GITHUB_TOKEN }} 54 | 55 | - name: Публикация в hub.oscript.io 56 | shell: bash 57 | run: opm push -f ./${{ env.PACKAGE_MASK }} --token ${{ env.TOKEN }} -c stable 58 | env: 59 | TOKEN: ${{ secrets.OSHUB_TOKEN }} 60 | -------------------------------------------------------------------------------- /.github/workflows/testing.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # Copyright (C) 2020 Tymko Oleg and contributors 3 | # All rights reserved. 4 | 5 | name: Тестирование 6 | # Любой пуш и pr в проекте 7 | on: [push, pull_request] 8 | 9 | jobs: 10 | build: 11 | runs-on: ${{ matrix.os }} 12 | strategy: 13 | fail-fast: false 14 | matrix: 15 | os: [ubuntu-latest] 16 | oscript_version: ['1.4.0'] 17 | 18 | steps: 19 | # Загрузка проекта 20 | - name: Актуализация 21 | uses: actions/checkout@v2 22 | 23 | # Установка OneScript конкретной версии 24 | - name: Установка OneScript 25 | uses: otymko/setup-onescript@v1.1 26 | with: 27 | version: ${{ matrix.oscript_version }} 28 | 29 | # Установка зависимостей пакета 30 | - name: Установка зависимостей 31 | run: | 32 | opm install opm 33 | opm install --dev 34 | 35 | # Задача тестирования, в результате ожидается успешное выполнение 36 | - name: Тестирование 37 | run: oscript ./tasks/test.os -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Файлы 2 | *.ospx 3 | 4 | # Каталоги 5 | oscript_modules/ 6 | .scannerwork/ 7 | coverage/ 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 SilverBulleters, LLC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # oscript-actions-template 2 | 3 | Шаблон нового проекта для библиотеки на OneScript 4 | 5 | ## Пример использования 6 | 7 | Команда SilverBulleters на стриме [Инженерные практики в OpenSource на GitHub. Часть I - Библиотека на OneScript](https://www.youtube.com/watch?v=oAi8F8WFZL0) разобрала как использовать этот шаблон для библиотек OneScript. 8 | 9 | ## Автоматизация 10 | 11 | Для автоматизации рутинных и скучных действий используется [GitHub Actions](https://github.com/features/actions). 12 | Автоматизировано следующее: 13 | * Запуск тестов 14 | * Запуск анализа в SonarQube и сбор покрытия кода 15 | * Загрузка артефактов в релиз GitHub и публикация пакета в хабе hub.oscript.io 16 | 17 | ### Секреты 18 | 19 | Перед началом запуска workflow нужно настроить секреты в проекте (`Settings` -> `Secrets`). 20 | Нужны следующие переменные: 21 | * `SONARQUBE_HOST` - ссылка на сервис SonarQube. Например: `https://open.checkbsl.org/`. 22 | * `SONARQUBE_TOKEN` - токен доступа на сервис SonarQube. Генерируется на странице профиля в SonarQube. 23 | * `OSHUB_TOKEN` - токен авторизации на GitHub, который подтверждает право пушить в организацию `oscript-library`. 24 | 25 | ### Блок CI 26 | 27 | В блок входит: 28 | * Тестирование [testing.yml](/.github/workflows/testing.yml) 29 | * Анализ качества кода [qa.yml](/.github/workflows/qa.yml) 30 | 31 | #### testing.yml 32 | 33 | В текущем workflow изначально ничего менять не нужно. По умолчанию: 34 | * Сборка на Ubuntu 35 | * Версия OneScript 1.4.0 36 | 37 | #### qa.yml 38 | 39 | В текущем workflow нужно поменять следующее: 40 | * Фильтр по названию основного проекта. В строке `if: github.repository == 'owner/project'` заменить `owner/project` 41 | на адрес основного проекта. Например: `oscript-library/gitsync`. 42 | 43 | Остальное по умолчанию как в `testing.yml`. Не стоит забывать что нужно предварительно заполнить секреты `SONARQUBE_HOST` и `SONARQUBE_TOKEN`. 44 | 45 | И последнее. В файле `sonar-project.properties` нужно сменить ключ и название проекта для SonarQube. 46 | 47 | ### Блок CD 48 | 49 | В блок входит [release.yml](/.github/workflows/release.yml): 50 | * Обновление `Assets` в новом / измененном релизе. 51 | * Публикация пакета в хабе [hub.oscript.io](http://hub.oscript.io). 52 | 53 | #### release.yml 54 | 55 | В текущем workflow нужно поменять следующее: 56 | * В строке `PACKAGE_MASK: project-*.ospx` заменить `project-*.ospx` на маску нового пакета. Например: `gitsync-*.ospx`. 57 | 58 | Остальное по умолчанию как в `testing.yml`. Не стоит забывать что нужно предварительно заполнить секреты `OSHUB_TOKEN`. 59 | -------------------------------------------------------------------------------- /features/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c-syntax/oscript-actions-template/b6fdbd9f1ce50b4396120b2978d702835cab2d35/features/.gitkeep -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////// 2 | // Описание пакета для сборки и установки 3 | // 4 | 5 | Описание.Имя("project") 6 | .Версия("1.0.0") 7 | .Автор("author") 8 | .АдресАвтора("author@localhost.ru") 9 | .ВерсияСреды("1.0.21") 10 | .ВключитьФайл("src") 11 | .ВключитьФайл("tests") 12 | .ВключитьФайл("README.md") 13 | // .ЗависитОт("cli", "0.9.8") 14 | .РазработкаЗависитОт("1bdd") 15 | .РазработкаЗависитОт("1testrunner") 16 | .РазработкаЗависитОт("asserts") 17 | .РазработкаЗависитОт("coverage") 18 | .РазработкаЗависитОт("fs") 19 | // .ОпределяетКласс("МойКласс", "src/Классы/МойКласс.os") 20 | // .ОпределяетМодуль("МойМодуль", "src/Модули/МойМодуль.os") 21 | ; -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | sonar.projectKey=project 2 | sonar.projectName=project 3 | sonar.sources=./src 4 | sonar.tests=./tests 5 | sonar.sourceEncoding=UTF-8 6 | sonar.coverageReportPaths=coverage/genericCoverage.xml 7 | -------------------------------------------------------------------------------- /tasks/coverage.os: -------------------------------------------------------------------------------- 1 | #Использовать coverage 2 | #Использовать 1commands 3 | #Использовать fs 4 | 5 | ФС.ОбеспечитьПустойКаталог("coverage"); 6 | ПутьКСтат = "coverage/stat.json"; 7 | 8 | Команда = Новый Команда; 9 | Команда.УстановитьКоманду("oscript"); 10 | Команда.ДобавитьПараметр("-encoding=utf-8"); 11 | Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); 12 | Команда.ДобавитьПараметр("tasks/test.os"); 13 | Команда.ПоказыватьВыводНемедленно(Истина); 14 | 15 | КодВозврата = Команда.Исполнить(); 16 | 17 | Файл_Стат = Новый Файл(ПутьКСтат); 18 | 19 | ИмяПакета = "crs-api"; 20 | 21 | Каталог = Новый Файл("coverage"); 22 | ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); 23 | ПроцессорГенерации.РабочийКаталог(Каталог.ПолноеИмя); 24 | 25 | ПроцессорГенерации.ОтносительныеПути() 26 | .ИмяФайлаСтатистики("stat*.json") 27 | .ФайлСтатистики(Файл_Стат.ПолноеИмя) 28 | .GenericCoverage() 29 | .Cobertura() 30 | .Clover(ИмяПакета) 31 | .Сформировать(); 32 | 33 | ЗавершитьРаботу(КодВозврата); -------------------------------------------------------------------------------- /tasks/test.os: -------------------------------------------------------------------------------- 1 | //заменить на путь к исходникам своей библиотеки, например, #Использовать ".." 2 | #Использовать "../src" 3 | #Использовать 1bdd 4 | #Использовать 1testrunner 5 | #Использовать fs 6 | 7 | Функция ПрогнатьТесты() 8 | 9 | Тестер = Новый Тестер; 10 | 11 | ПутьКТестам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests"); 12 | ПутьКОтчетуJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "out"); 13 | 14 | ФС.ОбеспечитьКаталог(ПутьКОтчетуJUnit); 15 | 16 | ПутьКОтчетуJUnit = Новый Файл(ПутьКОтчетуJUnit).ПолноеИмя; 17 | 18 | РезультатТестирования = Тестер.ТестироватьКаталог( 19 | Новый Файл(ПутьКТестам), 20 | Новый Файл(ПутьКОтчетуJUnit) 21 | ); 22 | 23 | Успешно = РезультатТестирования = 0; 24 | 25 | Возврат Успешно; 26 | КонецФункции // ПрогнатьТесты() 27 | 28 | Функция ПрогнатьФичи(Знач ПутьФич = "features") 29 | 30 | ПутьОтчетаJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "out", "bdd-log.xml"); 31 | 32 | КаталогФич = ОбъединитьПути(".", ПутьФич); 33 | 34 | Файл_КаталогФич = Новый Файл(КаталогФич); 35 | 36 | ИсполнительБДД = Новый ИсполнительБДД; 37 | РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); 38 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); 39 | 40 | СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; 41 | Если РезультатыВыполнения.Строки.Количество() > 0 Тогда 42 | 43 | СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); 44 | 45 | ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, Файл_КаталогФич.ЭтоКаталог()); 46 | КонецЕсли; 47 | 48 | ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; 49 | ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); 50 | 51 | Сообщить(СтрШаблон("Результат прогона фич <%1>. Путь %2 52 | |", ИтоговыйРезультатВыполнения, ПутьФич)); 53 | 54 | Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался; 55 | КонецФункции // ПрогнатьФичи() 56 | 57 | // основной код 58 | 59 | ТекКаталог = ТекущийКаталог(); 60 | 61 | Попытка 62 | ТестыПрошли = ПрогнатьТесты(); 63 | Исключение 64 | ТестыПрошли = Ложь; 65 | Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно 66 | |%1 67 | |%2", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ОписаниеОшибки())); 68 | КонецПопытки; 69 | 70 | УстановитьТекущийКаталог(ТекКаталог); 71 | 72 | Попытка 73 | ФичиПрошли = ПрогнатьФичи("features"); 74 | Исключение 75 | ФичиПрошли = Ложь; 76 | Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно 77 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); 78 | КонецПопытки; 79 | 80 | Сообщить(СтрШаблон("Результат прогона тестов <%1> 81 | |", ТестыПрошли)); 82 | Сообщить(СтрШаблон("Результат прогона основных фич <%1> 83 | |", ФичиПрошли)); 84 | 85 | Если НЕ ТестыПрошли Или НЕ ФичиПрошли Тогда 86 | Сообщить("Тестирование завершилось неудачно!"); 87 | ЗавершитьРаботу(1); 88 | КонецЕсли; -------------------------------------------------------------------------------- /tests/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c-syntax/oscript-actions-template/b6fdbd9f1ce50b4396120b2978d702835cab2d35/tests/.gitkeep --------------------------------------------------------------------------------