Hercules
Very simple deployment tool. It was made to deploy rails applications using github, bundler.
Features
- Parses github post-receive http hook.
- Executes a custom pre-deploy script and a post-deploy.
- Installs gems using Bundler (http://gembundler.com/)
- Uses the eventmachine http server, little dependencies, simple code.
Roadmap
- Allow end users to ask for redeploy.
- Allow end user to rollback deployments.
- Change checkout color according to deployment status.
- Show commit messages with the checkout sha1.
- Implement on_error trigger.
- Put some code ready for sending emails (to be used inside on_error triggers).
- Display time in a military fashion
Installation
For now you have to clone the repository hercules and run in the application root directory:
$ gem install hercules
$ hercules --help
Take a look at tests/fixtures/config.yml for a sample configuration file and at tests/fixtures/deployer_true.rb for a sample deployer script. Very important: Hercules does not work with bundler 0.9.
Installing the service hook in your github project
It is necessary to notify hercules whenever changes are made to your project's repository. So we need to setup some service hooks in the github admin interface (which you can access using the "admin" button in your github project page).
In your project's github admin interface, go to "service hooks" -> Post-Receive URLs.
Then you put the URL that will call hercules in the blank textbox and click "Update Settings".
Your URL should look like:
http://yourdomain.tld/github/security_token
Where github is a constant string, and security token is a string that you will put inside the config.yml.
You will need only one service hook for each server you want to deploy to. When you deploy several branches to the same server hercules will diferentiate between them through the information that github sends along with the notification.
The deploy hooks
The deployer scripts should be inside lib/hercules_triggers.rb Hercules implements two deploy hooks so far: before_deploy and after_deploy. They should be coded inside a module called Hercules in a class Triggers as class methods, moreover they receive an options parameter which contains: the path key with the complete deployment path, the branch key with the name of the branch to be deployed, and the shell key with a CommandRunner object to execute shell commands during deploy. If you do not have a Hercules module you can use the file lib/hercules_tiggers.rb and it will be ignored by the deployer.
module Hercules
class Triggers
def self.before_deploy()
[:shell].run "cp config/database.sample.yml config/database.yml"
end
def self.after_deploy()
[:shell].run "kill -HUP `cat /var/run/unicorn/development.pid`"
end
end
end
Canceling the deploy
If the before_deploy hook returns anything that evaluate as false the deploy will be cancelled.
The return value of after_deploy is ignored.
Also, you can create a Triggers class without all the hooks, only the implemented ones will be called.
module Hercules
class Triggers
def self.before_deploy()
# This will cancel the deploy
false
end
end
end
The JSON interface
You can check the deployment's status of your projects using GET requests. If you access the address where hercules is listening (defaults to 0.0.0.0:49456) in a web browser you can ask for a project and get a JSON with the deployment's status. For example, assuming I have the project test_project with the token "abc" using the default configuration I can see its deployment status with:
curl http://localhost:49456/test_project/abc
The HDI
There is a very simple web interface that relies on javascript to parse and present the JSON. The plan is to improve this interface over time. This web interface is unique for each project, you can access our example project's HDI in http://localhost:49456/test_project/abc/hdi