gitlab-deployment/docs/TESTING.md

313 lines
7.2 KiB
Markdown

# GitLab Testing Procedures
## Pre-Deployment Tests (Local Environment)
Run these tests before deploying to production.
### 1. DNS Resolution Test
```bash
# Test A record
dig gitlab.yourdomain.com
# Should return your droplet IP
# Alternative using nslookup
nslookup gitlab.yourdomain.com
```
**Expected Result:** Your droplet IP address should be returned.
### 2. SSH Access Test
```bash
# Test SSH connection with verbose output
ssh -v root@your_droplet_ip
# Should connect without errors
```
**Expected Result:** Successful SSH connection to droplet.
### 3. Port Accessibility Test
```bash
# Test required ports
nc -zv your_droplet_ip 22 # SSH
nc -zv your_droplet_ip 80 # HTTP
nc -zv your_droplet_ip 443 # HTTPS
# All should show "succeeded"
```
**Expected Result:** All three ports should be accessible.
## Post-Deployment Tests
Run these tests after each deployment step.
### 1. Service Status Check
```bash
ssh root@your_droplet_ip 'gitlab-ctl status'
```
**Expected Result:** All services should be "run" status.
### 2. HTTPS/SSL Test
```bash
# Test HTTPS response
curl -I https://gitlab.yourdomain.com
# Should return 200 OK with HTTPS headers
# Test SSL certificate
openssl s_client -connect gitlab.yourdomain.com:443 -servername gitlab.yourdomain.com
# Should show valid certificate from Let's Encrypt
```
**Expected Result:**
- HTTP 200 OK response
- Valid Let's Encrypt certificate
- No SSL warnings
### 3. Web Interface Test
**Manual Steps:**
1. Visit `https://gitlab.yourdomain.com` in browser
2. Verify no certificate warnings
3. Should see GitLab login page
4. Get root password: `ssh root@your_droplet_ip 'cat /etc/gitlab/initial_root_password'`
5. Login with username `root` and the password
6. Should successfully reach GitLab dashboard
**Expected Result:** Successful login and functional UI.
### 4. Git Operations Test (HTTPS)
```bash
# Create a test repository via web UI first
# Then test clone:
git clone https://gitlab.yourdomain.com/root/test-repo.git
cd test-repo
# Create test file
echo "# Test Repository" > README.md
# Commit and push
git add README.md
git commit -m "Initial commit"
git push origin main
```
**Expected Result:** Successful clone, commit, and push operations.
### 5. SSH Git Access Test
```bash
# First, add your SSH key in GitLab UI:
# User Settings → SSH Keys → Add new key
# Test SSH connection
ssh -T git@gitlab.yourdomain.com
# Should return: Welcome to GitLab, @username!
# Clone via SSH
git clone git@gitlab.yourdomain.com:root/test-repo.git test-repo-ssh
cd test-repo-ssh
# Make changes
echo "SSH test" >> README.md
git add README.md
git commit -m "SSH test commit"
git push origin main
```
**Expected Result:** Successful SSH authentication and git operations.
### 6. Email Delivery Test
Run the comprehensive email test script:
```bash
./scripts/test_email.sh
```
**Manual Email Test:**
```bash
ssh root@your_droplet_ip
gitlab-rails console
# Send test email
Notify.test_email('your@email.com', 'GitLab Test', 'This is a test').deliver_now
exit
# Check logs
tail -f /var/log/gitlab/gitlab-rails/production.log | grep -i mail
```
**Expected Result:**
- Test email received within 5 minutes
- Email NOT in spam folder
- Email has correct from address
- All DNS records verified (SPF, DKIM, DMARC)
### 7. Backup Test
```bash
# Run backup script
ssh root@your_droplet_ip '/root/gitlab-deployment/scripts/backup_gitlab.sh'
# Verify backup file created
ssh root@your_droplet_ip 'ls -lh /var/opt/gitlab/backups/'
# Should show recent .tar file
```
**Expected Result:**
- Backup completes without errors
- Backup file exists in /var/opt/gitlab/backups/
- Backup file size is reasonable (not empty)
### 8. Health Check Test
```bash
# Run health check script
ssh root@your_droplet_ip '/root/gitlab-deployment/scripts/health_check.sh'
```
**Expected Result:**
- All services running
- Adequate disk space (>20% free)
- Reasonable memory usage (<80%)
- Health endpoint returns success
- Valid SSL certificate
## Integration Tests
### GitLab Rake Checks
```bash
ssh root@your_droplet_ip 'sudo gitlab-rake gitlab:check'
```
**Expected Result:** All checks should pass or show warnings only (no failures).
### GitLab Environment Info
```bash
ssh root@your_droplet_ip 'sudo gitlab-rake gitlab:env:info'
```
Review output for correct configuration.
### Database Connectivity
```bash
ssh root@your_droplet_ip 'sudo gitlab-rake gitlab:db:check'
```
**Expected Result:** Database connection successful.
## Monitoring Checklist
Create this checklist for regular monitoring:
- [ ] GitLab web UI accessible and responsive
- [ ] SSL certificate valid and auto-renewing
- [ ] Git clone/push operations work via HTTPS
- [ ] Git clone/push operations work via SSH
- [ ] Email delivery working (test weekly)
- [ ] Emails not going to spam
- [ ] Backups completing successfully (check logs)
- [ ] All GitLab services running
- [ ] Disk space adequate (>20% free)
- [ ] Memory usage reasonable (<80%)
- [ ] No errors in logs
- [ ] SSL certificate expiry > 30 days
- [ ] DNS records still valid
## Automated Testing Script
Create `tests/integration_tests.sh`:
```bash
#!/bin/bash
# Run all integration tests
source .env
echo "=== GitLab Integration Tests ==="
FAILED=0
# Test 1: HTTP Response
echo -n "Testing HTTP response... "
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://${GITLAB_DOMAIN})
if [ "$HTTP_CODE" = "200" ]; then
echo "✓ PASS"
else
echo "✗ FAIL (HTTP $HTTP_CODE)"
FAILED=$((FAILED + 1))
fi
# Test 2: SSL Certificate
echo -n "Testing SSL certificate... "
if echo | openssl s_client -servername ${GITLAB_DOMAIN} -connect ${GITLAB_DOMAIN}:443 2>/dev/null | grep -q "Verify return code: 0"; then
echo "✓ PASS"
else
echo "✗ FAIL"
FAILED=$((FAILED + 1))
fi
# Test 3: Services Running
echo -n "Testing GitLab services... "
if ssh root@${DROPLET_IP} 'gitlab-ctl status' | grep -q "run:"; then
echo "✓ PASS"
else
echo "✗ FAIL"
FAILED=$((FAILED + 1))
fi
# Test 4: Disk Space
echo -n "Testing disk space... "
DISK_USAGE=$(ssh root@${DROPLET_IP} "df -h / | tail -1 | awk '{print \$5}' | sed 's/%//'")
if [ "$DISK_USAGE" -lt 80 ]; then
echo "✓ PASS (${DISK_USAGE}% used)"
else
echo "✗ FAIL (${DISK_USAGE}% used - critically high)"
FAILED=$((FAILED + 1))
fi
# Test 5: Email DNS Records
echo -n "Testing email DNS records... "
DOMAIN=$(echo $GITLAB_EMAIL_FROM | cut -d'@' -f2)
if dig +short TXT ${DOMAIN} | grep -q "spf"; then
echo "✓ PASS"
else
echo "⚠ WARNING (SPF not found)"
fi
# Summary
echo ""
echo "=== Test Summary ==="
if [ $FAILED -eq 0 ]; then
echo "✓ All tests passed"
exit 0
else
echo "✗ $FAILED test(s) failed"
exit 1
fi
```
Make executable: `chmod +x tests/integration_tests.sh`
## Production Readiness Checklist
Before declaring production ready:
- [ ] All pre-deployment tests pass
- [ ] All post-deployment tests pass
- [ ] Integration tests pass
- [ ] Email delivery works (not in spam)
- [ ] Backup and restore tested successfully
- [ ] Load testing completed satisfactorily
- [ ] Disaster recovery procedure tested
- [ ] Monitoring and alerting configured
- [ ] Documentation reviewed and updated
- [ ] Credentials rotated and secured
- [ ] Team trained on GitLab usage
- [ ] Support plan in place
## Troubleshooting Tests
If any test fails, see TROUBLESHOOTING.md for solutions.