1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00

Merge branch 'master' into goGithub

This commit is contained in:
Oliver Nocon 2019-11-06 11:29:16 +01:00 committed by GitHub
commit d385015437
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 231 additions and 2 deletions

4
.gitignore vendored
View File

@ -19,5 +19,5 @@ documentation/docs-gen
consumer-test/**/workspace consumer-test/**/workspace
*.code-workspace *.code-workspace
piper /piper
piper.exe /piper.exe

View File

@ -7,6 +7,7 @@ import hudson.tasks.junit.TestResultAction
import jenkins.model.Jenkins import jenkins.model.Jenkins
import org.apache.commons.io.IOUtils import org.apache.commons.io.IOUtils
import org.jenkinsci.plugins.workflow.libs.LibrariesAction
import org.jenkinsci.plugins.workflow.steps.MissingContextVariableException import org.jenkinsci.plugins.workflow.steps.MissingContextVariableException
@API @API
@ -108,3 +109,21 @@ String getIssueCommentTriggerAction() {
def getJobStartedByUserId() { def getJobStartedByUserId() {
return getRawBuild().getCause(hudson.model.Cause.UserIdCause.class)?.getUserId() return getRawBuild().getCause(hudson.model.Cause.UserIdCause.class)?.getUserId()
} }
@NonCPS
def getLibrariesInfo() {
def libraries = []
def build = getRawBuild()
def libs = build.getAction(LibrariesAction.class).getLibraries()
for (def i = 0; i < libs.size(); i++) {
Map lib = [:]
lib['name'] = libs[i].name
lib['version'] = libs[i].version
lib['trusted'] = libs[i].trusted
libraries.add(lib)
}
return libraries
}

View File

@ -0,0 +1,63 @@
package com.sap.piper
class PiperGoUtils implements Serializable {
private static Script steps
private static Utils utils
PiperGoUtils(Script steps) {
this.steps = steps
this.utils = new Utils()
}
PiperGoUtils(Script steps, Utils utils) {
this.steps = steps
this.utils = utils
}
void unstashPiperBin() {
if (utils.unstash('piper-bin').size() > 0) return
def libraries = getLibrariesInfo()
String version
libraries.each {lib ->
if (lib.name == 'piper-lib-os') {
version = lib.version
}
}
def fallbackUrl = 'https://github.com/SAP/jenkins-library/releases/latest/download/piper_master'
def piperBinUrl = (version == 'master') ? fallbackUrl : "https://github.com/SAP/jenkins-library/releases/tag/${version}"
boolean downloaded = downloadGoBinary(piperBinUrl)
if (!downloaded) {
//Inform that no Piper binary is available for used library branch
steps.echo ("Not able to download go binary of Piper for version ${version}")
//Fallback to master version & throw error in case this fails
steps.retry(5) {
if (!downloadGoBinary(fallbackUrl)) {
steps.sleep(2)
steps.error("Download of Piper go binary failed.")
}
}
}
utils.stashWithMessage('piper-bin', 'failed to stash piper binary', 'piper')
}
List getLibrariesInfo() {
return new JenkinsUtils().getLibrariesInfo()
}
private boolean downloadGoBinary(url) {
def httpStatus = steps.sh(returnStdout: true, script: "curl --insecure --silent --location --write-out '%{http_code}' --output ./piper '${url}'")
if (httpStatus == '200') {
steps.sh(script: 'chmod +x ./piper')
return true
}
return false
}
}

View File

@ -71,6 +71,16 @@ class JenkinsUtilsTest extends BasePiperTest {
return triggerCause return triggerCause
} }
} }
def getAction(type) {
return new Object() {
def getLibraries() {
return [
[name: 'lib1', version: '1', trusted: true],
[name: 'lib2', version: '2', trusted: false],
]
}
}
}
} }
LibraryLoadingTestExecutionListener.prepareObjectInterceptors(rawBuildMock) LibraryLoadingTestExecutionListener.prepareObjectInterceptors(rawBuildMock)
@ -130,4 +140,12 @@ class JenkinsUtilsTest extends BasePiperTest {
userId = null userId = null
assertThat(jenkinsUtils.getJobStartedByUserId(), isEmptyOrNullString()) assertThat(jenkinsUtils.getJobStartedByUserId(), isEmptyOrNullString())
} }
@Test
void testGetLibrariesInfo() {
def libs
libs = jenkinsUtils.getLibrariesInfo()
assertThat(libs[0], is([name: 'lib1', version: '1', trusted: true]))
assertThat(libs[1], is([name: 'lib2', version: '2', trusted: false]))
}
} }

