Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-AMF
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
OpenXG
OpenXG-AMF
Commits
d73c2618
Commit
d73c2618
authored
Mar 19, 2021
by
Raphael Defosseux
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'add-rhel8-build-ci' into 'develop'
Add rhel8 build ci See merge request oai/cn5g/oai-cn5g-amf!16
parents
56f8113e
abb5bc4f
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
469 additions
and
349 deletions
+469
-349
build/scripts/build_helper
build/scripts/build_helper
+1
-1
ci-scripts/Jenkinsfile-GitLab-Docker
ci-scripts/Jenkinsfile-GitLab-Docker
+150
-56
ci-scripts/generateHtmlReport.py
ci-scripts/generateHtmlReport.py
+318
-292
No files found.
build/scripts/build_helper
View file @
d73c2618
...
...
@@ -39,7 +39,7 @@ case "$OS_DISTRO" in
ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
esac
IS_CONTAINER=`egrep -c "docker|kubepods|podman|
runc-buildah|libpod" /proc/self/cgroup
`
IS_CONTAINER=`egrep -c "docker|kubepods|podman|
buildah|libpod" /proc/self/cgroup || true
`
if [ $IS_CONTAINER -eq 0 ]
then
...
...
ci-scripts/Jenkinsfile-GitLab-Docker
View file @
d73c2618
...
...
@@ -28,10 +28,16 @@ def cn_ci_host = params.Host_CN_CI_Server
// for lock
def
cn_ci_resource
=
params
.
DockerContainers
// Location of the 2nd CN executor
def
new_host_flag
=
false
def
new_host
=
""
def
new_host_user
=
""
// Location of the Remote Ubuntu18 CN executor
def
rem_u18_host_flag
=
false
def
rem_u18_host
=
""
def
rem_u18_host_user
=
""
// Location of the Remote RHEL CN executor
def
rem_rhel_host_flag
=
false
def
rem_rhel_host
=
""
def
rem_rhel_host_user
=
""
def
rem_rhel8_resource
=
params
.
PodmanContainers
// Tags/Branches to use
def
amf_tag
=
"develop"
...
...
@@ -41,6 +47,9 @@ def amf_branch = "develop"
// This base image is potentially subject to changes over time.
def
AMF_BASE_IMAGE_TAG
=
params
.
AmfBaseImageTag
// Merge Request Link
def
gitlabMergeRequestLink
//-------------------------------------------------------------------------------
// Pipeline start
pipeline
{
...
...
@@ -72,23 +81,31 @@ pipeline {
JOB_TIMESTAMP
=
JOB_TIMESTAMP
.
trim
()
if
(
params
.
Host_CN_CI_2nd_Server_Flag
!=
null
)
{
new
_host_flag
=
params
.
Host_CN_CI_2nd_Server_Flag
if
(
new
_host_flag
)
{
new
_host
=
params
.
Host_CN_CI_2nd_Server
new
_host_user
=
params
.
Host_CN_CI_2nd_Server_Login
rem_u18
_host_flag
=
params
.
Host_CN_CI_2nd_Server_Flag
if
(
rem_u18
_host_flag
)
{
rem_u18
_host
=
params
.
Host_CN_CI_2nd_Server
rem_u18
_host_user
=
params
.
Host_CN_CI_2nd_Server_Login
echo
"1st Node is ${NODE_NAME}"
echo
"2nd Node is ${
new
_host}"
echo
"2nd Node is ${
rem_u18
_host}"
}
else
{
echo
"
Node
is ${NODE_NAME}"
echo
"
U18 Node
is ${NODE_NAME}"
}
}
else
{
echo
"Node is ${NODE_NAME}"
}
if
(
params
.
Remote_RHEL_Server_Flag
!=
null
)
{
rem_rhel_host_flag
=
params
.
Remote_RHEL_Server_Flag
if
(
rem_rhel_host_flag
)
{
rem_rhel_host
=
params
.
Remote_RHEL_Server_Name
rem_rhel_host_user
=
params
.
Remote_RHEL_Server_Login
echo
"RHEL Node is ${rem_rhel_host}"
}
}
echo
"Git URL is ${GIT_URL}"
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
try
{
myShCmd
(
'docker image inspect --format=\'Size = {{.Size}} bytes\' oai-amf-base:'
+
AMF_BASE_IMAGE_TAG
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker image inspect --format=\'Size = {{.Size}} bytes\' oai-amf-base:'
+
AMF_BASE_IMAGE_TAG
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
catch
(
Exception
e
)
{
currentBuild
.
result
=
'FAILURE'
echo
'\u26D4 \u001B[31mBase Image does not exist\u001B[0m'
...
...
@@ -103,12 +120,24 @@ pipeline {
script
{
sh
"git clean -x -d -f > /dev/null 2>&1"
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
gitlabMergeRequestLink
=
sh
"curl --silent \"https://gitlab.eurecom.fr/api/v4/projects/oai%2Fcn5g%2Foai-cn5g-smf/merge_requests/53\" | jq .web_url | sed 's#\"##g'"
echo
"========= THIS IS A MERGE REQUEST =========="
echo
"MR ID is ${env.gitlabMergeRequestId}"
echo
"MR LINK is ${gitlabMergeRequestLink}"
echo
"MR TITLE is ${env.gitlabMergeRequestTitle}"
gitCommitAuthorEmailAddr
=
env
.
gitlabUserEmail
echo
"GitLab Usermail is ${gitCommitAuthorEmailAddr}"
sh
"git fetch --prune --unshallow"
shortenShaOne
=
sh
returnStdout:
true
,
script:
'git log -1 --pretty=format:"%h" '
+
env
.
gitlabMergeRequestLastCommit
shortenShaOne
=
shortenShaOne
.
trim
()
sh
"./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
sh
"sleep 10"
amf_tag
=
"ci-tmp"
rhel_amf_tag
=
'ci-temp-pr-'
+
env
.
gitlabMergeRequestId
+
'-'
+
shortenShaOne
amf_branch
=
env
.
gitlabSourceBranch
echo
"MR TAG is ${rhel_amf_tag}"
}
else
{
echo
"======== THIS IS A PUSH REQUEST ========"
echo
"Git Branch is ${GIT_BRANCH}"
echo
"Git Commit is ${GIT_COMMIT}"
gitCommitAuthorEmailAddr
=
sh
returnStdout:
true
,
script:
'git log -n1 --pretty=format:%ae ${GIT_COMMIT}'
...
...
@@ -118,11 +147,9 @@ pipeline {
}
sh
"tar -cjhf /tmp/openair-amf.tar.bz2 ."
sh
"mv /tmp/openair-amf.tar.bz2 ."
copyTo2ndServer
(
'openair-amf.tar.bz2'
,
new_host_flag
,
new_host_user
,
new_host
)
sh
"mkdir -p archives"
if
(
new_host_flag
)
{
sh
"mkdir -p archives/oai-amf-cfg"
}
copyTo2ndServer
(
'openair-amf.tar.bz2'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18_host
)
copyTo2ndServer
(
'openair-amf.tar.bz2'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
sh
"mkdir -p archives/oai-amf-cfg"
}
}
post
{
...
...
@@ -137,43 +164,43 @@ pipeline {
}
stage
(
'Build Core Network Function'
)
{
parallel
{
stage
(
'Build AMF Image'
)
{
stage
(
'Build
U18
AMF Image'
)
{
steps
{
script
{
gitlabCommitStatus
(
name:
"Build AMF Image"
)
{
myShCmd
(
'docker image prune --force'
,
new_host_flag
,
new_host_user
,
new
_host
)
gitlabCommitStatus
(
name:
"Build
U18
AMF Image"
)
{
myShCmd
(
'docker image prune --force'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
if
(
"PUSH"
.
equals
(
env
.
gitlabActionType
))
{
// Currently this pipeline only runs for pushes to `develop` branch
// First clean image registry
try
{
myShCmd
(
'docker image rm oai-amf:develop'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker image rm oai-amf:develop'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
catch
(
Exception
e
)
{
echo
"Maybe a previous build went wrong"
}
// In case of push to `develop` branch we build from scratch
myShCmd
(
'docker build --no-cache --target oai-amf --tag oai-amf:'
+
amf_tag
+
' --file docker/Dockerfile.ubuntu.18.04 --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > archives/amf_docker_image_build.log 2>&1'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker build --no-cache --target oai-amf --tag oai-amf:'
+
amf_tag
+
' --file docker/Dockerfile.ubuntu.18.04 --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > archives/amf_docker_image_build.log 2>&1'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
try
{
// Checking if the CI Base image is still there.
// If the inspect command fails, it's not there. If it passes, let remove tag.
myShCmd
(
'docker image inspect oai-amf-base:latest > /dev/null 2>&1'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker rmi oai-amf-base:latest'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker image inspect oai-amf-base:latest > /dev/null 2>&1'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker rmi oai-amf-base:latest'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
catch
(
Exception
e
)
{
echo
'No need to remove the CI base image'
}
// "latest" is the tag used in the docker file.
myShCmd
(
'docker image tag oai-amf-base:'
+
AMF_BASE_IMAGE_TAG
+
' oai-amf-base:latest'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker build --no-cache --target oai-amf --tag oai-amf:'
+
amf_tag
+
' --file ci-scripts/docker/Dockerfile.ci.ubuntu.18.04 . > archives/amf_docker_image_build.log 2>&1'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker image tag oai-amf-base:'
+
AMF_BASE_IMAGE_TAG
+
' oai-amf-base:latest'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker build --no-cache --target oai-amf --tag oai-amf:'
+
amf_tag
+
' --file ci-scripts/docker/Dockerfile.ci.ubuntu.18.04 . > archives/amf_docker_image_build.log 2>&1'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
myShCmd
(
'docker image ls >> archives/amf_docker_image_build.log'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker image ls >> archives/amf_docker_image_build.log'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
}
}
post
{
always
{
script
{
copyFrom2ndServer
(
'archives/amf_docker_image_build.log'
,
'archives'
,
new_host_flag
,
new_host_user
,
new
_host
)
copyFrom2ndServer
(
'archives/amf_docker_image_build.log'
,
'archives'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
}
success
{
...
...
@@ -184,32 +211,76 @@ pipeline {
}
}
}
stage
(
'Build RHEL8 AMF Image'
)
{
when
{
expression
{
rem_rhel_host_flag
}
}
steps
{
lock
(
rem_rhel8_resource
)
{
script
{
if
(
"PUSH"
.
equals
(
env
.
gitlabActionType
))
{
// Currently this pipeline only runs for pushes to `develop` branch
// First clean image registry
try
{
myShCmd
(
'sudo podman image rm oai-amf:develop || true'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
}
catch
(
Exception
e
)
{
echo
"Maybe a previous build went wrong"
}
}
else
{
// In case we forgot during a previous run
myShCmd
(
'sudo podman image rm oai-amf:'
+
amf_tag
+
' || true'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
}
myShCmd
(
'sudo podman image prune --force'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
// Copy the RHEL Host certificates for building
myShCmd
(
'mkdir -p tmp/ca tmp/entitlement'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
myShCmd
(
'cp /etc/pki/entitlement/*pem tmp/entitlement'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
myShCmd
(
'sudo cp /etc/rhsm/ca/redhat-uep.pem tmp/ca'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
myShCmd
(
'sudo podman build --no-cache --target oai-amf --tag oai-amf:'
+
amf_tag
+
' --file docker/Dockerfile.amf.rhel8.2 --build-arg EURECOM_PROXY="http://proxy.eurecom.fr:8080" . > archives/amf_podman_image_build.log 2>&1'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
myShCmd
(
'sudo podman image ls >> archives/amf_podman_image_build.log'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
if
(
"PUSH"
.
equals
(
env
.
gitlabActionType
))
{
myShCmd
(
'sudo podman image tag oai-amf:'
+
amf_tag
+
' oai-amf:'
+
rhel_amf_tag
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
}
}
}
}
post
{
always
{
script
{
copyFrom2ndServer
(
'archives/amf_podman_image_build.log'
,
'archives'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
}
}
success
{
sh
"echo 'OAI-AMF PODMAN RHEL8 IMAGE BUILD: OK' >> archives/amf_podman_image_build.log"
}
unsuccessful
{
sh
"echo 'OAI-AMF PODMAN RHEL8 IMAGE BUILD: KO' >> archives/amf_podman_image_build.log"
}
}
}
// Running CPPCHECK in parallel to gain time
stage
(
'Static Code Analysis'
)
{
steps
{
script
{
gitlabCommitStatus
(
name:
"Static Code Analysis"
)
{
// Running on xenial to have 1.72 version of cppcheck
myShCmd
(
'docker run --name ci-cn-cppcheck -d ubuntu:xenial /bin/bash -c "sleep infinity"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "apt-get update && apt-get upgrade --yes" > archives/cppcheck_install.log'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "apt-get install --yes cppcheck bzip2" >> archives/cppcheck_install.log'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker run --name ci-cn-cppcheck -d ubuntu:xenial /bin/bash -c "sleep infinity"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "apt-get update && apt-get upgrade --yes" > archives/cppcheck_install.log'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "apt-get install --yes cppcheck bzip2" >> archives/cppcheck_install.log'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker cp ./openair-amf.tar.bz2 ci-cn-cppcheck:/home'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "cd /home && tar -xjf openair-amf.tar.bz2"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "rm -f /home/openair-amf.tar.bz2"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker cp ./openair-amf.tar.bz2 ci-cn-cppcheck:/home'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "cd /home && tar -xjf openair-amf.tar.bz2"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "rm -f /home/openair-amf.tar.bz2"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "cd /home && cppcheck --enable=warning --force --xml --xml-version=2 --suppressions-list=ci-scripts/cppcheck_suppressions.list src 2> cppcheck.xml 1> cppcheck_build.log"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-cppcheck /bin/bash -c "cd /home && cppcheck --enable=warning --force --xml --xml-version=2 --suppressions-list=ci-scripts/cppcheck_suppressions.list src 2> cppcheck.xml 1> cppcheck_build.log"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
}
}
post
{
always
{
script
{
myShCmd
(
'docker cp ci-cn-cppcheck:/home/cppcheck.xml archives'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker cp ci-cn-cppcheck:/home/cppcheck_build.log archives'
,
new_host_flag
,
new_host_user
,
new
_host
)
copyFrom2ndServer
(
'archives/cppcheck*.*'
,
'archives'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker cp ci-cn-cppcheck:/home/cppcheck.xml archives'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker cp ci-cn-cppcheck:/home/cppcheck_build.log archives'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
copyFrom2ndServer
(
'archives/cppcheck*.*'
,
'archives'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
// no need to keep the cppcheck container
myShCmd
(
'docker rm -f ci-cn-cppcheck'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker rm -f ci-cn-cppcheck'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
}
success
{
...
...
@@ -225,20 +296,20 @@ pipeline {
steps
{
script
{
gitlabCommitStatus
(
name:
"Code Formatting Checker"
)
{
myShCmd
(
'docker run --name ci-cn-clang-formatter -d ubuntu:bionic /bin/bash -c "sleep infinity"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "apt-get update && apt-get upgrade --yes" > archives/clang_format_install.log'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "apt-get install --yes git tree bzip2" >> archives/clang_format_install.log'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker run --name ci-cn-clang-formatter -d ubuntu:bionic /bin/bash -c "sleep infinity"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "apt-get update && apt-get upgrade --yes" > archives/clang_format_install.log'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "apt-get install --yes git tree bzip2" >> archives/clang_format_install.log'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker cp ./openair-amf.tar.bz2 ci-cn-clang-formatter:/home'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "cd /home && tar -xjf openair-amf.tar.bz2"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "rm -f /home/openair-amf.tar.bz2"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker cp ./openair-amf.tar.bz2 ci-cn-clang-formatter:/home'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "cd /home && tar -xjf openair-amf.tar.bz2"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "rm -f /home/openair-amf.tar.bz2"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
// We install a dedicated version (installed on our CI server).
myShCmd
(
'docker cp /opt/clang-format/9.0.0/bin/clang-format ci-cn-clang-formatter:/usr/local/bin'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker cp /opt/clang-format/9.0.0/bin/clang-format ci-cn-clang-formatter:/usr/local/bin'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "cd /home && ./ci-scripts/checkCodingFormattingRules.sh --src-branch '
+
env
.
gitlabSourceBranch
+
' --target-branch '
+
env
.
gitlabTargetBranch
+
'"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "cd /home && ./ci-scripts/checkCodingFormattingRules.sh --src-branch '
+
env
.
gitlabSourceBranch
+
' --target-branch '
+
env
.
gitlabTargetBranch
+
'"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
else
{
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "cd /home && ./ci-scripts/checkCodingFormattingRules.sh"'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker exec ci-cn-clang-formatter /bin/bash -c "cd /home && ./ci-scripts/checkCodingFormattingRules.sh"'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
}
}
...
...
@@ -246,17 +317,17 @@ pipeline {
post
{
always
{
script
{
myShCmd
(
'docker cp ci-cn-clang-formatter:/home/src/oai_rules_result.txt src'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker cp ci-cn-clang-formatter:/home/src/oai_rules_result.txt src'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
// May not have been generated
try
{
myShCmd
(
'docker cp ci-cn-clang-formatter:/home/src/oai_rules_result_list.txt src'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker cp ci-cn-clang-formatter:/home/src/oai_rules_result_list.txt src'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
catch
(
Exception
e
)
{
echo
"Failed to copy src/oai_rules_result_list.txt! It may not have been generated. That's OK!"
}
copyFrom2ndServer
(
'archives/clang_format*.*'
,
'archives'
,
new_host_flag
,
new_host_user
,
new
_host
)
copyFrom2ndServer
(
'src/oai_rules*.*'
,
'src'
,
new_host_flag
,
new_host_user
,
new
_host
)
copyFrom2ndServer
(
'archives/clang_format*.*'
,
'archives'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
copyFrom2ndServer
(
'src/oai_rules*.*'
,
'src'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
// no need to keep the clang-formatter container
myShCmd
(
'docker rm -f ci-cn-clang-formatter'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker rm -f ci-cn-clang-formatter'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
}
}
...
...
@@ -317,21 +388,35 @@ pipeline {
script
{
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
// Remove CI Base image tag
myShCmd
(
'docker rmi oai-amf-base:latest'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker rmi oai-amf-base:latest'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
// Removing temporary / intermediate images
try
{
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
myShCmd
(
'docker image rm --force oai-amf:ci-tmp'
,
new_host_flag
,
new_host_user
,
new
_host
)
myShCmd
(
'docker image rm --force oai-amf:ci-tmp'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18
_host
)
}
}
catch
(
Exception
e
)
{
echo
"We failed to delete the OAI-AMF temp image"
}
try
{
myShCmd
(
'docker image prune --force'
,
new_host_flag
,
new_host_user
,
new_host
)
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
myShCmd
(
'sudo podman image rm oai-amf:ci-temp'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
}
}
catch
(
Exception
e
)
{
echo
"We failed to delete the OAI-AMF temp image"
}
try
{
myShCmd
(
'docker image prune --force'
,
rem_u18_host_flag
,
rem_u18_host_user
,
rem_u18_host
)
}
catch
(
Exception
e
)
{
echo
"We failed to prune all unneeded intermediate images"
}
if
(
rem_rhel_host_flag
)
{
try
{
myShCmd
(
'sudo podman image prune --force'
,
rem_rhel_host_flag
,
rem_rhel_host_user
,
rem_rhel_host
)
}
catch
(
Exception
e
)
{
echo
"We failed to prune all unneeded intermediate images"
}
}
// Zipping all archived log files
sh
"zip -r -qq docker_logs.zip archives"
...
...
@@ -342,11 +427,20 @@ pipeline {
// Generating the HTML report
if
(
"MERGE"
.
equals
(
env
.
gitlabActionType
))
{
sh
"python3 ci-scripts/generateHtmlReport.py --job_name=${JOB_NAME} --job_id=${BUILD_ID} --job_url=${BUILD_URL} --git_url=${GIT_URL} --git_src_branch=${env.gitlabSourceBranch} --git_src_commit=${env.gitlabMergeRequestLastCommit} --git_pull_request=True --git_target_branch=${env.gitlabTargetBranch} --git_target_commit=${GIT_COMMIT}"
if
(
fileExists
(
'test_results_oai_amf.html'
))
{
sh
"sed -i -e 's#TEMPLATE_MERGE_REQUEST_LINK#${ghprbPullLink}#g' test_results_oai_amf.html"
sh
"sed -i -e 's#TEMPLATE_MERGE_REQUEST_TEMPLATE#${env.gitlabMergeRequestTitle}#' test_results_oai_amf.html"
}
if
(
fileExists
(
'test_results_oai_cn5g.html'
))
{
sh
"sed -i -e 's#TEMPLATE_MERGE_REQUEST_LINK#${ghprbPullLink}#g' *_results_oai_cn5g.html"
sh
"sed -i -e 's#TEMPLATE_MERGE_REQUEST_TEMPLATE#${env.gitlabMergeRequestTitle}#' *_results_oai_cn5g.html"
}
}
else
{
sh
"python3 ci-scripts/generateHtmlReport.py --job_name=${JOB_NAME} --job_id=${BUILD_ID} --job_url=${BUILD_URL} --git_url=${GIT_URL} --git_src_branch=${GIT_BRANCH} --git_src_commit=${GIT_COMMIT}"
}
sh
"sed -i -e 's#TEMPLATE_TIME#${JOB_TIMESTAMP}#' test_results_oai_amf.html"
if
(
fileExists
(
'test_results_oai_amf.html'
))
{
sh
"sed -i -e 's#TEMPLATE_TIME#${JOB_TIMESTAMP}#' test_results_oai_amf.html"
archiveArtifacts
artifacts:
'test_results_oai_amf.html'
}
if
(
fileExists
(
'test_results_oai_cn5g.html'
))
{
...
...
@@ -382,8 +476,8 @@ def copyTo2ndServer(filename, flag, user, host) {
sh
"scp ${filename} ${user}@${host}:/tmp/CI-CN-AMF"
if
(
"openair-amf.tar.bz2"
.
equals
(
filename
))
{
sh
"ssh ${user}@${host} 'cd /tmp/CI-CN-AMF && tar -xjf ${filename}'"
sh
"ssh ${user}@${host} 'mkdir -p /tmp/CI-CN-AMF/archives'"
sh
"ssh ${user}@${host} 'mkdir -p /tmp/CI-CN-AMF/archives/oai-amf-cfg'"
sh
"ssh ${user}@${host} 'rm -Rf /tmp/CI-CN-AMF/${filename}'"
}
}
}
...
...
ci-scripts/generateHtmlReport.py
View file @
d73c2618
...
...
@@ -109,7 +109,16 @@ class HtmlReport():
buildSummary
+=
' <td><a href="'
+
self
.
git_url
+
'">'
+
self
.
git_url
+
'</a></td>
\n
'
buildSummary
+=
' </tr>
\n
'
if
self
.
git_pull_request
:
buildSummary
+=
' <tr>
\n
'
buildSummary
+=
' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-log-out"></span> Source Branch</td>
\n
'
buildSummary
+=
' <td><a href="TEMPLATE_MERGE_REQUEST_LINK">TEMPLATE_MERGE_REQUEST_LINK</a></td>
\n
'
buildSummary
+=
' </tr>
\n
'
buildSummary
+=
' <tr>
\n
'
buildSummary
+=
' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-header"></span> Merge Request Title</td>
\n
'
buildSummary
+=
' <td>TEMPLATE_MERGE_REQUEST_TEMPLATE</td>
\n
'
buildSummary
+=
' </tr>
\n
'
buildSummary
+=
' <tr>
\n
'
buildSummary
+=
' <td bgcolor="lightcyan" > <span class="glyphicon glyphicon-log-out"></span> Source Branch</td>
\n
'
buildSummary
+=
' <td>'
+
self
.
git_src_branch
+
'</td>
\n
'
buildSummary
+=
' </tr>
\n
'
buildSummary
+=
' <tr>
\n
'
...
...
@@ -153,7 +162,7 @@ class HtmlReport():
buildSummaryDone
=
True
with
open
(
cwd
+
'/ds_tester_results_oai_cn5g.html'
,
'r'
)
as
originalEpcReport
:
for
line
in
originalEpcReport
:
result
=
re
.
search
(
'D
S Tester
Summary'
,
line
)
result
=
re
.
search
(
'D
eployment
Summary'
,
line
)
if
(
result
is
not
None
)
and
buildSummaryDone
:
newEpcReport
.
write
(
buildSummary
)
buildSummaryDone
=
False
...
...
@@ -366,12 +375,13 @@ class HtmlReport():
self
.
file
.
write
(
' </div>
\n
'
)
def
buildSummaryHeader
(
self
):
self
.
file
.
write
(
' <h2>Docker Image Build Summary</h2>
\n
'
)
self
.
file
.
write
(
' <h2>Docker
/ Podman
Image Build Summary</h2>
\n
'
)
self
.
file
.
write
(
' <table class="table-bordered" width = "100%" align = "center" border = "1">
\n
'
)
self
.
file
.
write
(
' <tr bgcolor="#33CCFF" >
\n
'
)
self
.
file
.
write
(
' <th>Stage Name</th>
\n
'
)
self
.
file
.
write
(
' <th>Image Kind</th>
\n
'
)
self
.
file
.
write
(
' <th>OAI AMF cNF</th>
\n
'
)
self
.
file
.
write
(
' <th>OAI AMF <font color="Gold">Ubuntu18</font> Image</th>
\n
'
)
self
.
file
.
write
(
' <th>OAI AMF <font color="Gold">RHEL8</font> Image</th>
\n
'
)
self
.
file
.
write
(
' </tr>
\n
'
)
def
buildSummaryFooter
(
self
):
...
...
@@ -401,42 +411,43 @@ class HtmlReport():
def
analyze_docker_build_git_part
(
self
,
nfType
):
if
nfType
!=
'AMF'
:
self
.
file
.
write
(
' <td>N/A</td>
\n
'
)
self
.
file
.
write
(
' <td>Wrong NF Type for this Report</td>
\n
'
)
self
.
file
.
write
(
' <td
colspan="2"
>Wrong NF Type for this Report</td>
\n
'
)
return
logFileName
=
'amf_docker_image_build.log'
self
.
file
.
write
(
' <td>Builder Image</td>
\n
'
)
cwd
=
os
.
getcwd
()
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
status
=
False
section_start_pattern
=
'git config --global http'
section_end_pattern
=
'WORKDIR /openair-amf/build/scripts'
section_status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
cell_msg
+=
' -- All Git Operations went successfully</b></pre></td>
\n
'
variants
=
[
'docker'
,
'podman'
]
for
variant
in
variants
:
logFileName
=
'amf_'
+
variant
+
'_image_build.log'
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
status
=
False
section_start_pattern
=
'git config --global http'
section_end_pattern
=
'WORKDIR /openair-amf/build/scripts'
section_status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
cell_msg
+=
' -- All Git Operations went successfully</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO::
\n
'
cell_msg
+=
' -- Some Git Operations went WRONG</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO::
\n
'
cell_msg
+=
' -- Some Git Operations went WRONG</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
self
.
file
.
write
(
cell_msg
)
self
.
file
.
write
(
cell_msg
)
def
installLibsPackagesRow
(
self
):
self
.
file
.
write
(
' <tr>
\n
'
)
...
...
@@ -447,108 +458,110 @@ class HtmlReport():
def
analyze_install_log
(
self
,
nfType
):
if
nfType
!=
'AMF'
:
self
.
file
.
write
(
' <td>N/A</td>
\n
'
)
self
.
file
.
write
(
' <td>Wrong NF Type for this Report</td>
\n
'
)
self
.
file
.
write
(
' <td
colspan="2"
>Wrong NF Type for this Report</td>
\n
'
)
return
logFileName
=
'amf_docker_image_build.log'
self
.
file
.
write
(
' <td>Builder Image</td>
\n
'
)
cwd
=
os
.
getcwd
()
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
status
=
False
section_start_pattern
=
'build_amf --install-deps --force'
section_end_pattern
=
'build_amf --clean --Verbose --build-type Release --jobs'
section_status
=
False
package_install
=
False
fmt_build_start
=
False
fmt_build_status
=
False
folly_build_start
=
False
folly_build_status
=
False
spdlog_build_start
=
False
spdlog_build_status
=
False
pistache_build_start
=
False
pistache_build_status
=
False
json_build_start
=
False
json_build_status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
if
section_status
:
result
=
re
.
search
(
'AMF deps installation successful'
,
line
)
if
result
is
not
None
:
status
=
True
result
=
re
.
search
(
'Install fmt from source'
,
line
)
if
result
is
not
None
:
package_install
=
True
fmt_build_start
=
True
result
=
re
.
search
(
'Installing: /usr/local/lib/pkgconfig/fmt.pc'
,
line
)
if
result
is
not
None
:
fmt_build_status
=
True
result
=
re
.
search
(
'Cloning into
\'
folly
\'
'
,
line
)
if
result
is
not
None
:
folly_build_start
=
True
result
=
re
.
search
(
'Installing: /usr/local/lib/libfollybenchmark.a'
,
line
)
variants
=
[
'docker'
,
'podman'
]
for
variant
in
variants
:
logFileName
=
'amf_'
+
variant
+
'_image_build.log'
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
status
=
False
section_start_pattern
=
'build_amf --install-deps --force'
section_end_pattern
=
'build_amf --clean --Verbose --build-type Release --jobs'
section_status
=
False
package_install
=
False
fmt_build_start
=
False
fmt_build_status
=
False
folly_build_start
=
False
folly_build_status
=
False
spdlog_build_start
=
False
spdlog_build_status
=
False
pistache_build_start
=
False
pistache_build_status
=
False
json_build_start
=
False
json_build_status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
folly_build
_status
=
True
result
=
re
.
search
(
'Install spdlog from'
,
line
)
section
_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
spdlog_build_start
=
True
result
=
re
.
search
(
'Install Pistache from'
,
line
)
if
result
is
not
None
:
spdlog_build_status
=
True
pistache_build_start
=
True
result
=
re
.
search
(
'Installing: /usr/local/lib/libpistache.a'
,
line
)
if
result
is
not
None
:
pistache_build_status
=
True
result
=
re
.
search
(
'Install Nlohmann Json'
,
line
)
if
result
is
not
None
:
json_build_status
=
True
result
=
re
.
search
(
'Installing: /usr/local/lib/cmake/nlohmann_json/nlohmann_jsonTargets.cmake'
,
line
)
if
result
is
not
None
:
json_build_status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
section_status
=
False
if
section_status
:
result
=
re
.
search
(
'AMF deps installation successful'
,
line
)
if
result
is
not
None
:
status
=
True
result
=
re
.
search
(
'Install fmt from source'
,
line
)
if
result
is
not
None
:
package_install
=
True
fmt_build_start
=
True
result
=
re
.
search
(
'Installing: /usr/local/lib/pkgconfig/fmt.pc'
,
line
)
if
result
is
not
None
:
fmt_build_status
=
True
result
=
re
.
search
(
'Cloning into
\'
folly
\'
'
,
line
)
if
result
is
not
None
:
folly_build_start
=
True
result
=
re
.
search
(
'Installing: /usr/local/lib/libfollybenchmark.a'
,
line
)
if
result
is
not
None
:
folly_build_status
=
True
result
=
re
.
search
(
'Install spdlog from'
,
line
)
if
result
is
not
None
:
spdlog_build_start
=
True
result
=
re
.
search
(
'Install Pistache from'
,
line
)
if
result
is
not
None
:
spdlog_build_status
=
True
pistache_build_start
=
True
result
=
re
.
search
(
'Installing: /usr/local/lib/libpistache.a'
,
line
)
if
result
is
not
None
:
pistache_build_status
=
True
result
=
re
.
search
(
'Install Nlohmann Json'
,
line
)
if
result
is
not
None
:
json_build_status
=
True
result
=
re
.
search
(
'Installing: /usr/local/lib/cmake/nlohmann_json/nlohmann_jsonTargets.cmake'
,
line
)
if
result
is
not
None
:
json_build_status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
' -- build_amf --install-deps --force
\n
'
if
package_install
:
cell_msg
+=
' ** Packages Installation: OK
\n
'
else
:
cell_msg
+=
' ** Packages Installation: KO
\n
'
if
fmt_build_status
:
cell_msg
+=
' ** fmt Installation: OK
\n
'
else
:
cell_msg
+=
' ** fmt Installation: KO
\n
'
if
folly_build_status
:
cell_msg
+=
' ** folly Installation: OK
\n
'
else
:
cell_msg
+=
' ** folly Installation: KO
\n
'
if
spdlog_build_status
:
cell_msg
+=
' ** spdlog Installation: OK
\n
'
else
:
cell_msg
+=
' ** spdlog Installation: KO
\n
'
if
pistache_build_status
:
cell_msg
+=
' ** pistache Installation: OK
\n
'
else
:
cell_msg
+=
' ** pistache Installation: KO
\n
'
if
json_build_status
:
cell_msg
+=
' ** Nlohmann Json Installation: OK
\n
'
else
:
cell_msg
+=
' ** Nlohmann Json Installation: KO
\n
'
cell_msg
+=
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
' -- build_amf --install-deps --force
\n
'
if
package_install
:
cell_msg
+=
' ** Packages Installation: OK
\n
'
else
:
cell_msg
+=
' ** Packages Installation: KO
\n
'
if
fmt_build_status
:
cell_msg
+=
' ** fmt Installation: OK
\n
'
else
:
cell_msg
+=
' ** fmt Installation: KO
\n
'
if
folly_build_status
:
cell_msg
+=
' ** folly Installation: OK
\n
'
else
:
cell_msg
+=
' ** folly Installation: KO
\n
'
if
spdlog_build_status
:
cell_msg
+=
' ** spdlog Installation: OK
\n
'
else
:
cell_msg
+=
' ** spdlog Installation: KO
\n
'
if
pistache_build_status
:
cell_msg
+=
' ** pistache Installation: OK
\n
'
else
:
cell_msg
+=
' ** pistache Installation: KO
\n
'
if
json_build_status
:
cell_msg
+=
' ** Nlohmann Json Installation: OK
\n
'
else
:
cell_msg
+=
' ** Nlohmann Json Installation: KO
\n
'
cell_msg
+=
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
self
.
file
.
write
(
cell_msg
)
self
.
file
.
write
(
cell_msg
)
def
buildCompileRows
(
self
):
self
.
file
.
write
(
' <tr>
\n
'
)
...
...
@@ -563,47 +576,48 @@ class HtmlReport():
if
nfType
!=
'AMF'
:
if
imageKind
:
self
.
file
.
write
(
' <td>N/A</td>
\n
'
)
self
.
file
.
write
(
' <td>Wrong NF Type for this Report</td>
\n
'
)
self
.
file
.
write
(
' <td
colspan="2"
>Wrong NF Type for this Report</td>
\n
'
)
return
if
nfType
==
'AMF'
:
logFileName
=
'amf_docker_image_build.log'
if
imageKind
:
self
.
file
.
write
(
' <td>Builder Image</td>
\n
'
)
cwd
=
os
.
getcwd
()
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
status
=
False
if
nfType
==
'AMF'
:
section_start_pattern
=
'build_amf --clean --Verbose --build-type Release --jobs'
section_end_pattern
=
'FROM ubuntu:bionic as oai-amf$'
pass_pattern
=
'amf installed'
section_status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
if
section_status
:
result
=
re
.
search
(
pass_pattern
,
line
)
variants
=
[
'docker'
,
'podman'
]
for
variant
in
variants
:
logFileName
=
'amf_'
+
variant
+
'_image_build.log'
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
status
=
False
if
nfType
==
'AMF'
:
section_start_pattern
=
'build_amf --clean --Verbose --build-type Release --jobs'
section_end_pattern
=
'FROM ubuntu:bionic as oai-amf$'
pass_pattern
=
'amf installed'
section_status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
if
section_status
:
result
=
re
.
search
(
pass_pattern
,
line
)
if
result
is
not
None
:
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
' -- '
+
section_start_pattern
+
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
' -- '
+
section_start_pattern
+
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
self
.
file
.
write
(
cell_msg
)
self
.
file
.
write
(
cell_msg
)
def
analyze_compile_log
(
self
,
nfType
,
imageKind
):
if
nfType
!=
'AMF'
:
...
...
@@ -612,59 +626,59 @@ class HtmlReport():
self
.
file
.
write
(
' <td>Wrong NF Type for this Report</td>
\n
'
)
return
if
nfType
==
'AMF'
:
logFileName
=
'amf_docker_image_build.log'
if
imageKind
:
self
.
file
.
write
(
' <td>Builder Image</td>
\n
'
)
cwd
=
os
.
getcwd
()
nb_errors
=
0
nb_warnings
=
0
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
if
nfType
==
'AMF'
:
section_start_pattern
=
'build_amf --clean --Verbose --build-type Release --jobs'
section_end_pattern
=
'FROM ubuntu:bionic as oai-amf$'
section_status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
if
section_status
:
result
=
re
.
search
(
'error:'
,
line
)
variants
=
[
'docker'
,
'podman'
]
for
variant
in
variants
:
logFileName
=
'amf_'
+
variant
+
'_image_build.log'
nb_errors
=
0
nb_warnings
=
0
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
if
nfType
==
'AMF'
:
section_start_pattern
=
'build_amf --clean --Verbose --build-type Release --jobs'
section_end_pattern
=
'FROM ubuntu:bionic as oai-amf$'
section_status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
nb_errors
+=
1
result
=
re
.
search
(
'warning:'
,
line
)
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
correctLine
=
re
.
sub
(
"^.*/openair-amf"
,
"/openair-amf"
,
line
.
strip
())
wordsList
=
correctLine
.
split
(
None
,
2
)
filename
=
re
.
sub
(
":[0-9]*:[0-9]*:"
,
""
,
wordsList
[
0
])
linenumber
=
re
.
sub
(
filename
+
':'
,
""
,
wordsList
[
0
])
linenumber
=
re
.
sub
(
':[0-9]*:'
,
""
,
linenumber
)
error_warning_status
=
re
.
sub
(
':'
,
""
,
wordsList
[
1
])
error_warning_msg
=
re
.
sub
(
'^.*'
+
error_warning_status
+
':'
,
''
,
correctLine
)
nb_warnings
+=
1
self
.
warning_rows
+=
'<tr><td>'
+
filename
+
'</td><td>'
+
linenumber
+
'</td><td>'
+
error_warning_status
+
'</td><td>'
+
error_warning_msg
+
'</td></tr>
\n
'
logfile
.
close
()
if
nb_warnings
==
0
and
nb_errors
==
0
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
elif
nb_warnings
<
20
and
nb_errors
==
0
:
cell_msg
=
' <td bgcolor="Orange"><pre style="border:none; background-color:Orange"><b>'
section_status
=
False
if
section_status
:
result
=
re
.
search
(
'error:'
,
line
)
if
result
is
not
None
:
nb_errors
+=
1
result
=
re
.
search
(
'warning:'
,
line
)
if
result
is
not
None
:
correctLine
=
re
.
sub
(
"^.*/openair-amf"
,
"/openair-amf"
,
line
.
strip
())
wordsList
=
correctLine
.
split
(
None
,
2
)
filename
=
re
.
sub
(
":[0-9]*:[0-9]*:"
,
""
,
wordsList
[
0
])
linenumber
=
re
.
sub
(
filename
+
':'
,
""
,
wordsList
[
0
])
linenumber
=
re
.
sub
(
':[0-9]*:'
,
""
,
linenumber
)
error_warning_status
=
re
.
sub
(
':'
,
""
,
wordsList
[
1
])
error_warning_msg
=
re
.
sub
(
'^.*'
+
error_warning_status
+
':'
,
''
,
correctLine
)
nb_warnings
+=
1
self
.
warning_rows
+=
'<tr><td>'
+
filename
+
'</td><td>'
+
linenumber
+
'</td><td>'
+
error_warning_status
+
'</td><td>'
+
error_warning_msg
+
'</td></tr>
\n
'
logfile
.
close
()
if
nb_warnings
==
0
and
nb_errors
==
0
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
elif
nb_warnings
<
20
and
nb_errors
==
0
:
cell_msg
=
' <td bgcolor="Orange"><pre style="border:none; background-color:Orange"><b>'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
if
nb_errors
>
0
:
cell_msg
+=
str
(
nb_errors
)
+
' errors found in compile log
\n
'
cell_msg
+=
str
(
nb_warnings
)
+
' warnings found in compile log</b></pre></td>
\n
'
self
.
nb_warnings
=
nb_warnings
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
if
nb_errors
>
0
:
cell_msg
+=
str
(
nb_errors
)
+
' errors found in compile log
\n
'
cell_msg
+=
str
(
nb_warnings
)
+
' warnings found in compile log</b></pre></td>
\n
'
self
.
nb_warnings
=
nb_warnings
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
self
.
file
.
write
(
cell_msg
)
self
.
file
.
write
(
cell_msg
)
def
copyToTargetImage
(
self
):
self
.
file
.
write
(
' <tr>
\n
'
)
...
...
@@ -675,40 +689,42 @@ class HtmlReport():
def
analyze_copy_log
(
self
,
nfType
):
if
nfType
!=
'AMF'
:
self
.
file
.
write
(
' <td>N/A</td>
\n
'
)
self
.
file
.
write
(
' <td>Wrong NF Type for this Report</td>
\n
'
)
self
.
file
.
write
(
' <td
colspan="2"
>Wrong NF Type for this Report</td>
\n
'
)
return
logFileName
=
'amf_docker_image_build.log'
self
.
file
.
write
(
' <td>Target Image</td>
\n
'
)
cwd
=
os
.
getcwd
()
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
section_start_pattern
=
'FROM ubuntu:bionic as oai-amf$'
section_end_pattern
=
'WORKDIR /openair-amf/etc'
section_status
=
False
status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
variants
=
[
'docker'
,
'podman'
]
for
variant
in
variants
:
logFileName
=
'amf_'
+
variant
+
'_image_build.log'
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
section_start_pattern
=
'FROM ubuntu:bionic as oai-amf$'
section_end_pattern
=
'WORKDIR /openair-amf/etc'
section_status
=
False
status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
self
.
file
.
write
(
cell_msg
)
self
.
file
.
write
(
cell_msg
)
def
copyConfToolsToTargetImage
(
self
):
self
.
file
.
write
(
' <tr>
\n
'
)
...
...
@@ -719,40 +735,45 @@ class HtmlReport():
def
analyze_copy_conf_tool_log
(
self
,
nfType
):
if
nfType
!=
'AMF'
:
self
.
file
.
write
(
' <td>N/A</td>
\n
'
)
self
.
file
.
write
(
' <td>Wrong NF Type for this Report</td>
\n
'
)
self
.
file
.
write
(
' <td
colspan="2"
>Wrong NF Type for this Report</td>
\n
'
)
return
logFileName
=
'amf_docker_image_build.log'
self
.
file
.
write
(
' <td>Target Image</td>
\n
'
)
cwd
=
os
.
getcwd
()
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
section_start_pattern
=
'WORKDIR /openair-amf/etc'
section_end_pattern
=
'Successfully tagged oai-amf'
section_status
=
False
status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
variants
=
[
'docker'
,
'podman'
]
for
variant
in
variants
:
logFileName
=
'amf_'
+
variant
+
'_image_build.log'
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
section_start_pattern
=
'WORKDIR /openair-amf/etc'
if
variant
==
'docker'
:
section_end_pattern
=
'Successfully tagged oai-amf'
else
:
section_end_pattern
=
'COMMIT oai-amf:'
section_status
=
False
status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK:
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
self
.
file
.
write
(
cell_msg
)
self
.
file
.
write
(
cell_msg
)
def
imageSizeRow
(
self
):
self
.
file
.
write
(
' <tr>
\n
'
)
...
...
@@ -764,53 +785,58 @@ class HtmlReport():
if
nfType
!=
'AMF'
:
if
imageKind
:
self
.
file
.
write
(
' <td>N/A</td>
\n
'
)
self
.
file
.
write
(
' <td>Wrong NF Type for this Report</td>
\n
'
)
self
.
file
.
write
(
' <td
colspan="2"
>Wrong NF Type for this Report</td>
\n
'
)
return
if
nfType
==
'AMF'
:
logFileName
=
'amf_docker_image_build.log'
if
imageKind
:
self
.
file
.
write
(
' <td>Target Image</td>
\n
'
)
cwd
=
os
.
getcwd
()
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
if
nfType
==
'AMF'
:
section_start_pattern
=
'Successfully tagged oai-amf'
section_end_pattern
=
'OAI-AMF DOCKER IMAGE BUILD'
section_status
=
False
status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
False
if
section_status
:
if
nfType
==
'AMF'
:
if
self
.
git_pull_request
:
result
=
re
.
search
(
'oai-amf *ci-tmp'
,
line
)
else
:
result
=
re
.
search
(
'oai-amf *develop'
,
line
)
variants
=
[
'docker'
,
'podman'
]
for
variant
in
variants
:
logFileName
=
'amf_'
+
variant
+
'_image_build.log'
if
os
.
path
.
isfile
(
cwd
+
'/archives/'
+
logFileName
):
if
nfType
==
'AMF'
:
if
variant
==
'docker'
:
section_start_pattern
=
'Successfully tagged oai-amf'
section_end_pattern
=
'OAI-AMF DOCKER IMAGE BUILD'
else
:
section_start_pattern
=
'COMMIT oai-amf:'
section_end_pattern
=
'OAI-AMF PODMAN RHEL8 IMAGE BUILD'
section_status
=
False
status
=
False
with
open
(
cwd
+
'/archives/'
+
logFileName
,
'r'
)
as
logfile
:
for
line
in
logfile
:
result
=
re
.
search
(
section_start_pattern
,
line
)
if
result
is
not
None
:
result
=
re
.
search
(
'ago *([0-9A-Z]+)'
,
line
)
section_status
=
True
result
=
re
.
search
(
section_end_pattern
,
line
)
if
result
is
not
None
:
section_status
=
True
if
section_status
:
if
nfType
==
'AMF'
:
if
self
.
git_pull_request
:
result
=
re
.
search
(
'oai-amf *ci-tmp'
,
line
)
else
:
result
=
re
.
search
(
'oai-amf *develop'
,
line
)
if
result
is
not
None
:
size
=
result
.
group
(
1
)
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK: '
+
size
+
'
\n
'
result
=
re
.
search
(
'ago *([0-9A-Z]+)'
,
line
)
if
result
is
not
None
:
size
=
result
.
group
(
1
)
status
=
True
logfile
.
close
()
if
status
:
cell_msg
=
' <td bgcolor="LimeGreen"><pre style="border:none; background-color:LimeGreen"><b>'
cell_msg
+=
'OK: '
+
size
+
'
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO:
\n
'
cell_msg
+=
'</b></pre></td>
\n
'
else
:
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
cell_msg
=
' <td bgcolor="Tomato"><pre style="border:none; background-color:Tomato"><b>'
cell_msg
+=
'KO: logfile ('
+
logFileName
+
') not found</b></pre></td>
\n
'
self
.
file
.
write
(
cell_msg
)
self
.
file
.
write
(
cell_msg
)
def
Usage
():
print
(
'----------------------------------------------------------------------------------------------------------------------'
)
...
...
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