Setting up Ruby on Rails app to use Bitbucket Pipelines to run system tests
Asked by Paul Chesterton:

Hello! I have a Ruby on Rails app that I'm using bitbucket pipelines to deploy to Heroku. I have tests in the app that use minitest, capybara, selenium, and webdrivers. For system tests, I have an application_system_test_case.rb file with this class that specifies the headless chrome browser and the system test files inherit from it:

```
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
end
```

I've gotten the normal tests (model, controller, helper, etc) to successfully run in the pipeline, but if I try to run the system tests, I get errors related to the chrome browser not running properly. I've tried various ideas, but haven't been able to get it to work. Here is my bitbucket-pipelines.yml:

```
image: ruby:2.6.6
pipelines:
  branches:
    dev:
      - step:
        name: Deploy dev branch
        deployment: test
        caches:
          - bundler
          - yarn
        script:
          # install nodejs & yarn
          - apt-get update && apt-get install -y build-essential nodejs
          - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
          - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
          - apt-get update
          - apt-get install -y yarn
          - yarn install
          # install gems
          - gem install rails
          - bundle install --path vendor/bundle
          # set up postgres
          - export DATABASE_URL=postgresql://test_user:test_user_password@localhost/pipelines
          - bundle exec rake db:create db:migrate --trace RAILS_ENV=test
          - bundle exec rails test
          - git push [to server]
        services:
          - postgres
definitions:
  caches:
    bundler: ./vendor
    yarn: ./node_modules
  services:
    postgres:
      image: postgres
  environment:
    POSTGRES_DB: pipelines
    POSTGRES_USER: test_user
    POSTGRES_PASSWORD: test_user_password
```

Anyone know how to get this to work?


Answers:
author: Lee Whittaker
body: Hello,

I stumbled upon this post looking for an answer to this exact question.

I have spent the last two days trying and debugging various techniques to get this working for me, and I'm happy to say it finally works.

The issue with Chrome is that it crashes when run with a root user.

How I solved it was to use the following Dockerfile, push it to Docker and use it as the pipeline image

```
FROM ruby:3.1.3

# Set the TERM environment variable
ENV TERM=xterm

# Install dependencies
RUN apt-get update -qq && apt-get install -y \
postgresql \
postgresql-contrib \
curl

# Install Chrome
RUN curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN apt-get update && apt-get install -y google-chrome-stable


# Install Yarn
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update && apt-get install -y yarn

# Clean up
RUN apt-get autoremove -y && apt-get clean

# Set work directory in container
WORKDIR /myapp

# Copy the rest of the application into the work directory
COPY . /myapp

# Install Bundler
RUN gem install bundler -v 2.3.7
RUN bundle config set --global path "vendor/bundle"

# Change user
RUN useradd -ms /bin/bash appuser
RUN chown -R appuser:appuser /myapp /usr/local/bundle
USER appuser
```

This was useful to me because I was running many tests in parallel, so the Docker image saved me load times.   

You may be able to run "useradd" and "chown" and set the user as steps in your bitbucket-pipeline.yml, but I haven't tried that myself.  

**EDIT:** You may also note the "# Install Chrome" section that may be necessary to make sure it's present in your build.


Tags: bitbucket-cloud

bitbucket-pipelines

chrome

cloud

rails

ruby

selenium

test