Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 19 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Inputs:
Example:
```yaml
- name: Cleanup
uses: RoleModel/actions/test-cleanup@v1
uses: RoleModel/actions/test-cleanup@v3
with:
artifact-prefix: rspec-system
```
Expand All @@ -26,7 +26,7 @@ Inputs:
Example:
```yaml
- name: Analyze test runtimes
uses: RoleModel/actions/test-runtime-analyzer@v1
uses: RoleModel/actions/test-runtime-analyzer@v3
with:
test-output-path: tmp/turbo_rspec_runtime.log
```
Expand All @@ -53,48 +53,47 @@ concurrency:
env:
CI: true
RAILS_ENV: test
HONEYBADGER_SOURCE_MAP_DISABLED: true
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
SECRET_KEY_BASE: 0cb2b4ae6543f334e0eb5bc88bdabc24c9e5155ecb02a175c6f073a5a0d45a45f4a5b7d1288d3b412307bdfa19be441e97960ec4cd344f91f2d06a2595fb239c
SECRET_KEY_BASE: 123 # If you are using encrypted credentials, you'll need to extract this into a GitHub secret.
# Otherwise, the only thing that matters is that the value is not nil.

jobs:
compile_assets:
name: Compile assets
name: Compile Assets
runs-on: blacksmith-4vcpu-ubuntu-2204
timeout-minutes: 5
outputs:
cache-hit: ${{ steps.check-asset-cache.outputs.cache-hit }}
steps:
- name: Checkout code
- name: Checkout Code
uses: actions/checkout@v4

- uses: RoleModel/actions/compile-assets@v2
- uses: RoleModel/actions/compile-assets@v3
id: check-asset-cache

non-system-test:
name: Linting & Ruby Non-System Tests
runs-on: blacksmith-8vcpu-ubuntu-2204
timeout-minutes: 5
needs: compile_assets
# If you have non-system tests that touch the browser, you may need to uncomment the following line.
# needs: compile_assets
services:
postgres:
image: postgres:16
image: postgres:17
ports:
- "5432:5432"
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password

steps:
- name: Checkout code
- name: Checkout Code
uses: actions/checkout@v4

- name: Run shared flow
uses: RoleModel/actions/linting-and-non-system-tests@v2
- uses: RoleModel/actions/linting-and-non-system-tests@v3
with:
linting_step_required: true
linting_step_command: bundle exec rubocop --fail-level warning --display-only-fail-level-offenses --format github
needs-compiled-assets: false # Remove this input if you uncommented `needs: compile_assets` above.

system-test:
name: Ruby System Tests
Expand All @@ -103,25 +102,24 @@ jobs:
needs: compile_assets
services:
postgres:
image: postgres:16
image: postgres:17
ports:
- "5432:5432"
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password

steps:
- name: Checkout code
- name: Checkout Code
uses: actions/checkout@v4

# allows for custom install steps between checkout & test run if needed
- name: Setup vips
run: |
# Custom install steps may be added between checkout & test run if needed. e.g.
# If your application processes ActiveStorage::Variant records you probably need the following step:
- run: |
sudo apt-get update
sudo apt-get install -y libvips

- name: Run shared flow
uses: RoleModel/actions/system-tests@v2
- uses: RoleModel/actions/system-tests@v3
# if you've configured capybara to be compatible with the tmp:clear task
# you can tell the system-tests action like this:
with:
Expand Down
34 changes: 17 additions & 17 deletions compile-assets/action.yml
Original file line number Diff line number Diff line change
@@ -1,53 +1,53 @@
name: 'Compile Assets'
description: 'Compiles Rails assets if not cached'
name: Compile Assets
description: Compiles Rails assets if not cached

outputs:
cache-hit:
description: 'Whether the cache was hit'
description: Whether the cache was hit
value: ${{ steps.check-asset-cache.outputs.cache-hit }}

