Обновить Alpine-пакеты frontend-образа
All checks were successful
Проверка, сборка и развёртывание Magistr / Обязательные проверки (push) Successful in 1m9s
Проверка, сборка и развёртывание Magistr / Собрать backend image (push) Successful in 22s
Проверка, сборка и развёртывание Magistr / Собрать frontend image (push) Successful in 26s
Проверка, сборка и развёртывание Magistr / Проверить опубликованные образы (push) Successful in 6m31s
Проверка, сборка и развёртывание Magistr / Развернуть проверенные digests (push) Has been skipped

This commit is contained in:
Zuev
2026-07-30 01:24:11 +03:00
parent 0180b450b3
commit a759155b15
7 changed files with 130 additions and 75 deletions

View File

@@ -98,6 +98,7 @@ RUN npm ci
RUN npm run build:vendor
FROM httpd:alpine3.23@sha256:4a15e9c...
RUN apk upgrade --no-cache
COPY --from=frontend-assets /build/dist/vendor/ /usr/local/apache2/htdocs/vendor/
COPY security.conf /usr/local/apache2/conf/extra/magistr-security.conf
COPY proxy.conf /usr/local/apache2/conf/extra/magistr-proxy.conf
@@ -108,7 +109,8 @@ tag и manifest digest. Первый этап frontend собирает зафи
OpenTelemetry bundle; второй раздаёт только runtime-
файлы, без `node_modules`, тестов и build-исходников. Apache подключает `mod_headers`,
`mod_proxy` и `mod_proxy_http`; proxy сохраняет исходный `Host`, чтобы `localhost` корректно
маршрутизировался в tenant `default`. Сервер
маршрутизировался в tenant `default`. Перед копированием runtime-файлов устанавливаются
доступные исправления Alpine через `apk upgrade --no-cache`. Сервер
возвращает CSP с `script-src 'self'`, `script-src-attr 'none'`, `style-src 'self'` и точными
SHA-256 для оставшихся статических style-атрибутов. `unsafe-inline` и `unsafe-eval` не
используются. Дополнительно выставляются `nosniff`, `DENY`, строгий referrer policy и

View File

@@ -9,6 +9,9 @@ RUN npm run build:vendor
FROM httpd:alpine3.23@sha256:4a15e9c73f25334bc03cfb3c692c9adfc103bb46ca89cee1f0b9a5fcbc7b21f6
# Устанавливаем исправления безопасности, опубликованные после сборки базового образа.
RUN apk upgrade --no-cache
COPY admin/ /usr/local/apache2/htdocs/admin/
COPY department/ /usr/local/apache2/htdocs/department/
COPY edu-office/ /usr/local/apache2/htdocs/edu-office/

View File

