Gradle: Grégory Boissinot

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 23

GRADLE

Grégory Boissinot
Présentation Gradle 1
•  Consultant et formateur chez Zenika

•  Mes spécialités
– Ant/Ivy
– Maven
– Gradle
– Hudson

•  Contributeur Hudson

•  Introduction et mis en place de Gradle chez un très grand compte


industriel

Présentation Gradle 2
•  Système de build pour la JVM Java, focalisé sur le build
des applications d'entreprise

•  Modèle de description du build très riche à travers une


API

•  Flexible à la Ant avec les conventions de Maven à la


demande

•  Une gestion avancée d'un projet multi-modules

•  Support et insertion totale dans des infrastructures Maven


et Ant/Ivy existantes

Présentation Gradle 3
1ère génération 2ème génération 3ème génération

2000 2005 2008

3
1

Présentation Gradle 4
<!–- ANT -- build.xml -->
<project>
<property name="version"
<!–- MAVEN – pom.xml-->
value="1.0"/>
<?xml version="1.0" encoding="UTF-8"?>
<target name="antTask>
<project>
<echo message="Hello"/>
<modelVersion>4.0.0</modelVersion>
</target>
<groupId>com.zenika</groupId>
</project>
<artifactId>zenikac-core</artifactId>
<version>1.0</version>
<!–- GRADLE– build.gradle --> <dependencies>
apply plugin:'java' <dependency>
<groupId>org.apache.wicket</groupId>
repositories { <artifactId>wicket</artifactId>
mavenCental() <version>1.4.7</version>
flatDir(dirs:'lib') <scope>compile</scope>
} </dependency>
</dependencies>
dependencies { </project>
compile
"org.apache.wicket:wicket:1.4.7"
}

Présentation Gradle 5
Distribution Gradle

CORE UI WRAPPER OPEN-API DOCS

api

java groovy maven osgi code-quality

war jetty scala eclipse project-reports


plugins

Ant Ivy Maven Ant Tasks Groovy

outils

checkstyle codeNarc webdav Autres dépendances

Librairies tierces

Présentation Gradle 6
Écrire un script Gradle consiste à configurer un objet Gradle Project

configurations

repositories
dependencies
build.gradle

Project
ant

task artifacts

API

Présentation Gradle 7
Un script de build Gradle est défini par un ensemble de tâches sur
lesquelles sont ajoutées des actions qui sont des closures Groovy

<!-- build.gradle -->


task(hello)
hello.doFirst{ > gradle hello
println "Hello World" :hello
Hello World
for (int i:[1,2,3]){ 123
print i
} > gradle distribution
} :distribution
Print Distribution
task(distribution).doFirst {
println "Print Distribution" > gradle release
} :distribution
Print Distribution
:release
task(release) Print Release
release.dependsOn(distribution)
release.doFirst{
println "Print Release"
}
Présentation Gradle 8
task mycopy (type:Copy){
from(file('resources'))
into(file('target')) ConventionTask
include('**/*.txt', '**/*.xml')
}

myCopy.include('**/*.properties') SourceTask AbstractCopyTask

Javadoc Copy AbstractArchiveTask

Zip Tar
public class Copy extends AbstractCopyTask {
public AbstractCopyTask from(Object... sourcePaths);
public AbstractCopyTask into(Object destDir);
}
Jar

War
Présentation Gradle 9
<!– HelloTask.groovy -->
class HelloTask extends DefaultTask {

def message="Default Message"

@TaskAction
public void print(){ > gradle myhello
println message :myhello
} Default Message
}
> gradle myhello2
<!-- build.gradle --> :myhello2
Task Message
task(myhello, type:HelloTask)

task(myhello2, type:HelloTask){
message="Task Message"
}

Présentation Gradle 10
ant {
def wsdl2java_classpath = path {
fileset(dirs:'lib', includes: '*.jar')
}
taskdef(
name: 'axiswsdl2java',
classname:
'org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask',
classpath: wsdl2java_classpath )

axiswsdl2java( output:"generated",
verbose:"true" ,
url:"Exemple.wsdl" )
}

ant.echo (message:ANT)

Présentation Gradle 11
build.xml
<project>
<target name="antTask">
<echo message="Hello from Ant"/>
</target>
</project>

build.gradle
ant.importBuild('build.xml')
antTask.doLast {
println('Hello from Gradle')
}

> gradle antTask


:antTask
Hello from Ant
Hello from Gradle
Présentation Gradle 12
import org.junit.Assert

