├── .gitattributes ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── conf.d └── crserver-filter.conf └── docker-compose.yml /.gitattributes: -------------------------------------------------------------------------------- 1 | *.yml text eol=lf 2 | Dockerfile text eol=lf 3 | *.conf text eol=lf 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | log/ 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openresty/openresty 2 | 3 | LABEL maintainer="Dima Ovcharenko " -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Dmitrii Ovcharenko 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 | # Прокси-сервер для проверки формата комментариев в хранилище конфигураций 1С 2 | 3 | ## Назначение 4 | 5 | Простой инструмент для контроля формата комментариев, которые разработчики указывают при помещении изменений в хранилище. Это прокси-сервер nginx, который с помощью кода на Lua анализирует запросы и выдает `400 Bad Request` в случае, если комментарий к версии хранилища не указан или указан не по формату. Проверка осуществляется не только при помещении изменений, но и при редактировании версий хранилища "задним числом". 6 | 7 | По умолчанию реализована одновременно строгая и наивная проверка комментария. Корректный комментарий: 8 | 9 | - не пустой 10 | - начинается на `#`, после чего должны следовать либо 5 цифр, либо строка `"нетзадачи"` 11 | - содержит два перевода строки 12 | 13 | Примеры корректных комментариев: 14 | 15 | ```md 16 | #12345 Обработка заполнения ТЧ "Товары" 17 | 18 | Добавлена обработка заполнения ТЧ "Товары" документа "Реализация товаров и услуг" 19 | ``` 20 | 21 | ```md 22 | #нетзадачи 23 | 24 | Тех. долг 25 | ``` 26 | 27 | Код проверки комментария на соответствие формату можно модифицировать под свои потребности в `conf.d/crserver-filter.conf`. 28 | 29 | Работоспособность решения проверена на конфигурациях размера ERP 2.4 при активной работе 10+ разработчиков, в том числе в режиме подключения пустой конфигурации к хранилищу. 30 | 31 | ## Использование 32 | 33 | - внести изменения в `conf.d/crserver-filter.conf` 34 | - указать адрес прокси-сервера и адрес сервера хранилища 35 | - уточнить формат комментария к версии хранилища 36 | - внести изменения в docker-compose.yml 37 | - указать порт прокси-сервера (по умолчанию `3333`) 38 | - выполнить `docker-compose up -d` 39 | - открыть Конфигуратор, закрыть хранилище, открыть хранилище, вместо адреса реального хранилища указать `прокси:порт` 40 | 41 | БЫЛО: `http://srv-app-01/CRServer/repository.1ccr/ERP_Master` 42 | 43 | СТАЛО: `http://srv-ci-01:3333/CRServer/repository.1ccr/ERP_Master` 44 | 45 | После проверки работоспособности необходимо изменить порт основного http-сервера хранилища, обновить его в `conf.d/crserver-filter.conf`, перезапустить контейнер. 46 | 47 | ## Ссылки 48 | 49 | - [commitHook](https://github.com/asosnoviy/commitHook) 50 | - [OpenResty](https://openresty.org/) 51 | -------------------------------------------------------------------------------- /conf.d/crserver-filter.conf: -------------------------------------------------------------------------------- 1 | server { 2 | 3 | listen 80; 4 | 5 | # адрес прокси 6 | server_name 192.168.59.20; 7 | 8 | server_tokens off; 9 | 10 | location / { 11 | 12 | # адрес хранилища 13 | proxy_pass http://192.168.59.22:8082; 14 | 15 | proxy_read_timeout 600; 16 | 17 | proxy_set_header Host $host; 18 | proxy_set_header X-Real-IP $remote_addr; 19 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 20 | 21 | # значения этих параметров ОБЯЗАТЕЛЬНО должны быть одинаковыми 22 | # https://github.com/openresty/lua-nginx-module#lua_need_request_body 23 | client_body_buffer_size 2048m; 24 | client_body_timeout 600s; 25 | client_max_body_size 2048m; 26 | 27 | rewrite_by_lua_block { 28 | 29 | ngx.req.read_body() 30 | 31 | local req = ngx.req.get_body_data() 32 | if req == nil then 33 | return 34 | end 35 | 36 | local commentPattern = [[(.*)]] 37 | local message 38 | if req:match([[DevDepot_commitObjects]]) ~= nil then 39 | message = req:match(commentPattern) -- комментарий хранилища 40 | elseif req:match([[DevDepot_changeVersion]]) ~= nil then 41 | local newVersion = req:match([[(.*)]]) 42 | if newVersion == nil then 43 | return 44 | end 45 | message = newVersion:match(commentPattern) 46 | else 47 | return 48 | end 49 | 50 | -- проверка на пустой комментарий 51 | if message == nil then 52 | ngx.status = ngx.HTTP_BAD_REQUEST 53 | ngx.header.content_type = 'text/plain; charset=utf-8' 54 | ngx.say("ОТСУТСТВУЕТ КОММЕНТАРИЙ") 55 | ngx.exit(ngx.HTTP_BAD_REQUEST) 56 | end 57 | 58 | -- вот здесь можно написать свои проверки 59 | local five_digits = message:match([[^#%d%d%d%d%d]]) 60 | local no_task = message:match([[^#нетзадачи]]) 61 | local double_n = message:match("\n\n") 62 | if (five_digits ~= nil or no_task ~= nil) and double_n ~= nil then 63 | return 64 | else 65 | ngx.status = ngx.HTTP_BAD_REQUEST 66 | ngx.header.content_type = 'text/plain; charset=utf-8' 67 | ngx.say("НЕВЕРНЫЙ ФОРМАТ КОММЕНТАРИЯ") 68 | ngx.say("комментарий должен:") 69 | ngx.say("- начинаться на #12345 (где 12345 - номер задачи) или на #нетзадачи") 70 | ngx.say("- содержать пустую строку, отделяющую заголовок комментария от тела") 71 | ngx.exit(ngx.HTTP_BAD_REQUEST) 72 | end 73 | 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | 4 | crserver-filter: 5 | build: . 6 | ports: 7 | - 3333:80 8 | volumes: 9 | - ./log:/usr/local/openresty/nginx/logs 10 | - ./conf.d/crserver-filter.conf:/etc/nginx/conf.d/crserver-filter.conf --------------------------------------------------------------------------------