@@ -1,11 +1,16 @@
{
"generated_at": "2026-07-29T21:47:12.291616+00:00",
"generated_at": "2026-07-29T22:16:42.858165+00:00",
"nodes": {
"_gitea_workflows_docker_build_backend_image_pipeline": {
"code_fingerprint": "672f3effb2b85afa48bca601809662a5567dc0d57a24b224d4c7f1624899b222",
"code_fingerprint": "3b51aee192b5af2b63ee1b7f62beca1b4524fbbd2b143c9bd29eb039db90f7bd",
"label": "Pipeline backend-образа",
"last": "2026-07-29T21:27:26.637336+00:00",
"last": "2026-07-29T21:50:22.465033+00:00",
"provenance": [
{
"date": "2026-07-29T21:50:22.465033+00:00",
"outcome": "useful",
"q": "Проверить backend на HIGH и CRITICAL уязвимости: context deadline exceeded после загрузки Trivy DB"
},
{
"date": "2026-07-29T21:27:26.637336+00:00",
"outcome": "useful",
@@ -17,16 +22,21 @@
"q": "The goal you specified requires a project to execute but there is no POM in this directory (/workspace)."
}
],
"score": 1.998587492,
"score": 2.997218887,
"source_file": ".gitea/workflows/docker-build.yaml",
"status": "preferred",
"uses": 2
"uses": 3
},
"_gitea_workflows_docker_build_build_and_push_docker_images": {
"code_fingerprint": "672f3effb2b85afa48bca601809662a5567dc0d57a24b224d4c7f1624899b222",
"code_fingerprint": "3b51aee192b5af2b63ee1b7f62beca1b4524fbbd2b143c9bd29eb039db90f7bd",
"label": "Workflow сборки и публикации Docker-образов",
"last": "2026-07-29T21:27:26.637336+00:00",
"last": "2026-07-29T21:50:22.465033+00:00",
"provenance": [
{
"date": "2026-07-29T21:50:22.465033+00:00",
"outcome": "useful",
"q": "Проверить backend на HIGH и CRITICAL уязвимости: context deadline exceeded после загрузки Trivy DB"
},
{
"date": "2026-07-29T21:27:26.637336+00:00",
"outcome": "useful",
@@ -46,20 +56,15 @@
"date": "2026-07-29T19:59:04.551881+00:00",
"outcome": "useful",
"q": "новая схема на проде на удалённом сервере создана через CREATE SCHEMA public. я проверил, давай дальше"
},
{
"date": "2026-07-29T19:26:44.188240+00:00",
"outcome": "useful",
"q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?"
}
],
"score": 4.99308675,
"score": 5.990300641,
"source_file": ".gitea/workflows/docker-build.yaml",
"status": "preferred",
"uses": 5
"uses": 6
},
"_gitea_workflows_docker_build_deploy_to_k8s": {
"code_fingerprint": "672f3effb2b85afa48bca601809662a5567dc0d57a24b224d4c7f1624899b222",
"code_fingerprint": "3b51aee192b5af2b63ee1b7f62beca1b4524fbbd2b143c9bd29eb039db90f7bd",
"label": "Job деплоя в Kubernetes",
"last": "2026-07-29T20:12:38.880629+00:00",
"provenance": [
@@ -69,26 +74,31 @@
"q": "сам можешь выполнить эти действия?"
}
],
"score": 0.998483979,
"score": 0.998011327,
"source_file": ".gitea/workflows/docker-build.yaml",
"status": "tentative",
"uses": 1
},
"_gitea_workflows_docker_build_frontend_image_pipeline": {
"code_fingerprint": "672f3effb2b85afa48bca601809662a5567dc0d57a24b224d4c7f1624899b222",
"code_fingerprint": "3b51aee192b5af2b63ee1b7f62beca1b4524fbbd2b143c9bd29eb039db90f7bd",
"label": "Pipeline frontend-образа",
"last": "2026-07-29T20:38:53.488440+00:00",
"last": "2026-07-29T21:50:22.465033+00:00",
"provenance": [
{
"date": "2026-07-29T21:50:22.465033+00:00",
"outcome": "useful",
"q": "Проверить backend на HIGH и CRITICAL уязвимости: context deadline exceeded после загрузки Trivy DB"
},
{
"date": "2026-07-29T20:38:53.488440+00:00",
"outcome": "useful",
"q": "The goal you specified requires a project to execute but there is no POM in this directory (/workspace)."
}
],
"score": 0.998904507,
"score": 1.998009121,
"source_file": ".gitea/workflows/docker-build.yaml",
"status": "tentative",
"uses": 1
"status": "preferred",
"uses": 2
},
"backend_src_main_java_com_magistr_app_config_auth_authorizationinterceptor_authorizationinterceptor": {
"code_fingerprint": "70b01b3fa22e058ee997250c52cc0affee54ab37aa5f8cc7eb74411487f1bbbf",
@@ -111,7 +121,7 @@
"q": "Почему RequireRoles связывает множество контроллеров, моделей и сервисов как cross-community bridge?"
}
],
"score": 1.858025454,
"score": 1.857145922,
"source_file": "backend/src/main/java/com/magistr/app/config/auth/AuthorizationInterceptor.java",
"status": "preferred",
"uses": 3
@@ -127,7 +137,7 @@
"q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?"
}
],
"score": 0.660126499,
"score": 0.659814015,
"source_file": "backend/src/main/java/com/magistr/app/config/auth/JwtTokenService.java",
"status": "tentative",
"uses": 1
@@ -143,7 +153,7 @@
"q": "Почему RequireRoles связывает множество контроллеров, моделей и сервисов как cross-community bridge?"
}
],
"score": 0.555414877,
"score": 0.555151961,
"source_file": "backend/src/main/java/com/magistr/app/config/auth/RequireRoles.java",
"status": "tentative",
"uses": 1
@@ -159,7 +169,7 @@
"q": "Как безопасно обновлять tenant DataSource без потери рабочего подключения?"
}
],
"score": 0.675534207,
"score": 0.67521443,
"source_file": "backend/src/main/java/com/magistr/app/config/DataInitializer.java",
"status": "tentative",
"uses": 1
@@ -175,7 +185,7 @@
"q": "проанализируй весь проект на баги и ошибки и дополни '/mnt/HDD/ProjectMagistr/magistr/BUG_REPORT.md'"
}
],
"score": 0.642484079,
"score": 0.642179947,
"source_file": "backend/src/main/java/com/magistr/app/config/tenant/ConfigMapUpdater.java",
"status": "tentative",
"uses": 1
@@ -191,7 +201,7 @@
"q": "Как безопасно заменить tenant DataSource без потери рабочего подключения?"
}
],
"score": 0.675419668,
"score": 0.675099946,
"source_file": "backend/src/main/java/com/magistr/app/config/tenant/TenantConfig.java",
"status": "tentative",
"uses": 1
@@ -217,7 +227,7 @@
"q": "проанализируй весь проект на баги и ошибки и дополни '/mnt/HDD/ProjectMagistr/magistr/BUG_REPORT.md'"
}
],
"score": 1.993437954,
"score": 1.992494322,
"source_file": "backend/src/main/java/com/magistr/app/config/tenant/TenantConfigWatcher.java",
"status": "preferred",
"uses": 3
@@ -243,7 +253,7 @@
"q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?"
}
],
"score": 2.011080374,
"score": 2.01012839,
"source_file": "backend/src/main/java/com/magistr/app/config/tenant/TenantRoutingDataSource.java",
"status": "preferred",
"uses": 3
@@ -259,7 +269,7 @@
"q": "Почему в выборе аудитории показаны корпус и этаж?"
}
],
"score": 0.830472643,
"score": 0.830079523,
"source_file": "backend/src/main/java/com/magistr/app/controller/ClassroomController.java",
"status": "tentative",
"uses": 1
@@ -275,7 +285,7 @@
"q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?"
}
],
"score": 0.660126499,
"score": 0.659814015,
"source_file": "backend/src/main/java/com/magistr/app/controller/DatabaseController.java",
"status": "tentative",
"uses": 1
@@ -296,7 +306,7 @@
"q": "Как безопасно заменить tenant DataSource без потери рабочего подключения?"
}
],
"score": 1.350953875,
"score": 1.350314375,
"source_file": "backend/src/main/java/com/magistr/app/controller/DatabaseController.java",
"status": "preferred",
"uses": 2
@@ -312,7 +322,7 @@
"q": "проанализируй весь проект на баги и ошибки и дополни '/mnt/HDD/ProjectMagistr/magistr/BUG_REPORT.md'"
}
],
"score": 0.642484079,
"score": 0.642179947,
"source_file": "backend/src/main/java/com/magistr/app/controller/GlobalExceptionHandler.java",
"status": "tentative",
"uses": 1
@@ -333,7 +343,7 @@
"q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?"
}
],
"score": 1.48983232,
"score": 1.489127079,
"source_file": "backend/src/main/java/com/magistr/app/controller/ScheduleController.java",
"status": "preferred",
"uses": 2
@@ -349,7 +359,7 @@
"q": "Как безопасно валидировать и сохранять точечные изменения расписания?"
}
],
"score": 0.670693319,
"score": 0.670375833,
"source_file": "backend/src/main/java/com/magistr/app/controller/ScheduleOverrideController.java",
"status": "tentative",
"uses": 1
@@ -370,7 +380,7 @@
"q": "проанализируй весь проект на баги и ошибки и дополни '/mnt/HDD/ProjectMagistr/magistr/BUG_REPORT.md'"
}
],
"score": 1.317674538,
"score": 1.317050791,
"source_file": "backend/src/main/java/com/magistr/app/controller/ScheduleRuleAdminController.java",
"status": "preferred",
"uses": 2
@@ -386,7 +396,7 @@
"q": "хотим поменять название сервиса, придумай что-то короткое одним словом подходящее по смыслу"
}
],
"score": 0.850158824,
"score": 0.849756385,
"source_file": "backend/src/main/java/com/magistr/app/model/AcademicCalendar.java",
"status": "tentative",
"uses": 1
@@ -402,7 +412,7 @@
"q": "Почему в выборе аудитории показаны корпус и этаж?"
}
],
"score": 0.830472643,
"score": 0.830079523,
"source_file": "backend/src/main/java/com/magistr/app/model/Classroom.java",
"status": "tentative",
"uses": 1
@@ -418,7 +428,7 @@
"q": "хотим поменять название сервиса, придумай что-то короткое одним словом подходящее по смыслу"
}
],
"score": 0.850158824,
"score": 0.849756385,
"source_file": "backend/src/main/java/com/magistr/app/model/Department.java",
"status": "tentative",
"uses": 1
@@ -439,7 +449,7 @@
"q": "Корректны ли inferred-связи вокруг ScheduleRule?"
}
],
"score": 1.231225267,
"score": 1.230642443,
"source_file": "backend/src/main/java/com/magistr/app/model/ScheduleRule.java",
"status": "preferred",
"uses": 2
@@ -455,7 +465,7 @@
"q": "Какие связи затрагивает полная валидация правил расписания в исправлении №7?"
}
],
"score": 0.675190459,
"score": 0.674870845,
"source_file": "backend/src/main/java/com/magistr/app/model/ScheduleRuleSlot.java",
"status": "tentative",
"uses": 1
@@ -476,7 +486,7 @@
"q": "в дополнительные фильры просмотра расписаний нужно добавить выбор семестра"
}
],
"score": 1.679864645,
"score": 1.679069449,
"source_file": "backend/src/main/java/com/magistr/app/model/Semester.java",
"status": "preferred",
"uses": 2
@@ -492,7 +502,7 @@
"q": "хотим поменять название сервиса, придумай что-то короткое одним словом подходящее по смыслу"
}
],
"score": 0.850158824,
"score": 0.849756385,
"source_file": "backend/src/main/java/com/magistr/app/model/StudentGroup.java",
"status": "tentative",
"uses": 1
@@ -508,7 +518,7 @@
"q": "Какие связи затрагивает полная валидация правил расписания в исправлении №7?"
}
],
"score": 0.675190459,
"score": 0.674870845,
"source_file": "backend/src/main/java/com/magistr/app/repository/SemesterRepository.java",
"status": "tentative",
"uses": 1
@@ -529,7 +539,7 @@
"q": "Как безопасно валидировать и сохранять точечные изменения расписания?"
}
],
"score": 1.50039914,
"score": 1.499688898,
"source_file": "backend/src/main/java/com/magistr/app/service/ScheduleQueryService.java",
"status": "preferred",
"uses": 2
@@ -545,7 +555,7 @@
"q": "Корректны ли inferred-связи вокруг ScheduleRule?"
}
],
"score": 0.556034807,
"score": 0.555771598,
"source_file": "backend/src/test/java/com/magistr/app/model/ScheduleRuleTest.java",
"status": "tentative",
"uses": 1
@@ -561,7 +571,7 @@
"q": "Какие подсистемы связывают исправления аутентификации, tenant-конфигурации, расписания и инфраструктуры?"
}
],
"score": 0.660126499,
"score": 0.659814015,
"source_file": "compose.yaml",
"status": "tentative",
"uses": 1
@@ -577,7 +587,7 @@
"q": "новая схема на проде на удалённом сервере создана через CREATE SCHEMA public. я проверил, давай дальше"
}
],
"score": 0.998266566,
"score": 0.997794018,
"source_file": "compose.yaml",
"status": "tentative",
"uses": 1
@@ -593,16 +603,21 @@
"q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?"
}
],
"score": 0.997748712,
"score": 0.997276409,
"source_file": "docs/DATABASE.md",
"status": "tentative",
"uses": 1
},
"docs_infrastructure_gitea_actions_cicd": {
"code_fingerprint": "710cfffbe78ceeac834c0ad6e1c2107b1c55772a142c461fd9ef3787e9f97ace",
"code_fingerprint": "038c159537c77b4bfe631532511e807aac2677f3a26d722cdc9048402cf58f4b",
"label": "CI/CD Gitea Actions в инфраструктуре",
"last": "2026-07-29T21:27:26.637336+00:00",
"last": "2026-07-29T21:50:22.465033+00:00",
"provenance": [
{
"date": "2026-07-29T21:50:22.465033+00:00",
"outcome": "useful",
"q": "Проверить backend на HIGH и CRITICAL уязвимости: context deadline exceeded после загрузки Trivy DB"
},
{
"date": "2026-07-29T21:27:26.637336+00:00",
"outcome": "useful",
@@ -614,13 +629,13 @@
"q": "The goal you specified requires a project to execute but there is no POM in this directory (/workspace)."
}
],
"score": 1.998587492,
"score": 2.997218887,
"source_file": "docs/INFRASTRUCTURE.md",
"status": "preferred",
"uses": 2
"uses": 3
},
"docs_infrastructure_jwt_secret_policy": {
"code_fingerprint": "710cfffbe78ceeac834c0ad6e1c2107b1c55772a142c461fd9ef3787e9f97ace",
"code_fingerprint": "038c159537c77b4bfe631532511e807aac2677f3a26d722cdc9048402cf58f4b",
"label": "Политика JWT-секрета",
"last": "2026-07-29T20:12:38.880629+00:00",
"provenance": [
@@ -635,13 +650,13 @@
"q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?"
}
],
"score": 1.996232691,
"score": 1.995287736,
"source_file": "docs/INFRASTRUCTURE.md",
"status": "preferred",
"uses": 2
},
"docs_infrastructure_kubernetes_production": {
"code_fingerprint": "710cfffbe78ceeac834c0ad6e1c2107b1c55772a142c461fd9ef3787e9f97ace",
"code_fingerprint": "038c159537c77b4bfe631532511e807aac2677f3a26d722cdc9048402cf58f4b",
"label": "Production-инфраструктура Kubernetes",
"last": "2026-07-29T20:12:38.880629+00:00",
"provenance": [
@@ -661,13 +676,13 @@
"q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?"
}
],
"score": 2.994499257,
"score": 2.993081754,
"source_file": "docs/INFRASTRUCTURE.md",
"status": "preferred",
"uses": 3
},
"docs_infrastructure_tenants_configmap": {
"code_fingerprint": "710cfffbe78ceeac834c0ad6e1c2107b1c55772a142c461fd9ef3787e9f97ace",
"code_fingerprint": "038c159537c77b4bfe631532511e807aac2677f3a26d722cdc9048402cf58f4b",
"label": "Tenants ConfigMap",
"last": "2026-07-29T19:26:44.188240+00:00",
"provenance": [
@@ -677,7 +692,7 @@
"q": "теперь напиши мне инструкцию как это всё выыкатить на прод. у мня уже поднят на проде этот сервис со старой базой данных, но я могу её затереть. ci/cd тоже настроен, по сути я прямо сейчас могу залить это в ветку мейн и оно должно раскататься. каие есть подводные камни после изменений безопасности которые мы внесли?"
}
],
"score": 0.997748712,
"score": 0.997276409,
"source_file": "docs/INFRASTRUCTURE.md",
"status": "tentative",
"uses": 1
@@ -693,7 +708,7 @@
"q": "Проверить опубликованные образы: backend Trivy HIGH/CRITICAL scan завершился exitcode 1"
}
],
"score": 0.999682985,
"score": 0.999209766,
"source_file": "",
"status": "tentative",
"uses": 1

