Some checks failed
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
mdBook Build & Deploy / Build mdBook (push) Has been cancelled
Nickel Type Check / Nickel Type Checking (push) Has been cancelled
mdBook Build & Deploy / Documentation Quality Check (push) Has been cancelled
mdBook Build & Deploy / Deploy to GitHub Pages (push) Has been cancelled
mdBook Build & Deploy / Notification (push) Has been cancelled
432 lines
9.7 KiB
Markdown
432 lines
9.7 KiB
Markdown
# GitHub Actions Setup Guide
|
|
|
|
Quick setup guide to enable GitHub Actions CI/CD for VAPORA provisioning.
|
|
|
|
## 5-Minute Setup
|
|
|
|
### Step 1: Enable GitHub Actions
|
|
|
|
1. Go to repository Settings
|
|
2. Navigate to "Actions" → "General"
|
|
3. Select "Allow all actions and reusable workflows"
|
|
4. Set "Workflow permissions" to "Read and write permissions"
|
|
5. Save changes
|
|
|
|
### Step 2: Add Required Secrets
|
|
|
|
Go to Settings → Secrets and variables → Actions → New repository secret
|
|
|
|
#### Kubernetes Kubeconfigs (Required for K8s deployments)
|
|
|
|
```bash
|
|
# Get kubeconfig and encode as base64
|
|
cat ~/.kube/config | base64
|
|
|
|
# Create these secrets:
|
|
# KUBE_CONFIG_STAGING (for staging cluster)
|
|
# KUBE_CONFIG_PRODUCTION (for production cluster)
|
|
```
|
|
|
|
**For CI/Test Cluster** (Optional):
|
|
- Secret name: `KUBE_CONFIG_CI`
|
|
- Value: Base64-encoded kubeconfig
|
|
|
|
#### Slack Webhooks (Optional, for notifications)
|
|
|
|
```
|
|
SLACK_WEBHOOK # For general notifications
|
|
SLACK_WEBHOOK_ALERTS # For critical alerts
|
|
```
|
|
|
|
[How to create Slack webhooks](https://api.slack.com/apps)
|
|
|
|
#### Docker Registry (Optional, for image pushes)
|
|
|
|
```
|
|
DOCKER_USERNAME # Docker Hub username
|
|
DOCKER_PASSWORD # Docker Hub access token
|
|
```
|
|
|
|
### Step 3: Verify Setup
|
|
|
|
1. Go to Actions tab
|
|
2. You should see 5 workflows listed:
|
|
- ✓ Validate & Build Artifacts
|
|
- ✓ Deploy to Docker
|
|
- ✓ Deploy to Kubernetes
|
|
- ✓ Health Check & Monitoring
|
|
- ✓ Rollback Deployment
|
|
|
|
3. Click on "Validate & Build Artifacts"
|
|
4. Click "Run workflow" → "Run workflow"
|
|
5. Wait for completion (should take ~5 minutes)
|
|
|
|
### Step 4: Download Artifacts
|
|
|
|
1. Go to the completed workflow run
|
|
2. Scroll down to "Artifacts"
|
|
3. Download `deployment-artifacts`
|
|
4. Extract and review generated files
|
|
|
|
---
|
|
|
|
## Detailed Setup
|
|
|
|
### Configure Kubernetes Access
|
|
|
|
#### 1. Staging Cluster
|
|
|
|
```bash
|
|
# Get kubeconfig context for staging
|
|
kubectl config view --minify --flatten --context=staging-context > staging-kubeconfig.yaml
|
|
|
|
# Encode for GitHub
|
|
cat staging-kubeconfig.yaml | base64
|
|
|
|
# Create secret KUBE_CONFIG_STAGING with the base64 output
|
|
```
|
|
|
|
#### 2. Production Cluster
|
|
|
|
```bash
|
|
# Get kubeconfig context for production
|
|
kubectl config view --minify --flatten --context=prod-context > prod-kubeconfig.yaml
|
|
|
|
# Encode for GitHub
|
|
cat prod-kubeconfig.yaml | base64
|
|
|
|
# Create secret KUBE_CONFIG_PRODUCTION with the base64 output
|
|
```
|
|
|
|
#### 3. Verify Kubeconfig
|
|
|
|
```bash
|
|
# Test decoding
|
|
echo $KUBE_CONFIG_STAGING | base64 -d | kubectl cluster-info
|
|
|
|
# Should output cluster information if valid
|
|
```
|
|
|
|
### Configure Slack Integration
|
|
|
|
#### 1. Create Slack App
|
|
|
|
1. Go to [api.slack.com/apps](https://api.slack.com/apps)
|
|
2. Click "Create New App" → "From scratch"
|
|
3. App Name: `vapora-deployments`
|
|
4. Workspace: Select your workspace
|
|
5. Click "Create App"
|
|
|
|
#### 2. Enable Incoming Webhooks
|
|
|
|
1. Click "Incoming Webhooks" from left menu
|
|
2. Toggle "Activate Incoming Webhooks" to ON
|
|
3. Click "Add New Webhook to Workspace"
|
|
4. Select channel: `#deployments`
|
|
5. Click "Allow"
|
|
6. Copy the webhook URL
|
|
|
|
#### 3. Create Alert Webhook
|
|
|
|
1. Back on Incoming Webhooks page
|
|
2. Click "Add New Webhook to Workspace"
|
|
3. Select channel: `#alerts`
|
|
4. Click "Allow"
|
|
5. Copy the webhook URL
|
|
|
|
#### 4. Store Webhooks in GitHub
|
|
|
|
Create these secrets:
|
|
- `SLACK_WEBHOOK` = General notifications webhook
|
|
- `SLACK_WEBHOOK_ALERTS` = Critical alerts webhook
|
|
|
|
### Configure Docker Registry (Optional)
|
|
|
|
#### 1. Generate Docker Access Token
|
|
|
|
1. Go to [hub.docker.com](https://hub.docker.com)
|
|
2. Click your profile → Account settings
|
|
3. Navigate to "Security" → "Access Tokens"
|
|
4. Click "New Access Token"
|
|
5. Name: `github-actions`
|
|
6. Copy the token
|
|
|
|
#### 2. Store in GitHub
|
|
|
|
Create these secrets:
|
|
- `DOCKER_USERNAME` = Your Docker Hub username
|
|
- `DOCKER_PASSWORD` = The access token
|
|
|
|
---
|
|
|
|
## Branch Protection Rules (Recommended)
|
|
|
|
### Protect Main Branch
|
|
|
|
1. Go to Settings → Branches
|
|
2. Click "Add rule"
|
|
3. Branch name pattern: `main`
|
|
4. Enable:
|
|
- ✓ Require a pull request before merging
|
|
- ✓ Require status checks to pass
|
|
- ✓ Require branches to be up to date
|
|
- ✓ Include administrators
|
|
5. Save changes
|
|
|
|
### Protect Develop Branch
|
|
|
|
1. Add new rule
|
|
2. Branch name pattern: `develop`
|
|
3. Enable:
|
|
- ✓ Require a pull request before merging
|
|
- ✓ Require status checks to pass
|
|
4. Save changes
|
|
|
|
---
|
|
|
|
## First Deployment Walkthrough
|
|
|
|
### 1. Create Feature Branch
|
|
|
|
```bash
|
|
git checkout -b feature/test-deployment
|
|
```
|
|
|
|
### 2. Make a Small Change
|
|
|
|
```bash
|
|
# Edit a configuration file
|
|
echo "# Test" >> provisioning/schemas/platform/README.md
|
|
|
|
git add provisioning/
|
|
git commit -m "test: trigger validation workflow"
|
|
git push origin feature/test-deployment
|
|
```
|
|
|
|
### 3. Watch Validation
|
|
|
|
1. Go to Actions tab
|
|
2. See "Validate & Build Artifacts" running
|
|
3. Wait for completion (~5 minutes)
|
|
4. Verify no errors
|
|
|
|
### 4. Download Artifacts
|
|
|
|
1. Click the completed workflow
|
|
2. Scroll to Artifacts
|
|
3. Download `deployment-artifacts`
|
|
4. Extract and verify contents
|
|
|
|
### 5. Test Docker Deployment
|
|
|
|
1. Extract artifacts
|
|
2. Go to Actions → Deploy to Docker
|
|
3. Click "Run workflow"
|
|
4. Inputs:
|
|
- mode: `multiuser`
|
|
- dry_run: `true`
|
|
- environment: `development`
|
|
5. Click "Run workflow"
|
|
6. Monitor the run
|
|
7. Verify Docker Compose validates
|
|
|
|
### 6. Test Kubernetes Deployment (Dry-run)
|
|
|
|
1. Go to Actions → Deploy to Kubernetes
|
|
2. Click "Run workflow"
|
|
3. Inputs:
|
|
- mode: `multiuser`
|
|
- dry_run: `true`
|
|
- environment: `staging`
|
|
4. Click "Run workflow"
|
|
5. Monitor execution
|
|
6. Verify manifests are valid
|
|
|
|
### 7. Create Pull Request
|
|
|
|
```bash
|
|
# Push and create PR
|
|
git push origin feature/test-deployment
|
|
|
|
# Or go to GitHub and create PR from UI
|
|
```
|
|
|
|
---
|
|
|
|
## Monitoring Your Deployments
|
|
|
|
### Via GitHub Actions UI
|
|
|
|
1. Go to **Actions** tab
|
|
2. Select workflow to view
|
|
3. Click specific run to see details
|
|
4. Scroll to see jobs and logs
|
|
5. Download artifacts for review
|
|
|
|
### Via Slack
|
|
|
|
Messages will appear in:
|
|
- `#deployments` - General notifications
|
|
- `#alerts` - Critical failures only
|
|
|
|
### Via CLI
|
|
|
|
```bash
|
|
# View logs for a specific deployment
|
|
kubectl logs -f deployment/vapora-backend -n vapora
|
|
|
|
# Check deployment status
|
|
kubectl get deployments -n vapora
|
|
|
|
# View events
|
|
kubectl get events -n vapora --sort-by='.lastTimestamp'
|
|
```
|
|
|
|
---
|
|
|
|
## Common Tasks
|
|
|
|
### Validate a Configuration Change
|
|
|
|
1. Make changes to provisioning/schemas/
|
|
2. Push to feature branch
|
|
3. Validate & Build runs automatically
|
|
4. Review logs and artifacts
|
|
5. No manual steps needed
|
|
|
|
### Deploy to Staging
|
|
|
|
1. Create PR with provisioning changes
|
|
2. Get code review
|
|
3. Merge to develop
|
|
4. Go to Actions → Deploy to Kubernetes
|
|
5. Run workflow with:
|
|
- mode: your choice
|
|
- environment: staging
|
|
- dry_run: true (first)
|
|
6. Review dry-run output
|
|
7. Run again with dry_run: false
|
|
|
|
### Deploy to Production
|
|
|
|
1. Create PR to main (from develop)
|
|
2. Get required reviews
|
|
3. All status checks must pass
|
|
4. Merge to main
|
|
5. Run Validate & Build (should pass)
|
|
6. Go to Actions → Deploy to Kubernetes
|
|
7. Run workflow with:
|
|
- mode: your choice
|
|
- environment: production
|
|
- dry_run: true
|
|
8. Carefully review all changes
|
|
9. Run again with dry_run: false
|
|
10. Monitor health checks
|
|
|
|
### Check System Health
|
|
|
|
1. Go to Actions → Health Check & Monitoring
|
|
2. Click "Run workflow"
|
|
3. Select target and count
|
|
4. Monitor execution
|
|
5. Review health report in artifacts
|
|
|
|
### Rollback a Deployment
|
|
|
|
1. Go to Actions → Rollback Deployment
|
|
2. Click "Run workflow"
|
|
3. Select:
|
|
- target: kubernetes or docker
|
|
- environment: staging or production
|
|
- deployment: all or specific service
|
|
- revision: 0 (for previous) or number
|
|
4. Click "Run workflow"
|
|
5. Monitor execution
|
|
6. Review rollback report
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Workflow Not Appearing
|
|
|
|
**Problem**: Don't see workflows in Actions tab
|
|
|
|
**Solution**:
|
|
1. Ensure .github/workflows/*.yml files are committed
|
|
2. Push to main branch
|
|
3. Wait 1-2 minutes
|
|
4. Refresh GitHub Actions page
|
|
|
|
### Secret Not Found Error
|
|
|
|
**Problem**: Workflow fails with "Secret not found"
|
|
|
|
**Solution**:
|
|
1. Verify secret exists in Settings → Secrets
|
|
2. Check spelling matches exactly (case-sensitive)
|
|
3. Ensure secret value is not empty
|
|
4. For kubeconfig, verify it's valid base64
|
|
|
|
### Kubeconfig Decode Error
|
|
|
|
**Problem**: Kubeconfig fails to decode
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Test decode locally first
|
|
echo $KUBE_CONFIG_VALUE | base64 -d | kubectl cluster-info
|
|
|
|
# If it fails, re-encode:
|
|
cat ~/.kube/config | base64 | pbcopy # macOS
|
|
cat ~/.kube/config | base64 # Linux
|
|
|
|
# Then update the secret with fresh base64
|
|
```
|
|
|
|
### Health Check Fails on First Run
|
|
|
|
**Problem**: Health check fails when no services deployed yet
|
|
|
|
**Solution**:
|
|
- This is normal on first run
|
|
- Deploy with Deploy to Kubernetes or Deploy to Docker first
|
|
- Then run health check
|
|
- Health check will work after services are running
|
|
|
|
### Deployment Timeout
|
|
|
|
**Problem**: Workflow times out waiting for pod readiness
|
|
|
|
**Solution**:
|
|
1. Check pod logs: `kubectl logs -n vapora <pod>`
|
|
2. Check pod description: `kubectl describe pod -n vapora <pod>`
|
|
3. Increase `rollout_timeout` input (default 300s)
|
|
4. Check resource requests/limits in deployment.yaml
|
|
5. Verify cluster has sufficient resources
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. ✅ Setup workflows (you are here)
|
|
2. → Run first test deployment
|
|
3. → Configure Slack notifications
|
|
4. → Protect main and develop branches
|
|
5. → Train team on deployment process
|
|
6. → Monitor health checks
|
|
7. → Create runbook for incidents
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
- **Workflow Logs**: Check Actions → [Workflow] → [Run] → Logs
|
|
- **Artifacts**: Download from Actions → [Workflow] → [Run] → Artifacts
|
|
- **Issues**: Check GitHub Issues for auto-created failure reports
|
|
- **Slack**: Monitor #alerts channel for critical notifications
|
|
|
|
---
|
|
|
|
**Next**: Read [GITHUB_ACTIONS_GUIDE.md](./GITHUB_ACTIONS_GUIDE.md) for detailed workflow information
|