Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

Python builds mit ant

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 18 Publicité

Python builds mit ant

Télécharger pour lire hors ligne

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.

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.

Publicité
Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Similaire à Python builds mit ant (20)

Publicité

Plus par roskakori (17)

Plus récents (20)

Publicité

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 $ ant Buildfile: /Users/someone/hello/build.xml Bearbeitung von Ziel „hello“ hello: [echo] Hello someone! How are you? Bearbeitung von Ziel „build“ build: BUILD SUCCESSFUL Total 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/t runk/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 develop Aufruf: $ 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.

×