Devcontainer smoke test workflow (rails/rails)
The Devcontainer smoke test workflow from rails/rails, explained and optimized by Latchkey.
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.
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
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
- Run on Latchkey managed runners with one line (
runs-on), which apply the fixes below automatically and self-heal transient failures. This example useslatchkey-small; pick the runner size that fits the job. - Cancel superseded runs when a branch or PR gets a newer push.
- Add a job timeout so a hung step cannot burn hours of runner time.
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.