From 2c8645c040b0c97389aa08d834e07a73ba71ae9b Mon Sep 17 00:00:00 2001 From: DanliaQwerty20 Date: Sun, 30 Aug 2026 16:22:09 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B1=D1=80=D0=B8=D0=BA=D1=83=20CI?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docs.yml | 7 +++++ .github/workflows/reusable-container.yml | 11 +++++++ .github/workflows/reusable-security.yml | 30 +++++++++++++++++++ .gitignore | 6 ++++ README.md | 4 +++ docs/service-template.md | 10 +++++++ mkdocs.yml | 1 + service-template/AGENTS.md | 6 ++++ service-template/CODEOWNERS | 3 ++ service-template/README.md | 23 ++++++++++++++ service-template/SERVICE.md | 14 +++++++++ .../java-service.properties.json | 2 ++ workflow-templates/java-service.yml | 23 ++++++++++++++ .../node-service.properties.json | 2 ++ workflow-templates/node-service.yml | 23 ++++++++++++++ .../python-service.properties.json | 2 ++ workflow-templates/python-service.yml | 23 ++++++++++++++ 17 files changed, 190 insertions(+) create mode 100644 .github/workflows/reusable-security.yml create mode 100644 .gitignore create mode 100644 docs/service-template.md create mode 100644 service-template/AGENTS.md create mode 100644 service-template/CODEOWNERS create mode 100644 service-template/README.md create mode 100644 service-template/SERVICE.md create mode 100644 workflow-templates/java-service.properties.json create mode 100644 workflow-templates/java-service.yml create mode 100644 workflow-templates/node-service.properties.json create mode 100644 workflow-templates/node-service.yml create mode 100644 workflow-templates/python-service.properties.json create mode 100644 workflow-templates/python-service.yml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ff921da..03d2974 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -9,5 +9,12 @@ permissions: contents: read jobs: + workflow: + name: Workflow syntax + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - name: Проверить GitHub Actions + run: docker run --rm -v "$GITHUB_WORKSPACE:/repo" -w /repo rhysd/actionlint:1.7.12 -color docs: uses: ./.github/workflows/reusable-docs.yml diff --git a/.github/workflows/reusable-container.yml b/.github/workflows/reusable-container.yml index e1750f2..9296fce 100644 --- a/.github/workflows/reusable-container.yml +++ b/.github/workflows/reusable-container.yml @@ -55,3 +55,14 @@ jobs: subject-name: ghcr.io/${{ github.repository_owner }}/${{ inputs.image-name }} subject-digest: ${{ steps.build.outputs.digest }} push-to-registry: true + - name: Установить Cosign + if: github.event_name != 'pull_request' + uses: sigstore/cosign-installer@v4.0.0 + with: + cosign-release: v3.1.3 + - name: Подписать образ через GitHub OIDC + if: github.event_name != 'pull_request' + env: + IMAGE: ghcr.io/${{ github.repository_owner }}/${{ inputs.image-name }} + DIGEST: ${{ steps.build.outputs.digest }} + run: cosign sign --yes "${IMAGE}@${DIGEST}" diff --git a/.github/workflows/reusable-security.yml b/.github/workflows/reusable-security.yml new file mode 100644 index 0000000..d449e55 --- /dev/null +++ b/.github/workflows/reusable-security.yml @@ -0,0 +1,30 @@ +name: Reusable security + +on: + workflow_call: + +permissions: + contents: read + +jobs: + security: + name: Security + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + - name: Найти случайно добавленные секреты + uses: gitleaks/gitleaks-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Проверить файлы и IaC + uses: aquasecurity/trivy-action@v0.36.0 + with: + scan-type: fs + scan-ref: . + scanners: vuln,secret,misconfig + severity: CRITICAL,HIGH + ignore-unfixed: true + exit-code: "1" + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f7e1e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea/ +.vscode/ +site/ +.tmp-site/ +*.log + diff --git a/README.md b/README.md index c2dd43e..bd1883d 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ - шаблоны issue и pull request; - общие CI/CD-процессы; - единые правила документации и проверки репозиториев. +- шаблоны CI для Java, Python и Node; +- каркас обязательной документации нового сервиса. Код сервисов здесь не хранится. Каждый сервис находится в своей репе. @@ -19,6 +21,8 @@ - `profile/README.md` — главная страница организации. - `docs/` — правила и устройство этого репозитория. - `scripts/check-docs.ps1` — простая проверка обязательной документации. +- `workflow-templates/` — короткие CI-шаблоны с test, security, SBOM и подписью. +- `service-template/` — README, карточка сервиса, CODEOWNERS и правила AI-агентов. ## Проверка diff --git a/docs/service-template.md b/docs/service-template.md new file mode 100644 index 0000000..5c12b35 --- /dev/null +++ b/docs/service-template.md @@ -0,0 +1,10 @@ +# Шаблон нового сервиса + +GitHub показывает workflow templates при создании Actions workflow. Для Java, Python и Node есть +отдельные короткие файлы, но результат одинаков: тесты, поиск секретов, Trivy, сборка контейнера, +SBOM, provenance и keyless-подпись Cosign. + +Папка `service-template` содержит обязательную документацию. `SERVICE.md` — быстрый индекс границ +сервиса. Он не генерируется из кода, потому что ответственность сервиса — архитектурное решение. +Технические API следует генерировать из OpenAPI и AsyncAPI отдельно. + diff --git a/mkdocs.yml b/mkdocs.yml index 0fdf0d9..3786937 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -6,6 +6,7 @@ nav: - Главная: index.md - Архитектура: architecture.md - Разработка: development.md + - Шаблон сервиса: service-template.md - Эксплуатация: runbook.md - Решения: - Документация как код: decisions/0001-docs-as-code.md diff --git a/service-template/AGENTS.md b/service-template/AGENTS.md new file mode 100644 index 0000000..9ad1869 --- /dev/null +++ b/service-template/AGENTS.md @@ -0,0 +1,6 @@ +# Правила для AI-агентов + +Сначала прочитай `SERVICE.md`, README и открытые ADR. Не меняй границы сервиса без нового ADR. +Пиши тест до поведения. Используй простые английские имена. Не храни секреты, настоящие данные и +адреса окружений. Обновляй `SERVICE.md`, контракт и runbook в том же pull request. + diff --git a/service-template/CODEOWNERS b/service-template/CODEOWNERS new file mode 100644 index 0000000..b9c47ca --- /dev/null +++ b/service-template/CODEOWNERS @@ -0,0 +1,3 @@ +* @portable-agent/backend +.github/ @portable-agent/platform + diff --git a/service-template/README.md b/service-template/README.md new file mode 100644 index 0000000..9e84e29 --- /dev/null +++ b/service-template/README.md @@ -0,0 +1,23 @@ +# Название сервиса + +Одним предложением: что сервис делает и чего он не делает. + +## Ответственность + +- принимает: укажи тип входа; +- возвращает: укажи результат; +- хранит: укажи свои данные; +- не отвечает за: укажи соседнюю область. + +## Локальный запуск + +Запиши одну команду запуска и одну команду всех проверок. + +## API и события + +Ссылки на OpenAPI/AsyncAPI. Изменение контракта сначала получает тест. + +## Зависимости + +Перечисли только прямые сервисы и инфраструктуру. Секреты и настоящие адреса не добавляй. + diff --git a/service-template/SERVICE.md b/service-template/SERVICE.md new file mode 100644 index 0000000..99121eb --- /dev/null +++ b/service-template/SERVICE.md @@ -0,0 +1,14 @@ +# Карточка сервиса + +Этот файл — короткая память для людей и AI-агентов. Обновляй его при изменении границ сервиса. + +| Поле | Значение | +|---|---| +| Ответственность | change-me | +| Владелец | portable-agent/change-me | +| Язык | change-me | +| Входящие контракты | change-me | +| Исходящие контракты | change-me | +| Свои данные | change-me | +| SLO | не определён до бизнес-обсуждения | + diff --git a/workflow-templates/java-service.properties.json b/workflow-templates/java-service.properties.json new file mode 100644 index 0000000..ce2e7d0 --- /dev/null +++ b/workflow-templates/java-service.properties.json @@ -0,0 +1,2 @@ +{"name":"Portable Agent Java service","description":"Тесты, security scan, container, SBOM и подпись для Java-сервиса.","iconName":"octicon package","categories":["Java"]} + diff --git a/workflow-templates/java-service.yml b/workflow-templates/java-service.yml new file mode 100644 index 0000000..0e38d43 --- /dev/null +++ b/workflow-templates/java-service.yml @@ -0,0 +1,23 @@ +name: CI +on: + pull_request: + push: + branches: [main] +permissions: + contents: read +jobs: + test: + uses: portable-agent/.github/.github/workflows/reusable-java.yml@main + security: + uses: portable-agent/.github/.github/workflows/reusable-security.yml@main + container: + needs: [test, security] + permissions: + contents: read + packages: write + id-token: write + attestations: write + uses: portable-agent/.github/.github/workflows/reusable-container.yml@main + with: + image-name: ${{ github.event.repository.name }} + diff --git a/workflow-templates/node-service.properties.json b/workflow-templates/node-service.properties.json new file mode 100644 index 0000000..a7a82fc --- /dev/null +++ b/workflow-templates/node-service.properties.json @@ -0,0 +1,2 @@ +{"name":"Portable Agent Node service","description":"Тесты, security scan, container, SBOM и подпись для Node-сервиса.","iconName":"octicon package","categories":["JavaScript","TypeScript"]} + diff --git a/workflow-templates/node-service.yml b/workflow-templates/node-service.yml new file mode 100644 index 0000000..7387741 --- /dev/null +++ b/workflow-templates/node-service.yml @@ -0,0 +1,23 @@ +name: CI +on: + pull_request: + push: + branches: [main] +permissions: + contents: read +jobs: + test: + uses: portable-agent/.github/.github/workflows/reusable-node.yml@main + security: + uses: portable-agent/.github/.github/workflows/reusable-security.yml@main + container: + needs: [test, security] + permissions: + contents: read + packages: write + id-token: write + attestations: write + uses: portable-agent/.github/.github/workflows/reusable-container.yml@main + with: + image-name: ${{ github.event.repository.name }} + diff --git a/workflow-templates/python-service.properties.json b/workflow-templates/python-service.properties.json new file mode 100644 index 0000000..6c8c87f --- /dev/null +++ b/workflow-templates/python-service.properties.json @@ -0,0 +1,2 @@ +{"name":"Portable Agent Python service","description":"Тесты, security scan, container, SBOM и подпись для Python-сервиса.","iconName":"octicon package","categories":["Python"]} + diff --git a/workflow-templates/python-service.yml b/workflow-templates/python-service.yml new file mode 100644 index 0000000..75c3291 --- /dev/null +++ b/workflow-templates/python-service.yml @@ -0,0 +1,23 @@ +name: CI +on: + pull_request: + push: + branches: [main] +permissions: + contents: read +jobs: + test: + uses: portable-agent/.github/.github/workflows/reusable-python.yml@main + security: + uses: portable-agent/.github/.github/workflows/reusable-security.yml@main + container: + needs: [test, security] + permissions: + contents: read + packages: write + id-token: write + attestations: write + uses: portable-agent/.github/.github/workflows/reusable-container.yml@main + with: + image-name: ${{ github.event.repository.name }} +