Skip to content

Commit

Permalink
Merge pull request #60 from cloudogu/feature/59_add_gradle_support
Browse files Browse the repository at this point in the history
Feature/59 add gradle support
  • Loading branch information
mbehlendorf authored Apr 15, 2021
2 parents 615b281 + 9e67df8 commit a3b2851
Show file tree
Hide file tree
Showing 7 changed files with 174 additions and 0 deletions.
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ Jenkins Pipeline Shared library, that contains additional features for Git, Mave
- [Deploying sites](#deploying-sites)
- [Passing additional arguments](#passing-additional-arguments)
- [Maven Utilities](#maven-utilities)
- [Gradle](#gradle)
- [Gradle Wrapper in Docker](#gradle-wrapper-in-docker)
- [Git](#git)
- [Credentials](#credentials)
- [Git Utilities](#git-utilities)
Expand Down Expand Up @@ -441,6 +443,28 @@ Available from both local Maven and Maven in Docker.

See [Maven](src/com/cloudogu/ces/cesbuildlib/MavenInDocker.groovy)

# Gradle

## Gradle Wrapper in Docker

It's also possible to use a GradleWrapper in a Docker Container. Here, the Docker container is responsible for
providing the JDK.

See [GradleWrapperInDocker](src/com/cloudogu/ces/cesbuildlib/GradleWrapperInDocker.groovy)

Example:
```groovy
String gradleDockerImage = 'openjdk:11.0.10-jdk'
Gradle gradlew = new GradleWrapperInDocker(this, gradleDockerImage)
stage('Build') {
gradlew "clean build"
}
```

Since Oracle's announcement of shorter free JDK support, plenty of JDK images have appeared on public container image
registries, where `adoptopenjdk` is just one option. The choice is yours.

# Git

An extension to the `git` step, that provides an API for some commonly used git commands and utilities.
Expand Down
31 changes: 31 additions & 0 deletions src/com/cloudogu/ces/cesbuildlib/Gradle.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.cloudogu.ces.cesbuildlib

abstract class Gradle implements Serializable {
protected script

Gradle(script) {
this.script = script
}

def call(String args, boolean printStdOut = true) {
gradle(args, printStdOut)
}

/**
* @param printStdOut - returns output of gradle as String instead of printing to console
*/
protected abstract def gradle(String args, boolean printStdOut = true)

def gradlew(String args, boolean printStdOut) {
sh("./gradlew -q "+ args, printStdOut)
}

void sh(String command, boolean printStdOut) {
script.echo "executing sh: ${command}, return Stdout: ${printStdOut}"
if (printStdOut) {
script.sh "${command}"
} else {
new Sh(script).returnStdOut command
}
}
}
34 changes: 34 additions & 0 deletions src/com/cloudogu/ces/cesbuildlib/GradleInDockerBase.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.cloudogu.ces.cesbuildlib
/**
* Common tools for all GradleInDocker classes
*/
abstract class GradleInDockerBase extends Gradle {

/** Setting this to {@code true} allows the Gradle build to access the docker host, i.e. to start other containers.*/
boolean enableDockerHost = false

Docker docker

GradleInDockerBase(script) {
super(script)
this.docker = new Docker(script)
}

@Override
def gradle(String args, boolean printStdOut = true) {
call ({ args }, printStdOut)
}

abstract def call(Closure closure, boolean printStdOut);

protected void inDocker(String imageId, Closure closure) {
docker.image(imageId)
// Mount user and set HOME, which results in the workspace being user.home. Otherwise '?' might be the user.home.
.mountJenkinsUser(true)
.mountDockerSocket(enableDockerHost)
.inside("") {
closure.call()
}
}

}
23 changes: 23 additions & 0 deletions src/com/cloudogu/ces/cesbuildlib/GradleWrapperInDocker.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.cloudogu.ces.cesbuildlib

/**
* Run gradle using a Gradle Wrapper from the local repository within a Docker Container.
* The image of the container can be used to specified a JDK.
*/
class GradleWrapperInDocker extends GradleInDockerBase {
/** The docker image to use, e.g. {@code adoptopenjdk/openjdk11:jdk-11.0.1.13-alpine} **/
private String imageId

@SuppressWarnings("GrDeprecatedAPIUsage") // GradleWrapper will become protected constructor that is no longer deprecated
GradleWrapperInDocker(script, String imageId) {
super(script)
this.imageId = imageId
}

@Override
def call(Closure closure, boolean printStdOut) {
inDocker(imageId) {
gradlew(closure.call(), printStdOut)
}
}
}
18 changes: 18 additions & 0 deletions test/com/cloudogu/ces/cesbuildlib/GradleMock.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.cloudogu.ces.cesbuildlib

class GradleMock extends Gradle {
String args

GradleMock(scriptMock) {
super(scriptMock)
}

def gradle(String args, boolean printStdOut) {
this.args = args
return args
}

static Docker setupDockerMock(GradleInDockerBase gradle) {
gradle.docker = DockerMock.create()
}
}
24 changes: 24 additions & 0 deletions test/com/cloudogu/ces/cesbuildlib/GradleTest.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.cloudogu.ces.cesbuildlib


import org.junit.After
import org.junit.Test

import static org.junit.Assert.assertEquals

class GradleTest {
def scriptMock = new ScriptMock()
def gradle = new GradleMock(scriptMock)

@After
void tearDown() throws Exception {
// always reset metaClass after messing with it to prevent changes from leaking to other tests
Gradle.metaClass = null
}

@Test
void testCall() throws Exception {
def result = gradle "test"
assertEquals("test", result)
}
}
20 changes: 20 additions & 0 deletions test/com/cloudogu/ces/cesbuildlib/GradleWrapperInDockerTest.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.cloudogu.ces.cesbuildlib

import org.junit.Test
import static org.junit.Assert.assertEquals

import static org.mockito.Mockito.verify

class GradleWrapperInDockerTest {
def scriptMock = new ScriptMock()

@Test
void gradleInDocker() {
def gradle = new GradleWrapperInDocker(scriptMock, 'adoptopenjdk/openjdk11:jdk-11.0.1.13-alpine')
Docker docker = GradleMock.setupDockerMock(gradle)
gradle 'clean install'

assert scriptMock.actualShStringArgs[0].trim().contains('clean install')
verify(docker).image('adoptopenjdk/openjdk11:jdk-11.0.1.13-alpine')
}
}

0 comments on commit a3b2851

Please sign in to comment.