Builtiful

Runner Configuration

Configure GitHub Actions workflows to use Builtiful runners with the correct runs-on syntax

Runner Configuration

Learn how to configure your GitHub Actions workflows to use Builtiful's managed runners with the correct runs-on syntax.

Basic Configuration

Builtiful Runner Syntax

Builtiful uses a specific syntax format for the runs-on directive:

runs-on: builtiful(distribution, parameter=value, ...)

Simple Examples

jobs:
  build:
    # Basic Ubuntu runner with default settings of 2vCPU and 8GB RAM (same as ubuntu-latest)
    runs-on: builtiful(ubuntu)
    
    # Ubuntu runner with specific CPU count
    runs-on: builtiful(ubuntu, cpus=4)

Available Parameters

Required Parameters

ParameterDescriptionExample
distributionOperating system distributionubuntu

Optional Parameters

ParameterDescriptionDefaultExample
cpusNumber of CPU cores2cpus=8
archCPU architecturex86_64arch=arm64

Configuration Examples

CPU Scaling

Choose the right CPU count for your workload:

CPU CountMemorySyntax
14GBbuiltiful(ubuntu, cpus=1)
28GBbuiltiful(ubuntu, cpus=2)
312GBbuiltiful(ubuntu, cpus=3)
416GBbuiltiful(ubuntu, cpus=4)
520GBbuiltiful(ubuntu, cpus=5)
624GBbuiltiful(ubuntu, cpus=6)
728GBbuiltiful(ubuntu, cpus=7)
832GBbuiltiful(ubuntu, cpus=8)
936GBbuiltiful(ubuntu, cpus=9)
1040GBbuiltiful(ubuntu, cpus=10)
1144GBbuiltiful(ubuntu, cpus=11)
1248GBbuiltiful(ubuntu, cpus=12)
1352GBbuiltiful(ubuntu, cpus=13)
1456GBbuiltiful(ubuntu, cpus=14)
1560GBbuiltiful(ubuntu, cpus=15)
1664GBbuiltiful(ubuntu, cpus=16)

Example usage:

jobs:
  # Very small tasks - labeler, bots
  labeler:
    runs-on: builtiful(ubuntu, cpus=1)
 
  # Light tasks - linting, simple builds (2 vCPU is the default)
  lint:
    runs-on: builtiful(ubuntu, cpus=2)
  
  # Medium builds - most application builds
  build:
    runs-on: builtiful(ubuntu, cpus=4)
  
  # Heavy compilation - C++, Rust, large projects
  compile:
    runs-on: builtiful(ubuntu, cpus=16)

Architecture Options

Specify CPU architecture when needed:

jobs:
  # Default x86_64 architecture
  build-x86:
    runs-on: builtiful(ubuntu, cpus=4)
  
  # ARM64 architecture (coming soon)
  build-arm:
    runs-on: builtiful(ubuntu, cpus=4, arch=arm64)

Complete Examples

Multi-Job Workflow

name: Full CI/CD Pipeline
on: [push, pull_request]
 
jobs:
  lint:
    runs-on: builtiful(ubuntu, cpus=2)
    steps:
      - uses: actions/checkout@v4
      - name: Run linter
        run: npm run lint
 
  test:
    runs-on: builtiful(ubuntu, cpus=8)
    steps:
      - uses: actions/checkout@v4
      - name: Run tests
        run: npm test
 
  build:
    needs: [lint, test]
    runs-on: builtiful(ubuntu, cpus=16)
    steps:
      - uses: actions/checkout@v4
      - name: Build application
        run: npm run build
 
  deploy:
    needs: build
    if: github.ref == 'refs/heads/main'
    runs-on: builtiful(ubuntu, cpus=4)
    steps:
      - uses: actions/checkout@v4
      - name: Deploy
        run: ./deploy.sh

Matrix Builds

jobs:
  test:
    strategy:
      matrix:
        node: [18, 20, 22]
        cpus: [4, 8]
    
    runs-on: builtiful(ubuntu, cpus=${{ matrix.cpus }})
    
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - run: npm test

Dynamic Configuration

jobs:
  build:
    runs-on: ${{
      github.event_name == 'push' && github.ref == 'refs/heads/main'
        && 'builtiful(ubuntu, cpus=16)'  # Production builds
        || 'builtiful(ubuntu, cpus=4)'   # Development builds
    }}

Pre-installed Software

All Builtiful runners include the same software as GitHub-hosted runners:

You can see the pre-installed software, as well as their versions at the GitHub Runners image release page.

Docker Support

Docker is pre-installed and running on all runners:

jobs:
  docker-build:
    runs-on: builtiful(ubuntu, cpus=8)
    steps:
      - uses: actions/checkout@v4
      
      - name: Build Docker image
        run: docker build -t myapp:${{ github.sha }} .
      
      - name: Run tests in container
        run: docker run myapp:${{ github.sha }} npm test

Service Containers

Service containers work exactly like GitHub-hosted runners:

jobs:
  integration-test:
    runs-on: builtiful(ubuntu, cpus=4)
    
    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432
    
    steps:
      - uses: actions/checkout@v4
      - name: Run integration tests
        run: npm run test:integration
        env:
          DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test

Migration Guide

From GitHub-Hosted Runners

Before:

runs-on: ubuntu-latest
runs-on: ubuntu-24.04

After:

runs-on: builtiful(ubuntu)

From Self-Hosted Runners

Before:

runs-on: [self-hosted, linux, x64]

After:

runs-on: builtiful(ubuntu)

Performance Optimization

Right-Size Your Runners

CPU CountRAMUse CaseCost/Min
2~4GBLinting, deployments, simple scriptsLowest
4~8GBStandard builds, unit testsLow
8~16GBLarge projects, integration testsMedium
16~32GBHeavy compilation, parallel testingMedium-High

Caching Best Practices

Use GitHub's cache action for faster builds:

jobs:
  build:
    runs-on: builtiful(ubuntu, cpus=4)
    steps:
      - uses: actions/checkout@v4
      
      - uses: actions/cache@v3
        with:
          path: |
            ~/.npm
            node_modules
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
      
      - run: npm ci
      - run: npm run build

Troubleshooting

Common Issues

Job Stuck in Queue

Possible causes:

  • Typo in runner syntax
  • Invalid parameter values
  • Builtiful app not installed

Check syntax:

# ✅ Correct
runs-on: builtiful(ubuntu, cpus=4)
 
# ❌ Wrong - missing parentheses
runs-on: builtiful-ubuntu-4cpu
 
# ❌ Wrong - invalid parameter
runs-on: builtiful(ubuntu, cpu=4)  # Should be 'cpus'

Invalid Configuration

Common syntax errors:

# ❌ Wrong - quotes around values  
runs-on: builtiful(ubuntu, cpus="4")
 
# ❌ Wrong - invalid distribution
runs-on: builtiful(centos, cpus=4)
 
# ✅ Correct
runs-on: builtiful(ubuntu, cpus=4)

Next Steps