home / skills / adaptationio / skrillz / railway-automation
npx playbooks add skill adaptationio/skrillz --skill railway-automationReview the files below or copy the command above to add this skill to your agents.
---
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