ci: expand changes detection to rewire all pipeline nodes
CI / changes (push) Successful in 7s
CI / commitlint (push) Has been skipped
CI / openapi (push) Successful in 28s
CI / web (push) Successful in 40s
CI / go (push) Failing after 21s
CI / bird2 (push) Has been skipped
CI / release (push) Has been skipped

Полный прогон при scripts/*, workflows, golangci, pre-commit; openapi в full_pipeline; миграции и deploy-пути; исправлен fallback пустого diff.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Denozordec
2026-05-20 15:08:28 +07:00
co-authored by Cursor
parent 27864fad58
commit 87e756f34f
2 changed files with 77 additions and 39 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ Workflow: [workflows/ci.yaml](workflows/ci.yaml).
## CI (quality gates) ## CI (quality gates)
Job **changes** вычисляет флаги по путям в diff. Изменение `.gitea/workflows/*` поднимает полный прогон. Job **changes** вычисляет флаги по путям в diff. Полный прогон (все узлы openapi / web / go / bird2 в графе): `.gitea/workflows/*`, `scripts/*`, `.golangci.yml`, `.pre-commit-config.yaml`, корневой `package.json` / `.releaserc.json`. Отдельно: `migrations/*`, `docs/openapi.yaml``go` / `openapi` и т.д. (см. `ci.yaml`).
На **pull request****commitlint** (Conventional Commits). На **pull request****commitlint** (Conventional Commits).
+76 -38
View File
@@ -8,10 +8,9 @@ on:
jobs: jobs:
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Гранулярная детекция изменений по модулям. # Детекция изменений по модулям (флаги → downstream-джобы в графе CI).
# Каждый флаг соответствует группе файлов; downstream-джобы запускаются # Полный прогон (все флаги true): .gitea/workflows/*, scripts/*, .golangci.yml,
# только когда их группа затронута. Изменение CI-конфигурации (.gitea/workflows/*) # .pre-commit-config.yaml — чтобы при правках CI/CD пересобирались все узлы.
# поднимает все флаги, чтобы гарантировать полный прогон.
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
changes: changes:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -40,6 +39,23 @@ jobs:
docker_web=false docker_web=false
docker_bird=false docker_bird=false
# Все флаги true → openapi, web, go, bird2 (и release на main) в графе CI.
set_all_flags_true() {
openapi=true
go=true
web=true
bird_conf=true
docker_go=true
docker_web=true
docker_bird=true
}
write_outputs() {
for v in openapi go web bird_conf docker_go docker_web docker_bird; do
eval "echo \"\$v=\$$v\"" >> "$GITHUB_OUTPUT"
done
}
if [ "${{ github.event_name }}" = "pull_request" ]; then if [ "${{ github.event_name }}" = "pull_request" ]; then
base="${{ github.event.pull_request.base.sha }}" base="${{ github.event.pull_request.base.sha }}"
head="${{ github.event.pull_request.head.sha }}" head="${{ github.event.pull_request.head.sha }}"
@@ -52,62 +68,84 @@ jobs:
elif git rev-parse --verify HEAD~1 >/dev/null 2>&1; then elif git rev-parse --verify HEAD~1 >/dev/null 2>&1; then
FILES="$(git diff --name-only HEAD~1 HEAD)" FILES="$(git diff --name-only HEAD~1 HEAD)"
else else
openapi=true; go=true; web=true; bird_conf=true set_all_flags_true
docker_go=true; docker_web=true; docker_bird=true write_outputs
for v in openapi go web bird_conf docker_go docker_web docker_bird; do echo "No parent commit — full pipeline (all modules)"
echo "$v=true" >> "$GITHUB_OUTPUT"
done
echo "No parent commit — full pipeline"
exit 0 exit 0
fi fi
fi fi
if [ -z "$(printf '%s' "$FILES" | tr -d '[:space:]')" ]; then if [ -z "$(printf '%s' "$FILES" | tr -d '[:space:]')" ]; then
go=true; web=true set_all_flags_true
for v in openapi go web bird_conf docker_go docker_web docker_bird; do write_outputs
eval "echo \"\$v=\$$v\"" >> "$GITHUB_OUTPUT" echo "Empty diff — full pipeline fallback"
done
echo "Empty diff — safe fallback: go=true web=true"
exit 0 exit 0
fi fi
ci_changed=false full_pipeline=false
while IFS= read -r f || [ -n "${f:-}" ]; do while IFS= read -r f || [ -n "${f:-}" ]; do
[ -z "${f:-}" ] && continue [ -z "${f:-}" ] && continue
case "$f" in case "$f" in
.gitea/workflows/*) ci_changed=true ;; # CI/CD инфраструктура — все узлы quality gates
docs/openapi.yaml|redocly.yaml) openapi=true ;; .gitea/workflows/*|.golangci.yml|.pre-commit-config.yaml|scripts/*)
web/README.md) ;; # doc-only full_pipeline=true
web/*) web=true ;; ;;
deploy/bird/*) bird_conf=true ;; docs/openapi.yaml|redocly.yaml)
deploy/docker/bird/*) docker_bird=true; docker_go=true ;; openapi=true
deploy/docker/gobinary/*) docker_go=true ;; ;;
deploy/docker/docker-bake.hcl) docker_go=true; docker_web=true ;; docs/api.md|docs/access.md)
deploy/docker/evobgp-agent/*) docker_go=true ;; openapi=true
deploy/docker/evobgp-web/*) docker_web=true ;; go=true
deploy/docker/bird2/*) docker_bird=true ;; ;;
go.mod|go.sum|go.work) go=true ;; web/README.md|web/components.json)
migrations/*) go=true ;; ;;
*.go) go=true ;; web/*)
cmd/*|internal/*) go=true ;; web=true
;;
deploy/bird/*)
bird_conf=true
go=true
;;
deploy/compose/*|deploy/docker/*)
docker_go=true
docker_web=true
docker_bird=true
go=true
;;
go.mod|go.sum|go.work)
go=true
;;
migrations/*)
go=true
;;
cmd/*|internal/*|*.go)
go=true
bird_conf=true
;;
docs/*)
go=true
;;
package.json|package-lock.json|.releaserc.json)
full_pipeline=true
;;
*)
go=true
;;
esac esac
done <<< "$FILES" done <<< "$FILES"
if $ci_changed; then if $full_pipeline; then
go=true; web=true; bird_conf=true set_all_flags_true
docker_go=true; docker_web=true; docker_bird=true
fi fi
for v in openapi go web bird_conf docker_go docker_web docker_bird; do write_outputs
eval "echo \"\$v=\$$v\"" >> "$GITHUB_OUTPUT"
done
echo "Changed files (first 30):" echo "Changed files (first 30):"
printf '%s\n' "$FILES" | head -n 30 printf '%s\n' "$FILES" | head -n 30
echo "--- flags ---" echo "--- flags ---"
echo "openapi=$openapi go=$go web=$web bird_conf=$bird_conf" echo "openapi=$openapi go=$go web=$web bird_conf=$bird_conf"
echo "docker_go=$docker_go docker_web=$docker_web docker_bird=$docker_bird ci=$ci_changed" echo "docker_go=$docker_go docker_web=$docker_web docker_bird=$docker_bird full_pipeline=$full_pipeline"
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
openapi: openapi: