Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/check increase version #14

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"Lua.runtime.version": "LuaJIT",
"Lua.diagnostics.globals": [
"ngx"
],
"Lua.workspace.library": [
"${3rd}/OpenResty/library"
]
}
14 changes: 12 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
FROM openresty/openresty
FROM openresty/openresty:xenial

LABEL maintainer="Dima Ovcharenko <[email protected]>"
RUN apt-get update && apt-get install -y \
git \
libssl-dev \
libpcre3-dev \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN /usr/local/openresty/luajit/bin/luarocks install lrexlib-pcre
RUN /usr/local/openresty/luajit/bin/luarocks install lua-resty-http
RUN /usr/local/openresty/luajit/bin/luarocks install lua-cjson

LABEL maintainer="Ivanov Egor"
14 changes: 11 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@

Простой инструмент для контроля формата комментариев, которые разработчики указывают при помещении изменений в хранилище. Это прокси-сервер nginx, который с помощью кода на Lua анализирует запросы и выдает `400 Bad Request` в случае, если комментарий к версии хранилища не указан или указан не по формату. Проверка осуществляется не только при помещении изменений, но и при редактировании версий хранилища "задним числом".

По умолчанию реализована одновременно строгая и наивная проверка комментария. Корректный комментарий:
Проект имеет модульную структуру, в `conf.d/crserver-filter.conf` подключается модуль `modules/rewrite.lua` в котором уже подключаются модули проверок.

### Проверка комментария
В модуле `modules.formatCommentControl` реализована проверка комментария.

Корректный комментарий:

