Categories
Code Ruby Testing

Gitlab CI Setup with Rails

I had a few problems getting up and running with docker-based gitlab-ci builds, so here’s a description of my setup. I’m using gitlab.com (not self-hosted) and their hosted CI at ci.gitlab.com BUT I am using private build runners on my own Ubuntu 14.04 server.

Installation

This is a bit vague because I did this a few weeks ago but here’s what I remember

  1. Install gitlab-ci-multi-runner from the apt repo (Instructions)
  2. Install docker using the same instructions

Runner Config

  1. Enter your gitlab-ci URL and the key from the /runners page in gitlab-ci
  2. If you have execjs in your Gemfile.lock, you should specify your docker image as mwallasch/docker-ruby-node. Otherwise you can use ruby:2.2
  3. You can add tags on a runner via the web settings in CI. I couldn’t find how to do it from the config file.
  4. Speaking of config files, the multi-runner is installed as root so look at /etc/gitlab-runner/config.toml. My final one looks kind of like this:
    concurrent = 1
    
    [[runners]]
      name = "docker-runner-1"
      url = "https://ci.gitlab.com/"
      token = "XXXXXXXXXXXXXXXXXXXXXX"
      limit = 1
      executor = "docker"
      [runners.docker]
        image = "mwallasch/docker-ruby-node"
        privileged = false
        volumes = ["/cache"]
        services = ["postgres:latest", "redis:latest"]
    

    See that volume? The default config wizard added that, we’ll use it later.

Project Config

  1. Add .gitliab-ci.yml in your rails project.
    # Run before each script
    before_script:
      - gem install bundler
      - touch log/application.log
      - touch log/test.log
      - bundle install --jobs $(nproc) --path=/cache/bundler
      - cp config/database.gitlab-ci.yml config/database.yml
      - "bundle exec rake db:create RAILS_ENV=test"
      - "RAILS_ENV=test bundle exec rake db:reset"
    
    job1:
        script: "bundle exec rspec"
        tags:
            - ruby
            - postgres
            - docker
    
    • I added some tags here and setup my runner with matching tags in the CI web config. Note that I have a specific database.yml just for the CI environment, since we’re using docker services for postgres and redis (more below)
    • Note --jobs $(nproc) to speed up bundle installation.
    • Note --path=/cache/bundler which puts the gems on the persistent cache volume configured in config.toml
  2. Set up the database config. In config/database.gitlab-ci.yml:
    
    test: &test
      adapter: postgresql
      pool: 5
      timeout: 5000
      host: postgres
      database: mydbname
      user: postgres
    
    

Took some pain to get here but I do like that I can own the hardware the builds run on.

Categories
Code Javascript Testing

Async Testing With Jasmine and MooTools

Another post over on the Harry’s engineering blog about testing asynchronous MooTools code in Jasmine.