summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlbonn <lbonn@users.noreply.github.com>2019-07-17 09:58:39 +0200
committerGitHub <noreply@github.com>2019-07-17 09:58:39 +0200
commitb11e4ab227bed2e368646cb348e41a4603ed55e0 (patch)
tree8f5430210f314fc3ef7aead29beecf99047b8894
parentf68e1d59f0a0ed4341dad3b16d4979b1b63336d7 (diff)
parent5463396b1d47a122f5aef9a619244fd1777c0b56 (diff)
downloadmeta-updater-b11e4ab227bed2e368646cb348e41a4603ed55e0.tar.gz
Merge pull request #537 from advancedtelematic/ci/oe-selftest
Ci/oe selftest
-rw-r--r--.gitlab-ci.yml98
-rw-r--r--lib/oeqa/selftest/cases/testutils.py38
-rw-r--r--lib/oeqa/selftest/cases/updater_minnowboard.py12
-rw-r--r--lib/oeqa/selftest/cases/updater_native.py1
-rw-r--r--lib/oeqa/selftest/cases/updater_qemux86_64.py107
-rw-r--r--lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py13
-rw-r--r--lib/oeqa/selftest/cases/updater_raspberrypi.py11
-rw-r--r--recipes-sota/aktualizr/aktualizr_git.bb2
-rw-r--r--scripts/ci/Dockerfile.bitbake32
-rw-r--r--scripts/ci/Dockerfile.checkout13
-rwxr-xr-xscripts/ci/build.sh3
-rwxr-xr-xscripts/ci/checkout-oe.sh73
-rwxr-xr-xscripts/ci/configure.sh20
-rwxr-xr-xscripts/ci/docker/setup_kvm.sh14
-rw-r--r--scripts/ci/gitlab/checkout.yml16
-rw-r--r--scripts/ci/gitlab/docker.yml37
-rw-r--r--scripts/ci/gitlab/tests.yml36
-rwxr-xr-xscripts/ci/oe-selftest.sh5
-rwxr-xr-xscripts/envsetup.sh2
-rw-r--r--scripts/qemucommand.py9
-rwxr-xr-xscripts/run-qemu-ota1
21 files changed, 419 insertions, 124 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..3682753
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,98 @@
1stages:
2 - docker
3 - checkout
4 - test
5
6variables:
7 BITBAKE_IMAGE: ${CI_REGISTRY_IMAGE}:ci-${CI_COMMIT_REF_SLUG}-bitbake
8 BITBAKE_CHECKOUT_IMAGE: ${CI_REGISTRY_IMAGE}:ci-${CI_COMMIT_REF_SLUG}-checkout
9
10include:
11 - local: "scripts/ci/gitlab/docker.yml"
12 - local: "scripts/ci/gitlab/checkout.yml"
13 - local: "scripts/ci/gitlab/tests.yml"
14
15Docker setup:
16 extends: .bb_docker_local
17
18 stage: docker
19 variables:
20 BITBKAE_IMAGE_MASTER: ${CI_REGISTRY_IMAGE}:ci-master-bitbake
21 BITBAKE_CHECKOUT_IMAGE_MASTER: ${CI_REGISTRY_IMAGE}:ci-master-checkout
22 except:
23 - pushes
24
25Checkout:
26 extends: .bb_checkout
27
28 stage: checkout
29 variables:
30 MANIFEST: master
31 CURRENT_PROJECT: meta-updater
32 except:
33 - pushes
34
35Build core-image-minimal:
36 extends: .bitbake
37
38 stage: test
39 variables:
40 TEST_BUILD_DIR: 'build-core-image-minimal'
41 BITBAKE_TARGETS: 'core-image-minimal'
42 artifacts:
43 name: "core-image-minimal_$CI_COMMIT_REF_SLUG"
44 paths:
45 - $TEST_BUILD_DIR/tmp/deploy/images/*/core-image-minimal*
46 except:
47 - pushes
48
49Oe-selftest qemux86_64:
50 extends: .oe-selftest
51
52 stage: test
53 variables:
54 TEST_BUILD_DIR: 'build-oe-qemux86_64'
55 OE_SELFTESTS: 'updater_native updater_qemux86_64'
56 except:
57 - pushes
58
59# Not run by default, triggered on nightlies
60
61Oe-selftest minnowboard:
62 extends: .oe-selftest
63
64 stage: test
65 variables:
66 TEST_BUILD_DIR: 'build-oe-minnowboard'
67 OE_SELFTESTS: 'updater_minnowboard'
68 except:
69 - pushes
70 only:
71 variables:
72 - $OE_MINNOWBOARD
73
74Oe-selftest rpi:
75 extends: .oe-selftest
76
77 stage: test
78 variables:
79 TEST_BUILD_DIR: 'build-oe-rpi'
80 OE_SELFTESTS: 'updater_rpi'
81 except:
82 - pushes
83 only:
84 variables:
85 - $OE_RPI
86
87Ptest qemux86_64:
88 extends: .oe-selftest
89
90 stage: test
91 variables:
92 TEST_BUILD_DIR: 'build-oe-qemux86_64-ptest'
93 OE_SELFTESTS: 'updater_qemux86_64_ptest'
94 except:
95 - pushes
96 only:
97 variables:
98 - $OE_PTEST
diff --git a/lib/oeqa/selftest/cases/testutils.py b/lib/oeqa/selftest/cases/testutils.py
index f8b1904..8d618a6 100644
--- a/lib/oeqa/selftest/cases/testutils.py
+++ b/lib/oeqa/selftest/cases/testutils.py
@@ -1,4 +1,5 @@
1import os 1import os
2import oe.path
2import logging 3import logging
3import re 4import re
4import subprocess 5import subprocess
@@ -33,6 +34,7 @@ def qemu_boot_image(imagename, **kwargs):
33 args.dir = 'tmp/deploy/images' 34 args.dir = 'tmp/deploy/images'
34 args.efi = kwargs.get('efi', False) 35 args.efi = kwargs.get('efi', False)
35 args.machine = kwargs.get('machine', None) 36 args.machine = kwargs.get('machine', None)
37 args.mem = kwargs.get('mem', '128M')
36 qemu_use_kvm = get_bb_var("QEMU_USE_KVM") 38 qemu_use_kvm = get_bb_var("QEMU_USE_KVM")
37 if qemu_use_kvm and \ 39 if qemu_use_kvm and \
38 (qemu_use_kvm == 'True' and 'x86' in args.machine or 40 (qemu_use_kvm == 'True' and 'x86' in args.machine or
@@ -60,7 +62,7 @@ def qemu_bake_image(imagename):
60 bitbake(imagename) 62 bitbake(imagename)
61 63
62 64
63def qemu_send_command(port, command, timeout=60): 65def qemu_send_command(port, command, timeout=120):
64 command = ['ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@localhost -p ' + 66 command = ['ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@localhost -p ' +
65 str(port) + ' "' + command + '"'] 67 str(port) + ' "' + command + '"']
66 s2 = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 68 s2 = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -68,24 +70,30 @@ def qemu_send_command(port, command, timeout=60):
68 return stdout, stderr, s2.returncode 70 return stdout, stderr, s2.returncode
69 71
70 72
73def metadir():
74 # Assume the directory layout for finding other layers. We could also
75 # make assumptions by using 'show-layers', but either way, if the
76 # layers we need aren't where we expect them, we are out of luck.
77 path = os.path.abspath(os.path.dirname(__file__))
78 metadir = path + "/../../../../../"
79
80 return metadir
81
82
71def akt_native_run(testInst, cmd, **kwargs): 83def akt_native_run(testInst, cmd, **kwargs):
72 # run a command supplied by aktualizr-native and checks that: 84 # run a command supplied by aktualizr-native and checks that:
73 # - the executable exists 85 # - the executable exists
74 # - the command runs without error 86 # - the command runs without error
75 # NOTE: the base test class must have built aktualizr-native (in 87 #
76 # setUpClass, for example) 88 # Requirements in base test class (setUpClass for example):
77 bb_vars = get_bb_vars(['SYSROOT_DESTDIR', 'base_prefix', 'libdir', 'bindir'], 89 # bitbake aktualizr-native
78 'aktualizr-native') 90 # bitbake build-sysroots -c build_native_sysroot
79 sysroot = bb_vars['SYSROOT_DESTDIR'] + bb_vars['base_prefix'] 91 #
80 sysrootbin = bb_vars['SYSROOT_DESTDIR'] + bb_vars['bindir'] 92 # (technique found in poky/meta/lib/oeqa/selftest/cases/package.py)
81 libdir = bb_vars['libdir'] 93 bb_vars = get_bb_vars(['STAGING_DIR', 'BUILD_ARCH'])
82 94 sysroot = oe.path.join(bb_vars['STAGING_DIR'], bb_vars['BUILD_ARCH'])
83 program, *_ = cmd.split(' ') 95
84 p = '{}/{}'.format(sysrootbin, program) 96 result = runCmd(cmd, native_sysroot=sysroot, ignore_status=True, **kwargs)
85 testInst.assertTrue(os.path.isfile(p), msg="No {} found ({})".format(program, p))
86 env = dict(os.environ)
87 env['LD_LIBRARY_PATH'] = libdir
88 result = runCmd(cmd, env=env, native_sysroot=sysroot, ignore_status=True, **kwargs)
89 testInst.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output) 97 testInst.assertEqual(result.status, 0, "Status not equal to 0. output: %s" % result.output)
90 98
91 99
diff --git a/lib/oeqa/selftest/cases/updater_minnowboard.py b/lib/oeqa/selftest/cases/updater_minnowboard.py
index 267445b..855bd20 100644
--- a/lib/oeqa/selftest/cases/updater_minnowboard.py
+++ b/lib/oeqa/selftest/cases/updater_minnowboard.py
@@ -1,9 +1,8 @@
1import os
2import re 1import re
3 2
4from oeqa.selftest.case import OESelftestTestCase 3from oeqa.selftest.case import OESelftestTestCase
5from oeqa.utils.commands import runCmd, get_bb_var 4from oeqa.utils.commands import runCmd, get_bb_var
6from testutils import qemu_launch, qemu_send_command, qemu_terminate, verifyProvisioned 5from testutils import metadir, qemu_launch, qemu_send_command, qemu_terminate, verifyProvisioned
7 6
8 7
9class MinnowTests(OESelftestTestCase): 8class MinnowTests(OESelftestTestCase):
@@ -12,18 +11,13 @@ class MinnowTests(OESelftestTestCase):
12 layer_intel = "meta-intel" 11 layer_intel = "meta-intel"
13 layer_minnow = "meta-updater-minnowboard" 12 layer_minnow = "meta-updater-minnowboard"
14 result = runCmd('bitbake-layers show-layers') 13 result = runCmd('bitbake-layers show-layers')
15 # Assume the directory layout for finding other layers. We could also
16 # make assumptions by using 'show-layers', but either way, if the
17 # layers we need aren't where we expect them, we are out of luck.
18 path = os.path.abspath(os.path.dirname(__file__))
19 metadir = path + "/../../../../../"
20 if re.search(layer_intel, result.output) is None: 14 if re.search(layer_intel, result.output) is None:
21 self.meta_intel = metadir + layer_intel 15 self.meta_intel = metadir() + layer_intel
22 runCmd('bitbake-layers add-layer "%s"' % self.meta_intel) 16 runCmd('bitbake-layers add-layer "%s"' % self.meta_intel)
23 else: 17 else:
24 self.meta_intel = None 18 self.meta_intel = None
25 if re.search(layer_minnow, result.output) is None: 19 if re.search(layer_minnow, result.output) is None:
26 self.meta_minnow = metadir + layer_minnow 20 self.meta_minnow = metadir() + layer_minnow
27 runCmd('bitbake-layers add-layer "%s"' % self.meta_minnow) 21 runCmd('bitbake-layers add-layer "%s"' % self.meta_minnow)
28 else: 22 else:
29 self.meta_minnow = None 23 self.meta_minnow = None
diff --git a/lib/oeqa/selftest/cases/updater_native.py b/lib/oeqa/selftest/cases/updater_native.py
index 1fc9cb8..d2bf341 100644
--- a/lib/oeqa/selftest/cases/updater_native.py
+++ b/lib/oeqa/selftest/cases/updater_native.py
@@ -14,6 +14,7 @@ class SotaToolsTests(OESelftestTestCase):
14 logger = logging.getLogger("selftest") 14 logger = logging.getLogger("selftest")
15 logger.info('Running bitbake to build aktualizr-native tools') 15 logger.info('Running bitbake to build aktualizr-native tools')
16 bitbake('aktualizr-native') 16 bitbake('aktualizr-native')
17 bitbake('build-sysroots -c build_native_sysroot')
17 18
18 def test_push_help(self): 19 def test_push_help(self):
19 akt_native_run(self, 'garage-push --help') 20 akt_native_run(self, 'garage-push --help')
diff --git a/lib/oeqa/selftest/cases/updater_qemux86_64.py b/lib/oeqa/selftest/cases/updater_qemux86_64.py
index 7223e9e..2b4726c 100644
--- a/lib/oeqa/selftest/cases/updater_qemux86_64.py
+++ b/lib/oeqa/selftest/cases/updater_qemux86_64.py
@@ -2,6 +2,7 @@
2import os 2import os
3import logging 3import logging
4import re 4import re
5import subprocess
5import unittest 6import unittest
6from time import sleep 7from time import sleep
7from uuid import uuid4 8from uuid import uuid4
@@ -9,7 +10,8 @@ from uuid import uuid4
9from oeqa.selftest.case import OESelftestTestCase 10from oeqa.selftest.case import OESelftestTestCase
10from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars 11from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
11from testutils import qemu_launch, qemu_send_command, qemu_terminate, \ 12from testutils import qemu_launch, qemu_send_command, qemu_terminate, \
12 akt_native_run, verifyNotProvisioned, verifyProvisioned, qemu_bake_image, qemu_boot_image 13 metadir, akt_native_run, verifyNotProvisioned, verifyProvisioned, \
14 qemu_bake_image, qemu_boot_image
13 15
14 16
15class GeneralTests(OESelftestTestCase): 17class GeneralTests(OESelftestTestCase):
@@ -17,6 +19,9 @@ class GeneralTests(OESelftestTestCase):
17 logger = logging.getLogger("selftest") 19 logger = logging.getLogger("selftest")
18 logger.info('Running bitbake to build core-image-minimal') 20 logger.info('Running bitbake to build core-image-minimal')
19 self.append_config('SOTA_CLIENT_PROV = "aktualizr-shared-prov"') 21 self.append_config('SOTA_CLIENT_PROV = "aktualizr-shared-prov"')
22
23 # note: this also tests ostreepush/garagesign/garagecheck which are
24 # omitted from other test cases
20 bitbake('core-image-minimal') 25 bitbake('core-image-minimal')
21 credentials = get_bb_var('SOTA_PACKED_CREDENTIALS') 26 credentials = get_bb_var('SOTA_PACKED_CREDENTIALS')
22 # skip the test if the variable SOTA_PACKED_CREDENTIALS is not set 27 # skip the test if the variable SOTA_PACKED_CREDENTIALS is not set
@@ -39,20 +44,18 @@ class AktualizrToolsTests(OESelftestTestCase):
39 super(AktualizrToolsTests, cls).setUpClass() 44 super(AktualizrToolsTests, cls).setUpClass()
40 logger = logging.getLogger("selftest") 45 logger = logging.getLogger("selftest")
41 logger.info('Running bitbake to build aktualizr-native tools') 46 logger.info('Running bitbake to build aktualizr-native tools')
42 bitbake('aktualizr-native') 47 bitbake('aktualizr-native aktualizr-device-prov')
48 bitbake('build-sysroots -c build_native_sysroot')
43 49
44 def test_cert_provider_help(self): 50 def test_cert_provider_help(self):
45 akt_native_run(self, 'aktualizr-cert-provider --help') 51 akt_native_run(self, 'aktualizr-cert-provider --help')
46 52
47 def test_cert_provider_local_output(self): 53 def test_cert_provider_local_output(self):
48 logger = logging.getLogger("selftest")
49 logger.info('Running bitbake to build aktualizr-device-prov')
50 bitbake('aktualizr-device-prov')
51 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS', 'T'], 'aktualizr-native') 54 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS', 'T'], 'aktualizr-native')
52 creds = bb_vars['SOTA_PACKED_CREDENTIALS'] 55 creds = bb_vars['SOTA_PACKED_CREDENTIALS']
53 temp_dir = bb_vars['T'] 56 temp_dir = bb_vars['T']
54 bb_vars_prov = get_bb_vars(['STAGING_DIR_HOST', 'libdir'], 'aktualizr-device-prov') 57 bb_vars_prov = get_bb_vars(['WORKDIR', 'libdir'], 'aktualizr-device-prov')
55 config = bb_vars_prov['STAGING_DIR_HOST'] + bb_vars_prov['libdir'] + '/sota/sota-device-cred.toml' 58 config = bb_vars_prov['WORKDIR'] + '/sysroot-destdir' + bb_vars_prov['libdir'] + '/sota/conf.d/20-sota-device-cred.toml'
56 59
57 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -r -l {temp} -g {config}' 60 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -r -l {temp} -g {config}'
58 .format(creds=creds, temp=temp_dir, config=config)) 61 .format(creds=creds, temp=temp_dir, config=config))
@@ -75,17 +78,13 @@ class SharedCredProvTests(OESelftestTestCase):
75 layer = "meta-updater-qemux86-64" 78 layer = "meta-updater-qemux86-64"
76 result = runCmd('bitbake-layers show-layers') 79 result = runCmd('bitbake-layers show-layers')
77 if re.search(layer, result.output) is None: 80 if re.search(layer, result.output) is None:
78 # Assume the directory layout for finding other layers. We could also 81 self.meta_qemu = metadir() + layer
79 # make assumptions by using 'show-layers', but either way, if the
80 # layers we need aren't where we expect them, we are out of luck.
81 path = os.path.abspath(os.path.dirname(__file__))
82 metadir = path + "/../../../../../"
83 self.meta_qemu = metadir + layer
84 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 82 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
85 else: 83 else:
86 self.meta_qemu = None 84 self.meta_qemu = None
87 self.append_config('MACHINE = "qemux86-64"') 85 self.append_config('MACHINE = "qemux86-64"')
88 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') 86 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "')
87 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
89 self.qemu, self.s = qemu_launch(machine='qemux86-64') 88 self.qemu, self.s = qemu_launch(machine='qemux86-64')
90 89
91 def tearDownLocal(self): 90 def tearDownLocal(self):
@@ -117,18 +116,14 @@ class ManualControlTests(OESelftestTestCase):
117 layer = "meta-updater-qemux86-64" 116 layer = "meta-updater-qemux86-64"
118 result = runCmd('bitbake-layers show-layers') 117 result = runCmd('bitbake-layers show-layers')
119 if re.search(layer, result.output) is None: 118 if re.search(layer, result.output) is None:
120 # Assume the directory layout for finding other layers. We could also 119 self.meta_qemu = metadir() + layer
121 # make assumptions by using 'show-layers', but either way, if the
122 # layers we need aren't where we expect them, we are out of like.
123 path = os.path.abspath(os.path.dirname(__file__))
124 metadir = path + "/../../../../../"
125 self.meta_qemu = metadir + layer
126 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 120 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
127 else: 121 else:
128 self.meta_qemu = None 122 self.meta_qemu = None
129 self.append_config('MACHINE = "qemux86-64"') 123 self.append_config('MACHINE = "qemux86-64"')
130 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') 124 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "')
131 self.append_config('SYSTEMD_AUTO_ENABLE_aktualizr = "disable"') 125 self.append_config('SYSTEMD_AUTO_ENABLE_aktualizr = "disable"')
126 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
132 self.qemu, self.s = qemu_launch(machine='qemux86-64') 127 self.qemu, self.s = qemu_launch(machine='qemux86-64')
133 128
134 def tearDownLocal(self): 129 def tearDownLocal(self):
@@ -161,20 +156,16 @@ class DeviceCredProvTests(OESelftestTestCase):
161 layer = "meta-updater-qemux86-64" 156 layer = "meta-updater-qemux86-64"
162 result = runCmd('bitbake-layers show-layers') 157 result = runCmd('bitbake-layers show-layers')
163 if re.search(layer, result.output) is None: 158 if re.search(layer, result.output) is None:
164 # Assume the directory layout for finding other layers. We could also 159 self.meta_qemu = metadir() + layer
165 # make assumptions by using 'show-layers', but either way, if the
166 # layers we need aren't where we expect them, we are out of luck.
167 path = os.path.abspath(os.path.dirname(__file__))
168 metadir = path + "/../../../../../"
169 self.meta_qemu = metadir + layer
170 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 160 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
171 else: 161 else:
172 self.meta_qemu = None 162 self.meta_qemu = None
173 self.append_config('MACHINE = "qemux86-64"') 163 self.append_config('MACHINE = "qemux86-64"')
174 self.append_config('SOTA_CLIENT_PROV = " aktualizr-device-prov "') 164 self.append_config('SOTA_CLIENT_PROV = " aktualizr-device-prov "')
175 self.append_config('SOTA_DEPLOY_CREDENTIALS = "0"') 165 self.append_config('SOTA_DEPLOY_CREDENTIALS = "0"')
176 runCmd('bitbake -c cleanall aktualizr aktualizr-device-prov') 166 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
177 self.qemu, self.s = qemu_launch(machine='qemux86-64') 167 self.qemu, self.s = qemu_launch(machine='qemux86-64')
168 bitbake('build-sysroots -c build_native_sysroot')
178 169
179 def tearDownLocal(self): 170 def tearDownLocal(self):
180 qemu_terminate(self.s) 171 qemu_terminate(self.s)
@@ -201,8 +192,8 @@ class DeviceCredProvTests(OESelftestTestCase):
201 # Run aktualizr-cert-provider. 192 # Run aktualizr-cert-provider.
202 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS'], 'aktualizr-native') 193 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS'], 'aktualizr-native')
203 creds = bb_vars['SOTA_PACKED_CREDENTIALS'] 194 creds = bb_vars['SOTA_PACKED_CREDENTIALS']
204 bb_vars_prov = get_bb_vars(['STAGING_DIR_HOST', 'libdir'], 'aktualizr-device-prov') 195 bb_vars_prov = get_bb_vars(['WORKDIR', 'libdir'], 'aktualizr-device-prov')
205 config = bb_vars_prov['STAGING_DIR_HOST'] + bb_vars_prov['libdir'] + '/sota/sota-device-cred.toml' 196 config = bb_vars_prov['WORKDIR'] + '/sysroot-destdir' + bb_vars_prov['libdir'] + '/sota/conf.d/20-sota-device-cred.toml'
206 197
207 print('Provisining at root@localhost:%d' % self.qemu.ssh_port) 198 print('Provisining at root@localhost:%d' % self.qemu.ssh_port)
208 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -t root@localhost -p {port} -s -u -r -g {config}' 199 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -t root@localhost -p {port} -s -u -r -g {config}'
@@ -217,12 +208,7 @@ class DeviceCredProvHsmTests(OESelftestTestCase):
217 layer = "meta-updater-qemux86-64" 208 layer = "meta-updater-qemux86-64"
218 result = runCmd('bitbake-layers show-layers') 209 result = runCmd('bitbake-layers show-layers')
219 if re.search(layer, result.output) is None: 210 if re.search(layer, result.output) is None:
220 # Assume the directory layout for finding other layers. We could also 211 self.meta_qemu = metadir() + layer
221 # make assumptions by using 'show-layers', but either way, if the
222 # layers we need aren't where we expect them, we are out of luck.
223 path = os.path.abspath(os.path.dirname(__file__))
224 metadir = path + "/../../../../../"
225 self.meta_qemu = metadir + layer
226 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 212 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
227 else: 213 else:
228 self.meta_qemu = None 214 self.meta_qemu = None
@@ -231,8 +217,9 @@ class DeviceCredProvHsmTests(OESelftestTestCase):
231 self.append_config('SOTA_DEPLOY_CREDENTIALS = "0"') 217 self.append_config('SOTA_DEPLOY_CREDENTIALS = "0"')
232 self.append_config('SOTA_CLIENT_FEATURES = "hsm"') 218 self.append_config('SOTA_CLIENT_FEATURES = "hsm"')
233 self.append_config('IMAGE_INSTALL_append = " softhsm-testtoken"') 219 self.append_config('IMAGE_INSTALL_append = " softhsm-testtoken"')
234 runCmd('bitbake -c cleanall aktualizr aktualizr-device-prov-hsm') 220 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
235 self.qemu, self.s = qemu_launch(machine='qemux86-64') 221 self.qemu, self.s = qemu_launch(machine='qemux86-64')
222 bitbake('build-sysroots -c build_native_sysroot')
236 223
237 def tearDownLocal(self): 224 def tearDownLocal(self):
238 qemu_terminate(self.s) 225 qemu_terminate(self.s)
@@ -269,25 +256,24 @@ class DeviceCredProvHsmTests(OESelftestTestCase):
269 # Run aktualizr-cert-provider. 256 # Run aktualizr-cert-provider.
270 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS'], 'aktualizr-native') 257 bb_vars = get_bb_vars(['SOTA_PACKED_CREDENTIALS'], 'aktualizr-native')
271 creds = bb_vars['SOTA_PACKED_CREDENTIALS'] 258 creds = bb_vars['SOTA_PACKED_CREDENTIALS']
272 bb_vars_prov = get_bb_vars(['STAGING_DIR_HOST', 'libdir'], 'aktualizr-device-prov-hsm') 259 bb_vars_prov = get_bb_vars(['WORKDIR', 'libdir'], 'aktualizr-device-prov-hsm')
273 config = bb_vars_prov['STAGING_DIR_HOST'] + bb_vars_prov['libdir'] + '/sota/sota-device-cred-hsm.toml' 260 config = bb_vars_prov['WORKDIR'] + '/sysroot-destdir' + bb_vars_prov['libdir'] + '/sota/conf.d/20-sota-device-cred-hsm.toml'
274 261
275 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -t root@localhost -p {port} -r -s -u -g {config}' 262 akt_native_run(self, 'aktualizr-cert-provider -c {creds} -t root@localhost -p {port} -r -s -u -g {config}'
276 .format(creds=creds, port=self.qemu.ssh_port, config=config)) 263 .format(creds=creds, port=self.qemu.ssh_port, config=config))
277 264
278 # Verify that HSM is able to initialize. 265 # Verify that HSM is able to initialize.
279 ran_ok = False
280 for delay in [5, 5, 5, 5, 10]: 266 for delay in [5, 5, 5, 5, 10]:
281 sleep(delay) 267 sleep(delay)
282 p11_out, p11_err, p11_ret = self.qemu_command(pkcs11_command) 268 p11_out, p11_err, p11_ret = self.qemu_command(pkcs11_command)
283 hsm_out, hsm_err, hsm_ret = self.qemu_command(softhsm2_command) 269 hsm_out, hsm_err, hsm_ret = self.qemu_command(softhsm2_command)
284 if p11_ret == 0 and hsm_ret == 0 and hsm_err == b'': 270 if (p11_ret == 0 and hsm_ret == 0 and hsm_err == b'' and
285 ran_ok = True 271 b'X.509 cert' in p11_out and b'present token' in p11_err):
286 break 272 break
287 self.assertTrue(ran_ok, 'pkcs11-tool or softhsm2-tool failed: ' + p11_err.decode() + 273 else:
288 p11_out.decode() + hsm_err.decode() + hsm_out.decode()) 274 self.fail('pkcs11-tool or softhsm2-tool failed: ' + p11_err.decode() +
289 self.assertIn(b'present token', p11_err, 'pkcs11-tool failed: ' + p11_err.decode() + p11_out.decode()) 275 p11_out.decode() + hsm_err.decode() + hsm_out.decode())
290 self.assertIn(b'X.509 cert', p11_out, 'pkcs11-tool failed: ' + p11_err.decode() + p11_out.decode()) 276
291 self.assertIn(b'Initialized: yes', hsm_out, 'softhsm2-tool failed: ' + 277 self.assertIn(b'Initialized: yes', hsm_out, 'softhsm2-tool failed: ' +
292 hsm_err.decode() + hsm_out.decode()) 278 hsm_err.decode() + hsm_out.decode())
293 self.assertIn(b'User PIN init.: yes', hsm_out, 'softhsm2-tool failed: ' + 279 self.assertIn(b'User PIN init.: yes', hsm_out, 'softhsm2-tool failed: ' +
@@ -328,8 +314,8 @@ class IpSecondaryTests(OESelftestTestCase):
328 self.configure() 314 self.configure()
329 qemu_bake_image(self.imagename) 315 qemu_bake_image(self.imagename)
330 316
331 def send_command(self, cmd): 317 def send_command(self, cmd, timeout=60):
332 stdout, stderr, retcode = qemu_send_command(self.qemu.ssh_port, cmd, timeout=60) 318 stdout, stderr, retcode = qemu_send_command(self.qemu.ssh_port, cmd, timeout=timeout)
333 return str(stdout), str(stderr), retcode 319 return str(stdout), str(stderr), retcode
334 320
335 def __enter__(self): 321 def __enter__(self):
@@ -344,7 +330,7 @@ class IpSecondaryTests(OESelftestTestCase):
344 def wait_till_sshable(self): 330 def wait_till_sshable(self):
345 # qemu_send_command tries to ssh into the qemu VM and blocks until it gets there or timeout happens 331 # qemu_send_command tries to ssh into the qemu VM and blocks until it gets there or timeout happens
346 # so it helps us to block q control flow until the VM is booted and a target binary/daemon is running there 332 # so it helps us to block q control flow until the VM is booted and a target binary/daemon is running there
347 self.stdout, self.stderr, self.retcode = self.send_command(self.binaryname + ' --help') 333 self.stdout, self.stderr, self.retcode = self.send_command(self.binaryname + ' --help', timeout=300)
348 334
349 def was_successfully_booted(self): 335 def was_successfully_booted(self):
350 return self.retcode == 0 336 return self.retcode == 0
@@ -399,16 +385,12 @@ class IpSecondaryTests(OESelftestTestCase):
399 layer = "meta-updater-qemux86-64" 385 layer = "meta-updater-qemux86-64"
400 result = runCmd('bitbake-layers show-layers') 386 result = runCmd('bitbake-layers show-layers')
401 if re.search(layer, result.output) is None: 387 if re.search(layer, result.output) is None:
402 # Assume the directory layout for finding other layers. We could also 388 self.meta_qemu = metadir() + layer
403 # make assumptions by using 'show-layers', but either way, if the
404 # layers we need aren't where we expect them, we are out of luck.
405 path = os.path.abspath(os.path.dirname(__file__))
406 metadir = path + "/../../../../../"
407 self.meta_qemu = metadir + layer
408 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 389 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
409 else: 390 else:
410 self.meta_qemu = None 391 self.meta_qemu = None
411 392
393 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
412 self.primary = IpSecondaryTests.Primary(self) 394 self.primary = IpSecondaryTests.Primary(self)
413 self.secondary = IpSecondaryTests.Secondary(self) 395 self.secondary = IpSecondaryTests.Secondary(self)
414 396
@@ -446,17 +428,13 @@ class ResourceControlTests(OESelftestTestCase):
446 layer = "meta-updater-qemux86-64" 428 layer = "meta-updater-qemux86-64"
447 result = runCmd('bitbake-layers show-layers') 429 result = runCmd('bitbake-layers show-layers')
448 if re.search(layer, result.output) is None: 430 if re.search(layer, result.output) is None:
449 # Assume the directory layout for finding other layers. We could also 431 self.meta_qemu = metadir() + layer
450 # make assumptions by using 'show-layers', but either way, if the
451 # layers we need aren't where we expect them, we are out of luck.
452 path = os.path.abspath(os.path.dirname(__file__))
453 metadir = path + "/../../../../../"
454 self.meta_qemu = metadir + layer
455 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 432 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
456 else: 433 else:
457 self.meta_qemu = None 434 self.meta_qemu = None
458 self.append_config('MACHINE = "qemux86-64"') 435 self.append_config('MACHINE = "qemux86-64"')
459 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') 436 self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "')
437 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
460 self.append_config('IMAGE_INSTALL_append += " aktualizr-resource-control "') 438 self.append_config('IMAGE_INSTALL_append += " aktualizr-resource-control "')
461 self.append_config('RESOURCE_CPU_WEIGHT_pn-aktualizr = "1000"') 439 self.append_config('RESOURCE_CPU_WEIGHT_pn-aktualizr = "1000"')
462 self.append_config('RESOURCE_MEMORY_HIGH_pn-aktualizr = "50M"') 440 self.append_config('RESOURCE_MEMORY_HIGH_pn-aktualizr = "50M"')
@@ -476,10 +454,13 @@ class ResourceControlTests(OESelftestTestCase):
476 ran_ok = False 454 ran_ok = False
477 for delay in [5, 5, 5, 5]: 455 for delay in [5, 5, 5, 5]:
478 sleep(delay) 456 sleep(delay)
479 stdout, stderr, retcode = self.qemu_command('systemctl --no-pager show aktualizr') 457 try:
480 if retcode == 0 and b'ExecMainStatus=9' in stdout: 458 stdout, stderr, retcode = self.qemu_command('systemctl --no-pager show aktualizr')
481 ran_ok = True 459 if retcode == 0 and b'ExecMainStatus=9' in stdout:
482 break 460 ran_ok = True
461 break
462 except subprocess.TimeoutExpired:
463 pass
483 self.assertTrue(ran_ok, 'Aktualizr was not killed') 464 self.assertTrue(ran_ok, 'Aktualizr was not killed')
484 465
485 self.assertIn(b'CPUWeight=1000', stdout, 'CPUWeight was not set correctly') 466 self.assertIn(b'CPUWeight=1000', stdout, 'CPUWeight was not set correctly')
diff --git a/lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py b/lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py
index 0f0f491..e9a1a65 100644
--- a/lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py
+++ b/lib/oeqa/selftest/cases/updater_qemux86_64_ptest.py
@@ -1,10 +1,9 @@
1# pylint: disable=C0111,C0325 1# pylint: disable=C0111,C0325
2import os
3import re 2import re
4 3
5from oeqa.selftest.case import OESelftestTestCase 4from oeqa.selftest.case import OESelftestTestCase
6from oeqa.utils.commands import runCmd 5from oeqa.utils.commands import runCmd
7from testutils import qemu_launch, qemu_send_command, qemu_terminate 6from testutils import metadir, qemu_launch, qemu_send_command, qemu_terminate
8 7
9 8
10class PtestTests(OESelftestTestCase): 9class PtestTests(OESelftestTestCase):
@@ -13,12 +12,7 @@ class PtestTests(OESelftestTestCase):
13 layer = "meta-updater-qemux86-64" 12 layer = "meta-updater-qemux86-64"
14 result = runCmd('bitbake-layers show-layers') 13 result = runCmd('bitbake-layers show-layers')
15 if re.search(layer, result.output) is None: 14 if re.search(layer, result.output) is None:
16 # Assume the directory layout for finding other layers. We could also 15 self.meta_qemu = metadir() + layer
17 # make assumptions by using 'show-layers', but either way, if the
18 # layers we need aren't where we expect them, we are out of like.
19 path = os.path.abspath(os.path.dirname(__file__))
20 metadir = path + "/../../../../../"
21 self.meta_qemu = metadir + layer
22 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu) 16 runCmd('bitbake-layers add-layer "%s"' % self.meta_qemu)
23 else: 17 else:
24 self.meta_qemu = None 18 self.meta_qemu = None
@@ -26,7 +20,8 @@ class PtestTests(OESelftestTestCase):
26 self.append_config('SYSTEMD_AUTO_ENABLE_aktualizr = "disable"') 20 self.append_config('SYSTEMD_AUTO_ENABLE_aktualizr = "disable"')
27 self.append_config('PTEST_ENABLED_pn-aktualizr = "1"') 21 self.append_config('PTEST_ENABLED_pn-aktualizr = "1"')
28 self.append_config('IMAGE_INSTALL_append += "aktualizr-ptest ptest-runner "') 22 self.append_config('IMAGE_INSTALL_append += "aktualizr-ptest ptest-runner "')
29 self.qemu, self.s = qemu_launch(machine='qemux86-64') 23 self.append_config('IMAGE_FSTYPES_remove = "ostreepush garagesign garagecheck"')
24 self.qemu, self.s = qemu_launch(machine='qemux86-64', mem="256M")
30 25
31 def tearDownLocal(self): 26 def tearDownLocal(self):
32 qemu_terminate(self.s) 27 qemu_terminate(self.s)
diff --git a/lib/oeqa/selftest/cases/updater_raspberrypi.py b/lib/oeqa/selftest/cases/updater_raspberrypi.py
index e976100..8efc941 100644
--- a/lib/oeqa/selftest/cases/updater_raspberrypi.py
+++ b/lib/oeqa/selftest/cases/updater_raspberrypi.py
@@ -7,6 +7,8 @@ import unittest
7from oeqa.selftest.case import OESelftestTestCase 7from oeqa.selftest.case import OESelftestTestCase
8from oeqa.utils.commands import runCmd, bitbake, get_bb_var 8from oeqa.utils.commands import runCmd, bitbake, get_bb_var
9 9
10from testutils import metadir
11
10 12
11class RpiTests(OESelftestTestCase): 13class RpiTests(OESelftestTestCase):
12 14
@@ -16,18 +18,13 @@ class RpiTests(OESelftestTestCase):
16 layer_rpi = "meta-raspberrypi" 18 layer_rpi = "meta-raspberrypi"
17 layer_upd_rpi = "meta-updater-raspberrypi" 19 layer_upd_rpi = "meta-updater-raspberrypi"
18 result = runCmd('bitbake-layers show-layers') 20 result = runCmd('bitbake-layers show-layers')
19 # Assume the directory layout for finding other layers. We could also
20 # make assumptions by using 'show-layers', but either way, if the
21 # layers we need aren't where we expect them, we are out of luck.
22 path = os.path.abspath(os.path.dirname(__file__))
23 metadir = path + "/../../../../../"
24 if re.search(layer_rpi, result.output) is None: 21 if re.search(layer_rpi, result.output) is None:
25 self.meta_rpi = metadir + layer_rpi 22 self.meta_rpi = metadir() + layer_rpi
26 runCmd('bitbake-layers add-layer "%s"' % self.meta_rpi) 23 runCmd('bitbake-layers add-layer "%s"' % self.meta_rpi)
27 else: 24 else:
28 self.meta_rpi = None 25 self.meta_rpi = None
29 if re.search(layer_upd_rpi, result.output) is None: 26 if re.search(layer_upd_rpi, result.output) is None:
30 self.meta_upd_rpi = metadir + layer_upd_rpi 27 self.meta_upd_rpi = metadir() + layer_upd_rpi
31 runCmd('bitbake-layers add-layer "%s"' % self.meta_upd_rpi) 28 runCmd('bitbake-layers add-layer "%s"' % self.meta_upd_rpi)
32 else: 29 else:
33 self.meta_upd_rpi = None 30 self.meta_upd_rpi = None
diff --git a/recipes-sota/aktualizr/aktualizr_git.bb b/recipes-sota/aktualizr/aktualizr_git.bb
index ec36ca2..5de341e 100644
--- a/recipes-sota/aktualizr/aktualizr_git.bb
+++ b/recipes-sota/aktualizr/aktualizr_git.bb
@@ -6,7 +6,7 @@ LICENSE = "MPL-2.0"
6LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=9741c346eef56131163e13b9db1241b3" 6LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=9741c346eef56131163e13b9db1241b3"
7 7
8DEPENDS = "boost curl openssl libarchive libsodium sqlite3 asn1c-native" 8DEPENDS = "boost curl openssl libarchive libsodium sqlite3 asn1c-native"
9DEPENDS_append = "${@bb.utils.contains('PTEST_ENABLED', '1', ' coreutils-native ostree-native aktualizr-native ', '', d)}" 9DEPENDS_append = "${@bb.utils.contains('PTEST_ENABLED', '1', ' coreutils-native net-tools-native ostree-native aktualizr-native ', '', d)}"
10RDEPENDS_${PN}_class-target = "aktualizr-configs lshw" 10RDEPENDS_${PN}_class-target = "aktualizr-configs lshw"
11RDEPENDS_${PN}-host-tools = "aktualizr aktualizr-repo aktualizr-cert-provider ${@bb.utils.contains('PACKAGECONFIG', 'sota-tools', 'garage-deploy garage-push', '', d)}" 11RDEPENDS_${PN}-host-tools = "aktualizr aktualizr-repo aktualizr-cert-provider ${@bb.utils.contains('PACKAGECONFIG', 'sota-tools', 'garage-deploy garage-push', '', d)}"
12 12
diff --git a/scripts/ci/Dockerfile.bitbake b/scripts/ci/Dockerfile.bitbake
index c91f94c..51eaa57 100644
--- a/scripts/ci/Dockerfile.bitbake
+++ b/scripts/ci/Dockerfile.bitbake
@@ -1,15 +1,17 @@
1FROM debian:stable 1FROM debian:stretch
2LABEL Description="Image for bitbaking" 2LABEL Description="Image for bitbaking"
3 3
4RUN sed -i 's#deb http://deb.debian.org/debian stable main#deb http://deb.debian.org/debian stable main contrib#g' /etc/apt/sources.list 4RUN sed -i 's#deb http://deb.debian.org/debian stretch main#deb http://deb.debian.org/debian stretch main contrib#g' /etc/apt/sources.list
5RUN sed -i 's#deb http://deb.debian.org/debian stable-updates main#deb http://deb.debian.org/debian stable-updates main contrib#g' /etc/apt/sources.list 5RUN sed -i 's#deb http://deb.debian.org/debian stretch-updates main#deb http://deb.debian.org/debian stretch-updates main contrib#g' /etc/apt/sources.list
6RUN apt-get update -q && apt-get install -qy \ 6RUN apt-get update -q && apt-get install --no-install-suggests --no-install-recommends -qy \
7 awscli \
7 build-essential \ 8 build-essential \
8 bzip2 \ 9 bzip2 \
9 chrpath \ 10 chrpath \
10 cpio \ 11 cpio \
11 default-jre \ 12 default-jre \
12 diffstat \ 13 diffstat \
14 file \
13 gawk \ 15 gawk \
14 gcc-multilib \ 16 gcc-multilib \
15 git-core \ 17 git-core \
@@ -17,26 +19,40 @@ RUN apt-get update -q && apt-get install -qy \
17 iproute \ 19 iproute \
18 libpython-dev \ 20 libpython-dev \
19 libsdl1.2-dev \ 21 libsdl1.2-dev \
22 libvirt-clients \
23 libvirt-daemon-system \
20 locales \ 24 locales \
21 ovmf \ 25 ovmf \
26 openssh-client \
22 procps \ 27 procps \
23 python \ 28 python \
24 python3 \ 29 python3 \
25 python3-pexpect \ 30 python3-pexpect \
26 qemu \ 31 qemu-kvm \
27 socat \ 32 socat \
33 sudo \
28 texinfo \ 34 texinfo \
29 unzip \ 35 unzip \
30 wget \ 36 wget \
31 xterm \ 37 xterm \
32 xz-utils 38 xz-utils
33 39
34ARG uid=1000 40ARG uid=4321
35ARG gid=1000 41ARG gid=4321
36RUN groupadd -g $gid bitbake 42RUN groupadd -g $gid bitbake
37RUN useradd -m -u $uid -g $gid bitbake 43RUN useradd -m -u $uid -g $gid -s /bin/bash bitbake
38 44
39RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen 45RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
40ENV LC_ALL="en_US.UTF-8" 46ENV LC_ALL="en_US.UTF-8"
41ENV LANG="en_US.UTF-8" 47ENV LANG="en_US.UTF-8"
42ENV LANGUAGE="en_US.UTF-8" 48ENV LANGUAGE="en_US.UTF-8"
49
50# script to mirror kvm group id with host
51RUN echo "bitbake ALL=NOPASSWD: /usr/local/bin/setup_kvm.sh" >> /etc/sudoers
52COPY ./docker/setup_kvm.sh /usr/local/bin/setup_kvm.sh
53
54# other ci scripts
55RUN mkdir /scripts
56COPY configure.sh build.sh oe-selftest.sh /scripts/
57
58USER "bitbake"
diff --git a/scripts/ci/Dockerfile.checkout b/scripts/ci/Dockerfile.checkout
new file mode 100644
index 0000000..5210c6b
--- /dev/null
+++ b/scripts/ci/Dockerfile.checkout
@@ -0,0 +1,13 @@
1FROM debian:stretch-slim
2LABEL Description="Image for checking out updater-repo"
3
4RUN sed -i 's#deb http://deb.debian.org/debian stretch main#deb http://deb.debian.org/debian stretch main contrib#g' /etc/apt/sources.list
5RUN sed -i 's#deb http://deb.debian.org/debian stretch-updates main#deb http://deb.debian.org/debian stretch-updates main contrib#g' /etc/apt/sources.list
6RUN apt-get update -q && apt-get install -qy \
7 git \
8 repo \
9 xmlstarlet
10
11# checkout script
12RUN mkdir /scripts
13COPY checkout-oe.sh /scripts/
diff --git a/scripts/ci/build.sh b/scripts/ci/build.sh
index 6235428..9fbae98 100755
--- a/scripts/ci/build.sh
+++ b/scripts/ci/build.sh
@@ -12,7 +12,10 @@ IMAGE_NAME=${1:-core-image-minimal}
12( 12(
13set +euo pipefail 13set +euo pipefail
14set +x 14set +x
15METADIR=$(realpath "$TEST_REPO_DIR")
16export METADIR
15. "${TEST_REPO_DIR}/meta-updater/scripts/envsetup.sh" "${TEST_MACHINE}" "${TEST_BUILD_DIR}" 17. "${TEST_REPO_DIR}/meta-updater/scripts/envsetup.sh" "${TEST_MACHINE}" "${TEST_BUILD_DIR}"
16 18
19set -x
17bitbake "${IMAGE_NAME}" 20bitbake "${IMAGE_NAME}"
18) 21)
diff --git a/scripts/ci/checkout-oe.sh b/scripts/ci/checkout-oe.sh
new file mode 100755
index 0000000..a99f235
--- /dev/null
+++ b/scripts/ci/checkout-oe.sh
@@ -0,0 +1,73 @@
1#!/usr/bin/env bash
2
3set -euo pipefail
4
5set -x
6
7REMOTE_SOURCE=${REMOTE_SOURCE:-https://github.com/advancedtelematic}
8MANIFEST=${MANIFEST:-master}
9CURRENT_PROJECT=${CURRENT_PROJECT:-}
10
11# list of projects to pin to one version in the format:
12# "project:rev;project2:rev2..."
13PIN_LIST=${PIN_LIST:-}
14
15#CURRENT_REV=$(git rev-parse HEAD)
16LOCAL_REPO=$PWD
17
18mkdir -p updater-repo
19
20cd updater-repo
21
22repo init -m "${MANIFEST}.xml" -u "$REMOTE_SOURCE/updater-repo"
23
24git -C .repo/manifests reset --hard
25
26# patch manifest:
27# - add a new "ats" remote that points to "$REMOTE_SOURCE"
28# - change projects that contain "advancedtelematic" to use the ats remote
29MANIFEST_FILE=".repo/manifests/${MANIFEST}.xml"
30xmlstarlet ed --omit-decl -L \
31 -s "/manifest" -t elem -n "remote" -v "" \
32 -i "/manifest/remote[last()]" -t attr -n "name" -v "ats" \
33 -i "/manifest/remote[last()]" -t attr -n "fetch" -v "$REMOTE_SOURCE" \
34 -d "/manifest/project[contains(@name, 'advancedtelematic')]/@remote" \
35 -i "/manifest/project[contains(@name, 'advancedtelematic')]" -t attr -n "remote" -v "ats" \
36 "$MANIFEST_FILE"
37
38# hack: sed on `advancedtelematic/` names, to remove this unwanted prefix
39sed -i 's#name="advancedtelematic/#name="#g' "$MANIFEST_FILE"
40
41# pin projects from the list
42(
43IFS=";"
44for pin in $PIN_LIST; do
45 IFS=":"
46 read -r project rev <<< "$pin"
47 xmlstarlet ed --omit-decl -L \
48 -i "/manifest/project[@name=\"$project\"]/@revision" -t attr -n "revision" -v "$rev" \
49 -i "/manifest/project[@name=\"$project\"]" -t attr -n "revision" -v "$rev" \
50 "$MANIFEST_FILE"
51 IFS=";"
52done
53)
54
55# Remove the current project from the manifest if we have it checked out
56if [ -n "$CURRENT_PROJECT" ]; then
57 xmlstarlet ed --omit-decl -L \
58 -d "/manifest/project[@name=\"$CURRENT_PROJECT\"]" \
59 "$MANIFEST_FILE"
60fi
61
62repo manifest
63
64repo forall -c 'git reset --hard ; git clean -fdx'
65
66repo sync -d --force-sync
67
68if [ -n "$CURRENT_PROJECT" ]; then
69 rm -f "$CURRENT_PROJECT"
70 ln -s "$LOCAL_REPO" "$CURRENT_PROJECT"
71fi
72
73repo manifest -r
diff --git a/scripts/ci/configure.sh b/scripts/ci/configure.sh
index 960a0cc..a8968da 100755
--- a/scripts/ci/configure.sh
+++ b/scripts/ci/configure.sh
@@ -8,9 +8,13 @@ TEST_BUILD_DIR=${TEST_BUILD_DIR:-build}
8TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo} 8TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo}
9TEST_BITBAKE_COMMON_DIR=${TEST_BITBAKE_COMMON_DIR:-} 9TEST_BITBAKE_COMMON_DIR=${TEST_BITBAKE_COMMON_DIR:-}
10 10
11TEST_AKTUALIZR_DIR=${TEST_AKTUALIZR_DIR:-.} 11TEST_AKTUALIZR_REMOTE=${TEST_AKTUALIZR_REMOTE:-}
12TEST_AKTUALIZR_BRANCH=${TEST_AKTUALIZR_BRANCH:-master} 12if [ -n "$TEST_AKTUALIZR_REMOTE" ]; then
13TEST_AKTUALIZR_REV=${TEST_AKTUALIZR_REV:-$(GIT_DIR="$TEST_AKTUALIZR_DIR/.git" git rev-parse "$TEST_AKTUALIZR_REMOTE/$TEST_AKTUALIZR_BRANCH")} 13 TEST_AKTUALIZR_DIR=${TEST_AKTUALIZR_DIR:-.}
14 TEST_AKTUALIZR_BRANCH=${TEST_AKTUALIZR_BRANCH:-master}
15 TEST_AKTUALIZR_REV=${TEST_AKTUALIZR_REV:-$(GIT_DIR="$TEST_AKTUALIZR_DIR/.git" git rev-parse "$TEST_AKTUALIZR_REMOTE/$TEST_AKTUALIZR_BRANCH")}
16fi
17
14TEST_AKTUALIZR_CREDENTIALS=${TEST_AKTUALIZR_CREDENTIALS:-} 18TEST_AKTUALIZR_CREDENTIALS=${TEST_AKTUALIZR_CREDENTIALS:-}
15 19
16# move existing conf directory to backup, before generating a new one 20# move existing conf directory to backup, before generating a new one
@@ -21,6 +25,8 @@ mv "$TEST_BUILD_DIR/conf" "$TEST_BUILD_DIR/conf.old" || true
21set +euo pipefail 25set +euo pipefail
22set +x 26set +x
23echo ">> Running envsetup.sh" 27echo ">> Running envsetup.sh"
28METADIR=$(realpath "$TEST_REPO_DIR")
29export METADIR
24. "$TEST_REPO_DIR/meta-updater/scripts/envsetup.sh" "$TEST_MACHINE" "$TEST_BUILD_DIR" 30. "$TEST_REPO_DIR/meta-updater/scripts/envsetup.sh" "$TEST_MACHINE" "$TEST_BUILD_DIR"
25) 31)
26 32
@@ -31,19 +37,19 @@ SITE_CONF="$TEST_BUILD_DIR/conf/site.conf"
31echo ">> Set common bitbake config options" 37echo ">> Set common bitbake config options"
32cat << EOF > "$SITE_CONF" 38cat << EOF > "$SITE_CONF"
33SANITY_TESTED_DISTROS = "" 39SANITY_TESTED_DISTROS = ""
34SSTATE_MIRRORS ?= "file://.* https://bitbake-cache.atsgarage.com/PATH;downloadfilename=PATH"
35IMAGE_FEATURES += "ssh-server-openssh" 40IMAGE_FEATURES += "ssh-server-openssh"
36 41
37EOF 42EOF
38 43
39echo ">> Set aktualizr branch in bitbake's config" 44if [ -n "$TEST_AKTUALIZR_REMOTE" ]; then
40cat << EOF >> "$SITE_CONF" 45 echo ">> Set aktualizr branch in bitbake's config"
46 cat << EOF >> "$SITE_CONF"
41SRCREV_pn-aktualizr = "$TEST_AKTUALIZR_REV" 47SRCREV_pn-aktualizr = "$TEST_AKTUALIZR_REV"
42SRCREV_pn-aktualizr-native = "\${SRCREV_pn-aktualizr}" 48SRCREV_pn-aktualizr-native = "\${SRCREV_pn-aktualizr}"
43BRANCH_pn-aktualizr = "$TEST_AKTUALIZR_BRANCH" 49BRANCH_pn-aktualizr = "$TEST_AKTUALIZR_BRANCH"
44BRANCH_pn-aktualizr-native = "\${BRANCH_pn-aktualizr}" 50BRANCH_pn-aktualizr-native = "\${BRANCH_pn-aktualizr}"
45
46EOF 51EOF
52fi
47 53
48if [[ -n $TEST_AKTUALIZR_CREDENTIALS ]]; then 54if [[ -n $TEST_AKTUALIZR_CREDENTIALS ]]; then
49 echo ">> Set aktualizr credentials" 55 echo ">> Set aktualizr credentials"
diff --git a/scripts/ci/docker/setup_kvm.sh b/scripts/ci/docker/setup_kvm.sh
new file mode 100755
index 0000000..1ffbbf5
--- /dev/null
+++ b/scripts/ci/docker/setup_kvm.sh
@@ -0,0 +1,14 @@
1#!/usr/bin/env bash
2
3# This script makes the gid of the 'kvm' group to match the group
4# owner of '/dev/kvm'
5#
6# These two are not guaranteed to match when a docker image starts
7# with access to '/dev/kvm' that comes from the host
8
9set -euo pipefail
10
11kvm_gid=$(stat -c "%g" /dev/kvm)
12groupmod -g "$kvm_gid" kvm
13usermod -a -G kvm bitbake
14ln -s /bin/true /usr/bin/kvm-ok
diff --git a/scripts/ci/gitlab/checkout.yml b/scripts/ci/gitlab/checkout.yml
new file mode 100644
index 0000000..28c9177
--- /dev/null
+++ b/scripts/ci/gitlab/checkout.yml
@@ -0,0 +1,16 @@
1.bb_checkout:
2 # parameters:
3 # - MANIFEST
4 # - REMOTE_SOURCE
5 # - CURRENT_PROJECT (will be symlinked instead of pulled)
6
7 image: $BITBAKE_CHECKOUT_IMAGE
8 cache:
9 paths:
10 - updater-repo
11 artifacts:
12 expire_in: "1 day"
13 paths:
14 - updater-repo
15 script:
16 - /scripts/checkout-oe.sh
diff --git a/scripts/ci/gitlab/docker.yml b/scripts/ci/gitlab/docker.yml
new file mode 100644
index 0000000..827bb47
--- /dev/null
+++ b/scripts/ci/gitlab/docker.yml
@@ -0,0 +1,37 @@
1.bb_docker_local:
2 # intended to be run on meta-updater's master branch which contains the
3 # reference docker files
4 # parameters:
5 # - BITBAKE_IMAGE
6 # - BITBAKE_CHECKOUT_IMAGE
7 # - BITBKAE_IMAGE_MASTER
8 # - BITBAKE_CHECKOUT_IMAGE_MASTER
9 image: docker:stable
10 stage: docker
11 services:
12 - docker:dind
13 before_script:
14 - docker login -u gitlab-ci-token -p "$CI_JOB_TOKEN" "$CI_REGISTRY"
15 script:
16 - docker pull "$BITBAKE_IMAGE" || docker pull "$BITBKAE_IMAGE_MASTER" || true
17 - docker build --pull --cache-from "$BITBKAE_IMAGE_MASTER" --cache-from "$BITBAKE_IMAGE" -f ./scripts/ci/Dockerfile.bitbake -t "$BITBAKE_IMAGE" ./scripts/ci
18 - docker push "$BITBAKE_IMAGE"
19
20 - docker pull "$BITBAKE_CHECKOUT_IMAGE" || docker pull "$BITBAKE_CHECKOUT_IMAGE_MASTER" || true
21 - docker build --pull --cache-from "$BITBAKE_CHECKOUT_IMAGE_MASTER" --cache-from "$BITBAKE_CHECKOUT_IMAGE" -f ./scripts/ci/Dockerfile.checkout -t "$BITBAKE_CHECKOUT_IMAGE" ./scripts/ci
22 - docker push "$BITBAKE_CHECKOUT_IMAGE"
23
24.bb_docker_remote:
25 # intended to be run on other branches and repos: just pulls the last master image
26 # parameters:
27 # - BITBAKE_IMAGE
28 # - BITBAKE_CHECKOUT_IMAGE
29 image: docker:stable
30 stage: docker
31 services:
32 - docker:dind
33 before_script:
34 - docker login -u gitlab-ci-token -p "$CI_JOB_TOKEN" "$CI_REGISTRY"
35 script:
36 - docker pull "$BITBAKE_IMAGE"
37 - docker pull "$BITBAKE_CHECKOUT_IMAGE"
diff --git a/scripts/ci/gitlab/tests.yml b/scripts/ci/gitlab/tests.yml
new file mode 100644
index 0000000..4bd5844
--- /dev/null
+++ b/scripts/ci/gitlab/tests.yml
@@ -0,0 +1,36 @@
1.bitbake:
2 # parameters:
3 # - TEST_BUILD_DIR
4 # - TEST_MACHINE (defaults to qemux86-64)
5 # - BITBAKE_TARGETS
6 image: $BITBAKE_IMAGE
7 dependencies:
8 - Checkout
9 tags:
10 - bitbake
11 script:
12 - /scripts/configure.sh
13 - /scripts/build.sh $BITBAKE_TARGETS
14
15.oe-selftest:
16 # parameters:
17 # - TEST_BUILD_DIR
18 # - TEST_MACHINE (defaults to qemux86-64)
19 # - OE_SELFTESTS
20 image: $BITBAKE_IMAGE
21 dependencies:
22 - Checkout
23 tags:
24 - bitbake
25 variables:
26 TEST_AKTUALIZR_CREDENTIALS: $CI_PROJECT_DIR/credentials.zip
27 before_script:
28 - aws s3 cp s3://ota-gitlab-ci/hereotaconnect_prod.zip credentials.zip
29 - sudo /usr/local/bin/setup_kvm.sh
30 script:
31 - |
32 # sg is needed after adding bitbake to the kvm group (see setup_kvm.sh)
33 sg kvm << EOS
34 /scripts/configure.sh
35 /scripts/oe-selftest.sh $OE_SELFTESTS
36 EOS
diff --git a/scripts/ci/oe-selftest.sh b/scripts/ci/oe-selftest.sh
index 3124cce..66b1fc9 100755
--- a/scripts/ci/oe-selftest.sh
+++ b/scripts/ci/oe-selftest.sh
@@ -12,7 +12,10 @@ TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo}
12( 12(
13set +euo pipefail 13set +euo pipefail
14set +x 14set +x
15METADIR=$(realpath "$TEST_REPO_DIR")
16export METADIR
15. "${TEST_REPO_DIR}/meta-updater/scripts/envsetup.sh" "${TEST_MACHINE}" "${TEST_BUILD_DIR}" 17. "${TEST_REPO_DIR}/meta-updater/scripts/envsetup.sh" "${TEST_MACHINE}" "${TEST_BUILD_DIR}"
16 18
17oe-selftest -r updater 19set -x
20oe-selftest -r "$@"
18) 21)
diff --git a/scripts/envsetup.sh b/scripts/envsetup.sh
index 6103cf6..5827bc2 100755
--- a/scripts/envsetup.sh
+++ b/scripts/envsetup.sh
@@ -21,7 +21,7 @@ if [[ $SOURCED -ne 1 ]]; then
21 exit 1 21 exit 1
22fi 22fi
23 23
24METADIR="${SOURCEDIR}/../.." 24METADIR=${METADIR:-${SOURCEDIR}/../..}
25 25
26if [[ ! -f "${BUILDDIR}/conf/local.conf" ]]; then 26if [[ ! -f "${BUILDDIR}/conf/local.conf" ]]; then
27 source "$METADIR/poky/oe-init-build-env" "$BUILDDIR" 27 source "$METADIR/poky/oe-init-build-env" "$BUILDDIR"
diff --git a/scripts/qemucommand.py b/scripts/qemucommand.py
index 1049d7c..3045b45 100644
--- a/scripts/qemucommand.py
+++ b/scripts/qemucommand.py
@@ -2,7 +2,7 @@ from os.path import exists, join, realpath, abspath
2from os import listdir 2from os import listdir
3import random 3import random
4import socket 4import socket
5from subprocess import check_output, CalledProcessError 5from subprocess import check_output
6 6
7EXTENSIONS = { 7EXTENSIONS = {
8 'intel-corei7-64': 'wic', 8 'intel-corei7-64': 'wic',
@@ -68,6 +68,10 @@ class QemuCommand(object):
68 self.mac_address = random_mac() 68 self.mac_address = random_mac()
69 self.serial_port = find_local_port(8990) 69 self.serial_port = find_local_port(8990)
70 self.ssh_port = find_local_port(2222) 70 self.ssh_port = find_local_port(2222)
71 if args.mem:
72 self.mem = args.mem
73 else:
74 self.mem = "1G"
71 if args.kvm is None: 75 if args.kvm is None:
72 # Autodetect KVM using 'kvm-ok' 76 # Autodetect KVM using 'kvm-ok'
73 try: 77 try:
@@ -95,7 +99,7 @@ class QemuCommand(object):
95 cmdline += ["-drive", "file=%s,if=ide,format=raw,snapshot=on" % self.image] 99 cmdline += ["-drive", "file=%s,if=ide,format=raw,snapshot=on" % self.image]
96 cmdline += [ 100 cmdline += [
97 "-serial", "tcp:127.0.0.1:%d,server,nowait" % self.serial_port, 101 "-serial", "tcp:127.0.0.1:%d,server,nowait" % self.serial_port,
98 "-m", "1G", 102 "-m", self.mem,
99 "-usb", 103 "-usb",
100 "-object", "rng-random,id=rng0,filename=/dev/urandom", 104 "-object", "rng-random,id=rng0,filename=/dev/urandom",
101 "-device", "virtio-rng-pci,rng=rng0", 105 "-device", "virtio-rng-pci,rng=rng0",
@@ -131,4 +135,3 @@ class QemuCommand(object):
131 "-f", "qcow2", 135 "-f", "qcow2",
132 self.overlay] 136 self.overlay]
133 return cmdline 137 return cmdline
134
diff --git a/scripts/run-qemu-ota b/scripts/run-qemu-ota
index b2f55e9..de63297 100755
--- a/scripts/run-qemu-ota
+++ b/scripts/run-qemu-ota
@@ -26,6 +26,7 @@ def main():
26 dest='kvm', action='store_true', default=None) 26 dest='kvm', action='store_true', default=None)
27 kvm_group.add_argument('--no-kvm', help='Disable KVM in QEMU', 27 kvm_group.add_argument('--no-kvm', help='Disable KVM in QEMU',
28 dest='kvm', action='store_false') 28 dest='kvm', action='store_false')
29 parser.add_argument('--mem', default=None, help="Amount of memory the machine boots with")
29 parser.add_argument('--no-gui', help='Disable GUI', action='store_true') 30 parser.add_argument('--no-gui', help='Disable GUI', action='store_true')
30 parser.add_argument('--gdb', help='Export gdbserver port 2159 from the image', action='store_true') 31 parser.add_argument('--gdb', help='Export gdbserver port 2159 from the image', action='store_true')
31 parser.add_argument('--pcap', default=None, help='Dump all network traffic') 32 parser.add_argument('--pcap', default=None, help='Dump all network traffic')