Jenkinsfile: Fix workspace allocation and rewrite for configuration mapping.

This commit is contained in:
/dev/urandom 2016-09-17 19:08:00 +02:00
parent e29377580b
commit cce87be09a
No known key found for this signature in database
GPG Key ID: 41322B973E0F295E

119
Jenkinsfile vendored
View File

@ -36,11 +36,43 @@ is set up. For those who want to play around with this, here's a bit of informat
import groovy.transform.Field import groovy.transform.Field
@Field def configurations = [ @Field def configurations = [
"Debug", "Debug": [
// "DebugStatic", WorkspaceID: "build@debug",
"Release", StashName: "iw4x-debug",
// "ReleaseStatic" MSBuildConfiguration: "Debug",
] PremakeArgs: "",
Archive: true,
],
"Release": [
WorkspaceID: "build@release",
StashName: "iw4x-release",
MSBuildConfiguration: "Release",
PremakeArgs: "",
Archive: true,
],
"Release with unit tests": [
WorkspaceID: "build@release+unittests",
StashName: "iw4x-release-unittests",
MSBuildConfiguration: "Release",
PremakeArgs: "--force-unit-tests",
Archive: false,
],
].collect {k, v -> [k, v]}
@Field def testing = [
"Debug": [
WorkspaceID: "testing@debug",
StashName: "iw4x-debug",
],
"Release": [
WorkspaceID: "testing@release",
StashName: "iw4x-release-unittests",
],
].collect {k, v -> [k, v]}
def jobWorkspace(id, f) {
ws("workspace/${env.JOB_NAME}@$id", f)
}
def useShippedPremake(f) { def useShippedPremake(f) {
def premakeHome = "${pwd()}\\tools" def premakeHome = "${pwd()}\\tools"
@ -65,19 +97,19 @@ def getIW4xExecutable() {
// This will build the IW4x client. // This will build the IW4x client.
// We need a Windows Server with Visual Studio 2015, Premake5 and Git on it. // We need a Windows Server with Visual Studio 2015, Premake5 and Git on it.
def doBuild(name, wsid, premakeFlags, configuration) { def doBuild(cfg) {
node("windows") { node("windows") {
ws("IW4x/build/$wsid") { jobWorkspace(cfg.WorkspaceID) {
checkout scm checkout scm
useShippedPremake { useShippedPremake {
def outputDir = pwd() def outputDir = pwd()
def msbuild = tool "Microsoft.NET MSBuild 14.0" def msbuild = tool "Microsoft.NET MSBuild 14.0"
bat "premake5 vs2015 $premakeFlags" bat "premake5 vs2015 ${cfg.PremakeArgs}"
bat "\"${msbuild}\" build\\iw4x.sln \"/p:OutDir=$outputDir\\\\\" \"/p:Configuration=$configuration\"" bat "\"${msbuild}\" build\\iw4x.sln \"/p:OutDir=$outputDir\\\\\" \"/p:Configuration=${cfg.MSBuildConfiguration}\""
} }
stash name: "$name", includes: "*.dll,*.pdb" stash name: "${cfg.StashName}", includes: "*.dll,*.pdb"
} }
} }
} }
@ -148,12 +180,14 @@ gitlabBuilds(builds: ["Checkout & Versioning", "Build", "Testing", "Archiving"])
stage("Checkout & Versioning") { stage("Checkout & Versioning") {
gitlabCommitStatus("Checkout & Versioning") { gitlabCommitStatus("Checkout & Versioning") {
node("windows") { node("windows") {
checkout scm jobWorkspace("versioning") {
checkout scm
useShippedPremake { useShippedPremake {
def version = bat(returnStdout: true, script: '@premake5 version').split("\r?\n")[1] def version = bat(returnStdout: true, script: '@premake5 version').split("\r?\n")[1]
currentBuild.setDisplayName "$version (#${env.BUILD_NUMBER})" currentBuild.setDisplayName "$version (#${env.BUILD_NUMBER})"
}
} }
} }
} }
@ -163,14 +197,18 @@ gitlabBuilds(builds: ["Checkout & Versioning", "Build", "Testing", "Archiving"])
stage("Build") { stage("Build") {
gitlabCommitStatus("Build") { gitlabCommitStatus("Build") {
def executions = [:] def executions = [:]
for (int i = 0; i < configurations.size(); i++) for (int i = 0; i < configurations.size(); i++) {
{ def entry = configurations[i]
def configuration = configurations[i]
executions["$configuration"] = { def configName = entry[0]
doBuild("IW4x $configuration", "$configuration", "", configuration) def config = entry[1]
}
executions["$configuration with unit tests"] = { executions[configName] = {
doBuild("IW4x $configuration (unit tests)", "$configuration+unittests", "--force-unit-tests", configuration) node("windows") {
jobWorkspace(config.WorkspaceID) {
doBuild(config)
}
}
} }
} }
parallel executions parallel executions
@ -181,16 +219,20 @@ gitlabBuilds(builds: ["Checkout & Versioning", "Build", "Testing", "Archiving"])
stage("Testing") { stage("Testing") {
gitlabCommitStatus("Testing") { gitlabCommitStatus("Testing") {
executions = [:] executions = [:]
for (int i = 0; i < configurations.size(); i++) { for (int i = 0; i < testing.size(); i++) {
def configuration = configurations[i] def entry = testing.get(i)
executions["$configuration on Windows"] = {
def testName = entry[0]
def test = entry[1]
executions["$testName on Windows"] = {
node("windows") { node("windows") {
ws("IW4x/testing/$configuration") { jobWorkspace(test.WorkspaceID) {
doUnitTests("IW4x $configuration (unit tests)") doUnitTests(test.StashName)
} }
} }
} }
executions["$configuration on Linux"] = { executions["$testName on Linux"] = {
node("docker && linux && amd64") { node("docker && linux && amd64") {
try { try {
def image = null def image = null
@ -200,12 +242,12 @@ gitlabBuilds(builds: ["Checkout & Versioning", "Build", "Testing", "Archiving"])
deleteDir() deleteDir()
} }
image.inside { image.inside {
doUnitTests("IW4x $configuration (unit tests)") doUnitTests(test.StashName)
} }
} catch (Exception e) { } catch (Exception e) {
if (isUnix()) { if (isUnix()) {
manager.buildUnstable() manager.buildUnstable()
manager.addWarningBadge "$configuration unit test failed on Linux" manager.addWarningBadge "$testName unit test failed on Linux"
} else { } else {
throw e throw e
} }
@ -221,13 +263,18 @@ gitlabBuilds(builds: ["Checkout & Versioning", "Build", "Testing", "Archiving"])
stage("Archiving") { stage("Archiving") {
gitlabCommitStatus("Archiving") { gitlabCommitStatus("Archiving") {
node("windows") { // any node will do node("windows") { // any node will do
ws("IW4x/pub") { jobWorkspace("archiving") {
try { try {
for (int i = 0; i < configurations.size(); i++) for (int i = 0; i < configurations.size(); i++) {
{ def entry = configurations[i]
def configuration = configurations[i]
dir("$configuration") { def configName = entry[0]
unstash "IW4x $configuration" def config = entry[1]
if (config.Archive) {
dir(configName) {
unstash config.StashName
}
} }
} }
archiveArtifacts artifacts: "**/*.dll,**/*.pdb", fingerprint: true archiveArtifacts artifacts: "**/*.dll,**/*.pdb", fingerprint: true