23
Care and Feeding Care and Feeding of of Large Web Applications Large Web Applications Perrin Harkins Perrin Harkins

Care and Feeding of Large Web Applications

Embed Size (px)

DESCRIPTION

This talk was presented at OSCON 2007 and YAPC::NA 2007.

Citation preview

Page 1: Care and Feeding of Large Web Applications

Care and FeedingCare and Feeding of of Large Web ApplicationsLarge Web Applications

Perrin HarkinsPerrin Harkins

Page 2: Care and Feeding of Large Web Applications

Arcos, a project at Plus Three

About 2.5 years of continuous development

2 - 5 developers on the team during that time

~79,000 lines of Perl code

~4900 lines of SQL

(Computed with David Wheeler's SLOCCount program)

Plenty of HTML, CSS, and JavaScript too

~14000 automated tests in 269 files

169 CPAN modules

Page 3: Care and Feeding of Large Web Applications

Arcos, cont'd

CMS with modern AJAX UI

E-commerce

Data warehouse with AJAX query builder GUI

E-mail campaign management

Asynchronous job queue system

Comprehensive reporting

Page 4: Care and Feeding of Large Web Applications

Arcos, cont'd

Object-oriented

MVC-ish

Controller classes

Database classes

Templates

Core modules:

CGI::Application

Class::DBI

HTML::Template

Page 5: Care and Feeding of Large Web Applications

Deployment

Hard to generalize

.tar.gz files

Always release full builds, not individual files

Consistent state for production system

QA installs are accurate copies

Page 6: Care and Feeding of Large Web Applications

The CPAN problem

“Just use the CPAN shell”

Fails too often

Installs whatever the latest version is

Page 7: Care and Feeding of Large Web Applications

CPAN installer requirements:

Install specific versions

Install from local media

Allow locally modified versions

Fully automated

“Erase your hard drive? [n]”

Install in a local directory

Skip the tests

Cluster install

Some will never work

Page 8: Care and Feeding of Large Web Applications

Our solution

Finds all modules in src/ directory of package

(Including ones we hacked)

Uses Expect to answer questions

Builds non-CPAN stuff too

Apache

mod_perl

SWISH-E search engine

Page 9: Care and Feeding of Large Web Applications

Why bundle dependencies?

Avoid troubleshooting local problems

If possible, specify Perl, MySQL, OS, etc.

Sometimes reality intervenes

Hardware support

Office politics

Page 10: Care and Feeding of Large Web Applications

Next up: binary distributions

Compile takes too long

Still just tar?

RPMs?

PAR?

See build system in Krang: http://krancgcms.com/

Page 11: Care and Feeding of Large Web Applications

OH HAI!OH HAI!

I HELP WIF URI HELP WIF URINDENTATION!INDENTATION!

Page 12: Care and Feeding of Large Web Applications

Upgrades

Need full automation

Got the database part

Schema version number in database

Run all upgrade scripts with appropriate names

e.g. 2.0 --> 3.0 means run upgrade/V2_1.pm and upgrade/V3_0.pm

Hand-written SQL scripts

Test mode that upgrades from old schema first

LVM for rollback in QA

Page 13: Care and Feeding of Large Web Applications

Configuration

● Highly configurable systems must be highly configured

● Started with httpd.conf style– Config::ApacheFormat

– Basic scoping and inheritance

Page 14: Care and Feeding of Large Web Applications

Observations on Configuration

● People ignore options they don't understand– If the server starts, it must be ok!

● Some comments in a config file == weak documentation

● Things you rarely change shouldn't be in the shipped config file

Page 15: Care and Feeding of Large Web Applications

I CAN HASI CAN HASMAINTENANCEMAINTENANCE

BRANCH?BRANCH?

Page 16: Care and Feeding of Large Web Applications

Version Control

Many tool choices now

svn, svk, git...

Fight it out and let me know who wins

Most projects need at least two branches at all times

development

stable

Page 17: Care and Feeding of Large Web Applications

Very simple version control

Main branch is development

Must build and pass tests

When making a release from a branch, tag it

Make a “2.0” tag when you release it

Page 18: Care and Feeding of Large Web Applications

Very simple version control, cntd

Maintenance branch from that tag for bug fixes

“2.x” branch

On maintenance release, merge all changes on maintenance branch to main branch

Tag “2.1” on 2.x branch

Merge 2.0 --> 2.1 onto main branch

Page 19: Care and Feeding of Large Web Applications

Too simple?

Not everyone is done at the same time

Hard to keep dev branch stable for major changes

Feature branches

Possible integration problems

Beware of complex merges

This is not the Linux kernel

Could be a people problem

An alternate point of view

http://utsl.gen.nz/talks/git-svn/intro.html

Page 20: Care and Feeding of Large Web Applications

HALP!HALP!TESTS R TESTS R FAYLIN!FAYLIN!

Page 21: Care and Feeding of Large Web Applications

Testing

● You all know the drill● Local library for common testing tasks

– Log in mech object

– Run test SMTP server● Test data setup and teardown

– Keep stack, delete in reverse order

– Probably easier to just wipe the db

Page 22: Care and Feeding of Large Web Applications

Testing tools

● Simple Test::More scripts are easy– But scoping becomes an issue

– Test::Class

– Test::Builder● Improves test failure messages

● Test::WWW::Mechanize– Great for testing SSL, Apache config, mod_rewrite

– Works fine on JavaScript pages● But doesn't test the JavaScript● Selenium does

Page 23: Care and Feeding of Large Web Applications

KTHXBYE!KTHXBYE!