- не пустой
- начинается на `#`, после чего должны следовать либо 5 цифр, либо строка `"нетзадачи"`
Expand All @@ -24,9 +29,12 @@
Тех. долг
```

Код проверки комментария на соответствие формату можно модифицировать под свои потребности в `conf.d/crserver-filter.conf`.

Работоспособность решения проверена на конфигурациях размера ERP 2.4 при активной работе 10+ разработчиков, в том числе в режиме подключения пустой конфигурации к хранилищу.
### Контроль поднятия версии
В модуле `modules.versionControl` реализован контроль поднятия версия корня хранилища конфигурации

### Проверка пустрого комментария
В модуле `modules.emptyCommentControl` реализована проверка наличия пустого комментария.

## Использование

Expand Down
62 changes: 10 additions & 52 deletions conf.d/crserver-filter.conf
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
lua_shared_dict crs_keys 10m;

server {

listen 80;

# адрес прокси
server_name 192.168.59.20;
# адрес прокси, он должен быть указан в строке подключения к хранилищу. Напр.: http://127.0.0.1:3333/repo/repository.1ccr/adapter
server_name 127.0.0.1;

server_tokens off;

error_log logs/error.log debug;

location / {

# адрес хранилища
proxy_pass http://192.168.59.22:8082;
proxy_pass http://host.docker.internal:80;

proxy_read_timeout 600;

Expand All @@ -20,56 +24,10 @@ server {

# значения этих параметров ОБЯЗАТЕЛЬНО должны быть одинаковыми
# https://github.com/openresty/lua-nginx-module#lua_need_request_body
client_body_buffer_size 2048m;
client_max_body_size 2048m;

rewrite_by_lua_block {

ngx.req.read_body()

local req = ngx.var.request_body
if req == nil then
return
end

local commentPattern = [[<crs:comment>(.*)</crs:comment>]]
local message
if req:match([[DevDepot_commitObjects]]) ~= nil then
message = req:match(commentPattern) -- комментарий хранилища
elseif req:match([[DevDepot_changeVersion]]) ~= nil then
local newVersion = req:match([[<crs:newVersion>(.*)</crs:newVersion>]])
if newVersion == nil then
return
end
message = newVersion:match(commentPattern)
else
return
end

-- проверка на пустой комментарий
if message == nil then
ngx.status = ngx.HTTP_BAD_REQUEST
ngx.header.content_type = 'text/plain; charset=utf-8'
ngx.say("ОТСУТСТВУЕТ КОММЕНТАРИЙ")
ngx.exit(ngx.HTTP_BAD_REQUEST)
end
client_body_buffer_size 6048m;
client_max_body_size 6048m;

-- вот здесь можно написать свои проверки
local five_digits = message:match([[^#%d%d%d%d%d]])
local no_task = message:match([[^#нетзадачи]])
local double_n = message:match("\n\n")
if (five_digits ~= nil or no_task ~= nil) and double_n ~= nil then
return
else
ngx.status = ngx.HTTP_BAD_REQUEST
ngx.header.content_type = 'text/plain; charset=utf-8'
ngx.say("НЕВЕРНЫЙ ФОРМАТ КОММЕНТАРИЯ")
ngx.say("комментарий должен:")
ngx.say("- начинаться на #12345 (где 12345 - номер задачи) или на #нетзадачи")
ngx.say("- содержать пустую строку, отделяющую заголовок комментария от тела")
ngx.exit(ngx.HTTP_BAD_REQUEST)
end
rewrite_by_lua_file /usr/local/openresty/lualib/modules/rewrite.lua;

}
}
}
3 changes: 2 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ services:
- 3333:80
volumes:
- ./log:/usr/local/openresty/nginx/logs
- ./conf.d/crserver-filter.conf:/etc/nginx/conf.d/crserver-filter.conf
- ./conf.d/crserver-filter.conf:/etc/nginx/conf.d/crserver-filter.conf
- ./modules:/usr/local/openresty/lualib/modules/
27 changes: 27 additions & 0 deletions modules/emptyCommentControl.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
local _M = {}

-- проверка на пустой комментарий
function _M.check_comment(enabled, request_body, errors)

if enabled == false then
ngx.log(ngx.DEBUG, "Проверка пустого комментария отключена")
return
end

local commentPattern = [[<crs:comment>(.*)</crs:comment>]]

local message

if request_body:match([[DevDepot_commitObjects]]) ~= nil then
message = request_body:match(commentPattern) -- комментарий хранилища
else
return
end

if message == nil then
table.insert(errors, "Отсутствует комментарий (comment_check)")
end

end

return _M
59 changes: 59 additions & 0 deletions modules/formatCommentControl.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
local _M = {}

-- проверка на пустой комментарий
function _M.check_format_comment(enabled, request_body, errors)

if enabled == false then
ngx.log(ngx.DEBUG, "Проверка формата комментария отключена")
return
end

local commentPattern = [[<crs:comment>(.*)</crs:comment>]]

local message

if request_body:match([[DevDepot_commitObjects]]) ~= nil then
message = request_body:match(commentPattern) -- комментарий хранилища
else
return
end
if message == nil then
return
end

-- вот здесь можно написать свои проверки
local five_digits = message:match([[^.+-%d+]])
local no_task = message:match([[^#нетзадачи]])
local double_n = message:match("\n\n")

if (five_digits ~= nil ) then
ngx.log(ngx.DEBUG, "Номер задачи : Указан")
else
ngx.log(ngx.DEBUG, "Номер задачи : Не Указан")
end

if (no_task ~= nil ) then
ngx.log(ngx.DEBUG, "Нет задачи : Тег указан")
else
ngx.log(ngx.DEBUG, "Нет задачи : Тег не указан")
end
if (double_n ~= nil ) then
ngx.log(ngx.DEBUG, "Перенос строки : Есть ")
else
ngx.log(ngx.DEBUG, "Перенос строки : Отсутствует")
end



if (five_digits ~= nil or no_task ~= nil) and double_n ~= nil then
return
else
table.insert(errors, "Неверный форма комментария (comment_control)")
table.insert(errors, "комментарий должен:")
table.insert(errors, "- начинаться на P1C-12345 (где 12345 - номер задачи) или на #нетзадачи")
table.insert(errors, "- содержать пустую строку, отделяющую заголовок комментария от тела")
end

end

return _M
44 changes: 44 additions & 0 deletions modules/rewrite.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
ngx.req.read_body()

local req = ngx.var.request_body
local errors = {}
if req == nil then
return
end

ngx.log(ngx.DEBUG, ngx.var.request_body)
if req:match([[DevDepot_commitObjects]]) == nil then
return -- Интересуют только события помещения в хранилище, если для обработки нужно больше событий, можно их в эту проверку добавлять
end

local CheckFormatComment = true; --Проверка комментария вкл\выкл
local CheckEmptyComment = true; --Проверка пустого комментария вкл\выкл
local CheckVersion = true; --Проверка изменения версии конфигурации

local emptyCommentControl = require "modules.emptyCommentControl"
emptyCommentControl.check_comment(CheckEmptyComment, req, errors)

local formatCommentControl = require "modules.formatCommentControl"
formatCommentControl.check_format_comment(CheckFormatComment, req, errors)

local versionControl = require "modules.versionControl"
versionControl.check_version(CheckVersion, req, errors)

if #errors > 0 then
ngx.status = ngx.HTTP_BAD_REQUEST
ngx.header.content_type = 'text/plain; charset=utf-8'
ngx.say(" ")
for i = 1, #errors do
ngx.log(ngx.DEBUG, errors[i] .. " <- array")
ngx.say(errors[i])
end

ngx.exit(ngx.HTTP_BAD_REQUEST)
end







Loading