# Проверки на каждый push в main и на каждый PR (docs/ci-cd.md). name: ci on: push: branches: [main] pull_request: concurrency: group: ci-${{ github.ref }} cancel-in-progress: true env: GO_VERSION: "1.24" NODE_VERSION: "22" jobs: contract: name: contract (сгенерированный код совпадает с openapi.yaml) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: { go-version: "${{ env.GO_VERSION }}", cache-dependency-path: services/api/go.sum } - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: { node-version: "${{ env.NODE_VERSION }}", cache: pnpm } - run: pnpm install --frozen-lockfile - name: Регенерация Go-сервера, TS-клиента и дизайн-токенов run: | (cd services/api && go generate ./...) pnpm generate - name: Проверка, что всё закоммичено # status, а не diff: diff не видит новые неотслеживаемые файлы run: | changes="$(git status --porcelain -- services/api/internal/api/gen packages)" if [ -n "$changes" ]; then echo "$changes"; git diff -- services/api/internal/api/gen packages; exit 1; fi api: runs-on: ubuntu-latest defaults: { run: { working-directory: services/api } } steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: { go-version: "${{ env.GO_VERSION }}", cache-dependency-path: services/api/go.sum } - run: test -z "$(gofmt -l .)" || (gofmt -l . && exit 1) - run: go vet ./... - run: go test -race -coverprofile=coverage.out ./... - run: go build ./cmd/... recommender: runs-on: ubuntu-latest defaults: { run: { working-directory: services/recommender } } steps: - uses: actions/checkout@v4 - uses: astral-sh/setup-uv@v6 with: { version: "0.10.2", enable-cache: true, cache-dependency-glob: services/recommender/uv.lock } - run: uv sync --frozen - run: uv run ruff check . - run: uv run ruff format --check . - run: uv run mypy pipu_rec - run: uv run pytest -q ts: name: ts (packages + web) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: { node-version: "${{ env.NODE_VERSION }}", cache: pnpm } - run: pnpm install --frozen-lockfile - run: pnpm i18n:check - run: pnpm test:scripts - run: pnpm typecheck - run: pnpm test - run: pnpm --filter @pipu/web build docker: name: docker (образы собираются — их сервер собирает сам при обновлении) runs-on: ubuntu-latest strategy: matrix: include: - { name: api, dockerfile: services/api/Dockerfile, target: api } - { name: storage-agent, dockerfile: services/api/Dockerfile, target: storage-agent } - { name: recommender, dockerfile: services/recommender/Dockerfile, target: "" } - { name: web, dockerfile: apps/web/Dockerfile, target: "" } steps: - uses: actions/checkout@v4 - uses: docker/setup-buildx-action@v3 - uses: docker/build-push-action@v6 with: context: . file: ${{ matrix.dockerfile }} target: ${{ matrix.target }} push: false build-args: VERSION=ci mobile: name: mobile (Metro-бандл Android) runs-on: ubuntu-latest defaults: { run: { working-directory: apps/mobile } } steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: { node-version: "${{ env.NODE_VERSION }}", cache: pnpm } - run: pnpm install --frozen-lockfile - run: npx expo-doctor - run: npx expo export --platform android --output-dir dist