Skip to content
Latchkey

Devcontainer smoke test workflow (rails/rails)

The Devcontainer smoke test workflow from rails/rails, explained and optimized by Latchkey.

C

CI health: C - fair

Point runs-on at Latchkey and get run de-duplication, job timeouts, SHA-pinned actions, self-healing for flaky steps, and up to 58% lower cost, applied automatically.

Grade your own workflow free or run it on Latchkey →
Source: rails/rails.github/workflows/devcontainer-smoke-test.ymlLicense MITView source

What it does

This is the Devcontainer smoke test workflow from the rails/rails repository, a real project running GitHub Actions. It is shown here with attribution under its MIT license.

Below, Latchkey shows a faster, safer version produced by its optimization engine.

The workflow

workflow (.yml)
name: Devcontainer smoke test

on: push

jobs:
  build:
    name: Devcontainer smoke test

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    strategy:
      fail-fast: false

    steps:
      - name: Checkout (GitHub)
        uses: actions/checkout@v7

      - name: Login to GitHub Container Registry
        uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ruby
          bundler-cache: true

      - name: Generate rails app sqlite3
        run: bundle exec railties/exe/rails new myapp_sqlite --database="sqlite3" --dev --devcontainer

      - name: Test devcontainer sqlite3
        uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.1900000417
        with:
          subFolder: myapp_sqlite
          imageName: ghcr.io/rails/smoke-test-devcontainer
          cacheFrom: ghcr.io/rails/smoke-test-devcontainer
          imageTag: sqlite3
          push: ${{ github.repository == 'rails/rails' && 'filter' || 'never' }}
          refFilterForPush: refs/heads/main
          runCmd: bin/rails g scaffold Post && bin/rails db:migrate && bin/rails test

      - name: Stop all containers
        run: docker ps -q | xargs docker stop

      - name: Generate rails app postgresql
        run: bundle exec railties/exe/rails new myapp_postgresql --database="postgresql" --dev --devcontainer

      - name: Test devcontainer postgresql
        uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.1900000417
        with:
          subFolder: myapp_postgresql
          imageName: ghcr.io/rails/smoke-test-devcontainer
          cacheFrom: ghcr.io/rails/smoke-test-devcontainer
          imageTag: postgresql
          push: ${{ github.repository == 'rails/rails' && 'filter' || 'never' }}
          refFilterForPush: refs/heads/main
          runCmd: bin/rails g scaffold Post && bin/rails db:migrate && bin/rails test && bin/rails test:system

      - name: Stop all containers
        run: docker ps -q | xargs docker stop

      - name: Generate rails app mysql
        run: bundle exec railties/exe/rails new myapp_mysql --database="mysql" --dev --devcontainer

      - name: Test devcontainer mysql
        uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.1900000417
        with:
          subFolder: myapp_mysql
          imageName: ghcr.io/rails/smoke-test-devcontainer
          cacheFrom: ghcr.io/rails/smoke-test-devcontainer
          imageTag: mysql
          push: ${{ github.repository == 'rails/rails' && 'filter' || 'never' }}
          refFilterForPush: refs/heads/main
          runCmd: bin/rails g scaffold Post && bin/rails db:migrate && bin/rails test

      - name: Stop all containers
        run: docker ps -q | xargs docker stop

      - name: Generate rails app trilogy
        run: bundle exec railties/exe/rails new myapp_trilogy --database="trilogy" --dev --devcontainer

      - name: Test devcontainer trilogy
        uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.1900000417
        with:
          subFolder: myapp_trilogy
          imageName: ghcr.io/rails/smoke-test-devcontainer
          cacheFrom: ghcr.io/rails/smoke-test-devcontainer
          imageTag: trilogy
          push: ${{ github.repository == 'rails/rails' && 'filter' || 'never' }}
          refFilterForPush: refs/heads/main
          runCmd: bin/rails g scaffold Post && bin/rails db:migrate && bin/rails test

      - name: Stop all containers
        run: docker ps -q | xargs docker stop

The same workflow, on Latchkey

Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.

name: Devcontainer smoke test
 
on: push
 
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
  build:
    timeout-minutes: 30
    name: Devcontainer smoke test
 
    runs-on: latchkey-small
    permissions:
      contents: read
      packages: write
    strategy:
      fail-fast: false
 
    steps:
      - name: Checkout (GitHub)
        uses: actions/checkout@v7
 
      - name: Login to GitHub Container Registry
        uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}
 
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ruby
          bundler-cache: true
 
      - name: Generate rails app sqlite3
        run: bundle exec railties/exe/rails new myapp_sqlite --database="sqlite3" --dev --devcontainer
 
      - name: Test devcontainer sqlite3
        uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.1900000417
        with:
          subFolder: myapp_sqlite
          imageName: ghcr.io/rails/smoke-test-devcontainer
          cacheFrom: ghcr.io/rails/smoke-test-devcontainer
          imageTag: sqlite3
          push: ${{ github.repository == 'rails/rails' && 'filter' || 'never' }}
          refFilterForPush: refs/heads/main
          runCmd: bin/rails g scaffold Post && bin/rails db:migrate && bin/rails test
 
      - name: Stop all containers
        run: docker ps -q | xargs docker stop
 
      - name: Generate rails app postgresql
        run: bundle exec railties/exe/rails new myapp_postgresql --database="postgresql" --dev --devcontainer
 
      - name: Test devcontainer postgresql
        uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.1900000417
        with:
          subFolder: myapp_postgresql
          imageName: ghcr.io/rails/smoke-test-devcontainer
          cacheFrom: ghcr.io/rails/smoke-test-devcontainer
          imageTag: postgresql
          push: ${{ github.repository == 'rails/rails' && 'filter' || 'never' }}
          refFilterForPush: refs/heads/main
          runCmd: bin/rails g scaffold Post && bin/rails db:migrate && bin/rails test && bin/rails test:system
 
      - name: Stop all containers
        run: docker ps -q | xargs docker stop
 
      - name: Generate rails app mysql
        run: bundle exec railties/exe/rails new myapp_mysql --database="mysql" --dev --devcontainer
 
      - name: Test devcontainer mysql
        uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.1900000417
        with:
          subFolder: myapp_mysql
          imageName: ghcr.io/rails/smoke-test-devcontainer
          cacheFrom: ghcr.io/rails/smoke-test-devcontainer
          imageTag: mysql
          push: ${{ github.repository == 'rails/rails' && 'filter' || 'never' }}
          refFilterForPush: refs/heads/main
          runCmd: bin/rails g scaffold Post && bin/rails db:migrate && bin/rails test
 
      - name: Stop all containers
        run: docker ps -q | xargs docker stop
 
      - name: Generate rails app trilogy
        run: bundle exec railties/exe/rails new myapp_trilogy --database="trilogy" --dev --devcontainer
 
      - name: Test devcontainer trilogy
        uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.1900000417
        with:
          subFolder: myapp_trilogy
          imageName: ghcr.io/rails/smoke-test-devcontainer
          cacheFrom: ghcr.io/rails/smoke-test-devcontainer
          imageTag: trilogy
          push: ${{ github.repository == 'rails/rails' && 'filter' || 'never' }}
          refFilterForPush: refs/heads/main
          runCmd: bin/rails g scaffold Post && bin/rails db:migrate && bin/rails test
 
      - name: Stop all containers
        run: docker ps -q | xargs docker stop
 

What changed

1 third-party action is referenced by a movable tag. Pin it to the commit SHA (Latchkey resolves and applies this automatically) so a repointed tag cannot change what runs.

This workflow runs 1 job per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow