Skip to content
Snippets Groups Projects
Commit 70b1d781 authored by Jon Mason's avatar Jon Mason Committed by Naveen Saini
Browse files

CI: add Gitlab CI support


Mostly stolen from meta-arm

NOTE: this differs from upstream in that the kirkstone branch is being
used instead of the master branch in ci/base.yml

Signed-off-by: default avatarJon Mason <jon.mason@arm.com>
Signed-off-by: default avatarNaveen Saini <naveen.kumar.saini@intel.com>
parent bd1c1ebd
No related branches found
No related tags found
1 merge request!26Upmerge of latest meta-zephyr kirkstone branch without the new CI
image: ghcr.io/siemens/kas/kas:latest-release
stages:
- prep
- build
# Common job fragment to get a worker ready
.setup:
stage: build
interruptible: true
variables:
KAS_WORK_DIR: $CI_PROJECT_DIR/work
KAS_REPO_REF_DIR: $CI_BUILDS_DIR/persist/repos
SSTATE_DIR: $CI_BUILDS_DIR/persist/sstate
DL_DIR: $CI_BUILDS_DIR/persist/downloads
BB_LOGCONFIG: $CI_PROJECT_DIR/ci/logging.yml
before_script:
- echo KAS_WORK_DIR = $KAS_WORK_DIR
- echo SSTATE_DIR = $SSTATE_DIR
- echo DL_DIR = $DL_DIR
- rm -rf $KAS_WORK_DIR
- mkdir --verbose --parents $KAS_WORK_DIR $KAS_REPO_REF_DIR $SSTATE_DIR $DL_DIR
# Generalised fragment to do a Kas build
.build:
extends: .setup
script:
- KASFILES=$(./ci/jobs-to-kas "$CI_JOB_NAME")
- kas shell --update --force-checkout $KASFILES -c 'cat conf/*.conf'
- kas build $KASFILES
- ./ci/check-warnings $KAS_WORK_DIR/build/warnings.log
artifacts:
name: "logs"
when: on_failure
paths:
- $CI_PROJECT_DIR/work/build/tmp/work*/**/temp/log.do_*.*
# Workaround for Zephyr not currectly handling TESTIMAGE_AUTO
.build_and_test:
extends: .setup
script:
- KASFILES=$(./ci/jobs-to-kas "$CI_JOB_NAME")
- kas shell --update --force-checkout $KASFILES -c 'cat conf/*.conf'
- kas build $KASFILES
- kas build $KASFILES -c testimage
- ./ci/check-warnings $KAS_WORK_DIR/build/warnings.log
#
# Prep stage, update repositories once
#
update-repos:
extends: .setup
stage: prep
script:
- flock --verbose --timeout 60 $KAS_REPO_REF_DIR ./ci/update-repos
#
# Bootstrap stage, machine coverage
#
# What percentage of machines in the layer do we build
machine-coverage:
stage: prep
interruptible: true
script:
- ./ci/check-machine-coverage
coverage: '/Coverage: \d+/'
#
# Build stage, the actual build jobs
#
96b-avenger96:
extends: .build
96b-nitrogen:
extends: .build
arduino-nano-33-ble:
extends: .build
intel-x86-64:
extends: .build
nrf52840dk-nrf52840:
extends: .build
stm32mp157c-dk2:
extends: .build
qemu-cortex-m3/testimage:
extends: .build_and_test
qemu-nios2/testimage:
extends: .build
qemu-x86/testimage:
extends: .build_and_test
header:
version: 9
includes:
- base.yml
machine: 96b-avenger96
header:
version: 9
includes:
- base.yml
machine: 96b-nitrogen
header:
version: 9
includes:
- base.yml
machine: arduino-nano-33-ble
header:
version: 11
includes:
- meta-openembedded.yml
distro: zephyr
defaults:
repos:
refspec: kirkstone
repos:
meta-zephyr:
layers:
meta-zephyr-core:
meta-zephyr-bsp:
poky:
url: https://git.yoctoproject.org/git/poky
layers:
meta:
meta-poky:
env:
BB_LOGCONFIG: ""
local_conf_header:
base: |
BB_SERVER_TIMEOUT = "60"
CONF_VERSION = "2"
INHERIT += "rm_work"
machine: unset
target:
- zephyr-kernel-test-all
#! /usr/bin/env python3
from pathlib import Path
import sys
metazephyr = Path.cwd()
if metazephyr.name != "meta-zephyr":
print("Not running inside meta-zephyr")
sys.exit(1)
# All machine configurations
machines = metazephyr.glob("meta-zephyr-bsp/conf/machine/*.conf")
machines = set(p.stem for p in machines)
# All kas files
kas = metazephyr.glob("ci/*.yml")
kas = set(p.stem for p in kas)
missing = machines - kas
print(f"The following machines are missing: {', '.join(sorted(missing))}.")
covered = len(machines) - len(missing)
total = len(machines)
percent = int(covered / total * 100)
print(f"Coverage: {percent}%")
#! /bin/bash
# Expects the path to a log file as $1, and if this file has any content
# then display the contents and exit with an error code.
set -e -u
LOGFILE=$1
LINES=$(grep --invert-match "relocations in \.text" $LOGFILE | wc -l)
if test "$LINES" -ne 0; then
echo ==============================
echo The build had warnings/errors:
echo ==============================
cat $LOGFILE
exit 1
fi
exit 0
header:
version: 9
includes:
- base.yml
machine: intel-x86-64
#! /bin/bash
# Read a GitLab CI job name on $1 and transform it to a
# list of Kas yaml files
set -e -u
# Read Job namne from $1 and split on /
IFS=/ read -r -a PARTS<<<$1
# Prefix each part with ci/
PARTS=("${PARTS[@]/#/ci/}")
# Suffix each part with .yml
PARTS=("${PARTS[@]/%/.yml}")
# Print colon-separated
IFS=":"
echo "${PARTS[*]}"
# Python logging configuration to write all warnings to a separate file
version: 1
handlers:
warnings:
class: logging.FileHandler
level: WARNING
filename: warnings.log
formatter: BitBake.logfileFormatter
loggers:
BitBake:
handlers: [warnings]
header:
version: 11
repos:
meta-openembedded:
url: https://git.openembedded.org/meta-openembedded
layers:
meta-filesystems:
meta-networking:
meta-oe:
meta-python:
header:
version: 9
includes:
- base.yml
machine: nrf52840dk-nrf52840
header:
version: 11
includes:
- ci/base.yml
local_conf_header:
nonbuilding_tests: |
ZEPHYRTESTS:remove = "common context pending poll sleep"
qemu_opts: |
QB_OPT_APPEND = "-icount shift=3,align=off,sleep=on -rtc clock=vm"
machine: qemu-cortex-m3
header:
version: 9
includes:
- base.yml
local_conf_header:
nonbuilding_tests: |
ZEPHYRTESTS:remove = "interrupt"
machine: qemu-nios2
header:
version: 9
includes:
- base.yml
local_conf_header:
failing_tests: |
ZEPHYRTESTS:remove = "pending"
machine: qemu-x86
header:
version: 9
includes:
- base.yml
machine: stm32mp157c-dk2
header:
version: 11
local_conf_header:
testimage: |
IMAGE_CLASSES += "testimage"
TEST_TARGET = "QemuTargetZephyr"
TEST_SUITES = "zephyr"
#! /usr/bin/env python3
# Update clones of the repositories we need in KAS_REPO_REF_DIR to speed up fetches
import sys
import os
import subprocess
import pathlib
def repo_shortname(url):
# Taken from Kas (Repo.__getattr__) to ensure the logic is right
from urllib.parse import urlparse
url = urlparse(url)
return ('{url.netloc}{url.path}'
.format(url=url)
.replace('@', '.')
.replace(':', '.')
.replace('/', '.')
.replace('*', '.'))
repositories = (
"https://git.yoctoproject.org/git/poky",
"https://git.openembedded.org/meta-openembedded",
)
if __name__ == "__main__":
if "KAS_REPO_REF_DIR" not in os.environ:
print("KAS_REPO_REF_DIR needs to be set")
sys.exit(1)
base_repodir = pathlib.Path(os.environ["KAS_REPO_REF_DIR"])
for repo in repositories:
repodir = base_repodir / repo_shortname(repo)
if repodir.exists():
print("Updating %s..." % repo)
subprocess.run(["git", "-C", repodir, "fetch"], check=True)
else:
print("Cloning %s..." % repo)
subprocess.run(["git", "clone", "--bare", repo, repodir], check=True)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment