diff --git a/.gitea/README.md b/.gitea/README.md index db15721..1b7789a 100644 --- a/.gitea/README.md +++ b/.gitea/README.md @@ -12,7 +12,7 @@ Workflow: [workflows/ci.yaml](workflows/ci.yaml). ## 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). diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 1074aa7..3e160f2 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -8,10 +8,9 @@ on: jobs: # --------------------------------------------------------------------------- - # Гранулярная детекция изменений по модулям. - # Каждый флаг соответствует группе файлов; downstream-джобы запускаются - # только когда их группа затронута. Изменение CI-конфигурации (.gitea/workflows/*) - # поднимает все флаги, чтобы гарантировать полный прогон. + # Детекция изменений по модулям (флаги → downstream-джобы в графе CI). + # Полный прогон (все флаги true): .gitea/workflows/*, scripts/*, .golangci.yml, + # .pre-commit-config.yaml — чтобы при правках CI/CD пересобирались все узлы. # --------------------------------------------------------------------------- changes: runs-on: ubuntu-latest @@ -40,6 +39,23 @@ jobs: docker_web=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 base="${{ github.event.pull_request.base.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 FILES="$(git diff --name-only HEAD~1 HEAD)" else - openapi=true; go=true; web=true; bird_conf=true - docker_go=true; docker_web=true; docker_bird=true - for v in openapi go web bird_conf docker_go docker_web docker_bird; do - echo "$v=true" >> "$GITHUB_OUTPUT" - done - echo "No parent commit — full pipeline" + set_all_flags_true + write_outputs + echo "No parent commit — full pipeline (all modules)" exit 0 fi fi if [ -z "$(printf '%s' "$FILES" | tr -d '[:space:]')" ]; then - go=true; web=true - for v in openapi go web bird_conf docker_go docker_web docker_bird; do - eval "echo \"\$v=\$$v\"" >> "$GITHUB_OUTPUT" - done - echo "Empty diff — safe fallback: go=true web=true" + set_all_flags_true + write_outputs + echo "Empty diff — full pipeline fallback" exit 0 fi - ci_changed=false + full_pipeline=false while IFS= read -r f || [ -n "${f:-}" ]; do [ -z "${f:-}" ] && continue case "$f" in - .gitea/workflows/*) ci_changed=true ;; - docs/openapi.yaml|redocly.yaml) openapi=true ;; - web/README.md) ;; # doc-only - web/*) web=true ;; - deploy/bird/*) bird_conf=true ;; - deploy/docker/bird/*) docker_bird=true; docker_go=true ;; - deploy/docker/gobinary/*) docker_go=true ;; - deploy/docker/docker-bake.hcl) docker_go=true; docker_web=true ;; - deploy/docker/evobgp-agent/*) docker_go=true ;; - deploy/docker/evobgp-web/*) docker_web=true ;; - deploy/docker/bird2/*) docker_bird=true ;; - go.mod|go.sum|go.work) go=true ;; - migrations/*) go=true ;; - *.go) go=true ;; - cmd/*|internal/*) go=true ;; + # CI/CD инфраструктура — все узлы quality gates + .gitea/workflows/*|.golangci.yml|.pre-commit-config.yaml|scripts/*) + full_pipeline=true + ;; + docs/openapi.yaml|redocly.yaml) + openapi=true + ;; + docs/api.md|docs/access.md) + openapi=true + go=true + ;; + web/README.md|web/components.json) + ;; + web/*) + 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 done <<< "$FILES" - if $ci_changed; then - go=true; web=true; bird_conf=true - docker_go=true; docker_web=true; docker_bird=true + if $full_pipeline; then + set_all_flags_true fi - for v in openapi go web bird_conf docker_go docker_web docker_bird; do - eval "echo \"\$v=\$$v\"" >> "$GITHUB_OUTPUT" - done + write_outputs echo "Changed files (first 30):" printf '%s\n' "$FILES" | head -n 30 echo "--- flags ---" 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: