Skip to content
Merged
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
3 changes: 3 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Проверить режимы container workflow
shell: pwsh
run: ./scripts/check-workflows.ps1
- name: Проверить GitHub Actions
run: docker run --rm -v "$GITHUB_WORKSPACE:/repo" -w /repo rhysd/actionlint:1.7.12 -color
docs:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/reusable-container.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ jobs:
push: ${{ github.event_name != 'pull_request' }}
tags: ghcr.io/${{ github.repository_owner }}/${{ inputs.image-name }}:${{ github.sha }}
load: ${{ github.event_name == 'pull_request' }}
provenance: mode=max
sbom: true
provenance: ${{ github.event_name == 'pull_request' && 'false' || 'mode=max' }}
sbom: ${{ github.event_name != 'pull_request' }}
- name: Проверить образ
if: github.event_name == 'pull_request'
uses: aquasecurity/trivy-action@v0.36.0
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

```powershell
pwsh ./scripts/check-docs.ps1
pwsh ./scripts/check-workflows.ps1
```

## Полезные ссылки
Expand Down
4 changes: 4 additions & 0 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ portable-agent/.github

Общий workflow не должен знать устройство бизнес-кода. Нужные отличия передаются через простые входные
параметры. Специальные правила остаются в репозитории сервиса.

Container workflow имеет два режима. В pull request образ загружается в локальный Docker для проверки
Trivy, поэтому SBOM и provenance не создаются. После изменения `main` образ публикуется в GHCR вместе с
SBOM, максимальным provenance, attestation и подписью Cosign.
1 change: 1 addition & 0 deletions docs/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

```powershell
pwsh ./scripts/check-docs.ps1
pwsh ./scripts/check-workflows.ps1
```

Новый общий workflow также проверяется в тестовом репозитории до обязательного включения для всех сервисов.
3 changes: 2 additions & 1 deletion docs/service-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

GitHub показывает workflow templates при создании Actions workflow. Для Java, Python и Node есть
отдельные короткие файлы, но результат одинаков: тесты, поиск секретов, Trivy, сборка контейнера,
SBOM, provenance и keyless-подпись Cosign.
В pull request образ проверяется локально через Trivy. При публикации из `main` добавляются SBOM,
provenance и keyless-подпись Cosign.

Папка `service-template` содержит обязательную документацию. `SERVICE.md` — быстрый индекс границ
сервиса. Он не генерируется из кода, потому что ответственность сервиса — архитектурное решение.
Expand Down
40 changes: 40 additions & 0 deletions scripts/check-workflows.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
$ErrorActionPreference = "Stop"

$workflow = Get-Content -LiteralPath ".github/workflows/reusable-container.yml" -Raw
$requiredLines = @(
'id-token: write',
'push: ${{ github.event_name != ''pull_request'' }}',
'load: ${{ github.event_name == ''pull_request'' }}',
'provenance: ${{ github.event_name == ''pull_request'' && ''false'' || ''mode=max'' }}',
'sbom: ${{ github.event_name != ''pull_request'' }}',
'uses: actions/attest-build-provenance@v4',
'push-to-registry: true',
'uses: sigstore/cosign-installer@v4.0.0',
'run: cosign sign --yes "${IMAGE}@${DIGEST}"'
)

foreach ($line in $requiredLines) {
if (-not $workflow.Contains($line)) {
throw "В reusable-container.yml нет ожидаемого правила: $line"
}
}

$publishSteps = @(
"Аттестовать образ",
"Установить Cosign",
"Подписать образ через GitHub OIDC"
)

foreach ($stepName in $publishSteps) {
$escapedName = [regex]::Escape($stepName)
$stepPattern = "(?ms)^\s{6}- name: $escapedName\r?\n(?:(?!^\s{6}- name: ).)*"
$step = [regex]::Match($workflow, $stepPattern)
if (-not $step.Success) {
throw "В reusable-container.yml нет шага: $stepName"
}
if (-not $step.Value.Contains("if: github.event_name != 'pull_request'")) {
throw "Шаг '$stepName' не должен выполняться в pull request."
}
}

Write-Host "Режимы container workflow настроены корректно."
Loading