docs-v2/DOCS-DEPLOYING.md

353 lines
8.5 KiB
Markdown

# Deploying InfluxData Documentation
This guide covers deploying the docs-v2 site to staging and production environments, as well as LLM markdown generation.
## Table of Contents
- [Staging Deployment](#staging-deployment)
- [Production Deployment](#production-deployment)
- [LLM Markdown Generation](#llm-markdown-generation)
- [Testing and Validation](#testing-and-validation)
- [Troubleshooting](#troubleshooting)
## Staging Deployment
Staging deployments are manual and run locally with your AWS credentials.
### Prerequisites
1. **AWS Credentials** - Configure AWS CLI with appropriate permissions:
```bash
aws configure
```
2. **s3deploy** - Install the s3deploy binary:
```bash
./deploy/ci-install-s3deploy.sh
```
3. **Environment Variables** - Set required variables:
```bash
export STAGING_BUCKET="test2.docs.influxdata.com"
export AWS_REGION="us-east-1"
export STAGING_CF_DISTRIBUTION_ID="E1XXXXXXXXXX" # Optional
```
### Deploy to Staging
Use the staging deployment script:
```bash
yarn deploy:staging
```
Or run the script directly:
```bash
./scripts/deploy-staging.sh
```
### What the Script Does
1. **Builds Hugo site** with staging configuration (`config/staging/hugo.yml`)
2. **Generates LLM-friendly Markdown** (`yarn build:md`)
3. **Uploads to S3** using s3deploy
4. **Invalidates CloudFront cache** (if `STAGING_CF_DISTRIBUTION_ID` is set)
### Optional Environment Variables
Skip specific steps for faster iteration:
```bash
# Skip Hugo build (use existing public/)
export SKIP_BUILD=true
# Skip markdown generation
export SKIP_MARKDOWN=true
# Build only (no S3 upload)
export SKIP_DEPLOY=true
```
### Example: Test Markdown Generation Only
```bash
SKIP_DEPLOY=true ./scripts/deploy-staging.sh
```
## Production Deployment
Production deployments are **automatic** via CircleCI when merging to `master`.
### Workflow
1. **Build Job** (`.circleci/config.yml`):
- Installs dependencies
- Builds Hugo site with production config
- Generates LLM-friendly Markdown (`yarn build:md`)
- Persists workspace for deploy job
2. **Deploy Job**:
- Attaches workspace
- Uploads to S3 using s3deploy
- Invalidates CloudFront cache
- Posts success notification to Slack
### Environment Variables (CircleCI)
Production deployment requires the following environment variables set in CircleCI:
- `BUCKET` - Production S3 bucket name
- `REGION` - AWS region
- `CF_DISTRIBUTION_ID` - CloudFront distribution ID
- `SLACK_WEBHOOK_URL` - Slack notification webhook
### Trigger Production Deploy
```bash
git push origin master
```
CircleCI will automatically build and deploy.
## LLM Markdown Generation
Both staging and production deployments generate LLM-friendly Markdown files at build time.
### Output Files
The build generates two types of markdown files in `public/`:
1. **Single-page markdown** (`index.md`)
- Individual page content with frontmatter
- Contains: title, description, URL, product, version, token estimate
2. **Section bundles** (`index.section.md`)
- Aggregated section with all child pages
- Includes child page list in frontmatter
- Optimized for LLM context windows
### Generation Script
```bash
# Generate all markdown
yarn build:md
# Generate for specific path
node scripts/build-llm-markdown.js --path influxdb3/core/get-started
# Limit number of files (for testing)
node scripts/build-llm-markdown.js --limit 100
```
### Configuration
Edit `scripts/build-llm-markdown.js` to adjust:
```javascript
// Skip files smaller than this (Hugo alias redirects)
const MIN_HTML_SIZE_BYTES = 1024;
// Token estimation ratio
const CHARS_PER_TOKEN = 4;
// Concurrency (workers)
const CONCURRENCY = process.env.CI ? 10 : 20;
```
### Performance
- **Speed**: \~105 seconds for 5,000 pages + 500 sections
- **Memory**: \~300MB peak (safe for 2GB CircleCI)
- **Rate**: \~23 files/second with memory-bounded parallelism
## Making Deployment Changes
### During Initial Implementation
If making changes that affect `yarn build` commands or `.circleci/config.yml`:
1. **Read the surrounding context** in the CI file
2. **Notice** flags, such as `--destination workspace/public` on the Hugo build
3. **Ask**: "Does the build script need to know about environment details--for example, do paths differ between production and staging?"
### Recommended Prompt for Future Similar Work
> "This script will run in CI. Let me read the CI configuration to understand the build environment and directory structure before finalizing the implementation."
## Summary of Recommendations
| Strategy | Implementation | Effort |
| ---------------------------------- | ---------------------------------- | ------ |
| Read CI config before implementing | Process/habit change | Low |
| Test on feature branch first | Push and watch CI before merging | Low |
| Add CI validation step | Add file count check in config.yml | Low |
## Testing and Validation
### Local Testing
Test markdown generation locally before deploying:
```bash
# Prerequisites
yarn install
yarn build:ts
npx hugo --quiet
# Generate markdown for testing
yarn build:md
# Generate markdown for specific path
node scripts/build-llm-markdown.js --path influxdb3/core/get-started --limit 10
# Run validation tests
node cypress/support/run-e2e-specs.js \
--spec "cypress/e2e/content/markdown-content-validation.cy.js"
```
### Validation Checks
The Cypress tests validate:
- ✅ No raw Hugo shortcodes (`{{< >}}` or `{{% %}}`)
- ✅ No HTML comments
- ✅ Proper YAML frontmatter with required fields
- ✅ UI elements removed (feedback forms, navigation)
- ✅ GitHub-style callouts (Note, Warning, etc.)
- ✅ Properly formatted tables, lists, and code blocks
- ✅ Product context metadata
- ✅ Clean link formatting
See [DOCS-TESTING.md](DOCS-TESTING.md) for comprehensive testing documentation.
## Troubleshooting
### s3deploy Not Found
Install the s3deploy binary:
```bash
./deploy/ci-install-s3deploy.sh
```
Verify installation:
```bash
s3deploy -version
```
### Missing Environment Variables
Check required variables are set:
```bash
echo $STAGING_BUCKET
echo $AWS_REGION
```
Set them if missing:
```bash
export STAGING_BUCKET="test2.docs.influxdata.com"
export AWS_REGION="us-east-1"
```
### AWS Permission Errors
Ensure your AWS credentials have the required permissions:
- `s3:PutObject` - Upload files to S3
- `s3:DeleteObject` - Delete old files from S3
- `cloudfront:CreateInvalidation` - Invalidate cache
Check your AWS profile:
```bash
aws sts get-caller-identity
```
### Hugo Build Fails
Check for:
- Missing dependencies (`yarn install`)
- TypeScript compilation errors (`yarn build:ts`)
- Invalid Hugo configuration
Build Hugo separately to isolate the issue:
```bash
yarn hugo --environment staging
```
### Markdown Generation Fails
Check for:
- Hugo build completed successfully
- TypeScript compiled (`yarn build:ts`)
- Sufficient memory available
Test markdown generation separately:
```bash
yarn build:md --limit 10
```
### CloudFront Cache Not Invalidating
If you see stale content after deployment:
1. Check `STAGING_CF_DISTRIBUTION_ID` is set correctly
2. Verify AWS credentials have `cloudfront:CreateInvalidation` permission
3. Manual invalidation:
```bash
aws cloudfront create-invalidation \
--distribution-id E1XXXXXXXXXX \
--paths "/*"
```
### Deployment Timing Out
For large deployments:
1. **Skip markdown generation** if unchanged:
```bash
SKIP_MARKDOWN=true ./scripts/deploy-staging.sh
```
2. **Use s3deploy's incremental upload**:
- s3deploy only uploads changed files
- First deploy is slower, subsequent deploys are faster
3. **Check network speed**:
- Large uploads require good bandwidth
- Consider deploying from an AWS region closer to the S3 bucket
## Deployment Checklist
### Before Deploying to Staging
- [ ] Run tests locally (`yarn lint`)
- [ ] Build Hugo successfully (`yarn hugo --environment staging`)
- [ ] Generate markdown successfully (`yarn build:md`)
- [ ] Set staging environment variables
- [ ] Have AWS credentials configured
### Before Merging to Master (Production)
- [ ] Test on staging first
- [ ] Verify LLM markdown quality
- [ ] Check for broken links (`yarn test:links`)
- [ ] Run code block tests (`yarn test:codeblocks:all`)
- [ ] Review CircleCI configuration changes
- [ ] Ensure all tests pass
## Related Documentation
- [Contributing Guide](DOCS-CONTRIBUTING.md)
- [Testing Guide](DOCS-TESTING.md)
- [CircleCI Configuration](.circleci/config.yml)
- [S3 Deploy Configuration](.s3deploy.yml)