Skip to content

Commit 1c2abb3

Browse files
authored
Merge pull request #51 from double16/composepull
Add ComposePull task Closes #30 #40
2 parents c818215 + 319680f commit 1c2abb3

File tree

4 files changed

+60
-0
lines changed

4 files changed

+60
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ Simplifies usage of [Docker Compose](https://www.docker.com/docker-compose) for
77

88
`composeDown` task stops the application and removes the containers.
99

10+
`composePull` task pulls and optionally builds the images required by the application. This is useful, for example, with a CI platform that caches docker images to decrease build times.
11+
1012
## Why to use Docker Compose?
1113
1. I want to be able to run my application on my computer, and it must work for my colleagues as well. Just execute `docker-compose up` and I'm done.
1214
2. I want to be able to test my application on my computer - I don't wanna wait till my application is deployed into dev/testing environment and acceptance/end2end tests get executed. I want to execute these tests on my computer - it means execute `docker-compose up` before these tests.

src/main/groovy/com/avast/gradle/dockercompose/DockerComposePlugin.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.avast.gradle.dockercompose
22

33
import com.avast.gradle.dockercompose.tasks.ComposeDown
4+
import com.avast.gradle.dockercompose.tasks.ComposePull
45
import com.avast.gradle.dockercompose.tasks.ComposeUp
56
import org.gradle.api.Plugin
67
import org.gradle.api.Project
@@ -9,10 +10,12 @@ class DockerComposePlugin implements Plugin<Project> {
910
@Override
1011
void apply(Project project) {
1112
ComposeUp upTask = project.tasks.create('composeUp', ComposeUp)
13+
ComposePull pullTask = project.tasks.create('composePull', ComposePull)
1214
ComposeDown downTask = project.tasks.create('composeDown', ComposeDown)
1315
ComposeExtension extension = project.extensions.create('dockerCompose', ComposeExtension, project, upTask, downTask)
1416
upTask.extension = extension
1517
upTask.downTask = downTask
1618
downTask.extension = extension
19+
pullTask.extension = extension
1720
}
1821
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.avast.gradle.dockercompose.tasks
2+
3+
import com.avast.gradle.dockercompose.ComposeExtension
4+
import org.gradle.api.DefaultTask
5+
import org.gradle.api.tasks.TaskAction
6+
import org.gradle.process.ExecSpec
7+
8+
class ComposePull extends DefaultTask {
9+
10+
ComposeExtension extension
11+
12+
ComposePull() {
13+
group = 'docker'
14+
description = 'Pulls and builds all images of docker-compose project'
15+
}
16+
17+
@TaskAction
18+
void pull() {
19+
if (extension.buildBeforeUp) {
20+
project.exec { ExecSpec e ->
21+
e.environment = extension.environment
22+
e.commandLine extension.composeCommand('build')
23+
}
24+
}
25+
project.exec { ExecSpec e ->
26+
e.environment = extension.environment
27+
e.commandLine extension.composeCommand('pull')
28+
}
29+
}
30+
}

src/test/groovy/com/avast/gradle/dockercompose/DockerComposePluginTest.groovy

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.avast.gradle.dockercompose
22

33
import com.avast.gradle.dockercompose.tasks.ComposeDown
44
import com.avast.gradle.dockercompose.tasks.ComposeUp
5+
import com.avast.gradle.dockercompose.tasks.ComposePull
56
import org.gradle.api.Task
67
import org.gradle.api.internal.file.TmpDirTemporaryFileProvider
78
import org.gradle.api.tasks.testing.Test
@@ -17,6 +18,7 @@ class DockerComposePluginTest extends Specification {
1718
then:
1819
project.tasks.composeUp instanceof ComposeUp
1920
project.tasks.composeDown instanceof ComposeDown
21+
project.tasks.composePull instanceof ComposePull
2022
project.extensions.findByName('dockerCompose') instanceof ComposeExtension
2123
}
2224

@@ -74,6 +76,29 @@ class DockerComposePluginTest extends Specification {
7476
}
7577
}
7678

79+
def "allows pull from integration test"() {
80+
def projectDir = new TmpDirTemporaryFileProvider().createTemporaryDirectory("gradle", "projectDir")
81+
new File(projectDir, 'docker-compose.yml') << '''
82+
web:
83+
image: nginx
84+
command: bash -c "sleep 5 && nginx -g 'daemon off;'"
85+
ports:
86+
- 80
87+
'''
88+
def project = ProjectBuilder.builder().withProjectDir(projectDir).build()
89+
project.plugins.apply 'docker-compose'
90+
when:
91+
project.tasks.composePull.pull()
92+
then:
93+
noExceptionThrown()
94+
cleanup:
95+
try {
96+
projectDir.delete()
97+
} catch(ignored) {
98+
projectDir.deleteOnExit()
99+
}
100+
}
101+
77102
def "can specify compose files to use"() {
78103
def projectDir = new TmpDirTemporaryFileProvider().createTemporaryDirectory("gradle", "projectDir")
79104
new File(projectDir, 'original.yml') << '''

0 commit comments

Comments
 (0)