forked from mozilla/playdoh
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Merge pull request mozilla#97 from jsocol/master
Add Mozilla infra scripts
- Loading branch information
Showing
4 changed files
with
213 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# | ||
# {{ header }} | ||
# | ||
|
||
# MAILTO=some-email-list | ||
|
||
HOME=/tmp | ||
|
||
# Every minute! | ||
* * * * * {{ cron }} | ||
|
||
# Every hour. | ||
42 * * * * {{ django }} cleanup | ||
|
||
# Every 2 hours. | ||
1 */2 * * * {{ cron }} something | ||
|
||
# Etc... | ||
|
||
MAILTO=root |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#!/usr/bin/env python | ||
import os | ||
from optparse import OptionParser | ||
|
||
from jinja2 import Template | ||
|
||
|
||
HEADER = '!!AUTO-GENERATED!! Edit bin/crontab/crontab.tpl instead.' | ||
TEMPLATE = open(os.path.join(os.path.dirname(__file__), 'crontab.tpl')).read() | ||
|
||
|
||
def main(): | ||
parser = OptionParser() | ||
parser.add_option('-w', '--webapp', | ||
help='Location of web app (required)') | ||
parser.add_option('-u', '--user', | ||
help=('Prefix cron with this user. ' | ||
'Only define for cron.d style crontabs.')) | ||
parser.add_option('-p', '--python', default='/usr/bin/python2.6', | ||
help='Python interpreter to use.') | ||
|
||
(opts, args) = parser.parse_args() | ||
|
||
if not opts.webapp: | ||
parser.error('-w must be defined') | ||
|
||
ctx = {'django': 'cd %s; %s manage.py' % (opts.webapp, opts.python)} | ||
ctx['cron'] = '%s cron' % ctx['django'] | ||
|
||
if opts.user: | ||
for k, v in ctx.iteritems(): | ||
ctx[k] = '%s %s' % (opts.user, v) | ||
|
||
# Needs to stay below the opts.user injection. | ||
ctx['python'] = opts.python | ||
ctx['header'] = HEADER | ||
|
||
print Template(TEMPLATE).render(**ctx) | ||
|
||
|
||
if __name__ == '__main__': | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
SRC_DIR = '' | ||
WWW_DIR = '' | ||
|
||
CRON_NAME = '' | ||
|
||
DEPLOY_SCRIPT = '' | ||
REMOTE_UPDATE_SCRIPT = '' | ||
|
||
WEB_HOSTGROUP = '' | ||
CELERY_HOSTGROUP = '' | ||
CELERY_SERVICE = '' | ||
|
||
UPDATE_REF = 'origin/master' | ||
SSH_KEY = None |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
""" | ||
Deploy this project in dev/stage/production. | ||
Requires commander_ which is installed on the systems that need it. | ||
.. _commander: https://github.com/oremj/commander | ||
""" | ||
|
||
import os | ||
import sys | ||
|
||
sys.path.append(os.path.dirname(os.path.abspath(__file__))) | ||
|
||
from commander.deploy import task, hostgroups | ||
import commander_settings as settings | ||
|
||
|
||
@task | ||
def update_code(ctx, tag): | ||
"""Update the code to a specific git reference (tag/sha/etc).""" | ||
with ctx.lcd(settings.SRC_DIR): | ||
ctx.local('git fetch') | ||
ctx.local('git checkout -f %s' % tag) | ||
ctx.local('git submodule sync') | ||
ctx.local('git submodule update --init --recursive') | ||
|
||
|
||
@task | ||
def update_locales(ctx): | ||
"""Update a locale directory from SVN. | ||
Assumes localizations 1) exist, 2) are in SVN, 3) are in SRC_DIR/locale and | ||
4) have a compile-mo.sh script. This should all be pretty standard, but | ||
change it if you need to. | ||
""" | ||
with ctx.lcd(os.path.join(settings.SRC_DIR, 'locale')): | ||
ctx.local('svn up') | ||
ctx.local('./compile-mo.sh .') | ||
|
||
|
||
@task | ||
def update_assets(ctx): | ||
with ctx.lcd(settings.SRC_DIR): | ||
# LANG=en_US.UTF-8 is sometimes necessary for the YUICompressor. | ||
ctx.local('LANG=en_US.UTF8 python2.6 manage.py compress_assets') | ||
|
||
|
||
@task | ||
def update_db(ctx): | ||
"""Update the database schema, if necessary. | ||
Uses schematic by default. Change to south if you need to. | ||
""" | ||
with ctx.lcd(settings.SRC_DIR): | ||
ctx.local('python2.6 ./vendor/src/schematic/schematic migrations') | ||
|
||
|
||
@task | ||
def install_cron(ctx): | ||
"""Use gen-crons.py method to install new crontab. | ||
Ops will need to adjust this to put it in the right place. | ||
""" | ||
with ctx.lcd(settings.SRC_DIR): | ||
ctx.local('python2.6 ./bin/crontab/gen-crons.py -w %s -u apache > ' | ||
'/etc/cron.d/.%' % (settings.WWW_DIR, settings.CRON_NAME)) | ||
ctx.local('mv /etc/cron.d/.%s /etc/cron.d/%s' % | ||
(settings.CRON_NAME, settings.CRON_NAME)) | ||
|
||
|
||
@task | ||
def checkin_changes(ctx): | ||
"""Use the local, IT-written deploy script to check in changes.""" | ||
ctx.local(settings.DEPLOY_SCRIPT) | ||
|
||
|
||
@hostgroups(settings.WEB_HOSTGROUP, remote_kwargs={'ssh_key': settings.SSH_KEY}) | ||
def deploy_app(ctx): | ||
"""Call the remote update script to push changes to webheads.""" | ||
ctx.remote(settings.REMOTE_UPDATE_SCRIPT) | ||
ctx.remote('/bin/touch %s' % settings.REMOTE_WSGI) | ||
|
||
|
||
@hostgroups(settings.CELERY_HOSTGROUP, remote_kwargs={'ssh_key': settings.SSH_KEY}) | ||
def update_celery(ctx): | ||
"""Update and restart Celery.""" | ||
ctx.remote(settings.REMOTE_UPDATE_SCRIPT) | ||
ctx.remote('/sbin/service %s restart' % settings.CELERY_SERVICE) | ||
|
||
|
||
@task | ||
def update_info(ctx): | ||
"""Write info about the current state to a publicly visible file.""" | ||
with ctx.lcd(settings.SRC_DIR): | ||
ctx.local('date') | ||
ctx.local('git branch') | ||
ctx.local('git log -3') | ||
ctx.local('git status') | ||
ctx.local('git submodule status') | ||
ctx.local('python2.6 ./vendor/src/schematic/schematic -v migrations/') | ||
with ctx.lcd('locale'): | ||
ctx.local('svn info') | ||
ctx.local('svn status') | ||
|
||
ctx.local('git rev-parse HEAD > media/revision.txt') | ||
|
||
|
||
@task | ||
def pre_update(ctx, ref=settings.UPDATE_REF): | ||
"""Update code to pick up changes to this file.""" | ||
update_code(ref) | ||
update_info() | ||
|
||
|
||
@task | ||
def update(ctx): | ||
update_assets() | ||
update_locales() | ||
update_db() | ||
|
||
|
||
@task | ||
def deploy(ctx): | ||
install_cron() | ||
checkin_changes() | ||
deploy_app() | ||
update_celery() | ||
|
||
|
||
@task | ||
def update_site(ctx, tag): | ||
"""Update the app to prep for deployment.""" | ||
pre_update(tag) | ||
update() |