I love hubot and use one in a few different places. One thing I do find though is that I often want to edit or evolve those plugins, and it seems somehow unethical to just hardcode my changes into my own repo. Once I figured out how to wire together a forked repo as a submodule, it became much easier to work with hubots with external plugins, so I thought I'd share my recipe for that.
Plugins as Submodules
Git submodules can get messy if you're not totally clear on what is going on. The basic premise is this: there's a git repo in your subdirectory, and the parent directory will notice if things change in there. You need to remember to commit and push on both the main repo and the submodule and then everything will work! The git-scm reference for this has good examples: http://git-scm.com/book/en/v2/Git-Tools-Submodules>http://git-scm.com/book/en/v2/Git-Tools-Submodules
In this case, I've got my own fork of the github notifier plugin which we use in the #joind.in channel on freenode. My fork lives here: https://github.com/lornajane/hubot-github-repo-event-notifier so I go there, and I grap the repo URL.
Then, I add it as a submodule. I've created a directory called
my_modules inside my hubot folder to keep submodules in.
git submodule add my_modules/hubot-github-repo-event-notifier https://github.com/lornajane/hubot-github-repo-event-notifier.git
There are two particular things to notice about this command:
- It is run from the top level of the repo, not the subdirectory
- It uses the https version of the URL - I usually work with SSH for github, but if you're going to push to heroku, the https one makes more sense there
Tell Hubot About The Plugin
To get hubot to "see" this plugin, create a symlink in the
scripts/ directory that points to the script you want to run in your plugin. My command looks like this:
ln -s ../my_modules/hubot-github-repo-event-notifier/index.coffee gh-notifier.coffee
Now when you run hubot, the plugin should load. You can easily test your hubot locally (without having to commit and push to heroku every time) by running
./bin/hubot from the commandline; this starts hubot with the shell adapter and is really hand for the types of commands where you say something and the bot does something. I have a trick for testing webhooks on my local machine that I'll share in a separate blog post but the main thing is, any really basic mistakes like syntax errors will become obvious at this point :)
Submodules to Heroku
There isn't anything special to do here. Make sure that both your main and submodule repositories have changes added, committed and pushed. When you push the main repo to heroku, it knows how to handle the submodules and will plug them in accordingly.
I love that so many of the hubot plugins are packaged via npm but often I want to tweak or evolve them - or even just take advantage of their newest changes without waiting for it to be packaged! The github integration in particular I found was a lot less useful than I expected from any of the plugins I could find, so if you're using hubot and github and you want to try my version, feel free ... the main reason I wanted to work with submodules and hubot is so that I could share what I was working on in case it was useful to anyone else.