chore(instructions): remove outdated instruction files #53
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # file: .github/workflows/ci.yml | ||
| # version: 1.18.4 | ||
| # guid: f1a2b3c4-d5e6-f7a8-b9c0-d1e2f3a4b5c6 | ||
| name: Continuous Integration | ||
| on: | ||
| push: | ||
| branches: [main, master] | ||
| pull_request: | ||
| branches: [main, master] | ||
| schedule: | ||
| - cron: "0 0 * * 0" # Weekly on Sunday | ||
| workflow_dispatch: | ||
| concurrency: | ||
| group: ${{ github.workflow }}-${{ github.ref }} | ||
| cancel-in-progress: true | ||
| env: | ||
| GO_VERSION: "1.24" | ||
| NODE_VERSION: "22" | ||
| PYTHON_VERSION: "3.13" | ||
| RUST_VERSION: "1.76" | ||
| COVERAGE_THRESHOLD: "80" | ||
| CACHE_VERSION: "v1" | ||
| # GitHub context variables (for security) | ||
| GITHUB_WORKFLOW: ${{ github.workflow }} | ||
| GITHUB_REF: ${{ github.ref }} | ||
| GITHUB_EVENT_NAME: ${{ github.event_name }} | ||
| GITHUB_REPOSITORY_DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} | ||
| GITHUB_HEAD_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} | ||
| permissions: | ||
| contents: write | ||
| actions: write | ||
| checks: write | ||
| packages: write | ||
| security-events: write | ||
| id-token: write | ||
| attestations: write | ||
| jobs: | ||
| # Check for commit override flags | ||
| check-overrides: | ||
| name: Check Commit Overrides | ||
| uses: jdfalk/ghcommon/.github/workflows/commit-override-handler.yml@bc6380dd1cfb1a3b8eb24c27d6cfe4a887562b5b # main | ||
| # Detect what files changed to optimize workflow execution | ||
| detect-changes: | ||
| name: Detect Changes | ||
| runs-on: ubuntu-latest | ||
| outputs: | ||
| gofiles: ${{ steps.filter.outputs.gofiles }} | ||
| frontendfiles: ${{ steps.filter.outputs.frontendfiles }} | ||
| pythonfiles: ${{ steps.filter.outputs.pythonfiles }} | ||
| rustfiles: ${{ steps.filter.outputs.rustfiles }} | ||
| dockerfiles: ${{ steps.filter.outputs.dockerfiles }} | ||
| docsfiles: ${{ steps.filter.outputs.docsfiles }} | ||
| workflowfiles: ${{ steps.filter.outputs.workflowfiles }} | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| with: | ||
| fetch-depth: 0 | ||
| - name: Check file changes | ||
| uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 | ||
| id: filter | ||
| with: | ||
| filters: | | ||
| gofiles: | ||
| - '**/*.go' | ||
| - 'go.mod' | ||
| - 'go.sum' | ||
| - '**/go.mod' | ||
| - '**/go.sum' | ||
| frontendfiles: | ||
| - 'webui/**/*.js' | ||
| - 'webui/**/*.jsx' | ||
| - 'webui/**/*.ts' | ||
| - 'webui/**/*.tsx' | ||
| - 'webui/**/*.vue' | ||
| - 'webui/**/*.html' | ||
| - 'webui/**/*.css' | ||
| - 'webui/**/*.scss' | ||
| - 'webui/**/*.sass' | ||
| - 'webui/**/*.less' | ||
| - 'frontend/**/*.js' | ||
| - 'frontend/**/*.jsx' | ||
| - 'frontend/**/*.ts' | ||
| - 'frontend/**/*.tsx' | ||
| - 'frontend/**/*.vue' | ||
| - 'frontend/**/*.html' | ||
| - 'frontend/**/*.css' | ||
| - 'frontend/**/*.scss' | ||
| - 'frontend/**/*.sass' | ||
| - 'frontend/**/*.less' | ||
| - 'ui/**/*.js' | ||
| - 'ui/**/*.jsx' | ||
| - 'ui/**/*.ts' | ||
| - 'ui/**/*.tsx' | ||
| - 'ui/**/*.vue' | ||
| - 'ui/**/*.html' | ||
| - 'ui/**/*.css' | ||
| - 'ui/**/*.scss' | ||
| - 'ui/**/*.sass' | ||
| - 'ui/**/*.less' | ||
| - 'webui/package.json' | ||
| - 'webui/package-lock.json' | ||
| - 'webui/yarn.lock' | ||
| - 'webui/pnpm-lock.yaml' | ||
| - 'frontend/package.json' | ||
| - 'frontend/package-lock.json' | ||
| - 'frontend/yarn.lock' | ||
| - 'frontend/pnpm-lock.yaml' | ||
| - 'ui/package.json' | ||
| - 'ui/package-lock.json' | ||
| - 'ui/yarn.lock' | ||
| - 'ui/pnpm-lock.yaml' | ||
| pythonfiles: | ||
| - '**/*.py' | ||
| - 'requirements.txt' | ||
| - 'pyproject.toml' | ||
| - 'setup.py' | ||
| - 'setup.cfg' | ||
| - 'Pipfile' | ||
| - 'poetry.lock' | ||
| - '**/requirements.txt' | ||
| - '**/pyproject.toml' | ||
| - '**/setup.py' | ||
| - '**/setup.cfg' | ||
| - '**/Pipfile' | ||
| - '**/poetry.lock' | ||
| rustfiles: | ||
| - '**/*.rs' | ||
| - 'Cargo.toml' | ||
| - 'Cargo.lock' | ||
| - '**/Cargo.toml' | ||
| - '**/Cargo.lock' | ||
| dockerfiles: | ||
| - '**/Dockerfile*' | ||
| - '**/*.dockerfile' | ||
| - 'docker-compose*.yml' | ||
| - 'docker-compose*.yaml' | ||
| - '.dockerignore' | ||
| docsfiles: | ||
| - '**/*.md' | ||
| - '**/*.rst' | ||
| - '**/*.txt' | ||
| - 'docs/**' | ||
| - '.github/**/*.md' | ||
| workflowfiles: | ||
| - '.github/workflows/**' | ||
| - '.github/actions/**' | ||
| - name: Debug outputs | ||
| run: | | ||
| echo "Go files changed: ${{ steps.filter.outputs.gofiles }}" | ||
| echo "Frontend files changed: ${{ steps.filter.outputs.frontendfiles }}" | ||
| echo "Python files changed: ${{ steps.filter.outputs.pythonfiles }}" | ||
| echo "Rust files changed: ${{ steps.filter.outputs.rustfiles }}" | ||
| echo "Docker files changed: ${{ steps.filter.outputs.dockerfiles }}" | ||
| echo "Docs files changed: ${{ steps.filter.outputs.docsfiles }}" | ||
| echo "Workflow files changed: ${{ steps.filter.outputs.workflowfiles }}" | ||
| - name: Determine workflow execution | ||
| id: execution | ||
| run: | | ||
| # Check if we should skip CI based on commit message | ||
| if [[ "$GITHUB_HEAD_COMMIT_MESSAGE" =~ \[skip\ ci\] ]] || [[ "$GITHUB_HEAD_COMMIT_MESSAGE" =~ \[ci\ skip\] ]]; then | ||
| echo "skip_ci=true" >> $GITHUB_OUTPUT | ||
| echo "Skipping CI due to commit message" | ||
| else | ||
| echo "skip_ci=false" >> $GITHUB_OUTPUT | ||
| fi | ||
| # Set execution flags | ||
| echo "should_lint=true" >> $GITHUB_OUTPUT | ||
| echo "should_test_go=${{ steps.filter.outputs.gofiles }}" >> $GITHUB_OUTPUT | ||
| echo "should_test_frontend=${{ steps.filter.outputs.frontendfiles }}" >> $GITHUB_OUTPUT | ||
| echo "should_test_python=${{ steps.filter.outputs.pythonfiles }}" >> $GITHUB_OUTPUT | ||
| echo "should_test_rust=${{ steps.filter.outputs.rustfiles }}" >> $GITHUB_OUTPUT | ||
| echo "should_test_docker=${{ steps.filter.outputs.dockerfiles }}" >> $GITHUB_OUTPUT | ||
| # Code quality and linting | ||
| lint: | ||
| name: Lint Code | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.detect-changes.outputs.workflowfiles == 'true' || needs.detect-changes.outputs.gofiles == 'true' || needs.detect-changes.outputs.frontendfiles == 'true' || needs.detect-changes.outputs.pythonfiles == 'true' || needs.detect-changes.outputs.rustfiles == 'true' || needs.detect-changes.outputs.docsfiles == 'true' | ||
| steps: | ||
| - name: Checkout Code | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| with: | ||
| fetch-depth: 0 | ||
| - name: Set up Go | ||
| if: needs.detect-changes.outputs.gofiles == 'true' | ||
| uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 | ||
| with: | ||
| go-version: ${{ env.GO_VERSION }} | ||
| cache: true | ||
| - name: Set up Node.js | ||
| if: needs.detect-changes.outputs.frontendfiles == 'true' | ||
| uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
| cache: npm | ||
| cache-dependency-path: | | ||
| **/package-lock.json | ||
| **/yarn.lock | ||
| **/pnpm-lock.yaml | ||
| - name: Set up Python | ||
| if: needs.detect-changes.outputs.pythonfiles == 'true' | ||
| uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 | ||
| with: | ||
| python-version: ${{ env.PYTHON_VERSION }} | ||
| cache: pip | ||
| cache-dependency-path: | | ||
| **/requirements.txt | ||
| **/pyproject.toml | ||
| - name: Ensure pip cache directory | ||
| if: needs.detect-changes.outputs.pythonfiles == 'true' | ||
| run: mkdir -p ~/.cache/pip | ||
| - name: Set up Rust | ||
| if: needs.detect-changes.outputs.rustfiles == 'true' | ||
| uses: dtolnay/rust-toolchain@4be9e76fd7c4901c61fb841f559994984270fce7 # stable | ||
| with: | ||
| toolchain: stable | ||
| components: rustfmt, clippy | ||
| - name: Wait for PR Automation (for PR events) | ||
| if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target' | ||
| run: | | ||
| echo "🔄 Waiting for PR automation to complete..." | ||
| # Wait up to 10 minutes for PR automation to complete | ||
| max_attempts=60 | ||
| attempt=0 | ||
| while [ $attempt -lt $max_attempts ]; do | ||
| # Check if PR automation workflow has completed | ||
| echo "Checking for PR automation completion (attempt $((attempt + 1))/$max_attempts)..." | ||
| # Use GitHub API to check if pr-automation workflow has completed | ||
| pr_automation_status=$(gh api repos/${{ github.repository }}/actions/runs \ | ||
| --jq '.workflow_runs[] | select(.head_sha == "${{ github.event.pull_request.head.sha || github.sha }}" and .name == "PR Automation") | .status' \ | ||
| | head -1) | ||
| if [ "$pr_automation_status" = "completed" ]; then | ||
| echo "✅ PR automation has completed, proceeding with CI" | ||
| break | ||
| elif [ -z "$pr_automation_status" ]; then | ||
| echo "ℹ️ No PR automation workflow found, proceeding with CI" | ||
| break | ||
| else | ||
| echo "⏳ PR automation status: $pr_automation_status, waiting..." | ||
| sleep 10 | ||
| attempt=$((attempt + 1)) | ||
| fi | ||
| done | ||
| if [ $attempt -ge $max_attempts ]; then | ||
| echo "⚠️ Timeout waiting for PR automation, proceeding with CI anyway" | ||
| fi | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| - name: Load CI Super Linter Configuration | ||
| id: super-linter-config | ||
| run: | | ||
| # Load environment variables from CI-specific config file | ||
| if [ -f .github/linters/super-linter-ci.env ]; then | ||
| echo "Loading CI Super Linter configuration from .github/linters/super-linter-ci.env" | ||
| # Export all variables from the env file to GitHub environment | ||
| while IFS='=' read -r key value; do | ||
| # Skip comments and empty lines | ||
| if [[ ! "$key" =~ ^[[:space:]]*# && -n "$key" ]]; then | ||
| # Remove any quotes and whitespace | ||
| key=$(echo "$key" | xargs) | ||
| value=$(echo "$value" | xargs) | ||
| # Export to GitHub environment for use in subsequent steps | ||
| echo "$key=$value" >> $GITHUB_ENV | ||
| fi | ||
| done < .github/linters/super-linter-ci.env | ||
| elif [ -f .github/linters/super-linter.env ]; then | ||
| echo "CI config not found, falling back to .github/linters/super-linter.env" | ||
| # Export all variables from the env file to GitHub environment | ||
| while IFS='=' read -r key value; do | ||
| # Skip comments and empty lines | ||
| if [[ ! "$key" =~ ^[[:space:]]*# && -n "$key" ]]; then | ||
| # Remove any quotes and whitespace | ||
| key=$(echo "$key" | xargs) | ||
| value=$(echo "$value" | xargs) | ||
| # Export to GitHub environment for use in subsequent steps | ||
| echo "$key=$value" >> $GITHUB_ENV | ||
| fi | ||
| done < .github/linters/super-linter.env | ||
| else | ||
| echo "Warning: No Super Linter configuration found" | ||
| fi | ||
| - name: Run Super Linter (Validation Only) | ||
| uses: super-linter/super-linter@ffde3b2b33b745cb612d787f669ef9442b1339a6 # v8.1.0 | ||
| env: | ||
| DEFAULT_BRANCH: ${{ env.GITHUB_REPOSITORY_DEFAULT_BRANCH }} | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| - name: Validation Summary | ||
| if: always() | ||
| run: | | ||
| echo "# 🔍 CI Validation Results" >> $GITHUB_STEP_SUMMARY | ||
| echo "" >> $GITHUB_STEP_SUMMARY | ||
| echo "✅ **Code validation completed**" >> $GITHUB_STEP_SUMMARY | ||
| echo "" >> $GITHUB_STEP_SUMMARY | ||
| echo "## Configuration" >> $GITHUB_STEP_SUMMARY | ||
| echo "- **Mode**: Validation only (no auto-fixes)" >> $GITHUB_STEP_SUMMARY | ||
| echo "- **Configuration**: super-linter-ci.env" >> $GITHUB_STEP_SUMMARY | ||
| echo "- **Event**: ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY | ||
| # Go testing | ||
| test-go: | ||
| name: Test Go | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.detect-changes.outputs.gofiles == 'true' && needs.check-overrides.outputs.skip-tests != 'true' | ||
| strategy: | ||
| matrix: | ||
| go-version: ["1.24"] | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| - name: Set up Go | ||
| uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 | ||
| with: | ||
| go-version: ${{ matrix.go-version }} | ||
| cache: true | ||
| - name: Download dependencies | ||
| run: go mod download | ||
| - name: Run tests | ||
| run: go test -v -race -coverprofile=coverage.out ./... | ||
| - name: Check coverage | ||
| run: | | ||
| go tool cover -html=coverage.out -o coverage.html | ||
| coverage=$(go tool cover -func=coverage.out | grep total | awk '{print substr($3, 1, length($3)-1)}') | ||
| echo "Coverage: ${coverage}%" | ||
| if (( $(echo "${coverage} < ${{ env.COVERAGE_THRESHOLD }}" | bc -l) )); then | ||
| echo "❌ Coverage ${coverage}% is below threshold ${{ env.COVERAGE_THRESHOLD }}%" | ||
| exit 1 | ||
| else | ||
| echo "✅ Coverage ${coverage}% meets threshold ${{ env.COVERAGE_THRESHOLD }}%" | ||
| fi | ||
| - name: Upload coverage reports | ||
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 | ||
| with: | ||
| name: go-coverage-${{ matrix.go-version }} | ||
| path: | | ||
| coverage.out | ||
| coverage.html | ||
| # Frontend testing | ||
| test-frontend: | ||
| name: Test Frontend | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.detect-changes.outputs.frontendfiles == 'true' && needs.check-overrides.outputs.skip-tests != 'true' | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| - name: Set up Node.js | ||
| uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 | ||
| with: | ||
| node-version: ${{ env.NODE_VERSION }} | ||
| cache: npm | ||
| - name: Install dependencies | ||
| run: | | ||
| if [ -f package-lock.json ]; then | ||
| npm ci | ||
| elif [ -f yarn.lock ]; then | ||
| yarn install --frozen-lockfile | ||
| elif [ -f pnpm-lock.yaml ]; then | ||
| npm install -g pnpm | ||
| pnpm install --frozen-lockfile | ||
| else | ||
| npm install | ||
| fi | ||
| - name: Run linting | ||
| run: | | ||
| if npm run lint --if-present; then | ||
| echo "✅ Linting passed" | ||
| else | ||
| echo "❌ Linting failed or not configured" | ||
| fi | ||
| - name: Run tests | ||
| run: | | ||
| if npm run test --if-present; then | ||
| echo "✅ Tests passed" | ||
| else | ||
| echo "ℹ️ No tests configured" | ||
| fi | ||
| - name: Build project | ||
| run: | | ||
| if npm run build --if-present; then | ||
| echo "✅ Build successful" | ||
| else | ||
| echo "ℹ️ No build script configured" | ||
| fi | ||
| # Python testing | ||
| test-python: | ||
| name: Test Python | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.detect-changes.outputs.pythonfiles == 'true' && needs.check-overrides.outputs.skip-tests != 'true' | ||
| strategy: | ||
| matrix: | ||
| python-version: ["3.13"] | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| - name: Set up Python | ||
| uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 | ||
| with: | ||
| python-version: ${{ matrix.python-version }} | ||
| cache: pip | ||
| - name: Ensure pip cache directory | ||
| run: mkdir -p ~/.cache/pip | ||
| - name: Install dependencies | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| if [ -f requirements.txt ]; then | ||
| pip install -r requirements.txt | ||
| fi | ||
| if [ -f pyproject.toml ]; then | ||
| pip install -e . | ||
| fi | ||
| pip install pytest pytest-cov | ||
| - name: Run tests | ||
| run: | | ||
| if find . -name "test_*.py" -o -name "*_test.py" | head -1 | grep -q .; then | ||
| python -m pytest --cov=. --cov-report=xml --cov-report=html | ||
| else | ||
| echo "ℹ️ No Python tests found" | ||
| fi | ||
| - name: Upload coverage reports | ||
| if: matrix.python-version == '3.12' | ||
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 | ||
| with: | ||
| name: python-coverage | ||
| path: | | ||
| coverage.xml | ||
| htmlcov/ | ||
| # Rust testing | ||
| test-rust: | ||
| name: Test Rust | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.detect-changes.outputs.rustfiles == 'true' && needs.check-overrides.outputs.skip-tests != 'true' | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| - name: Set up Rust | ||
| uses: dtolnay/rust-toolchain@4be9e76fd7c4901c61fb841f559994984270fce7 # stable | ||
| with: | ||
| toolchain: stable | ||
| components: rustfmt, clippy | ||
| - name: Cache Rust dependencies | ||
| uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 | ||
| with: | ||
| path: | | ||
| ~/.cargo/bin/ | ||
| ~/.cargo/registry/index/ | ||
| ~/.cargo/registry/cache/ | ||
| ~/.cargo/git/db/ | ||
| target/ | ||
| key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} | ||
| - name: Run clippy | ||
| run: cargo clippy -- -D warnings | ||
| - name: Run tests | ||
| run: cargo test --verbose | ||
| - name: Check formatting | ||
| run: cargo fmt -- --check | ||
| # Release build for multi-platform testing and artifacts | ||
| release-build: | ||
| name: Release Build | ||
| uses: ./.github/workflows/release.yml | ||
|
Check failure on line 518 in .github/workflows/ci.yml
|
||
| needs: [detect-changes, check-overrides] | ||
| if: needs.check-overrides.outputs.skip-tests != 'true' | ||
| with: | ||
| release_type: auto | ||
| build_target: all | ||
| prerelease: true | ||
| draft: true | ||
| # Docker testing | ||
| test-docker: | ||
| name: Test Docker | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.detect-changes.outputs.dockerfiles == 'true' && needs.check-overrides.outputs.skip-tests != 'true' | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| - name: Set up Docker Buildx | ||
| uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 | ||
| - name: Build Docker image | ||
| run: | | ||
| if [ -f Dockerfile ]; then | ||
| docker build -t test-image . | ||
| else | ||
| echo "ℹ️ No Dockerfile found" | ||
| fi | ||
| - name: Test Docker Compose | ||
| run: | | ||
| if [ -f docker-compose.yml ] || [ -f docker-compose.yaml ]; then | ||
| docker-compose config | ||
| else | ||
| echo "ℹ️ No docker-compose file found" | ||
| fi | ||
| # Documentation testing | ||
| test-docs: | ||
| name: Test Documentation | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.detect-changes.outputs.docsfiles == 'true' && needs.check-overrides.outputs.skip-tests != 'true' | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| - name: Check links in documentation | ||
| run: | | ||
| echo "ℹ️ Link checking would go here" | ||
| # Add link checking logic here | ||
| - name: Validate documentation structure | ||
| run: | | ||
| echo "ℹ️ Documentation structure validation would go here" | ||
| # Add documentation validation logic here | ||
| # Security scanning | ||
| security-scan: | ||
| name: Security Scan | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.check-overrides.outputs.skip-tests != 'true' | ||
| permissions: | ||
| security-events: write | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| - name: Run CodeQL Analysis | ||
| uses: github/codeql-action/analyze@4bdb89f48054571735e3792627da6195c57459e2 # v3.31.10 | ||
| continue-on-error: true | ||
| # Performance testing | ||
| performance-test: | ||
| name: Performance Test | ||
| runs-on: ubuntu-latest | ||
| needs: [detect-changes, check-overrides] | ||
| if: needs.detect-changes.outputs.gofiles == 'true' && needs.check-overrides.outputs.skip-tests != 'true' | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | ||
| - name: Set up Go | ||
| uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 | ||
| with: | ||
| go-version: ${{ env.GO_VERSION }} | ||
| cache: true | ||
| - name: Run benchmarks | ||
| run: | | ||
| if find . -name "*_test.go" -exec grep -l "Benchmark" {} \; | head -1 | grep -q .; then | ||
| go test -bench=. -benchmem ./... | ||
| else | ||
| echo "ℹ️ No benchmarks found" | ||
| fi | ||
| # Summary job | ||
| ci-summary: | ||
| name: CI Summary | ||
| runs-on: ubuntu-latest | ||
| needs: | ||
| [ | ||
| detect-changes, | ||
| check-overrides, | ||
| lint, | ||
| test-go, | ||
| test-frontend, | ||
| test-python, | ||
| test-rust, | ||
| test-docker, | ||
| test-docs, | ||
| release-build, | ||
| security-scan, | ||
| performance-test, | ||
| ] | ||
| if: always() | ||
| steps: | ||
| - name: Generate summary | ||
| run: | | ||
| echo "# 🚀 CI Pipeline Summary" >> $GITHUB_STEP_SUMMARY | ||
| echo "" >> $GITHUB_STEP_SUMMARY | ||
| echo "## 📊 Job Results" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Job | Status |" >> $GITHUB_STEP_SUMMARY | ||
| echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Detect Changes | ${{ needs.detect-changes.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Check Overrides | ${{ needs.check-overrides.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Lint | ${{ needs.lint.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Test Go | ${{ needs.test-go.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Test Frontend | ${{ needs.test-frontend.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Test Python | ${{ needs.test-python.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Test Rust | ${{ needs.test-rust.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Test Docker | ${{ needs.test-docker.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Test Docs | ${{ needs.test-docs.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Release Build | ${{ needs.release-build.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Security Scan | ${{ needs.security-scan.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "| Performance Test | ${{ needs.performance-test.result }} |" >> $GITHUB_STEP_SUMMARY | ||
| echo "" >> $GITHUB_STEP_SUMMARY | ||
| echo "## 📁 Changed Files" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Go: ${{ needs.detect-changes.outputs.gofiles }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Frontend: ${{ needs.detect-changes.outputs.frontendfiles }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Python: ${{ needs.detect-changes.outputs.pythonfiles }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Rust: ${{ needs.detect-changes.outputs.rustfiles }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Docker: ${{ needs.detect-changes.outputs.dockerfiles }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Docs: ${{ needs.detect-changes.outputs.docsfiles }}" >> $GITHUB_STEP_SUMMARY | ||
| echo "- Workflows: ${{ needs.detect-changes.outputs.workflowfiles }}" >> $GITHUB_STEP_SUMMARY | ||
| - name: Check overall status | ||
| run: | | ||
| if [[ "${{ needs.lint.result }}" == "failure" ]] || | ||
| [[ "${{ needs.test-go.result }}" == "failure" ]] || | ||
| [[ "${{ needs.test-frontend.result }}" == "failure" ]] || | ||
| [[ "${{ needs.test-python.result }}" == "failure" ]] || | ||
| [[ "${{ needs.test-rust.result }}" == "failure" ]] || | ||
| [[ "${{ needs.test-docker.result }}" == "failure" ]] || | ||
| [[ "${{ needs.release-build.result }}" == "failure" ]]; then | ||
| echo "❌ CI Pipeline failed" | ||
| exit 1 | ||
| else | ||
| echo "✅ CI Pipeline succeeded" | ||
| fi | ||