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?
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.