View File

@@ -0,0 +1,24 @@
---
type: "query"
date: "2026-07-29T22:22:22.155742+00:00"
question: "Проверить frontend на HIGH и CRITICAL уязвимости: 8 HIGH в Alpine runtime"
contributor: "graphify"
outcome: "useful"
source_nodes: ["Workflow сборки и публикации Docker-образов", "Pipeline frontend-образа", "CI/CD Gitea Actions в инфраструктуре"]
---
# Q: Проверить frontend на HIGH и CRITICAL уязвимости: 8 HIGH в Alpine runtime
## Answer
Expanded from original query via graph vocab: [build, container, docker, frontend, gitea, pipeline, registry, workflow]. Traversal вывел Workflow сборки и публикации Docker-образов и Pipeline frontend-образа; фактическая причина проверена по frontend/Dockerfile и Trivy-логу. В финальном httpd:alpine 3.23.4 найдены 8 исправимых HIGH: c-ares, libcrypto3/libssl3, libcurl и libexpat. В runtime-stage добавлен RUN apk upgrade --no-cache. Локальная Docker-сборка подтвердила обновление ровно до fixed versions из отчёта: c-ares 1.34.8-r0, OpenSSL 3.5.7-r0, libcurl 8.20.0-r0, libexpat 2.8.2-r0, Alpine 3.23.5. Supply-chain regression gates и frontend 11/11 прошли. Отдельный локальный Trivy-процесс не стартовал из-за таймаута механизма разрешений Docker socket; окончательный scan выполняет новый CI-run.
## Outcome
- Signal: useful
## Source Nodes
- Workflow сборки и публикации Docker-образов
- Pipeline frontend-образа
- CI/CD Gitea Actions в инфраструктуре

