Orbtoberfest by CircleCI

Screen Shot 2019-10-16 at 3.58.03 PM.png

CircleCI put on an event in Seattle to promote their open Orb registry. Orbs are their shared configuration format that allows you to write a CircleCI configuration for a job that anyone can use. This was possible before Orbs by sharing a bit of YAML that you could copy into your existing CircleCI config, but now you can reference the Orb by name and leave the rest up to the Orb. They call it Orbtoberfest which is kinda cute.

The simplest Orb YAML file looks like:

version: 2.1
description: Hello World Orb

commands:
  hello-world:
    description: say hello world
    steps:
    - run:
        command: echo Hello, World
        name: hello-world

examples:
  hello-world:
    description: Say hello
    usage:
      orbs:
        hello-world: hparker/hello-world@x.y.z
      version: 2.1
      workflows:
        test:
          jobs:
          - hello-world/hello-world
        version: 2

executors:
  ruby:
    docker:
    - image: circleci/ruby:2.4.2-jessie-node
jobs:
  hello-world:
    description: Say hello world
    executor: << parameters.executor >>
    parameters:
      executor:
        default: ruby
        description: executor for hello world
        type: executor
    steps:
    - hello-world

Someone can add this to their existing config with,

orbs:
  hello-world: hparker/hello-world@0.0.1

version: 2.1

test:
    docker:
      - image: rubylang/ruby:latest

workflows:
  test:
    jobs:
    - hello-world/hello-world
  version: 2

You can save arbitrarily large and complicated bits of configuration from your CircleCI

Surprisingly helpful #

During the event, I wanted to release an Orbs for some of the popular ruby linting libraries. While working on that, I made a mistake. I made my config say,

jobs:
  reek:
    description: Checkout code and run Reek
    executor: << parameters.executor >>
    parameters:
      executor:
        default: ruby
        description: executor for reek
        type: executor
      options:
        default:
        description: CLI options
        type: string
      version:
        default: ""
        description: Reek version
        type: string

Under options: I left the default line empty. I thought this would add an empty string default, which it doesn’t. This makes the field required. So now, if I call the reek Orb from my project’s config,

orbs:
  hello-world: hparker/reek@0.0.1

version: 2.1

test:
    docker:
      - image: rubylang/ruby:latest

workflows:
  test:
    jobs:
    - reek/reek
  version: 2

validating my circle config will actually tell me that I didn’t pass the required argument!

$ CircleCI config validate .circleci/config.yml
Error: Error calling workflow: 'test'
Error calling job: 'reek/reek'
Missing required argument(s): options

This is a bit of effort put into making Orbs easier to use that I really appreciate. I assumed that validating your config would just check that it is syntactically correct, but it actually knows the contract provided by the Orb. I was pleasantly surprised that CircleCI put in the extra effort to make that work.

Why are Orbs cool? #

I am actually excited for more projects to adopt Orbs. Orbs allow open source tools to more easily provide a service equivalent to closed source alternatives. Now instead of paying someone to run a linter and code analysis tools over your code, the open source project can provide an Orb to run and integrate with your CI as easily as closed source solutions.

You can see the Orbs I created on the registry under hparker Please feel free to use them in your projects and contribute changes you might want.

Huge thanks to the author of the RuboCop Orb which I took most of my inspiration from.

 
5
Kudos
 
5
Kudos

Now read this

Uncovering Ruby Bytecode Patterns

Since Ruby 1.9, Ruby runs your code in a bytecode VM. That means that the ruby compiler converts your code to a series of bytecode instructions. For example, ruby --dump=insns -e '5 * 10' == disasm: #<ISeq:<main>@-e:1... Continue →