Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge pull request #97 from jsocol/master

Add Mozilla infra scripts
  • Loading branch information...
commit d8044b1d11ac24ba54e418539b43eeeb89a7257a 2 parents 6bb6696 + b442103
Dave Dash authored
View
20 bin/crontab/crontab.tpl
@@ -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
View
42 bin/crontab/gen-crons.py
@@ -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()
View
14 bin/update/commander_settings.py-dist
@@ -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
View
137 bin/update/deploy.py
@@ -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()
Please sign in to comment.
Something went wrong with that request. Please try again.