View File

@@ -1,21 +1,22 @@
# Lessons
_Auto-generated by `graphify reflect` from 17 session memories in graphify-out/memory/. Deterministic; no LLM. Use for orientation — verify before relying, and revisit dead ends if the code has changed since._
_Auto-generated by `graphify reflect` from 18 session memories in graphify-out/memory/. Deterministic; no LLM. Use for orientation — verify before relying, and revisit dead ends if the code has changed since._
## Summary
- 16 useful · 1 dead ends · 0 corrected · 0 unmarked
- 17 useful · 1 dead ends · 0 corrected · 0 unmarked
## Lessons
**Preferred sources** — corroborated by ≥2 useful results; start here.
- `Workflow сборки и публикации Docker-образов` (5× useful)
- `Workflow сборки и публикации Docker-образов` (6× useful)
- `CI/CD Gitea Actions в инфраструктуре` (3× useful)
- `Pipeline backend-образа` (3× useful)
- `Production-инфраструктура Kubernetes` (3× useful)
- `ScheduleGeneratorService` (3× useful)
- `TenantRoutingDataSource` (3× useful)
- `CI/CD Gitea Actions в инфраструктуре` (2× useful)
- `Pipeline backend-образа` (2× useful)
- `Pipeline frontend-образа` (2× useful)
- `Политика JWT-секрета` (2× useful)
- `TenantConfigWatcher` (3× useful)
- `AuthorizationInterceptor` (3× useful)
@@ -29,7 +30,6 @@ _Auto-generated by `graphify reflect` from 17 session memories in graphify-out/m
**Tentative** — useful in fewer than 2 results; verify before relying.
- `SpringBootApplication` (1× useful)
- `Pipeline frontend-образа` (1× useful)
- `Job деплоя в Kubernetes` (1× useful)
- `PostgreSQL-сервис Docker Compose` (1× useful)
- `Flyway-миграции` (1× useful)