runs:
using: "composite"
using: composite
steps:
- name: Check if assets are already compiled
- name: Check for Existing Precompiled Assets
id: check-asset-cache
uses: actions/cache/restore@v4
uses: actions/cache/restore@v5
with:
path: |
public/assets
app/assets/builds
key: rails-assets-${{ hashFiles('app/assets/images/**/*', 'app/assets/stylesheets/**/*', 'app/javascript/**/*', 'yarn.lock', 'Gemfile.lock') }}
lookup-only: true

- name: Enable corepack
if: steps.check-asset-cache.outputs.cache-hit != 'true'
- name: Enable Corepack
if: ${{ steps.check-asset-cache.outputs.cache-hit != 'true' }}
shell: bash
run: corepack enable

- name: Set up node
if: steps.check-asset-cache.outputs.cache-hit != 'true'
uses: actions/setup-node@v4
- name: Setup Node
if: ${{ steps.check-asset-cache.outputs.cache-hit != 'true' }}
uses: actions/setup-node@v6
with:
node-version-file: .node-version
cache: yarn

- name: Install Ruby and gems
if: steps.check-asset-cache.outputs.cache-hit != 'true'
- name: Install Ruby and Gems
if: ${{ steps.check-asset-cache.outputs.cache-hit != 'true' }}
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Build assets
if: steps.check-asset-cache.outputs.cache-hit != 'true'
- name: Build Assets
if: ${{ steps.check-asset-cache.outputs.cache-hit != 'true' }}
shell: bash
run: |
yarn install --immutable
bundle exec rails assets:precompile

- name: Cache Rails Precompiled Assets
if: steps.check-asset-cache.outputs.cache-hit != 'true'
if: ${{ steps.check-asset-cache.outputs.cache-hit != 'true' }}
id: lookup-cached-assets
uses: actions/cache/save@v4
uses: actions/cache/save@v5
with:
path: |
public/assets
Expand Down
50 changes: 26 additions & 24 deletions linting-and-non-system-tests/action.yml
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
name: 'Linting & Ruby Non-System Tests'
description: 'Runs linting and non-system Ruby tests'

name: Linting & Ruby Non-System Tests
description: Runs linting and non-system Ruby tests
inputs:
linting_step_required:
description: 'Whether linting is required'
type: boolean
description: Whether linting is required
required: false
default: false
default: 'false'
linting_step_command:
description: 'Command for linting (e.g., "bundle exec rubocop")'
type: string
description: Command for linting (e.g., "bundle exec rubocop")
required: false
default: ''
needs-compiled-assets:
description: Whether to retrieve the Rails asset cache (set to false if your workflow does not depend on the compile-assets workflow)
required: false
default: ""
default: 'true'

runs:
using: "composite"
using: composite
steps:
- name: Enable Corepack
shell: bash
run: corepack enable

- name: Set up node
uses: actions/setup-node@v4
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: .node-version
cache: yarn
Expand All @@ -30,51 +31,52 @@ runs:
shell: bash
run: yarn install --immutable

- name: Install Ruby and gems
- name: Install Ruby and Gems
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Retrieve Cached Rails Assets
id: cache-assets
uses: actions/cache/restore@v4
if: ${{ inputs.needs-compiled-assets == 'true' }}
uses: actions/cache/restore@v5
with:
path: |
public/assets
app/assets/builds
key: rails-assets-${{ hashFiles('app/assets/images/**/*', 'app/assets/stylesheets/**/*', 'app/javascript/**/*', 'yarn.lock', 'Gemfile.lock') }}
fail-on-cache-miss: true

- name: Load previous turbo test runtime stats
- name: Load Previous Turbo-Test Runtime Stats
id: restore-parallel-spec
uses: actions/cache/restore@v4
uses: actions/cache/restore@v5
with:
path: tmp/turbo_rspec_runtime.log
key: parallel-spec-non-system-runtimes-${{ github.sha }}_${{ github.run_attempt }}
restore-keys: parallel-spec-non-system-runtimes-

