DEV Community

loading...

Ruby Gems CI using GitHub Action

pikachuexe profile image PikachuEXE ・4 min read

Travis CI is probably "gone" for Open Source Projects.

And for small ruby gem projects I think GitHub Action is enough.

Some other articles if you want to read more about Travis CI:

GitHub Action Official Doc:
https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions

TL;DR

Wait shouldn't that be put at the end?
Anyway here is my version of workflow.

For most basic testing like rspec,

Create .github/workflows/tests.yaml
Taken from One of my own gem's GitHub Action config

name: Tests

on:
  pull_request:
    branches:
      - master
    paths-ignore:
      - 'README.md'
  push:
    branches:
      - master
    paths-ignore:
      - 'README.md'


jobs:
  unit_tests:
    name: Unit Tests
    if: "contains(github.event.commits[0].message, '[ci skip]') == false"
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu
        ruby:
          - 2.4
          - 2.5
          - 2.6
          - 2.7
        gemfile:
          - gemfiles/contracts_15_0.gemfile
          - gemfiles/contracts_16_0.gemfile
        allow_failures:
          - false
        include:
          - os: ubuntu
            ruby: ruby-head
            gemfile: gemfiles/contracts_16_0.gemfile
            allow_failures: true
    env:
      BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
      ALLOW_FAILURES: "${{ matrix.allow_failures }}"
    runs-on: ${{ matrix.os }}-latest
    continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby }}
          bundler-cache: true
      - name: Test
        run: bundle exec rake spec || $ALLOW_FAILURES
Enter fullscreen mode Exit fullscreen mode

GitHub Action Config with comment

OK You got some more time to read
Let me post one with comments inside

# Just the workflow name, you will see this on project's action tab
# Do give it a good name and stick to it
name: Tests

# When do you want this workflow to run
# https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#on
on:
  # On pull request
  pull_request:
    # For some branches only (base branch)
    branches:
      - master
    # Don't run if changes only include these files
    paths-ignore:
      - 'README.md'
  # On push
  push:
    # For some branches only (base branch)
    branches:
      - master
    # Don't run if changes only include these files
    paths-ignore:
      - 'README.md'

jobs:
  # `unit_tests` is the job id here & can be renamed
  unit_tests:
    name: Unit Tests
    # Emulates Travis skip build on `[ci skip]` in commit message
    # But you can customize this or just remove it
    if: "contains(github.event.commits[0].message, '[ci skip]') == false"
    strategy:
      # Depends on whether you want to see result of all spawned jobs when one failed
      fail-fast: false
      # This is like Travis CI
      # But the keys can be renamed except a few keywords
      matrix:
        os:
          - ubuntu
        ruby:
          - 2.4
          - 2.5
          - 2.6
          - 2.7
        gemfile:
          - gemfiles/contracts_15_0.gemfile
          - gemfiles/contracts_16_0.gemfile
        allow_failures:
          - false
        # Part of a technique to allow some jobs to fail
        include:
          - os: ubuntu
            ruby: ruby-head
            gemfile: gemfiles/contracts_16_0.gemfile
            allow_failures: true
    env:
      # Required for action `ruby/setup-ruby` & other steps with bundler
      BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
      # Part of a technique to allow some jobs to fail
      ALLOW_FAILURES: "${{ matrix.allow_failures }}"
    runs-on: ${{ matrix.os }}-latest
    # Actually unnecessary if we use `allow_failures` technique
    continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup Ruby
        # NOT `action/setup-ruby` which is deprecated
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby }}
          # With this option enabled
          # Running `bundle install` is not needed since it's included
          bundler-cache: true
      - name: Test
        # `$ALLOW_FAILURES` is part of a technique to allow some jobs to fail
        run: bundle exec rake spec || $ALLOW_FAILURES
Enter fullscreen mode Exit fullscreen mode

Replacement for allow-failure on Travis CI

This one is tricky.

Currently (2020-11-20) I am not aware of any complete replacement allow-failure on GitHub Action.

Related:

A close one would be like the allow_failures I put above.

Any job with allow_failures: true would look passed due to $ALLOW_FAILURES.

However there is no place that shows the test or whatever command run failed unless you look into the log.

But using continue-on-error would make the Check shown as failed (even we allow it to fail). This is not good looking in Pull Request UI & some project even require all Checks to be passed before merging a PR (sometimes auto merging).

This is a design issue so we have to wait.

Replacement of Cron Jobs on Travis CI

Nothing special just read the doc

https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows#scheduled-events

Fixing coverage report on Coverall

I don't use Coverall on every gem I have (maybe I should)
Use these as examples:

Basically generate the coverage reports using simplecov-lcov and upload via action coverallsapp/github-action@master.

Gotcha on $stdout

GitHub Action's runner (the one that runs all the action/commands) has $stdout.tty? == false

This is the one that took me some time to figure out when migrating gem-release to GitHub Action

Discussion (0)

pic
Editor guide