1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/test/groovy/BuildExecuteTest.groovy
Florian Wilhelm ae0074b5d3
Infer build tool (#1980)
Add a function for inferring the used build tool based on project layout.
This feature must be explicitly enabled for backwards compatibility reasons.
2020-09-04 14:45:09 +02:00

399 lines
13 KiB
Groovy

#!groovy
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.ExpectedException
import org.junit.rules.RuleChain
import util.BasePiperTest
import util.JenkinsDockerExecuteRule
import util.JenkinsReadYamlRule
import util.JenkinsShellCallRule
import util.JenkinsStepRule
import util.Rules
import static org.hamcrest.CoreMatchers.containsString
import static org.hamcrest.CoreMatchers.hasItem
import static org.hamcrest.CoreMatchers.is
import static org.hamcrest.CoreMatchers.nullValue
import static org.junit.Assert.assertEquals
import static org.junit.Assert.assertFalse
import static org.junit.Assert.assertNotNull
import static org.junit.Assert.assertThat
import static org.junit.Assert.assertTrue
import static org.junit.Assert.fail
class BuildExecuteTest extends BasePiperTest {
private ExpectedException exception = ExpectedException.none()
private JenkinsStepRule stepRule = new JenkinsStepRule(this)
private JenkinsDockerExecuteRule dockerRule = new JenkinsDockerExecuteRule(this)
private JenkinsShellCallRule shellCallRule = new JenkinsShellCallRule(this)
@Rule
public RuleChain rules = Rules
.getCommonRules(this)
.around(new JenkinsReadYamlRule(this))
.around(exception)
.around(shellCallRule)
.around(dockerRule)
.around(stepRule)
def dockerMockArgs = [:]
class DockerMock {
DockerMock(name) {
dockerMockArgs.name = name
}
def build(image, options) {
return [image: image, options: options]
}
}
@Before
void init() {
}
@Test
void testDefaultError() {
exception.expectMessage(containsString('buildTool not set and no dockerImage & dockerCommand provided'))
stepRule.step.buildExecute(
script: nullScript,
)
}
@Test
void testDefaultWithDockerImage() {
stepRule.step.buildExecute(
script: nullScript,
dockerImage: 'path/to/myImage:tag',
dockerCommand: 'myTestCommand'
)
assertThat(dockerRule.dockerParams.dockerImage, is('path/to/myImage:tag'))
assertThat(shellCallRule.shell, hasItem('myTestCommand'))
}
@Test
void inferBuildToolMaven() {
boolean buildToolCalled = false
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "pom.xml"
})
helper.registerAllowedMethod('mavenBuild', [Map.class], { m ->
buildToolCalled = true
return
})
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: true])
stepRule.step.buildExecute(
script: nullScript,
)
assertNotNull(nullScript.commonPipelineEnvironment.getBuildTool())
assertEquals('maven', nullScript.commonPipelineEnvironment.getBuildTool())
assertTrue(buildToolCalled)
}
@Test
void inferBuildToolNpm() {
boolean buildToolCalled = false
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "package.json"
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
buildToolCalled = true
return
})
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: true])
stepRule.step.buildExecute(
script: nullScript,
)
assertNotNull(nullScript.commonPipelineEnvironment.getBuildTool())
assertEquals('npm', nullScript.commonPipelineEnvironment.getBuildTool())
assertTrue(buildToolCalled)
}
@Test
void inferBuildToolMTA() {
boolean buildToolCalled = false
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "mta.yaml"
})
helper.registerAllowedMethod('mtaBuild', [Map.class], { m ->
buildToolCalled = true
return
})
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: true])
stepRule.step.buildExecute(
script: nullScript,
)
assertNotNull(nullScript.commonPipelineEnvironment.getBuildTool())
assertEquals('mta', nullScript.commonPipelineEnvironment.getBuildTool())
assertTrue(buildToolCalled)
}
@Test
void 'Do not infer build tool, do not set build tool, with docker dockerImage and dockerCommand, should run docker'() {
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "package.json"
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
fail("Called npmExecuteScripts which should not happen when no buildTool was defined but dockerImage and dockerCommand were.")
})
// Does nothing because feature toggle is not active
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: false])
stepRule.step.buildExecute(
script: nullScript,
dockerImage: 'path/to/myImage:tag',
dockerCommand: 'myTestCommand'
)
assertThat(dockerRule.dockerParams.dockerImage, is('path/to/myImage:tag'))
assertThat(shellCallRule.shell, hasItem('myTestCommand'))
}
@Test
void 'Do infer build tool, do not set build tool, with docker dockerImage and dockerCommand, should run npm'() {
boolean npmCalled = false
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "package.json"
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
npmCalled = true
return
})
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: true])
stepRule.step.buildExecute(
script: nullScript,
dockerImage: 'path/to/myImage:tag',
dockerCommand: 'myTestCommand'
)
assertTrue(npmCalled)
assertEquals(0, shellCallRule.shell.size())
}
@Test
void testMaven() {
boolean buildToolCalled = false
boolean installOptionSet = false
helper.registerAllowedMethod('mavenBuild', [Map.class], { m ->
buildToolCalled = true
return
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
installOptionSet = m['install']
return
})
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == 'package.json'
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'maven',
)
assertTrue(buildToolCalled)
assertTrue(installOptionSet)
}
@Test
void testMta() {
def buildToolCalled = false
helper.registerAllowedMethod('mtaBuild', [Map.class], { m ->
buildToolCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'mta',
)
assertThat(buildToolCalled, is(true))
}
@Test
void testNpm() {
def buildToolCalled = false
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
buildToolCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
)
assertThat(buildToolCalled, is(true))
}
@Test
void testNpmWithScripts() {
boolean actualValue = false
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
actualValue = (m['runScripts'][0] == 'foo' && m['runScripts'][1] == 'bar')
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
npmRunScripts: ['foo', 'bar']
)
assertTrue(actualValue)
}
@Test
void testNpmWithInstallFalse() {
boolean actualValue = true
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
actualValue = m['install']
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
npmInstall: false
)
assertFalse(actualValue)
}
@Test
void testNpmWithInstallTrue() {
boolean actualValue = false
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
actualValue = m['install']
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
npmInstall: true
)
assertTrue(actualValue)
}
@Test
void testDocker() {
binding.setVariable('docker', new DockerMock('test'))
def pushParams = [:]
helper.registerAllowedMethod('containerPushToRegistry', [Map.class], { m ->
pushParams = m
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'docker',
dockerImageName: 'path/to/myImage',
dockerImageTag: 'myTag',
dockerRegistryUrl: 'https://my.registry:55555'
)
assertThat(pushParams.dockerBuildImage.image.toString(), is('path/to/myImage:myTag'))
assertThat(pushParams.dockerRegistryUrl.toString(), is('https://my.registry:55555'))
assertThat(nullScript.commonPipelineEnvironment.getValue('containerImage').toString(), is('path/to/myImage:myTag'))
}
@Test
void testDockerWithEnv() {
nullScript.commonPipelineEnvironment.setArtifactVersion('1.0.0')
binding.setVariable('docker', new DockerMock('test'))
def pushParams = [:]
helper.registerAllowedMethod('containerPushToRegistry', [Map.class], { m ->
pushParams = m
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'docker',
dockerImageName: 'path/to/myImage',
dockerRegistryUrl: 'https://my.registry:55555'
)
assertThat(pushParams.dockerBuildImage.image.toString(), is('path/to/myImage:1.0.0'))
assertThat(pushParams.dockerRegistryUrl.toString(), is('https://my.registry:55555'))
assertThat(nullScript.commonPipelineEnvironment.getValue('containerImage').toString(), is('path/to/myImage:1.0.0'))
}
@Test
void testDockerNoPush() {
binding.setVariable('docker', new DockerMock('test'))
def pushParams = [:]
helper.registerAllowedMethod('containerPushToRegistry', [Map.class], { m ->
pushParams = m
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'docker',
dockerImageName: 'path/to/myImage',
dockerImageTag: 'myTag',
dockerRegistryUrl: ''
)
assertThat(pushParams.dockerBuildImage, nullValue())
assertThat(pushParams.dockerRegistryUrl, nullValue())
}
@Test
void testKaniko() {
def kanikoParams = [:]
helper.registerAllowedMethod('kanikoExecute', [Map.class], { m ->
kanikoParams = m
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'kaniko',
dockerImageName: 'path/to/myImage',
dockerImageTag: 'myTag',
dockerRegistryUrl: 'https://my.registry:55555'
)
assertThat(kanikoParams.containerImageNameAndTag.toString(), is('my.registry:55555/path/to/myImage:myTag'))
}
@Test
void testKanikoNoPush() {
def kanikoParams = [:]
helper.registerAllowedMethod('kanikoExecute', [Map.class], { m ->
kanikoParams = m
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'kaniko',
dockerImageName: 'path/to/myImage',
dockerImageTag: 'myTag',
dockerRegistryUrl: ''
)
assertThat(kanikoParams.containerImageNameAndTag, is(''))
}
@Test
void testSwitchToKaniko() {
shellCallRule.setReturnValue('docker ps -q > /dev/null', 1)
def kanikoParams = [:]
helper.registerAllowedMethod('kanikoExecute', [Map.class], { m ->
kanikoParams = m
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'kaniko',
dockerImageName: 'path/to/myImage',
dockerImageTag: 'myTag',
dockerRegistryUrl: 'https://my.registry:55555'
)
assertThat(kanikoParams.containerImageNameAndTag.toString(), is('my.registry:55555/path/to/myImage:myTag'))
}
}