Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wangjie
OpenXG-RAN
Commits
d4cd65f6
Commit
d4cd65f6
authored
Mar 17, 2021
by
Raphael Defosseux
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CI: initial draft for new container pipeline
Signed-off-by:
Raphael Defosseux
<
raphael.defosseux@eurecom.fr
>
parent
d6c07d81
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
217 additions
and
0 deletions
+217
-0
ci-scripts/Jenkinsfile-GitLab-Container
ci-scripts/Jenkinsfile-GitLab-Container
+217
-0
No files found.
ci-scripts/Jenkinsfile-GitLab-Container
0 → 100644
View file @
d4cd65f6
#
!
/bin/
groovy
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
// Location of the executor node
def
nodeExecutor
=
params
.
nodeExecutor
// Tags to shorten pipeline duration
def
doMandatoryTests
=
false
def
doFullTestsuite
=
false
pipeline
{
agent
{
label
nodeExecutor
}
options
{
disableConcurrentBuilds
()
timestamps
()
gitLabConnection
(
'OAI GitLab'
)
ansiColor
(
'xterm'
)
}
stages
{
stage
(
"Verify Parameters"
)
{
steps
{
script
{
JOB_TIMESTAMP
=
sh
returnStdout:
true
,
script:
'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"'
JOB_TIMESTAMP
=
JOB_TIMESTAMP
.
trim
()
echo
'\u2705 \u001B[32mVerify Parameters\u001B[0m'
def
allParametersPresent
=
true
echo
'\u2705 \u001B[32mVerify Labels\u001B[0m'
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
LABEL_CHECK
=
sh
returnStdout:
true
,
script:
'ci-scripts/checkGitLabMergeRequestLabels.sh --mr-id '
+
env
.
gitlabMergeRequestIid
LABEL_CHECK
=
LABEL_CHECK
.
trim
()
if
(
LABEL_CHECK
==
'NONE'
)
{
def
message
=
"OAI "
+
JOB_NAME
+
" build ("
+
BUILD_ID
+
"): Your merge request has none of the mandatory labels:\n\n"
message
+=
" - BUILD-ONLY\n"
message
+=
" - 4G-LTE\n"
message
+=
" - 5G-NR\n"
message
+=
" - CI\n\n"
message
+=
"Not performing CI due to lack of labels"
addGitLabMRComment
comment:
message
error
(
'Not performing CI due to lack of labels'
)
}
else
if
(
LABEL_CHECK
==
'FULL'
)
{
doMandatoryTests
=
true
doFullTestsuite
=
true
}
else
if
(
LABEL_CHECK
==
'SHORTEN-5G'
)
{
doMandatoryTests
=
true
}
else
{
def
message
=
"OAI "
+
JOB_NAME
+
" build ("
+
BUILD_ID
+
"): We will perform only build stages on your Merge Request"
addGitLabMRComment
comment:
message
}
}
else
{
doMandatoryTests
=
true
doFullTestsuite
=
true
}
}
}
}
stage
(
"Verify Guidelines"
)
{
steps
{
echo
"Git URL is ${GIT_URL}"
echo
"GitLab Act is ${env.gitlabActionType}"
script
{
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
// since a bit, in push events, gitlabUserEmail is not populated
gitCommitAuthorEmailAddr
=
env
.
gitlabUserEmail
echo
"GitLab Usermail is ${gitCommitAuthorEmailAddr}"
// GitLab-Jenkins plugin integration is lacking to perform the merge by itself
// Doing it manually --> it may have merge conflicts
sh
"./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
}
else
{
echo
"Git Branch is ${GIT_BRANCH}"
echo
"Git Commit is ${GIT_COMMIT}"
// since a bit, in push events, gitlabUserEmail is not populated
gitCommitAuthorEmailAddr
=
sh
returnStdout:
true
,
script:
'git log -n1 --pretty=format:%ae ${GIT_COMMIT}'
gitCommitAuthorEmailAddr
=
gitCommitAuthorEmailAddr
.
trim
()
echo
"GitLab Usermail is ${gitCommitAuthorEmailAddr}"
sh
"git log -n1 --pretty=format:\"%s\" > .git/CI_COMMIT_MSG"
}
}
}
post
{
failure
{
script
{
def
message
=
"OAI "
+
JOB_NAME
+
" build ("
+
BUILD_ID
+
"): Merge Conflicts -- Cannot perform CI"
addGitLabMRComment
comment:
message
currentBuild
.
result
=
'FAILURE'
}
}
}
}
}
post
{
always
{
script
{
emailext
attachmentsPattern:
'*results*.html'
,
body:
'''Hi,
Here are attached HTML report files for $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
Regards,
OAI CI Team'''
,
replyTo:
'no-reply@openairinterface.org'
,
subject:
'$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!'
,
to:
gitCommitAuthorEmailAddr
if
(
fileExists
(
'.git/CI_COMMIT_MSG'
))
{
sh
"rm -f .git/CI_COMMIT_MSG"
}
}
}
success
{
script
{
def
message
=
"OAI "
+
JOB_NAME
+
" build ("
+
BUILD_ID
+
"): passed ("
+
BUILD_URL
+
")"
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
echo
"This is a MERGE event"
addGitLabMRComment
comment:
message
}
}
}
failure
{
script
{
def
message
=
"OAI "
+
JOB_NAME
+
" build ("
+
BUILD_ID
+
"): failed ("
+
BUILD_URL
+
")"
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
echo
"This is a MERGE event"
addGitLabMRComment
comment:
message
}
}
}
}
}
// ---- Slave Job functions
def
triggerSlaveJob
(
jobName
,
gitlabStatusName
)
{
// Workaround for the "cancelled" GitLab pipeline notification
// The slave job is triggered with the propagate false so the following commands are executed
// Its status is now PASS/SUCCESS from a stage pipeline point of view
// localStatus variable MUST be analyzed to properly assess the status
localStatus
=
build
job:
jobName
,
parameters:
[
string
(
name:
'eNB_Repository'
,
value:
String
.
valueOf
(
GIT_URL
)),
string
(
name:
'eNB_Branch'
,
value:
String
.
valueOf
(
env
.
gitlabSourceBranch
)),
string
(
name:
'eNB_CommitID'
,
value:
String
.
valueOf
(
env
.
gitlabMergeRequestLastCommit
)),
booleanParam
(
name:
'eNB_mergeRequest'
,
value:
"MERGE"
.
equals
(
env
.
gitlabActionType
)),
string
(
name:
'eNB_TargetBranch'
,
value:
String
.
valueOf
(
env
.
gitlabTargetBranch
))
],
propagate:
false
localResult
=
localStatus
.
getResult
()
echo
"${jobName} Slave Job status is ${localResult}"
gitlabCommitStatus
(
name:
gitlabStatusName
)
{
if
(
localStatus
.
resultIsBetterOrEqualTo
(
'SUCCESS'
))
{
echo
"${jobName} Slave Job is OK"
}
else
{
echo
"${jobName} Slave Job is KO"
sh
"ci-scripts/fail.sh"
}
}
}
def
triggerSlaveJobNoGitLab
(
jobName
)
{
// Workaround for the "cancelled" GitLab pipeline notification
// The slave job is triggered with the propagate false so the following commands are executed
// Its status is now PASS/SUCCESS from a stage pipeline point of view
// localStatus variable MUST be analyzed to properly assess the status
localStatus
=
build
job:
jobName
,
parameters:
[
string
(
name:
'eNB_Repository'
,
value:
String
.
valueOf
(
GIT_URL
)),
string
(
name:
'eNB_Branch'
,
value:
String
.
valueOf
(
env
.
gitlabSourceBranch
)),
string
(
name:
'eNB_CommitID'
,
value:
String
.
valueOf
(
env
.
gitlabMergeRequestLastCommit
)),
booleanParam
(
name:
'eNB_mergeRequest'
,
value:
"MERGE"
.
equals
(
env
.
gitlabActionType
)),
string
(
name:
'eNB_TargetBranch'
,
value:
String
.
valueOf
(
env
.
gitlabTargetBranch
))
],
propagate:
false
localResult
=
localStatus
.
getResult
()
echo
"${jobName} Slave Job status is ${localResult}"
if
(
localStatus
.
resultIsBetterOrEqualTo
(
'SUCCESS'
))
{
echo
"${jobName} Slave Job is OK"
}
else
{
echo
"${jobName} Slave Job is KO"
sh
"ci-scripts/fail.sh"
}
}
def
finalizeSlaveJob
(
jobName
)
{
// In case of any non-success, we are retrieving the HTML report of the last completed
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
fileName
=
"test_results-${jobName}.html"
if
(!
fileExists
(
fileName
))
{
copyArtifacts
(
projectName:
jobName
,
filter:
'test_results*.html'
,
selector:
lastCompleted
())
if
(
fileExists
(
fileName
))
{
sh
"sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' ${fileName}"
archiveArtifacts
artifacts:
fileName
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment