docs(hybrid): 완벽 가이드 확장 — 폐쇄망 VPC 엔드포인트·업그레이드·관측성·GPU 폴백 4개 챕터 신설 KO+EN #269
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
| name: Link Checker | |
| on: | |
| # Trigger on pushes to main that affect documentation | |
| push: | |
| branches: | |
| - main | |
| paths: | |
| - 'docs/**' | |
| - '*.md' | |
| - '.github/workflows/link-check.yml' | |
| # Trigger on pull requests targeting main | |
| pull_request: | |
| branches: | |
| - main | |
| # Weekly scheduled check (every Monday at 9:00 AM UTC) | |
| schedule: | |
| - cron: '0 9 * * 1' | |
| # Allow manual workflow dispatch | |
| workflow_dispatch: | |
| jobs: | |
| link-check: | |
| name: Check Links | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Restore lychee cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: .lycheecache | |
| key: cache-lychee-${{ github.sha }} | |
| restore-keys: cache-lychee- | |
| - name: Create lychee configuration | |
| run: | | |
| cat > .lychee.toml << 'EOF' | |
| # Maximum number of concurrent network requests | |
| max_concurrency = 10 | |
| # Request timeout in seconds | |
| timeout = 30 | |
| # Number of retries for failed requests | |
| max_retries = 3 | |
| # Delay between retries in seconds | |
| retry_wait_time = 2 | |
| # Accept these HTTP status codes as valid | |
| accept = [200, 301, 302] | |
| # Check links with these schemes | |
| scheme = ["https", "http"] | |
| # Exclude these URLs from checking | |
| exclude = [ | |
| # Examples and placeholders | |
| 'https?://example\\.com.*', | |
| 'https?://.*\\.example\\.com.*', | |
| 'http://localhost.*', | |
| 'https?://127\\.0\\.0\\.1.*', | |
| # Common problematic domains (block automated requests) | |
| 'https?://.*linkedin\\.com.*', | |
| 'https?://.*facebook\\.com.*', | |
| 'https?://.*twitter\\.com.*', | |
| 'https?://.*x\\.com.*', | |
| # Domains with intermittent SSL/connection issues in CI | |
| 'https?://netflixtechblog\\.com.*', | |
| 'https?://keda\\.sh/?$', | |
| # Domains that block automated requests (bot protection) | |
| 'https?://milvus\\.io.*', | |
| 'https?://medium\\.com.*', | |
| 'https?://.*\\.medium\\.com.*', | |
| 'https?://.*eksworkshop\\.com.*', | |
| # Documentation placeholders | |
| 'https?://your-.*', | |
| 'https?://.*your-org.*', | |
| 'https?://.*yourdomain.*', | |
| 'https?://.*\\.local.*', | |
| # Common CI/CD variables | |
| 'https?://\\$\\{.*\\}.*', | |
| 'https?://%.*%.*', | |
| ] | |
| # Exclude links with these patterns | |
| exclude_path = [ | |
| '.git', | |
| 'node_modules', | |
| 'vendor', | |
| '.github/workflows', | |
| 'SUMMARY.md', | |
| ] | |
| # Check anchors/fragments | |
| include_fragments = true | |
| # Follow redirects | |
| max_redirects = 5 | |
| # User agent string | |
| user_agent = "Mozilla/5.0 (compatible; LinkChecker/1.0; +https://github.com/lycheeverse/lychee)" | |
| # HTTP headers to send with requests | |
| [headers] | |
| "Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" | |
| EOF | |
| - name: Run lychee link checker | |
| uses: lycheeverse/lychee-action@v2 | |
| with: | |
| # Check external URLs only (Docusaurus build validates internal links) | |
| # Note: lychee cannot resolve Docusaurus-specific routing (extensionless | |
| # paths, /img/ -> static/img/), so local link errors are expected. | |
| args: >- | |
| --verbose | |
| --no-progress | |
| --cache | |
| --max-cache-age 1d | |
| --root-dir '${{ github.workspace }}' | |
| --include 'https?://.*' | |
| --exclude-path './.github' | |
| --exclude-path './node_modules' | |
| --exclude-path './SUMMARY.md' | |
| --exclude 'https?://milvus\.io.*' | |
| --exclude 'https?://.*kubeflow\.org.*' | |
| --exclude 'https?://gateway-api\.sigs\.k8s\.io.*' | |
| --exclude 'https?://.*envoyproxy\.io.*' | |
| --exclude 'https?://netflixtechblog\.com.*' | |
| --exclude 'https?://aws\.amazon\.com/blogs/aws/investigate-and-remediate.*' | |
| --exclude 'https?://opentelemetry\.io.*' | |
| 'docs/**/*.md' | |
| 'docs/**/*.mdx' | |
| # Advisory only — Docusaurus build validates internal links | |
| fail: false | |
| # Output format | |
| format: markdown | |
| # Custom output file | |
| output: ./lychee-report.md | |
| env: | |
| # Add GitHub token for API rate limits | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Upload link check report | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: lychee-report | |
| path: lychee-report.md | |
| retention-days: 30 | |
| - name: Comment PR with results | |
| if: github.event_name == 'pull_request' && failure() | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const fs = require('fs'); | |
| let report = 'Link check failed. Please review the broken links.'; | |
| try { | |
| report = fs.readFileSync('./lychee-report.md', 'utf8'); | |
| } catch (err) { | |
| console.log('Could not read lychee report:', err.message); | |
| } | |
| github.rest.issues.createComment({ | |
| issue_number: context.issue.number, | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| body: `## 🔗 Link Check Results\n\n${report}` | |
| }); |