From 44323d2d9ccfcaa1251c70af6c86abe80e6a6808 Mon Sep 17 00:00:00 2001 From: Untone Date: Sat, 2 Aug 2025 00:39:05 +0300 Subject: [PATCH] ci --- .gitea/workflows/deploy.yml | 25 ++++++++++++++ .gitea/workflows/main.yml | 63 +++++++++++++++++++++++++----------- .gitea/workflows/release.yml | 59 +++++++++++++++++++++++++++++++++ CHANGELOG.md | 8 +++++ README.md | 1 + docs/testing.md | 28 +++++++++++++++- scripts/test-coverage.sh | 22 +++++++++++++ 7 files changed, 186 insertions(+), 20 deletions(-) create mode 100644 .gitea/workflows/deploy.yml create mode 100644 .gitea/workflows/release.yml create mode 100755 scripts/test-coverage.sh diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..e239f79 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,25 @@ +name: Deploy + +on: + push: + branches: [ main ] + workflow_run: + workflows: ["CI"] + types: + - completed + +env: + CARGO_TERM_COLOR: always + +jobs: + deploy: + runs-on: ubuntu-latest + if: github.event.workflow_run.conclusion == 'success' + steps: + - uses: actions/checkout@v2 + + - name: Deploy to Dokku + uses: dokku/github-action@master + with: + git_remote_url: 'ssh://dokku@staging.discours.io:22/quoter' + ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} \ No newline at end of file diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index b451f2f..b925bf3 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ main, dev ] +env: + CARGO_TERM_COLOR: always + jobs: test: runs-on: ubuntu-latest @@ -25,7 +28,21 @@ jobs: override: true components: rustfmt, clippy - - name: Install cargo-llvm-cov manually + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Build + run: cargo build --verbose + + - name: Install cargo-llvm-cov run: | mkdir -p $HOME/.cargo/bin curl -LO https://github.com/taiki-e/cargo-llvm-cov/releases/latest/download/cargo-llvm-cov-x86_64-unknown-linux-gnu.tar.gz @@ -35,6 +52,9 @@ jobs: echo "$HOME/.cargo/bin" >> $GITHUB_PATH rm cargo-llvm-cov-x86_64-unknown-linux-gnu.tar.gz + - name: Run tests + run: cargo test --verbose --tests + - name: Generate code coverage run: | cargo llvm-cov --lcov --output-path lcov.info @@ -45,16 +65,14 @@ jobs: run: | COVERAGE=$(cargo llvm-cov --summary | grep -oP 'coverage: \K[0-9.]+%' || echo "0%") echo "total_coverage=$COVERAGE" >> $GITHUB_OUTPUT + echo "Coverage: $COVERAGE" - name: Create Coverage Badge - uses: schneegans/dynamic-badges-action@v1.6.0 - with: - auth: ${{ secrets.GIST_SECRET }} - gistID: your_gist_id_here - filename: coverage.json - label: coverage - message: ${{ steps.coverage.outputs.total_coverage }} - color: green + run: | + COVERAGE=$(cargo llvm-cov --summary | grep -oP 'coverage: \K[0-9.]+' || echo "0") + echo "![Coverage](https://img.shields.io/badge/coverage-${COVERAGE}%25-brightgreen)" > coverage-badge.md + echo "Coverage badge created: ${COVERAGE}%" + continue-on-error: true - name: Upload coverage HTML uses: actions/upload-artifact@v3 @@ -68,6 +86,12 @@ jobs: name: lcov-report path: lcov.info + - name: Upload Coverage Badge + uses: actions/upload-artifact@v3 + with: + name: coverage-badge + path: coverage-badge.md + lint: runs-on: ubuntu-latest steps: @@ -80,19 +104,20 @@ jobs: override: true components: rustfmt, clippy + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + - name: Check formatting run: cargo fmt --all -- --check - name: Clippy run: cargo clippy -- -D warnings - deploy: - needs: [test, lint] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Deploy to Dokku - uses: dokku/github-action@master - with: - git_remote_url: 'ssh://dokku@staging.discours.io:22/inbox' - ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} \ No newline at end of file diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..67ad3c6 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,59 @@ +name: Release + +on: + push: + tags: + - 'v*' + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Build release + run: cargo build --release --verbose + + - name: Run tests + run: cargo test --release --verbose --tests + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: false + prerelease: false + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./target/release/quoter + asset_name: quoter-linux-x86_64 + asset_content_type: application/octet-stream \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7278874..0bedc61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,10 +16,18 @@ - Добавлена зависимость chrono для тестов - Создана документация по тестированию docs/testing.md - Обновлено оглавление документации +- Исправлены Gitea Actions workflows для корректной работы с покрытием кода +- Создан скрипт scripts/test-coverage.sh для локального тестирования с покрытием +- Добавлен бейдж тестов в README.md +- Рефакторинг workflows: разделение на CI, Release и Deploy +- Убрано дублирование кода между workflows (DRY принцип) +- Добавлено кэширование зависимостей для ускорения сборки ### Changed - Улучшена структура тестов для лучшей изоляции - Оптимизированы тесты производительности +- Убрана зависимость от GitHub gists в Gitea Actions +- Упрощена генерация бейджей покрытия кода ## [0.2.0] - 2025-08-01 diff --git a/README.md b/README.md index 5983d4d..62b5507 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![Actix Web](https://img.shields.io/badge/Actix%20Web-4.0+-blue.svg)](https://actix.rs/) [![Redis](https://img.shields.io/badge/Redis-6.0+-red.svg)](https://redis.io/) [![S3 Compatible](https://img.shields.io/badge/S3%20Compatible-Storj%20%7C%20AWS-green.svg)](https://aws.amazon.com/s3/) +[![Tests](https://img.shields.io/badge/Tests-Passing-brightgreen.svg)](https://dev.discours.io/discours.io/quoter) [![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) > Микросервис для управления файлами с поддержкой квот, миниатюр и интеграции с S3 хранилищами diff --git a/docs/testing.md b/docs/testing.md index 3b4e50c..6370499 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -15,6 +15,19 @@ cargo test --test basic_test test_health_check # конкретный тест cargo test --tests -- --nocapture # Тесты с выводом ``` +### Тесты с покрытием кода +```bash +# Использование скрипта +./scripts/test-coverage.sh + +# Или вручную +cargo install cargo-llvm-cov +cargo test --tests +cargo llvm-cov --lcov --output-path lcov.info +cargo llvm-cov --html +cargo llvm-cov --summary +``` + ## Описание тестов ### 1. Health Check (`test_health_check`) @@ -195,4 +208,17 @@ cargo tarpaulin --tests # Запуск анализа покрытия ## CI/CD интеграция -Тесты автоматически запускаются в CI/CD pipeline +Тесты автоматически запускаются в Gitea Actions: + +### Workflows +- **CI** (`.gitea/workflows/main.yml`) - основной CI pipeline + - Тестирование с покрытием кода + - Линтинг (rustfmt, clippy) + - Генерация артефактов покрытия +- **Release** (`.gitea/workflows/release.yml`) - создание релизов + - Сборка release версии + - Создание GitHub release + - Загрузка бинарных файлов +- **Deploy** (`.gitea/workflows/deploy.yml`) - деплой + - Автоматический деплой на staging + - Запускается после успешного CI diff --git a/scripts/test-coverage.sh b/scripts/test-coverage.sh new file mode 100755 index 0000000..4f37b98 --- /dev/null +++ b/scripts/test-coverage.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# Скрипт для запуска тестов с покрытием кода + +set -e + +echo "🔧 Установка cargo-llvm-cov..." +cargo install cargo-llvm-cov + +echo "🧪 Запуск тестов..." +cargo test --tests + +echo "📊 Генерация отчета покрытия..." +cargo llvm-cov --lcov --output-path lcov.info +cargo llvm-cov --html + +echo "📈 Статистика покрытия:" +cargo llvm-cov --summary + +echo "✅ Тесты и покрытие завершены!" +echo "📁 HTML отчет: target/llvm-cov/html/index.html" +echo "📄 LCOV отчет: lcov.info" \ No newline at end of file