View File

@@ -142,13 +142,17 @@ check_downloaded_backend_artifact() {
fi
}
check_backend_runtime_updates() {
local dockerfile="$PROJECT_ROOT/backend/Dockerfile"
check_runtime_updates() {
local component
local dockerfile
require_file "$dockerfile" || return
for component in backend frontend; do
dockerfile="$PROJECT_ROOT/$component/Dockerfile"
require_file "$dockerfile" || continue
if ! grep -Fq 'RUN apk upgrade --no-cache' "$dockerfile"; then
fail "runtime-образ backend должен устанавливать доступные исправления Alpine"
fail "runtime-образ $component должен устанавливать доступные исправления Alpine"
fi
done
}
check_testcontainer_images() {
@@ -188,7 +192,7 @@ check_compose_images
check_actions
check_workflow_gates
check_downloaded_backend_artifact
check_backend_runtime_updates
check_runtime_updates
check_testcontainer_images
check_optional_kubernetes_images

View File

@@ -42,11 +42,18 @@ cp "$ROOT_DIR/.gitea/workflows/docker-build.yaml" \
"$FIXTURE_DIR/.gitea/workflows/docker-build.yaml"
sed -i '/RUN apk upgrade --no-cache/d' "$FIXTURE_DIR/backend/Dockerfile"
if PROJECT_ROOT="$FIXTURE_DIR" bash "$CHECK_SCRIPT" >/dev/null 2>&1; then
printf 'Ошибка теста: отсутствие Alpine security updates не было отклонено\n' >&2
printf 'Ошибка теста: отсутствие Alpine security updates в backend не было отклонено\n' >&2
exit 1
fi
cp "$ROOT_DIR/backend/Dockerfile" "$FIXTURE_DIR/backend/Dockerfile"
sed -i '/RUN apk upgrade --no-cache/d' "$FIXTURE_DIR/frontend/Dockerfile"
if PROJECT_ROOT="$FIXTURE_DIR" bash "$CHECK_SCRIPT" >/dev/null 2>&1; then
printf 'Ошибка теста: отсутствие Alpine security updates во frontend не было отклонено\n' >&2
exit 1
fi
cp "$ROOT_DIR/frontend/Dockerfile" "$FIXTURE_DIR/frontend/Dockerfile"
cp "$ROOT_DIR/.gitea/workflows/docker-build.yaml" \
"$FIXTURE_DIR/.gitea/workflows/docker-build.yaml"
sed -i '0,/image --timeout 15m --scanners vuln/{s/image --timeout 15m --scanners vuln/image --scanners vuln/;}' \