task myzip (type:Zip) {


from 'somedir'
include '*.txt'
baseName='zipname'
doLast {
Assert.assertEquals('zipname.zip', myzip.archiveName)
Assert.assertEquals(file('build/distributions'),
myzip.destinationDir)

Assert.assertTrue( ! zipTree(myzip.archivePath).isEmpty())
ziptxtfiles=zipTree(myzip.archivePath).matching{
include('*.txt')
}
txtfiles=fileTree('somedir').include('*.txt')
Assert.assertEquals (
txtfiles.getFiles().size(),
ziptxtfiles.getFiles().size())

}
}
Présentation Gradle 13
Chaque plugin déclaré apporte un ensemble de tâches et de propriétés

CORE UI WRAPPER OPEN-API DOCS

api

java groovy maven osgi code-quality

war jetty scala eclipse project-reports


plugins

Ant Ivy Maven Ant Tasks Groovy

outils

Présentation Gradle 14
> gradle clean build
:clean
apply plugin:'java' :compileJava
:processResources
repositories { :classes
mavenCental() :jar
flatDir(dirs:'destrepo', :assemble
name:'ivyrep’) :compileTestJava myLib
} :processTestResources .jar
:testClasses
dependencies { :test
compile :check
"jdom:jdom:1.0", :build
":qtjambi:4.5.2_01"
testCompile BUILD SUCCESSFUL
"junit:junit:4.7"
} Total time: 2.937 secs

Présentation Gradle 15
apply plugin:'war'
> gradle build -PskipTest
processResources.enabled=false :compileJava
:processResources SKIPPED
//Add behavior in the lifecycle :classes
task(preJar) :preJar
jar.dependsOn preJar :jar
:war
//Predicate :assemble
:compileTestJava
test.onlyIf{
:processTestResources
!project.hasProperty('skipTests') :testClasses
} :test SKIPPED
:check
//Change the output directory :build
buildDirName='target'
BUILD SUCCESSFUL
//Change the source directory
Total time: 2.937 secs
sourceSets{
main{
java.srcDir file('src/main')
}
} Présentation Gradle 16
Soyez informé de tous les événements de votre chaîne de build
class MyTestListener implements TestListener{

void beforeSuite(TestDescriptor suite) {


println('suiteStarting: '+suite.getName())
}

void afterSuite(TestDescriptor suite,


TestResult result) {
println 'suiteFinished: '+suite.getName()
}

void beforeTest(TestDescriptor test) {


println 'testStarting: '+test.getName()
}

void afterTest(TestDescriptor test,


TestResult result) {
println 'testFinished: '+test.getName()
+', result: '+result.getResultType()
}
}

Présentation Gradle 17
<!-- settings.gradle --> shared
include 'api',
'shared',
'services:webservices'

<!–- build.gradle --> webservices api


version='1.0'
subprojects {
apply plugin: 'java' api > gradle buildNeeded
} :shared:jar
project(':api') { :api:jar
dependencies { :api:test
compile project(':shared') :shared:test
}
}
<!–- webservices/build.gradle --> api > gradle buildDependents
apply plugin:'war' :shared:jar
dependencies { :api:jar
compile :api:test
project(':shared'), :webservices:war
project(':api'), :webservices:test
'commons-io:commons-io:1.2'
}
Présentation Gradle 18
apply plugin:'java'

repositories {
mavenCental()
flatDir(dirs:'destrepo', IVY
name:'ivyrep’)
}

group='test'
version='1.0'
status='release' > gradle uploadArchives

uploadArchives {
repositories {
add(repositories.ivyrep)
}
} Repository
Ivy
distant Artifacts +
meta Ivy

Présentation Gradle 19
apply plugin:'java'
apply plugin:'maven' Maven
Ant
group='test' Tasks
version='1.0-SNAPSHOT'

uploadArchives {
repositories {
mavenDeployer {
repository( > gradle > gradle
url: remoteRepo) install uploadArchives
}
}
}

Repository Repository
Maven Maven
Artifacts +
Local meta Maven distant Artifacts +
meta Maven

Présentation Gradle 20
•  Amélioration constante de la DSL pour encore plus de richesse et
de simplicité

•  Support amélioré dans les IDE

•  Une abstraction de Ivy pour encore un gestionnaire de


dépendance plus avancé

•  Parallélisation/Distribution des builds

•  Réutilisation des plugins Maven et import de projets Maven

•  Simplification dans la phase de publication des artefacts

Présentation Gradle 21
gmock

spcok

Présentation Gradle 22
•  Gradle vous offre toute la richesse pour exprimer vos chaines de
build au plus près de vos besoins

•  Gradle fournit une approche déclarative de premier plan

•  Gradle est un système de build complet et alternatif pour builder


vos applications

•  Gradle s'insère nativement en lecture et en écriture dans votre


existant pour l'enrichir

Présentation Gradle 23

Vous aimerez peut-être aussi