Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Python-Builds mit ant          Thomas Aglassinger   <roskakori@users.sourceforge.net>
Agenda●   Was ist ant?●   Grundkonzepte und allgemeine Verwendung.●   Konkrete Beispiele für Python.●   Ausgewählte Featur...
Was ist ant?●   Ant ist ein Build-Tool.●   Ursprung in der Java-Welt.●   Bewährt seit 2000.●   Einfache Einbindung in Jenk...
Vergleich mit anderen Build-Tools●   Oft kompakter als distutils / setup.py. → Standard-    Aufgaben und leistungsfähige D...
Grundlagen zu ant●   Build.xml beschreibt Projekt.●   Projekt besteht aus Zielen („targets“).●   Ziele führen Aufgaben („t...
Beispiel für build.xml<project name="hello" default="build" basedir=".">                                                  ...
Aufruf und Ausgabe$ antBuildfile: /Users/someone/hello/build.xml                                            Bearbeitung vo...
Beispiel-Ziele●   PEP8 Style-Prüfung.●   Anzahl der Quellcode-Zeilen.●   Tests inklusive Testabdeckung.●   Aufrufe von set...
PEP8 Style-Prüfung  <target name="pep8" description="build pep8 violations report">     <echo message="build pep8 violatio...
Anzahl der Quellcode-Zeilen<target name="sloccount" description="build sloccount report">  <echo message="build sloccount ...
Tests inklusive Testabdeckung (1/2)●   Unter Verwendung von nose und coverage.    http://pypi.python.org/pypi/nose/    htt...
Tests inklusive Testabdeckung (2/2)<target name="test" depends="testdata" description="run test suite">  <exec executable=...
Performance-Test<target name="performance" description="run performance test" ...>  <exec executable="nosetests" failonerr...
Aufruf von setup.py (1/2)<macrodef name="pyst">           Definiert Macro <pyst>  <!-- Macro to run a setup.py command. --...
Aufruf von setup.py (2/2)  <target name="bdist_egg" depends="docs"     description="build binary distribution">     <pyst ...
Nützliche Ant-Aufgaben●   <copy>, <delete>, <move> - Dateioperationen.●   <mkdir> - Ordner anlegen (auch verschachtelt).● ...
Plugins, Muster, Filter<taskdef classname="org.acm.seguin.ant.Pretty"     classpath="lib/pretty.jar;lib/JavaStyle.jar"    ...
Zusammenfassung●   Bewährtes Werkzeug aus der Java-Welt.●   Vergleichsweise einfach und deterministisch.●   Viele fertige ...
Nächste SlideShare
Wird geladen in …5
×

Python builds mit ant

1.365 Aufrufe

Veröffentlicht am

Ant ist ein Build-Werkzeug aus der Java-Welt, das auch für Python Projekte verwendbar ist. Diese Präsentation zeigt Beispiele für häufige Aufgaben und beschreibt, wie eine Einbindung in Jenkins zur continuous integration erfolgeb kann.

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Python builds mit ant

  1. 1. Python-Builds mit ant Thomas Aglassinger <roskakori@users.sourceforge.net>
  2. 2. Agenda● Was ist ant?● Grundkonzepte und allgemeine Verwendung.● Konkrete Beispiele für Python.● Ausgewählte Features von ant.
  3. 3. Was ist ant?● Ant ist ein Build-Tool.● Ursprung in der Java-Welt.● Bewährt seit 2000.● Einfache Einbindung in Jenkins.● Auch für Python-Projekte verwendbar als Ergänzung zu distutils / setup.py.● Sehr gutes Handbuch mit vielen Beispielen.
  4. 4. Vergleich mit anderen Build-Tools● Oft kompakter als distutils / setup.py. → Standard- Aufgaben und leistungsfähige Dateimuster statt komplexe shutils-Aufrufe.● Weiter verbreitet als Scons. http://www.scons.org/● Robuster als Shell-Scripts → Abbruch bei Fehlern.● Deterministischeres Verhalten als Make. http://en.wikipedia.org/wiki/Make_(software)● Einfacher zu verwenden als Maven. http://maven.apache.org/
  5. 5. Grundlagen zu ant● Build.xml beschreibt Projekt.● Projekt besteht aus Zielen („targets“).● Ziele führen Aufgaben („tasks“) aus und erstellen Dateien.● Ziele können von anderen Zielen abhängig sein.● Aufgaben sind i.d.R. auf mehrere Dateien anwendbar – ausgewählt mit leistungsfähigen Dateimustern.● Eigenschaften („properties“) sind verwendbar als Variablen oder Konstante. Allerdings kaum Funktionen für String- Manipulation oder mathematische Berechnungen.● Einfache Makros zum parameterisierten Aufruf von mehreren Aufgaben.
  6. 6. Beispiel für build.xml<project name="hello" default="build" basedir="."> Setzt Eigenschaft <description>Say hello.</description> „greeting“ auf „Hello“ <property name="greeting" value="Hello" /> Setzt Präfix für Zugriff auf <property environment="env" /> Umgebungsvariablen. <target name="build" depends="hello"> Definiert Ziel „build“ mit <!-- Do nothing. --> Abhängigkeit zu Ziel „hello“ </target> Definiert Ziel „hello“ zur <target name="hello"> Ausgabe einer Begrüßung. <echo message="${greeting} ${env.USER}! How are you?" /> </target></project>
  7. 7. Aufruf und Ausgabe$ antBuildfile: /Users/someone/hello/build.xml Bearbeitung von Ziel „hello“hello: [echo] Hello someone! How are you? Bearbeitung von Ziel „build“build:BUILD SUCCESSFULTotal time: 0 seconds
  8. 8. Beispiel-Ziele● PEP8 Style-Prüfung.● Anzahl der Quellcode-Zeilen.● Tests inklusive Testabdeckung.● Aufrufe von setup.py.Quelle für vollständiges build.xml:http://sourceforge.net/apps/trac/cutplace/browser/trunk/build.xml
  9. 9. PEP8 Style-Prüfung <target name="pep8" description="build pep8 violations report"> <echo message="build pep8 violations report" /> <exec executable="pep8"> <arg value="--repeat" /> <arg value="--ignore" /> Zeilen dürfen mehr <arg value="E501" /> als 80 Zeichen haben <arg value="cutplace" /> <redirector output="pep8.txt" /> Lenkt Ausgabe um </exec> in Datei „pep8.txt“. </target>Entspricht: pep8 –-repeat –-ignore E501 cutplace >pep8.txt
  10. 10. Anzahl der Quellcode-Zeilen<target name="sloccount" description="build sloccount report"> <echo message="build sloccount report" /> <exec executable="sloccount" failonerror="true"> <arg value="--details" /> <arg value="--wide" /> Download über Package Manager oder http://www.dwheeler.com/sloccount/ <arg value="cutplace" /> <redirector output="sloccount.sc"> <outputfilterchain> Entfernt Zeilen mit „.svn“, <linecontains negate="true"> um interne Kopie von <contains value=".svn" /> Subversion nicht mit zu zählen. </linecontains> </outputfilterchain> </redirector> </exec></target>
  11. 11. Tests inklusive Testabdeckung (1/2)● Unter Verwendung von nose und coverage. http://pypi.python.org/pypi/nose/ http://pypi.python.org/pypi/coverage/● Ausgabe von nose im Format von JUnit.● Ausgabe von coverage im Format von Cobertura.
  12. 12. Tests inklusive Testabdeckung (2/2)<target name="test" depends="testdata" description="run test suite"> <exec executable="nosetests" failonerror="false"> <arg value="--with-coverage" /> <arg value="--with-doctest" /> <arg value="--with-xunit" /> Nach fehlgeschlagenen Tests <arg value="--cover-erase" /> den Build fortsetzen und Jenkins-Berichte erzeugen. <arg value="--exclude" /> <arg value="(.*setup.*)|(.*test_performance.*)" /> </exec> <exec executable="coverage" failonerror="true"> <arg value="xml" /> </exec> Keine Testabdeckung für</target> setup.py („Test“ im Rahmen des builds) und des Performance-Test (erfolgt mit eigenem Ziel).
  13. 13. Performance-Test<target name="performance" description="run performance test" ...> <exec executable="nosetests" failonerror="false"> <arg value="--with-xunit" /> <arg value="--xunit-file" /> <arg file="nosetests_performance.xml" /> <arg file="cutplace/test_performance.py" /> </exec></target>
  14. 14. Aufruf von setup.py (1/2)<macrodef name="pyst"> Definiert Macro <pyst> <!-- Macro to run a setup.py command. --> <attribute name="command" /> Definiert Parameter „command“ <sequential> <exec executable="python" failonerror="true"> Aufruf von python setup.py <arg value="setup.py" /> <arg value="@{command}" /> Übergabe von Parameter „command“ mit @{...} </exec> statt ${...}. </sequential></macrodef>
  15. 15. Aufruf von setup.py (2/2) <target name="bdist_egg" depends="docs" description="build binary distribution"> <pyst command="bdist_egg" /> Entspricht: </target> python setup.py bdist_egg <target name="develop" depends="bdist_egg" description="install current development version"> <pyst command="develop" /> Entspricht: </target> python setup.py developAufruf:$ ant bdist_egg$ sudo ant develop
  16. 16. Nützliche Ant-Aufgaben● <copy>, <delete>, <move> - Dateioperationen.● <mkdir> - Ordner anlegen (auch verschachtelt).● <get> - Download einer URL.● <replace> - Suchen und Ersetzen von Texten.● <FixCRLF> - Zeilenenden vereinheitlichen.● <scp> - Secure remote copy.● <zip>, <unzip> - Dateien und Ordner komprimieren.● <XmlValidate> - XML mit DTD prüfen.● <xslt> - XSL Transformationen.
  17. 17. Plugins, Muster, Filter<taskdef classname="org.acm.seguin.ant.Pretty" classpath="lib/pretty.jar;lib/JavaStyle.jar" Import einer externen Aufgabe name="pretty"/> <target depends="init" description="reformat java source code" name="reformat-java"> Aufruf der importierten <pretty settingsDir="${settings.dir}"> Aufgabe Dateien, auf die <fileset dir="${source.dir}"> Aufgabe an zu wenden ist. <include name="**/*.java"/> <not><contains text="/*@"/></not> </fileset> „**“ = alle Ordner und enthaltene Unterordner </pretty> </target>
  18. 18. Zusammenfassung● Bewährtes Werkzeug aus der Java-Welt.● Vergleichsweise einfach und deterministisch.● Viele fertige Aufgaben (Tasks).● Einfache Einbindung von Python-Projekten in Jenkins.

×