home / skills / adaptationio / skrillz / railway-automation

railway-automation skill

/skills/railway-automation

npx playbooks add skill adaptationio/skrillz --skill railway-automation

Review the files below or copy the command above to add this skill to your agents.

Files (7)
SKILL.md
10.8 KB
---
name: railway-automation
description: Railway CI/CD integration and automation. Use when setting up GitHub Actions, GitLab CI, automated deployments, migration scripts, or programmatic Railway workflows.
---

# Railway CI/CD Automation

Automate Railway deployments with CI/CD pipelines, migration scripts, and event-driven workflows.

## Quick Start

**GitHub Actions (5 minutes)**
```yaml
# .github/workflows/railway.yml
- uses: railway/deploy@v1
  with:
    railway_token: ${{ secrets.RAILWAY_TOKEN }}
    service: api
```

**GitLab CI (5 minutes)**
```yaml
# .gitlab-ci.yml
deploy:
  script:
    - railway up --service api
  only: [main]
```

**Migration (10 minutes)**
```bash
./scripts/migrate.sh --from heroku --project myapp
```

## Workflow Overview

### 1. GitHub Actions Integration

**Setup Process**
1. Generate Railway token (`railway login && railway token`)
2. Add token to GitHub secrets (`RAILWAY_TOKEN`)
3. Create workflow file (`.github/workflows/railway.yml`)
4. Configure deployment triggers
5. Test with PR or push

**Use Cases**
- Deploy on push to main/staging
- PR preview environments
- Multi-environment promotion
- Scheduled deployments
- Manual approval gates

**Template**: See `templates/github-workflow.yml`

**Reference**: `references/github-actions.md` for complete guide with 5+ workflow examples

---

### 2. GitLab CI Integration

**Setup Process**
1. Generate Railway token
2. Add to GitLab CI/CD variables (`RAILWAY_TOKEN`)
3. Create `.gitlab-ci.yml`
4. Define stages (test → staging → production)
5. Configure manual gates

**Use Cases**
- Multi-stage pipelines
- Environment-specific deployments
- Review apps for merge requests
- Parallel service deployments
- Artifact-based deployments

**Template**: See `templates/gitlab-ci.yml`

**Reference**: `references/gitlab-ci.md` for complete guide with pipeline examples

---

### 3. Custom CI/CD Integration

**Generic Pattern (Any Platform)**
```bash
# Install Railway CLI
npm i -g @railway/cli

# Login with token
export RAILWAY_TOKEN=$YOUR_TOKEN

# Link project
railway link $PROJECT_ID

# Deploy
railway up --service $SERVICE_NAME --environment $ENVIRONMENT
```

**Environment Variables**
- `RAILWAY_TOKEN`: Authentication token
- `RAILWAY_PROJECT_ID`: Project identifier (optional if linked)
- `RAILWAY_SERVICE`: Service name (optional)
- `RAILWAY_ENVIRONMENT`: Environment name (optional)

**Health Check Pattern**
```bash
# Deploy and wait for health
railway up --service api
sleep 30

# Verify deployment
DEPLOY_URL=$(railway status --json | jq -r '.url')
curl -f $DEPLOY_URL/health || exit 1
```

**Supported Platforms**
- CircleCI
- Travis CI
- Jenkins
- Bitbucket Pipelines
- Azure DevOps
- Any platform with shell access

---

### 4. Migration Automation

**Interactive Migration Script**
```bash
# From Heroku
./scripts/migrate.sh --from heroku --project myapp

# From Vercel
./scripts/migrate.sh --from vercel --project myapp --env production

# Dry run (preview changes)
./scripts/migrate.sh --from render --project myapp --dry-run
```

**Script Features**
- Platform detection
- Environment variable export/import
- Railway project creation
- Service configuration
- Database migration
- DNS cutover planning
- Verification checks

**Supported Migrations**
- Heroku → Railway
- Vercel → Railway
- Render → Railway
- Docker Compose → Railway
- Kubernetes → Railway

**Reference**: `references/migration-patterns.md` for detailed guides per platform

---

### 5. Scheduled Tasks

**Cron-Based Deployments**
```yaml
# GitHub Actions - Deploy every night at 2 AM
on:
  schedule:
    - cron: '0 2 * * *'

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: railway/deploy@v1
        with:
          railway_token: ${{ secrets.RAILWAY_TOKEN }}
```

**Database Backups**
```yaml
# Scheduled backup workflow
on:
  schedule:
    - cron: '0 0 * * *'  # Daily at midnight

jobs:
  backup:
    steps:
      - name: Backup database
        run: |
          railway run pg_dump > backup.sql
          aws s3 cp backup.sql s3://backups/$(date +%Y%m%d).sql
```

**Health Check Monitoring**
```yaml
# Hourly health checks
on:
  schedule:
    - cron: '0 * * * *'

jobs:
  health:
    steps:
      - name: Check service health
        run: |
          curl -f ${{ secrets.SERVICE_URL }}/health || \
          curl -X POST ${{ secrets.SLACK_WEBHOOK }} \
            -d '{"text":"Service down!"}'
```

---

### 6. Webhook Integration

**GitHub Webhook → Railway Deploy**
```javascript
// Webhook handler
app.post('/webhook/github', async (req, res) => {
  const { ref, repository } = req.body;

  if (ref === 'refs/heads/main') {
    const { exec } = require('child_process');
    exec('railway up --service api', (error, stdout) => {
      console.log(stdout);
    });
  }

  res.json({ status: 'ok' });
});
```

**Railway Webhook Events**
Railway supports webhooks for:
- Deployment started
- Deployment completed
- Deployment failed
- Service crashed
- Build logs

