Bernard is a Slack incoming webhook setup as a cron job that retrieves all new rules, proposed rules, and presidential documents from the Federal Register. This repo will provide the infrastructure to setup a cron job on an Ubuntu server.
It is named after Bernard Kennedy, the first director of the Federal Register.
The following things are assumed to be true in this documentation.
- You are using Python 2.7.
- You have virtualenv and virtualenvwrapper installed and working.
For more details our stack, see our development environment blog post.
The project contains the following folders and important files:
fabfile
-- Fabric commands for automating setup, deployment, data processing, etc.app_config.py
-- Global project configuration for scripts, deployment, etc.crontab
-- Cron jobs to be installed as part of the project.requirements.txt
-- Python requirements.run_on_server.sh
-- Shell script to run at the beginning of cron jobs to source environment variables and virtual environments.
cd bernard
mkvirtualenv bernard
pip install -r requirements.txt
Project secrets should never be stored in app_config.py
or anywhere else in the repository. Instead, always store passwords, keys, etc. in environment variables and document that they are needed here in the README.
Any environment variable that starts with $PROJECT_SLUG_
will be automatically loaded when app_config.get_secrets()
is called.
To connect Bernard to your Slack, you will need to create an incoming webhook and copy the webhook endpoint to an environment variable called bernard_WEBHOOK
.
- Run
fab staging master servers.setup
to configure the server. - Run
fab staging master deploy
to deploy the project to the server. Note that this will also install your crontab.
Cron jobs are defined in the file crontab
. Each task should use the run_on_server.sh
shim to ensure the project's virtualenv is properly activated prior to execution. For example:
* * * * * ubuntu bash /home/ubuntu/apps/bernard/repository/cron.sh fab $DEPLOYMENT_TARGET cron_jobs.test >> /var/log/bernard/crontab.log 2>&1
The cron jobs themselves should be defined in fabfile/cron_jobs.py
whenever possible.
To install the cronjob, run either fab staging master deploy
, which will also synchronize the repo with the latest on Github, or fab staging master servers.install_crontab
to simply copy the crontab on the server to etc/cron.d
.
To uninstall the cronjob (a recommended practice for disabling the job), run fab staging master servers.uninstall_cronjob
.