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:
commit
d385015437
4
.gitignore
vendored
4
.gitignore
vendored
@ -19,5 +19,5 @@ documentation/docs-gen
|
|||||||
consumer-test/**/workspace
|
consumer-test/**/workspace
|
||||||
|
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
piper
|
/piper
|
||||||
piper.exe
|
/piper.exe
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
63
src/com/sap/piper/PiperGoUtils.groovy
Normal file
63
src/com/sap/piper/PiperGoUtils.groovy
Normal 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
|
||||||
|
}
|
||||||
|
}
|
@ -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]))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
129
test/groovy/com/sap/piper/PiperGoUtilsTest.groovy
Normal file
129
test/groovy/com/sap/piper/PiperGoUtilsTest.groovy
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user