**Configure Webhooks**
```bash
# Via Railway CLI
railway webhooks add \
  --url https://yourapp.com/webhook \
  --events deployment.success,deployment.failure

# Via API
curl -X POST https://backboard.railway.app/graphql \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "query": "mutation { webhookCreate(input: {...}) }"
  }'
```

**Notification Integration**
```bash
# Slack notification on deploy
railway webhooks add \
  --url $SLACK_WEBHOOK_URL \
  --events deployment.success \
  --transform '{
    "text": "Deployed {{service}} to {{environment}}"
  }'
```

---

## Common Patterns

### Multi-Environment Deployment
```yaml
# Deploy to staging first, then production
jobs:
  staging:
    environment: staging
    steps:
      - uses: railway/deploy@v1
        with:
          railway_token: ${{ secrets.RAILWAY_TOKEN }}
          environment: staging

  production:
    needs: staging
    environment: production
    steps:
      - uses: railway/deploy@v1
        with:
          railway_token: ${{ secrets.RAILWAY_TOKEN }}
          environment: production
```

### PR Preview Environments
```yaml
# Create preview for each PR
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  preview:
    steps:
      - uses: railway/deploy@v1
        with:
          railway_token: ${{ secrets.RAILWAY_TOKEN }}
          service: api-pr-${{ github.event.pull_request.number }}
```

### Rollback on Failure
```yaml
# Automatic rollback if health check fails
jobs:
  deploy:
    steps:
      - name: Deploy
        id: deploy
        run: railway up --service api

      - name: Health check
        run: curl -f $SERVICE_URL/health

      - name: Rollback on failure
        if: failure()
        run: railway rollback --service api
```

### Matrix Deployments
```yaml
# Deploy multiple services in parallel
strategy:
  matrix:
    service: [api, worker, cron]

steps:
  - uses: railway/deploy@v1
    with:
      railway_token: ${{ secrets.RAILWAY_TOKEN }}
      service: ${{ matrix.service }}
```

---

## Token Management

**Generate Token**
```bash
# CLI method
railway login
railway token

# Copy token to clipboard
railway token | pbcopy  # macOS
railway token | xclip   # Linux
```

**Add to CI Platform**

**GitHub**
```
Settings → Secrets and variables → Actions → New repository secret
Name: RAILWAY_TOKEN
Value: [paste token]
```

**GitLab**
```
Settings → CI/CD → Variables → Add variable
Key: RAILWAY_TOKEN
Value: [paste token]
Protected: Yes
Masked: Yes
```

**CircleCI**
```
Project Settings → Environment Variables → Add Variable
Name: RAILWAY_TOKEN
Value: [paste token]
```

**Token Rotation**
```bash
# Generate new token
NEW_TOKEN=$(railway token)

# Update in CI (platform-specific)
# Then invalidate old token via dashboard
```

---

## Environment-Specific Configuration

**Detect Environment in Code**
```javascript
const env = process.env.RAILWAY_ENVIRONMENT || 'development';

const config = {
  development: { db: 'localhost:5432' },
  staging: { db: process.env.DATABASE_URL },
  production: { db: process.env.DATABASE_URL }
};

export default config[env];
```

**Conditional Deployment**
```yaml
# Only deploy staging on feature branches
jobs:
  deploy-staging:
    if: github.ref != 'refs/heads/main'
    steps:
      - uses: railway/deploy@v1
        with:
          environment: staging

  deploy-production:
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: railway/deploy@v1
        with:
          environment: production
```

**Environment Variable Management**
```bash
# Export from staging
railway env --environment staging > .env.staging

# Import to production (selective)
cat .env.staging | grep -v SECRET | railway env --environment production
```

---

## Best Practices

### Security
- Use masked/protected CI variables
- Rotate tokens quarterly
- Use service tokens (not personal) for production
- Never commit tokens to git
- Limit token scope to specific projects

### Performance
- Cache dependencies in CI
- Use Railway's built-in caching
- Deploy only changed services
- Run tests before deploy
- Use health checks before traffic

### Reliability
- Always include rollback mechanism
- Monitor deployment notifications
- Set deployment timeouts
- Use staging before production
- Test migrations in preview environments

### Monitoring
- Log all deployments
- Track deployment duration
- Alert on failures
- Monitor health checks
- Track rollback frequency

---

## Troubleshooting

**Deployment Fails in CI**
```bash
# Check token validity
railway whoami

# Verify project link
railway status

# Check service exists
railway list

# View deployment logs
railway logs --service api
```

**Token Authentication Errors**
```bash
# Regenerate token
railway logout
railway login
railway token

# Update in CI secrets
# Test locally first
RAILWAY_TOKEN=$NEW_TOKEN railway status
```

**Environment Not Found**
```bash
# List available environments
railway environment list

# Verify environment name matches
railway status --environment production
```

**Service Not Deploying**
```bash
# Check service name
railway list

# Verify service configuration
railway status --service api

# Check for build errors
railway logs --service api --deployment latest
```

---

## Related Skills

- **railway-auth**: Token management and authentication setup
- **railway-api**: Programmatic Railway API automation
- **railway-deployment**: Deployment patterns and strategies
- **railway-database**: Database automation and backups
- **railway-monitoring**: Health checks and alerting

---

## References

- **references/github-actions.md**: Complete GitHub Actions guide with 5+ workflow examples
- **references/gitlab-ci.md**: Complete GitLab CI guide with pipeline examples
- **references/migration-patterns.md**: Platform migration guides (Heroku, Vercel, Render, etc.)

## Templates

- **templates/github-workflow.yml**: Production-ready GitHub Actions template
- **templates/gitlab-ci.yml**: Production-ready GitLab CI template

## Scripts

- **scripts/migrate.sh**: Interactive migration script supporting multiple platforms