Rodbot plugin – GitHub webhook

Pipeline event announcements from GitHub

Preparation

The Rodbot app binds to localhost by default which cannot be reached from GitHub. Make sure this connection is possible by setting a different IP in config/rodbot.rb:

app do
  host '0.0.0.0'
end

To authenticate the webhook calls from GitHub, create a new random secret token:

ruby -r securerandom -e "puts SecureRandom.alphanumeric(20)"

Configure this plugin in config/rodbot.rb:

plugin :github_webhook do
  secret_tokens '<TOKEN>'
end

You can set any number of secure tokens here separated with colons.

Activation

Add a webhook to every GitHub repository you'd like to see pipeline event announcements for. Go to https://github.com/<USER>/<REPO>/settings/hooks and create a new webhook with the following properties:

  • Payload URL: https://<RODBOT-APP>/github_webhook
  • Content type: application/json
  • Secret: <TOKEN>
  • SSL verification: (o) Enable SSL verification
  • Which events? (o) Let me select individual events: [x] Workflow runs
  • And... [x] Active

Use the test tool to verify your setup and to see what the JSON payloads look like in case you'd like to customize the handler.

Customization

You can change how the plugin reacts to which webhook requests by configuring a custom handler proc. Here's the default one:

plugin :github_webhook do
  handler ->(request) do
    if request.env['HTTP_X_GITHUB_EVENT'] == 'workflow_run'
      json = JSON.parse(request.body.read)
      project = json.dig('repository', 'full_name')
      status = json.dig('workflow_run', 'status')
      status = json.dig('workflow_run', 'conclusion') if status == 'completed'
      emoji = case status
        when 'requested' then '🟡'
        when 'success' then '🟢'
        when 'failure' then '🔴'
        else '⚪️'
      end
      [emoji, project, status.gsub('_', ' ')].join(' ')
    end
  end
end