SlideShare ist ein Scribd-Unternehmen logo
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 Features von ant.
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.
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/
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.
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>
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
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
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
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>
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.
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).
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>
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>
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
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.
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>
Zusammenfassung
●   Bewährtes Werkzeug aus der Java-Welt.
●   Vergleichsweise einfach und deterministisch.
●   Viele fertige Aufgaben (Tasks).
●   Einfache Einbindung von Python-Projekten in
    Jenkins.

Weitere ähnliche Inhalte

PDF
IPC 2015 Zend Framework 3 Reloaded
PDF
Ldap sqlnet
PDF
Rex Linuxtag 2012
PDF
01 sqlplus
PDF
Upgrading Puppet CommitterConf Essen 2014
PDF
Der oracle dba_und_seine_passwoerter
PDF
Gradle - Beginner's Workshop (german)
PDF
Testing tools
IPC 2015 Zend Framework 3 Reloaded
Ldap sqlnet
Rex Linuxtag 2012
01 sqlplus
Upgrading Puppet CommitterConf Essen 2014
Der oracle dba_und_seine_passwoerter
Gradle - Beginner's Workshop (german)
Testing tools

Was ist angesagt? (20)

PPTX
Einführung React Native
PDF
FLOW3-Workshop F3X12
PDF
An Introduction to Ruby On Rails
PPT
Einsteiger Workshop
PDF
Automatisierungmit NANT
PPTX
Java Batch: Der neue Standard für‘s Stapeln
PDF
Introduction into Oracle Data Pump 11g/12c - Export and Import Data
PDF
Seminar Joomla 1.5 SEF-Mechanismus
PDF
Versionskontrolle in Machine-Learning-Projekten
PDF
Opensource Tools für das Data Center Management
PDF
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
PDF
Mvc public
PDF
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
PDF
Powerful mostly unknown Javascript-Features
PDF
Konfigurationsmanagement mit Opscode Chef
PPTX
Object-orientied way of using mysqli interface - Workshop
PDF
Welches Webframework passt zu mir? (WJAX)
PPTX
C++ Dependency Management 2.0
PDF
Einführung in React
PDF
Auszug Seminarunterlagen "Tomcat 6.x"
Einführung React Native
FLOW3-Workshop F3X12
An Introduction to Ruby On Rails
Einsteiger Workshop
Automatisierungmit NANT
Java Batch: Der neue Standard für‘s Stapeln
Introduction into Oracle Data Pump 11g/12c - Export and Import Data
Seminar Joomla 1.5 SEF-Mechanismus
Versionskontrolle in Machine-Learning-Projekten
Opensource Tools für das Data Center Management
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
Mvc public
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Powerful mostly unknown Javascript-Features
Konfigurationsmanagement mit Opscode Chef
Object-orientied way of using mysqli interface - Workshop
Welches Webframework passt zu mir? (WJAX)
C++ Dependency Management 2.0
Einführung in React
Auszug Seminarunterlagen "Tomcat 6.x"
Anzeige

Ähnlich wie Python builds mit ant (20)

PDF
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
PDF
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
PDF
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
PDF
Java Batch – Der Standard für's Stapeln
KEY
Automatisierte Linux Administration mit (R)?ex
PDF
Automatisierung mit grunt
PDF
Docker und Kubernetes Patterns & Anti-Patterns
PDF
Docker und Kubernetes Patterns & Anti-Patterns
PDF
Funktionale Programmierung mit Java - Andreas Jürgensen
PPTX
Angular von 0 auf 100
PDF
Einführung in Docker
PDF
Backbase Intro
PDF
Grunt
PDF
Lightweight AOP with CDI and JPA
PDF
Feature Flags mit Togglz
PPTX
JSF 2 Kompositkomponenten (JAX 2012)
PDF
Dokumentation schreiben kann spass machen
PDF
Slides__Splunk_UserGroup_20220407.pdf
PPTX
Microservices mit Rust
PPTX
Creasoft - Windows powershell
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Java Batch – Der Standard für's Stapeln
Automatisierte Linux Administration mit (R)?ex
Automatisierung mit grunt
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
Funktionale Programmierung mit Java - Andreas Jürgensen
Angular von 0 auf 100
Einführung in Docker
Backbase Intro
Grunt
Lightweight AOP with CDI and JPA
Feature Flags mit Togglz
JSF 2 Kompositkomponenten (JAX 2012)
Dokumentation schreiben kann spass machen
Slides__Splunk_UserGroup_20220407.pdf
Microservices mit Rust
Creasoft - Windows powershell
Anzeige

Mehr von roskakori (18)

PDF
Expanding skill sets - Broaden your perspective on design
PPTX
Django trifft Flutter
PDF
Multiple django applications on a single server with nginx
PDF
Helpful pre commit hooks for Python and Django
PDF
Startmeeting Interessengruppe NLP NLU Graz
PDF
Helpful logging with python
PDF
Helpful logging with Java
PDF
Einführung in Kommunikation und Konfliktmanagement für Software-Entwickler
PDF
Analyzing natural language feedback using python
PDF
Microsoft SQL Server with Linux and Docker
PDF
Migration to Python 3 in Finance
PDF
Introduction to pygments
PDF
Lösungsorientierte Fehlerbehandlung
PDF
XML namespaces and XPath with Python
PDF
Erste-Hilfekasten für Unicode mit Python
PDF
Introduction to trader bots with Python
PDF
Open source projects with python
PPT
Kanban zur Abwicklung von Reporting-Anforderungen
Expanding skill sets - Broaden your perspective on design
Django trifft Flutter
Multiple django applications on a single server with nginx
Helpful pre commit hooks for Python and Django
Startmeeting Interessengruppe NLP NLU Graz
Helpful logging with python
Helpful logging with Java
Einführung in Kommunikation und Konfliktmanagement für Software-Entwickler
Analyzing natural language feedback using python
Microsoft SQL Server with Linux and Docker
Migration to Python 3 in Finance
Introduction to pygments
Lösungsorientierte Fehlerbehandlung
XML namespaces and XPath with Python
Erste-Hilfekasten für Unicode mit Python
Introduction to trader bots with Python
Open source projects with python
Kanban zur Abwicklung von Reporting-Anforderungen

Python builds mit ant

  • 2. Agenda ● Was ist ant? ● Grundkonzepte und allgemeine Verwendung. ● Konkrete Beispiele für Python. ● Ausgewählte Features von ant.
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Zusammenfassung ● Bewährtes Werkzeug aus der Java-Welt. ● Vergleichsweise einfach und deterministisch. ● Viele fertige Aufgaben (Tasks). ● Einfache Einbindung von Python-Projekten in Jenkins.