- name: Setup parallel databases
- name: Setup Parallel Databases
shell: bash
run: bundle exec rake parallel:create parallel:load_schema

- name: Rspec tests
shell: bash
run: bundle exec parallel_rspec --verbose --exclude-pattern "/system/"

- name: Linting
if: ${{ inputs.linting_step_required }}
if: ${{ inputs.linting_step_required == 'true' }}
shell: bash
run: ${{ inputs.linting_step_command }}

- name: Run Rspec Tests
shell: bash
run: bundle exec parallel_rspec --verbose --exclude-pattern "/system/"

- name: Publish Test Results
uses: mikepenz/action-junit-report@v4
uses: mikepenz/action-junit-report@v6
if: success() || failure()
with:
check_name: Test Results
report_paths: tmp/rspec-*.xml
detailed_summary: true

- name: Analyze test runtimes
- name: Analyze Test Runtimes
uses: RoleModel/actions/test-runtime-analyzer@v1
with:
test-output-path: tmp/turbo_rspec_runtime.log
Expand Down
37 changes: 15 additions & 22 deletions system-tests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@ name: Ruby System Tests
description: Runs Ruby system tests
inputs:
failure-screenshot-dir:
description: tmp directory where your tests save failure screenshots to
description: the directory where your test runner saves screenshots on failure
required: false
default: tmp/capybara

runs:
using: "composite"
using: composite
steps:
- name: Setup Chrome
uses: browser-actions/setup-chrome@v1
uses: browser-actions/setup-chrome@v2
id: setup-chrome

- name: Enable Corepack
shell: bash
run: corepack enable

- name: Set up node
uses: actions/setup-node@v4
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: .node-version
cache: yarn
Expand All @@ -27,63 +27,56 @@ runs:
shell: bash
run: yarn install --immutable

- name: Install Ruby and gems
- name: Install Ruby and Gems
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Retrieve Cached Rails Assets
id: cache-assets
uses: actions/cache/restore@v4
uses: actions/cache/restore@v5
with:
path: |
public/assets
app/assets/builds
key: rails-assets-${{ hashFiles('app/assets/images/**/*', 'app/assets/stylesheets/**/*', 'app/javascript/**/*', 'yarn.lock', 'Gemfile.lock') }}
fail-on-cache-miss: true

# Technically the cache fail-on-cache-miss above should fail this flow...but it doesn't.
# This manually fails the workflow if the cache is not found.
- name: Fail if cache miss
if: steps.cache-assets.outputs.cache-hit != 'true'
shell: bash
run: exit 1

- name: Load previous turbo test runtime stats
- name: Load Previous Turbo-Test Runtime Stats
id: restore-parallel-spec
uses: actions/cache/restore@v4
uses: actions/cache/restore@v5
with:
path: tmp/turbo_rspec_runtime.log
key: parallel-spec-system-runtimes-${{ github.sha }}_${{ github.run_attempt }}
restore-keys: parallel-spec-system-runtimes-

- name: Setup parallel databases
- name: Setup Parallel Databases
shell: bash
run: bundle exec rake parallel:create parallel:load_schema

- name: Rspec tests
- name: Run Rspec Tests
shell: bash
run: bundle exec parallel_rspec --verbose-command spec/system
env:
GOOGLE_CHROME_BIN: ${{ steps.setup-chrome.outputs.chrome-path }}
CAPYBARA_DRIVER: js

- name: Publish Test Results
uses: mikepenz/action-junit-report@v4
uses: mikepenz/action-junit-report@v6
if: success() || failure()
with:
check_name: Test Results
report_paths: tmp/rspec-*.xml
detailed_summary: true

- name: Analyze test runtimes
- name: Analyze Test Runtimes
uses: RoleModel/actions/test-runtime-analyzer@v1
with:
test-output-path: tmp/turbo_rspec_runtime.log

- name: Upload screenshots
- name: Upload Screenshots
if: failure()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: rspec-screenshots
path: ${{ inputs.failure-screenshot-dir }}
Expand Down