forked from HoerTech-gGmbH/openMHA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jenkinsfile.differential
182 lines (166 loc) · 7.73 KB
/
Jenkinsfile.differential
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
// This file is part of the HörTech Open Master Hearing Aid (openMHA)
// Copyright © 2018 2019 HörTech gGmbH
//
// openMHA is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, version 3 of the License.
//
// openMHA is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License, version 3 for more details.
//
// You should have received a copy of the GNU Affero General Public License,
// version 3 along with openMHA. If not, see <http://www.gnu.org/licenses/>.
// On the 2019 windows build server, we cannot use the sh step anymore.
// This workaround invokes the msys2 bash, sets the required environment
// variables, and executes the desired command.
def windows_bash(command) {
bat ('C:\\msys64\\usr\\bin\\bash -c "source /jenkins.environment && set -ex && ' + command + ' "')
// This will probably fail if command contains multiple lines, quotes, or
// similar. Currently all our shell commands are simple enough for this
// simple solution to work. Should this no longer be sufficient, then we
// could write the shell command to a temporary file and execute this file
// after sourcing the enviroment.
}
// Encapsulation of the build steps to perform when compiling openMHA for
// phabricator code reviews
// @param stage_name the stage name is "system && arch" where system is bionic,
// xenial, windows, or mac, and arch is x86_64, i686,
// or armv7. Both are separated by an && operator and spaces.
// This string is also used as a valid label expression for
// jenkins. The appropriate nodes have the respective labels.
// We might need to extend this in future to include the
// "mhadev" label, to differentiate build environments
// for the same system and architecture but with different
// library / tool dependencies.
def openmha_build_steps(stage_name) {
// Extract components from stage_name:
def system, arch, devenv
(system,arch,devenv) = stage_name.split(/ *&& */) // regexp for missing/extra spaces
// platform booleans
def linux = (system != "windows" && system != "mac")
def windows = (system == "windows")
def mac = (system == "mac")
def docs = (devenv == "mhadoc")
// Compilation on ARM is the slowest, assign 5 CPU cores to each ARM build job
def cpus = (arch == "armv7") ? 5 : 2 // default on other systems is 2 cores
def additional_cpus_for_docs = 7
// workaround to invoke unix shell on all systems
def bash = { command -> windows ? windows_bash(command) : sh(command) }
// checkout and clean openMHA, branch development
checkout changelog: false, poll: false, scm: [
$class: 'GitSCM',
branches: [[name: "phabricator/diff/$DIFF_ID"]],
browser: [$class: 'Phabricator', repo: 'rOMD',
repoUrl: 'https://dev.openmha.org/'],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'CleanCheckout']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '8219f3dc-c16a-44d4-a0a3-a336b036fc29',
url: "$GIT_SERVER_MHA/mha_phabricator_staging"]]]
// Save time by using precompiled external libs if possible.
// Install pre-compiled external libraries for the common branches
copyArtifacts(projectName: "openMHA/external_libs/external_libs_development",
selector: lastSuccessful())
bash "tar xvzf external_libs.tgz"
// if we notice any differences between the sources of the precompiled
// dependencies and the current sources, we cannot help but need to recompile
bash "git diff --exit-code || (git reset --hard && git clean -ffdx)"
// Autodetect libs/compiler
bash "./configure"
if (docs) {
bash ("make -j ${cpus + additional_cpus_for_docs} doc")
// Store generated PDF documents as Jenkins artifacts
stash name: "docs", includes: '*.pdf'
bash ("echo stashed docs on $system $arch at \$(date -R)")
archiveArtifacts 'pdf-*.zip'
}
// Build executables, plugins, execute tests
bash ("make -j $cpus test")
// Retrieve the documents, wait if they are not ready yet
def wait_time = 1
def attempt = 0
retry(45){
sleep(wait_time)
wait_time = 15
attempt = attempt + 1
bash ("echo unstash docs attempt $attempt on $system $arch at \$(date -R)")
unstash "docs"
}
if (linux) {
bash ("make -j $cpus deb")
// Store debian packages
stash name: (arch+"_"+system), includes: 'mha/tools/packaging/deb/hoertech/'
archiveArtifacts 'mha/tools/packaging/deb/hoertech/*/*.deb'
}
if (windows) {
bash ("make -j $cpus exe")
// Store windows installer
archiveArtifacts 'mha/tools/packaging/exe/*.exe'
}
if (mac) {
bash ("make -j $cpus pkg")
// Store mac installer
archiveArtifacts 'mha/tools/packaging/pkg/*.pkg'
}
}
pipeline {
agent {label "jenkinsmaster"}
parameters {
string(name: 'PHID', defaultValue: 'invalidDefault', description: '')
string(name: 'DIFF_ID', defaultValue: 'invalidDefault', description: '')
}
stages {
stage("build") {
parallel {
stage( "bionic && x86_64 && mhadoc") {
agent {label "bionic && x86_64 && mhadoc"}
steps {openmha_build_steps("bionic && x86_64 && mhadoc")}
}
stage( "xenial && x86_64 && mhadev") {
agent {label "xenial && x86_64 && mhadev"}
steps {openmha_build_steps("xenial && x86_64 && mhadev")}
}
stage( "bionic && i686 && mhadev") {
agent {label "bionic && i686 && mhadev"}
steps {openmha_build_steps("bionic && i686 && mhadev")}
}
stage( "xenial && i686 && mhadev") {
agent {label "xenial && i686 && mhadev"}
steps {openmha_build_steps("xenial && i686 && mhadev")}
}
stage( "bionic && armv7 && mhadev") {
agent {label "bionic && armv7 && mhadev"}
steps {openmha_build_steps("bionic && armv7 && mhadev")}
}
stage( "xenial && armv7 && mhadev") {
agent {label "xenial && armv7 && mhadev"}
steps {openmha_build_steps("xenial && armv7 && mhadev")}
}
stage( "windows && x86_64 && mhadev") {
agent {label "windows && x86_64 && mhadev"}
steps {openmha_build_steps("windows && x86_64 && mhadev")}
}
stage( "mac && x86_64 && mhadev") {
agent {label "mac && x86_64 && mhadev"}
steps {openmha_build_steps("mac && x86_64 && mhadev")}
}
}
}
}
post {
always {
script {
// workaround. See https://github.com/uber/phabricator-jenkins-plugin/pull/185
currentBuild.result = currentBuild.currentResult
}
step([$class: 'PhabricatorNotifier',
commentOnSuccess: true,
commentWithConsoleLinkOnFailure: true,
uberallsEnabled: false,
customComment: false,
processLint: false])
}
}
}