Книга: Automation and Monitoring with Hubot: For DevOps and Developers
Назад: GitHub Integration
Дальше: Building And Deploying With Hubot And Jenkins

GitLab Integration

is an open source collaboration platform that you can host on your own servers. It is similar to GitHub and has a nice , which we will explore and integrate with Hubot.

Creating Web Hooks

To create a web hook in GitLab, simply go to projet’s settings and select “Web Hooks” in the menu. Then add web hook URL and tick the checkbox of the payload you want to be delivered.

Warning: GitLab has a bug that , therefore you may see some webhook event duplications.

Pushes

The following script will allow you to subscribe to repository push events using GitLab’s Web Hook. To make it work, add a web hook with http://<hubot.server>:<hubot.port>/gitlab/pushes/pubsub/gitlab.pushes url to any GitLab repo.

scripts/gitlab-pubsub-pushes.coffee


# Description: #   hubot-pubsub based GitLab push notifier # # Dependencies: #   "hubot-pubsub": "1.0.0" # # Commands: #   None # # URLS: #   POST /gitlab/pushes/pubsub/<pubsub-event> # # Authors: #   spajus  module.exports = (robot) ->    robot.router.post "/gitlab/pushes/pubsub/:event", (req, res) ->     res.end('')     event = req.params.event     try       payload = req.body       prefix = ">>> "       if payload.commits.length > 0         merge_commit = false         author = payload.commits[0].author.name         for commit in payload.commits           if commit.author.name != author             merge_commit = true             break         if merge_commit           message = "#{prefix} merged #{payload.commits.length} " +                     "commits on #{payload.repository.name}:" +                     payload.ref.replace('refs/heads/', '')           robot.emit 'pubsub:publish', event, message           if payload.commits.length < 10             for commit in payload.commits               robot.emit 'pubsub:publish', event,                          "  * #{commit.author.name}: #{commit.message} (#{com\ mit.url})"         else           message = "#{prefix}#{payload.commits[0].author.name} " +                     "pushed #{payload.commits.length} commits to " +                     "#{payload.repository.name}:#{payload.ref.replace('refs/h\ eads/', '')}"           robot.emit 'pubsub:publish', event, message           for commit in payload.commits             robot.emit 'pubsub:publish', event, "  * #{commit.message} (#{com\ mit.url})"     catch error       console.log "gitlab-pubsub-pushes error: #{error}. Payload: #{req.body}" 

Script source available at

Example output:

Tomas V.  hubot subscribe gitlab.pushes Hubot     Subscribed 585164 to gitlab.pushes events Hubot     gitlab.pushes: >>> Tomas Varaneckas pushed 1 commits to Andromeda:m\ aster           gitlab.pushes: * Improve planetary defense system (http://gitlab.bo\ tserv.org/spajus/andromeda/commit/1b8f2e53...) 

Issues

To receive Issue notifications, begin by creating a web hook on your target repository. Set webhook url to http://<hubot.server>:<hubot.port>/gitlab/pushes/issues/gitlab.issues and check “Issues events”.

The script:

scripts/gitlab-pubsub-issues.coffee


# Description: #   hubot-pubsub based GitLab issue notifier # # Dependencies: #   "hubot-pubsub": "1.0.0" # # Commands: #   None # # Configuration: #   GITLAB_ROOT_URL #   GITLAB_API_TOKEN # # URLS: #   POST /gitlab/issues/pubsub/<pubsub-event> # # Authors: #   spajus  module.exports = (robot) ->   api_root = "#{process.env.GITLAB_ROOT_URL}/api/v3"   robot.router.post "/gitlab/issues/pubsub/:event", (req, res) ->     res.end('')     event = req.params.event     try       payload = req.body       attribs = payload.object_attributes       project_url = "#{api_root}/projects/#{attribs.project_id}"       robot.http(project_url)         .header('PRIVATE-TOKEN', process.env.GITLAB_API_TOKEN)         .get() (err, res, body) ->           body = JSON.parse(body)           issue_url = "#{body.web_url}/issues/#{attribs.id}"           issue_message = "#{payload.object_kind} #{attribs.state}: #{attribs\ .title}"           message = "#{issue_message} (#{issue_url})"           robot.emit 'pubsub:publish', event, message     catch error       console.log "gitlab-pubsub-issues error: #{error}. Payload: #{req.body}" 

Script source available at

You will have to configure it first. Find your “Private token” in “Account settings” page, then add export GITLAB_ROOT_URL="http://gitlab.your.org" and export GITLAB_API_TOKEN=<your-private-token> to hubot.conf, restart Hubot, subscribe to an appropriate event and give it a try:

Example output:

Tomas V.  hubot subscribe gitlab.issues Hubot     Subscribed 585164 to gitlab.issues events Hubot     gitlab.issues: issue opened: Squadron one out of fuel (http://gitla\ b.botserv.org/spajus/andromeda/issues/3           gitlab.issues: issue closed: Squadron one out of fuel (http://gitla\ b.botserv.org/spajus/andromeda/issues/3) 

Merge Requests

Merge Requests in GitLab is like Pull Requests in GitHub. And you can get notifications about them in your chat as well. The script is nearly identical to the one that handles Issues, but with a few slight differences. If GitLab API was a little more consistent, one script would do.

Merge Requests script’s webhook is set up just like in two scripts above, just check “Merge Request events”, and probably choose a different pubsub event name, like gitlab.merges.

You should also add GITLAB_ROOT_URL and GITLAB_API_TOKEN to your hubot.conf, as described in “Issues” section above. Now, the nearly identical script:

scripts/gitlab-pubsub-merges.coffee


# Description: #   hubot-pubsub based GitLab merge notifier # # Dependencies: #   "hubot-pubsub": "1.0.0" # # Commands: #   None # # Configuration: #   GITLAB_ROOT_URL #   GITLAB_API_TOKEN # # URLS: #   POST /gitlab/merges/pubsub/<pubsub-event> # # Authors: #   spajus  module.exports = (robot) ->   api_root = "#{process.env.GITLAB_ROOT_URL}/api/v3"   robot.router.post "/gitlab/merges/pubsub/:event", (req, res) ->     res.end('')     event = req.params.event     try       payload = req.body       attribs = payload.object_attributes       project_url = "#{api_root}/projects/#{attribs.target_project_id}"       robot.http(project_url)         .header('PRIVATE-TOKEN', process.env.GITLAB_API_TOKEN)         .get() (err, res, body) ->           body = JSON.parse(body)           issue_url = "#{body.web_url}/merge_requests/#{attribs.id}"           issue_message = "#{payload.object_kind} #{attribs.state}: #{attribs\ .title}"           message = "#{issue_message} (#{issue_url})"           robot.emit 'pubsub:publish', event, message     catch error       console.log "gitlab-pubsub-merges error: #{error}. Payload: #{req.body}" 

Script source available at

How it looks in action:

Tomas V.  hubot subscribe gitlab.merges Hubot     Subscribed 585164 to gitlab.merges events Hubot     gitlab.merges: merge_request opened: Add even more phasers (http://\ gitlab.botserv.org/spajus/andromeda/merge_requests/3) 

These scripts should give you a decent starting point for deeper integration with . Try adding author’s name to Merge Request notification. Hint, you will have to query /users/#{author_id} to get that data.

Назад: GitHub Integration
Дальше: Building And Deploying With Hubot And Jenkins