3. Continuous Integration
• Extreme Programming principle
• Martin Fowler
http://www.martinfowler.com/articles/
continuousIntegration.html
Wednesday, October 27, 2010
4. Continuous Integration
• Maintain a Source
Repository
• Automate the Build
• Make the Build Self-
Testing
• Everyone Commits
Every Day
• Every Commit
Should Be Built
• Keep the Build Fast
• Test in a Clone of the
Production
Environment
• Make it Easy to Get
the Latest
Deliverables
• Everyone Can See
the Results of the
Latest Build
• Automate
Deployment
Wednesday, October 27, 2010
5. Essentially
• Commit your code
• Test the crap out of it
• Regressions are bad
• Assign blame
• Shame is a great motivator
Wednesday, October 27, 2010
81. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
82. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
83. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
84. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
85. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
86. zptlint
[buildout]
...
# A list of package locations to be examined
# by Hudson
package-directories =
src/fsd.core/fsd/core
src/fsd.membrane/fsd/membrane
Wednesday, October 27, 2010
87. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
88. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
89. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
90. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
91. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
92. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
93. zptlint
[zptlint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -e zptlint.log ]; then
echo "Old zptlint.log file removed"
rm zptlint.log
fi
echo "Running zptlint-test"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find $pkg -regex ".*.[c|z]?pt" | xargs -r bin/zptlint |
perl -p -e 's/s+$/ /g;s/s+/ /g;s/*{3}s?/n/g' >> zptlint.log
done
output = ${buildout:directory}/bin/zptlint-test
mode = 755
Wednesday, October 27, 2010
127. pylint
• disable-msg
• R0911:Too many return statements (%s/%s)
• R0201: Method could be a function
• W0201:Attribute %r defined outside of
__init__
• http://pylint-messages.wikidot.com/all-messages
Wednesday, October 27, 2010
128. pylint
[pylint-test]
recipe = collective.recipe.template
input = inline:
#!/bin/sh
if [ -s pylint.log ]; then
rm pylint.log
echo "Old pylint.log file removed"
fi
echo "Running pylint"
PACKAGES="${buildout:package-directories}"
for pkg in $PACKAGES
do
find -L $pkg -regex ".*.py" | xargs bin/pylint >> pylint.log
done
echo "Finished"
output = ${buildout:directory}/bin/pylint-test
mode = 755
Wednesday, October 27, 2010
168. Use an Egg Cache
• Set up a default.cfg for your hudson
account.
[buildout]
eggs-directory =
/home/hudson/.buildout/eggs
download-cache =
/home/hudson/.buildout/downloads
Wednesday, October 27, 2010
169. Pin unittest2
• (If you’re using it)
• plone.app.testing
• 3x faster buildout
Wednesday, October 27, 2010
170. Split Big Builds
• How long does the build take?
• How often does each part need to be run?
• Tests?
• Coverage?
Wednesday, October 27, 2010
171. Split Big Builds
• Build
• Test
• Syntax Checking
• Coverage
• Selenium
Wednesday, October 27, 2010
172. Split Big Builds
1. “Build other projects” post-build action
Wednesday, October 27, 2010
173. Split Big Builds
1. “Build other projects” post-build action
2. Custom workspace
Wednesday, October 27, 2010
174. Split Big Builds
1. “Build other projects” post-build action
2. Custom workspace
3. Build Fingerprinting
Wednesday, October 27, 2010
175. Fingerprinting
• “These builds are related”
• Archive an md5 hash of a file to act as an
identifier
Wednesday, October 27, 2010