Skip to content

Advanced Workflow Scenarios

1. Cost Optimization: On-Demand for Releases, Spot for CI

Scenario - one workflow uses spot instances, another on-demand (good for critical workflows - ie. release). Each workflow will provision runners with its specified usage-class.

Sample Refresh Configuration (.github/workflows/refresh.yml)

Your refresh.yml remains standard. It manages the overall pool and AWS resources.

# .github/workflows/refresh.yml
name: Refresh Runner Pool
# ... (standard refresh configuration as in previous examples) ...
on:
  workflow_dispatch:
  schedule:
    - cron: "*/15 * * * *"

jobs:
  refresh_job:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1 # Or your desired region
      - name: Refresh EC2 Runner Pool
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: refresh
          github-token: ${{ secrets.GH_PAT }}
          ami: ami-xxxxxxxxxxxxxxxxx # Your chosen AMI ID
          iam-instance-profile: YourInstanceProfileName
          security-group-ids: sg-xxxxxxxxxxxxxxxxx
          subnet-ids: subnet-xxxxxxxxxxxxxxxxx subnet-yyyyyyyyyyyyyyyyy

CI Workflow with Spot Instances (.github/workflows/main-ci.yml)

This workflow provisions cost-effective spot instances for routine CI tasks.

# .github/workflows/main-ci.yml
name: Main CI (Spot Instances)

on:
  pull_request:
  push:
    branches: [main, develop]

jobs:
  provision_spot_runners:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS Credentials
        # ... (AWS credentials configuration) ...
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Provision Spot Runners for CI
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: provision
          instance-count: 3
          usage-class: spot # <----

  build_and_test:
    needs: provision_spot_runners
    runs-on: ${{ github.run_id }} # Uses runners provisioned for this workflow run
    strategy:
      matrix:
        node-version: [18, 20]
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Use Node.js ${{ matrix.node-version }}
        # ... (setup node) ...
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby-version }}
      - name: Build and Test
        run: |
          echo "Running CI on spot instances..."
          # Your build and test commands

  release_spot_runners:
    needs: [provision_spot_runners, build_and_test]
    runs-on: ubuntu-latest
    if: ${{ always() }}
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Release Spot Runners
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: release

Release Workflow with On-Demand Instances (.github/workflows/release.yml)

This workflow provisions reliable on-demand instances for critical release tasks.

# .github/workflows/release.yml
name: Release Workflow (On-Demand)

on:
  workflow_dispatch: # Manual trigger for releases
  push:
    tags:
      - 'v*' # Trigger on version tags

jobs:
  provision_ondemand_runners:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS Credentials
        # ... (AWS credentials configuration) ...
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Provision On-Demand Runners for Release
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: provision
          instance-count: 1
          usage-class: on-demand
          allowed-instance-types: "m5.large" # Specific, reliable type
          max-runtime-min: 120 # Potentially longer timeout for deployments

  deploy_production:
    needs: provision_ondemand_runners
    runs-on: ${{ github.run_id }} # Uses on-demand runner from this workflow's pool
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Deploy to Production
        run: echo "Deploying to production using an on-demand runner..."
        # Your deployment script

  release_ondemand_runners:
    needs: [provision_ondemand_runners, deploy_production]
    runs-on: ubuntu-latest
    if: ${{ always() }}
    steps:
      - name: Configure AWS Credentials
        # ... (AWS credentials configuration) ...
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Release On-Demand Runners
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: release

2. Specialized Environments: Custom CPU Resource Classes

To use runners with different CPU/memory profiles for various tasks (e.g., standard builds vs. CPU-intensive computations), you can define custom resource classes and provision them in separate workflow files.

Sample Refresh Configuration with Custom Resource Classes (.github/workflows/refresh.yml)

Define resource-class-config in your refresh.yml to specify your custom CPU and memory configurations.

# .github/workflows/refresh.yml
name: Refresh Runner Pool with Custom CPU Classes

on:
  workflow_dispatch:
  schedule:
    - cron: "*/15 * * * *"

jobs:
  refresh_job:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Refresh EC2 Runner Pool
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: refresh
          github-token: ${{ secrets.GH_PAT }}
          ami: ami-general-purpose-xxxxxxxx # A general-purpose AMI suitable for all tasks
          iam-instance-profile: YourInstanceProfileName
          security-group-ids: sg-xxxxxxxxxxxxxxxxx
          subnet-ids: subnet-xxxxxxxxxxxxxxxxx
          resource-class-config: |
            {
              "standard-compute": { "cpu": 2, "mmem": 4096 },
              "high-cpu-compute": { "cpu": 8, "mmem": 16384 }
            }
          # Broad allowed-instance-types; specific workflows can refine this
          allowed-instance-types: "c* m* r*"

Standard Compute Workflow (.github/workflows/ci-standard.yml)

This workflow provisions standard-compute runners for general CI tasks.

# .github/workflows/ci-standard.yml
name: Standard Compute CI

on:
  pull_request:

jobs:
  provision_standard_runners:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Provision Standard Compute Runners
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: provision
          instance-count: 2
          resource-class: "standard-compute"
          # Optional: Refine instance types if needed, e.g., general purpose
          allowed-instance-types: "m6* m5*"

  run_standard_tasks:
    needs: provision_standard_runners
    runs-on: ${{ github.run_id }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Execute standard build and test
        run: echo "Running standard CI tasks on 'standard-compute' runners..."

  release_standard_runners:
    needs: [provision_standard_runners, run_standard_tasks]
    runs-on: ubuntu-latest
    if: ${{ always() }}
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Release Standard Compute Runners
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: release

High CPU Compute Workflow (.github/workflows/ci-high-cpu.yml)

This workflow provisions high-cpu-compute runners specifically targeting CPU-optimized instance families for intensive tasks.

# .github/workflows/ci-high-cpu.yml
name: High CPU Compute Workflow

on:
  workflow_dispatch: # e.g., for nightly computationally intensive jobs

jobs:
  provision_high_cpu_runners:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Provision High CPU Runners
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: provision
          instance-count: 1
          resource-class: "high-cpu-compute"
          # Target CPU-optimized instance families
          allowed-instance-types: "c6a.2xlarge c7g.2xlarge c5.2xlarge"

  run_intensive_computation:
    needs: provision_high_cpu_runners
    runs-on: ${{ github.run_id }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Execute CPU-intensive task
        run: |
          echo "Starting CPU-intensive computation on 'high-cpu-compute' runner..."
          # Your computationally demanding script or program

  release_high_cpu_runners:
    needs: [provision_high_cpu_runners, run_intensive_computation]
    runs-on: ubuntu-latest
    if: ${{ always() }}
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@main
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - name: Release High CPU Runners
        uses: fleet-actions/ec2-runner-pool-manager@main
        with:
          mode: release