View File

@ -0,0 +1,129 @@
package com.sap.piper
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.JenkinsLoggingRule
import util.JenkinsShellCallRule
import util.Rules
import static org.hamcrest.Matchers.containsString
import static org.hamcrest.Matchers.is
import static org.junit.Assert.assertThat
class PiperGoUtilsTest extends BasePiperTest {
public ExpectedException exception = ExpectedException.none()
public JenkinsShellCallRule shellCallRule = new JenkinsShellCallRule(this)
public JenkinsLoggingRule loggingRule = new JenkinsLoggingRule(this)
@Rule
public RuleChain ruleChain = Rules.getCommonRules(this)
.around(shellCallRule)
.around(exception)
.around(loggingRule)
@Before
void init() {
helper.registerAllowedMethod("retry", [Integer, Closure], null)
}
@Test
void testUnstashPiperBinAvailable() {
def piperBinStash = 'piper-bin'
// this mocks utils.unstash
helper.registerAllowedMethod("unstash", [String.class], { stashFileName ->
if (stashFileName != piperBinStash) {
return []
}
return [piperBinStash]
})
def piperGoUtils = new PiperGoUtils(nullScript, utils)
piperGoUtils.unstashPiperBin()
}
@Test
void testUnstashPiperBinMaster() {
def piperGoUtils = new PiperGoUtils(nullScript, utils)
piperGoUtils.metaClass.getLibrariesInfo = {-> return [[name: 'piper-lib-os', version: 'master']]}
// this mocks utils.unstash - mimic stash not existing
helper.registerAllowedMethod("unstash", [String.class], { stashFileName ->
return []
})
shellCallRule.setReturnValue('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/latest/download/piper_master\'', '200')
piperGoUtils.unstashPiperBin()
assertThat(shellCallRule.shell.size(), is(2))
assertThat(shellCallRule.shell[0].toString(), is('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/latest/download/piper_master\''))
assertThat(shellCallRule.shell[1].toString(), is('chmod +x ./piper'))
}
@Test
void testUnstashPiperBinNonMaster() {
def piperGoUtils = new PiperGoUtils(nullScript, utils)
piperGoUtils.metaClass.getLibrariesInfo = {-> return [[name: 'piper-lib-os', version: 'testTag']]}
// this mocks utils.unstash - mimic stash not existing
helper.registerAllowedMethod("unstash", [String.class], { stashFileName ->
return []
})
shellCallRule.setReturnValue('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/tag/testTag\'', '200')
piperGoUtils.unstashPiperBin()
assertThat(shellCallRule.shell.size(), is(2))
assertThat(shellCallRule.shell[0].toString(), is('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/tag/testTag\''))
assertThat(shellCallRule.shell[1].toString(), is('chmod +x ./piper'))
}
@Test
void testUnstashPiperBinFallback() {
def piperGoUtils = new PiperGoUtils(nullScript, utils)
piperGoUtils.metaClass.getLibrariesInfo = {-> return [[name: 'piper-lib-os', version: 'notAvailable']]}
shellCallRule.setReturnValue('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/tag/notAvailable\'', '404')
shellCallRule.setReturnValue('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/latest/download/piper_master\'', '200')
// this mocks utils.unstash - mimic stash not existing
helper.registerAllowedMethod("unstash", [String.class], { stashFileName ->
return []
})
piperGoUtils.unstashPiperBin()
assertThat(shellCallRule.shell.size(), is(3))
assertThat(shellCallRule.shell[0].toString(), is('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/tag/notAvailable\''))
assertThat(shellCallRule.shell[1].toString(), is('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/latest/download/piper_master\''))
assertThat(shellCallRule.shell[2].toString(), is('chmod +x ./piper'))
}
@Test
void testDownloadFailed() {
def piperGoUtils = new PiperGoUtils(nullScript, utils)
piperGoUtils.metaClass.getLibrariesInfo = {-> return [[name: 'piper-lib-os', version: 'notAvailable']]}
shellCallRule.setReturnValue('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/tag/notAvailable\'', '404')
shellCallRule.setReturnValue('curl --insecure --silent --location --write-out \'%{http_code}\' --output ./piper \'https://github.com/SAP/jenkins-library/releases/latest/download/piper_master\'', '500')
helper.registerAllowedMethod("unstash", [String.class], { stashFileName ->
return []
})
exception.expectMessage(containsString('Download of Piper go binary failed'))
piperGoUtils.unstashPiperBin()
}
}