diff options
29 files changed, 446 insertions, 375 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..4b22e20 --- /dev/null +++ b/.gitlab-ci.yml | |||
| @@ -0,0 +1,98 @@ | |||
| 1 | stages: | ||
| 2 | - docker | ||
| 3 | - checkout | ||
| 4 | - test | ||
| 5 | |||
| 6 | variables: | ||
| 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 | |||
| 10 | include: | ||
| 11 | - local: "scripts/ci/gitlab/docker.yml" | ||
| 12 | - local: "scripts/ci/gitlab/checkout.yml" | ||
| 13 | - local: "scripts/ci/gitlab/tests.yml" | ||
| 14 | |||
| 15 | Docker 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 | |||
| 25 | Checkout: | ||
| 26 | extends: .bb_checkout | ||
| 27 | |||
| 28 | stage: checkout | ||
| 29 | variables: | ||
| 30 | MANIFEST: master | ||
| 31 | CURRENT_PROJECT: meta-updater | ||
| 32 | except: | ||
| 33 | - pushes | ||
| 34 | |||
| 35 | Build 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 | |||
| 49 | Oe-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 | |||
| 61 | Oe-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 | |||
| 74 | Oe-selftest rpi: | ||
| 75 | extends: .oe-selftest | ||
| 76 | |||
| 77 | stage: test | ||
| 78 | variables: | ||
| 79 | TEST_BUILD_DIR: 'build-oe-rpi' | ||
| 80 | OE_SELFTESTS: 'updater_raspberrypi' | ||
| 81 | except: | ||
| 82 | - pushes | ||
| 83 | only: | ||
| 84 | variables: | ||
| 85 | - $OE_RPI | ||
| 86 | |||
| 87 | Ptest 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/README.adoc b/README.adoc index 1f9d863..b047f91 100644 --- a/README.adoc +++ b/README.adoc | |||
| @@ -104,7 +104,7 @@ Your images will also need network connectivity to be able to reach an actual OT | |||
| 104 | * `SOTA_DEPLOY_CREDENTIALS` - when set to '1' (default value), deploys credentials to the built image. Override it in `local.conf` to built a generic image that can be provisioned manually after the build. | 104 | * `SOTA_DEPLOY_CREDENTIALS` - when set to '1' (default value), deploys credentials to the built image. Override it in `local.conf` to built a generic image that can be provisioned manually after the build. |
| 105 | * `SOTA_CLIENT_PROV` - which provisioning method to use. Valid options are `aktualizr-shared-prov`, `aktualizr-device-prov`, and `aktualizr-device-prov-hsm`. For more information on these provisioning methods, see the https://docs.ota.here.com/client-config/client-provisioning-methods.html[OTA Connect documentation]. The default is `aktualizr-shared-prov`. This can also be set to an empty string to avoid using a provisioning recipe. | 105 | * `SOTA_CLIENT_PROV` - which provisioning method to use. Valid options are `aktualizr-shared-prov`, `aktualizr-device-prov`, and `aktualizr-device-prov-hsm`. For more information on these provisioning methods, see the https://docs.ota.here.com/client-config/client-provisioning-methods.html[OTA Connect documentation]. The default is `aktualizr-shared-prov`. This can also be set to an empty string to avoid using a provisioning recipe. |
| 106 | * `SOTA_CLIENT_FEATURES` - extensions to aktualizr. The only valid options are `hsm` (to build with HSM support) and `secondary-network` (to set up a simulated 'in-vehicle' network with support for a primary node with a DHCP server and a secondary node with a DHCP client). | 106 | * `SOTA_CLIENT_FEATURES` - extensions to aktualizr. The only valid options are `hsm` (to build with HSM support) and `secondary-network` (to set up a simulated 'in-vehicle' network with support for a primary node with a DHCP server and a secondary node with a DHCP client). |
| 107 | * `SOTA_SECONDARY_CONFIG_DIR` - a directory containing JSON configuration files for virtual secondaries on the host. These will be installed into `/etc/sota/ecus` on the device and automatically provided to aktualizr. | 107 | * `SOTA_SECONDARY_CONFIG` - a file containing JSON configuration for secondaries. It will be installed into `/etc/sota/ecus` on the device and automatically provided to aktualizr. See link:https://github.com/advancedtelematic/aktualizr/blob/master/docs/posix-secondaries-bitbaking.adoc[here] for more details. |
| 108 | * `SOTA_HARDWARE_ID` - a custom hardware ID that will be written to the aktualizr config. Defaults to MACHINE if not set. | 108 | * `SOTA_HARDWARE_ID` - a custom hardware ID that will be written to the aktualizr config. Defaults to MACHINE if not set. |
| 109 | * `SOTA_MAIN_DTB` - base device tree to use with the kernel. Used together with FIT images. You can change it, and the device tree will also be changed after the update. | 109 | * `SOTA_MAIN_DTB` - base device tree to use with the kernel. Used together with FIT images. You can change it, and the device tree will also be changed after the update. |
| 110 | * `SOTA_DT_OVERLAYS` - whitespace-separated list of used device tree overlays for FIT image. This list is OSTree-updateable as well. | 110 | * `SOTA_DT_OVERLAYS` - whitespace-separated list of used device tree overlays for FIT image. This list is OSTree-updateable as well. |
diff --git a/classes/image_types_ostree.bbclass b/classes/image_types_ostree.bbclass index b1c53ff..a9a8174 100644 --- a/classes/image_types_ostree.bbclass +++ b/classes/image_types_ostree.bbclass | |||
| @@ -7,6 +7,8 @@ OSTREE_COMMIT_SUBJECT ??= "Commit-id: ${IMAGE_NAME}" | |||
| 7 | OSTREE_COMMIT_BODY ??= "" | 7 | OSTREE_COMMIT_BODY ??= "" |
| 8 | OSTREE_UPDATE_SUMMARY ??= "0" | 8 | OSTREE_UPDATE_SUMMARY ??= "0" |
| 9 | OSTREE_DEPLOY_DEVICETREE ??= "0" | 9 | OSTREE_DEPLOY_DEVICETREE ??= "0" |
| 10 | OSTREE_BRANCHNAME ?= "${SOTA_HARDWARE_ID}" | ||
| 11 | GARAGE_TARGET_NAME ?= "${OSTREE_BRANCHNAME}" | ||
| 10 | 12 | ||
| 11 | BUILD_OSTREE_TARBALL ??= "1" | 13 | BUILD_OSTREE_TARBALL ??= "1" |
| 12 | 14 | ||
| @@ -254,6 +256,12 @@ IMAGE_CMD_garagesign () { | |||
| 254 | ${target_url} \ | 256 | ${target_url} \ |
| 255 | --sha256 ${ostree_target_hash} \ | 257 | --sha256 ${ostree_target_hash} \ |
| 256 | --hardwareids ${SOTA_HARDWARE_ID} | 258 | --hardwareids ${SOTA_HARDWARE_ID} |
| 259 | if [ -n "${GARAGE_CUSTOMIZE_TARGET}" ]; then | ||
| 260 | bbplain "Running command(${GARAGE_CUSTOMIZE_TARGET}) to customize target" | ||
| 261 | ${GARAGE_CUSTOMIZE_TARGET} \ | ||
| 262 | ${GARAGE_SIGN_REPO}/tufrepo/roles/unsigned/targets.json \ | ||
| 263 | ${GARAGE_TARGET_NAME}-${target_version} | ||
| 264 | fi | ||
| 257 | garage-sign targets sign --repo tufrepo \ | 265 | garage-sign targets sign --repo tufrepo \ |
| 258 | --home-dir ${GARAGE_SIGN_REPO} \ | 266 | --home-dir ${GARAGE_SIGN_REPO} \ |
| 259 | --key-name=targets | 267 | --key-name=targets |
diff --git a/classes/sota.bbclass b/classes/sota.bbclass index bf27b6d..1a9d68b 100644 --- a/classes/sota.bbclass +++ b/classes/sota.bbclass | |||
| @@ -39,7 +39,6 @@ INITRAMFS_FSTYPES ?= "${@oe.utils.ifelse(d.getVar('OSTREE_BOOTLOADER') == 'u-boo | |||
| 39 | 39 | ||
| 40 | # Please redefine OSTREE_REPO in order to have a persistent OSTree repo | 40 | # Please redefine OSTREE_REPO in order to have a persistent OSTree repo |
| 41 | export OSTREE_REPO ?= "${DEPLOY_DIR_IMAGE}/ostree_repo" | 41 | export OSTREE_REPO ?= "${DEPLOY_DIR_IMAGE}/ostree_repo" |
| 42 | export OSTREE_BRANCHNAME ?= "${SOTA_HARDWARE_ID}" | ||
| 43 | export OSTREE_OSNAME ?= "poky" | 42 | export OSTREE_OSNAME ?= "poky" |
| 44 | export OSTREE_BOOTLOADER ??= 'u-boot' | 43 | export OSTREE_BOOTLOADER ??= 'u-boot' |
| 45 | export OSTREE_BOOT_PARTITION ??= "/boot" | 44 | export OSTREE_BOOT_PARTITION ??= "/boot" |
| @@ -48,9 +47,9 @@ INITRAMFS_IMAGE ?= "initramfs-ostree-image" | |||
| 48 | 47 | ||
| 49 | GARAGE_SIGN_REPO ?= "${DEPLOY_DIR_IMAGE}/garage_sign_repo" | 48 | GARAGE_SIGN_REPO ?= "${DEPLOY_DIR_IMAGE}/garage_sign_repo" |
| 50 | GARAGE_SIGN_KEYNAME ?= "garage-key" | 49 | GARAGE_SIGN_KEYNAME ?= "garage-key" |
| 51 | GARAGE_TARGET_NAME ?= "${OSTREE_BRANCHNAME}" | ||
| 52 | GARAGE_TARGET_VERSION ?= "" | 50 | GARAGE_TARGET_VERSION ?= "" |
| 53 | GARAGE_TARGET_URL ?= "" | 51 | GARAGE_TARGET_URL ?= "" |
| 52 | GARAGE_CUSTOMIZE_TARGET ?= "" | ||
| 54 | 53 | ||
| 55 | SOTA_MACHINE ??="none" | 54 | SOTA_MACHINE ??="none" |
| 56 | SOTA_MACHINE_rpi ?= "raspberrypi" | 55 | SOTA_MACHINE_rpi ?= "raspberrypi" |
| @@ -61,6 +60,6 @@ SOTA_MACHINE_qemux86-64 ?= "qemux86-64" | |||
| 61 | SOTA_MACHINE_am335x-evm ?= "am335x-evm-wifi" | 60 | SOTA_MACHINE_am335x-evm ?= "am335x-evm-wifi" |
| 62 | 61 | ||
| 63 | SOTA_OVERRIDES_BLACKLIST = "ostree ota" | 62 | SOTA_OVERRIDES_BLACKLIST = "ostree ota" |
| 64 | SOTA_REQUIRED_VARIABLES = "OSTREE_REPO OSTREE_BRANCHNAME OSTREE_OSNAME OSTREE_BOOTLOADER OSTREE_BOOT_PARTITION GARAGE_SIGN_REPO GARAGE_TARGET_NAME" | 63 | SOTA_REQUIRED_VARIABLES = "OSTREE_REPO OSTREE_OSNAME OSTREE_BOOTLOADER OSTREE_BOOT_PARTITION GARAGE_SIGN_REPO" |
| 65 | 64 | ||
| 66 | inherit sota_sanity sota_${SOTA_MACHINE} image_repo_manifest | 65 | inherit sota_sanity sota_${SOTA_MACHINE} image_repo_manifest |
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 @@ | |||
| 1 | import os | 1 | import os |
| 2 | import oe.path | ||
| 2 | import logging | 3 | import logging |
| 3 | import re | 4 | import re |
| 4 | import subprocess | 5 | import 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 | ||
| 63 | def qemu_send_command(port, command, timeout=60): | 65 | def 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 | ||
| 73 | def 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 | |||
| 71 | def akt_native_run(testInst, cmd, **kwargs): | 83 | def 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..f4da360 100644 --- a/lib/oeqa/selftest/cases/updater_minnowboard.py +++ b/lib/oeqa/selftest/cases/updater_minnowboard.py | |||
| @@ -1,9 +1,8 @@ | |||
| 1 | import os | ||
| 2 | import re | 1 | import re |
| 3 | 2 | ||
| 4 | from oeqa.selftest.case import OESelftestTestCase | 3 | from oeqa.selftest.case import OESelftestTestCase |
| 5 | from oeqa.utils.commands import runCmd, get_bb_var | 4 | from oeqa.utils.commands import runCmd, get_bb_var |
| 6 | from testutils import qemu_launch, qemu_send_command, qemu_terminate, verifyProvisioned | 5 | from testutils import metadir, qemu_launch, qemu_send_command, qemu_terminate, verifyProvisioned |
| 7 | 6 | ||
| 8 | 7 | ||
| 9 | class MinnowTests(OESelftestTestCase): | 8 | class MinnowTests(OESelftestTestCase): |
| @@ -12,25 +11,20 @@ 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 |
| 30 | self.append_config('MACHINE = "intel-corei7-64"') | 24 | self.append_config('MACHINE = "intel-corei7-64"') |
| 31 | self.append_config('OSTREE_BOOTLOADER = "grub"') | 25 | self.append_config('OSTREE_BOOTLOADER = "grub"') |
| 32 | self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') | 26 | self.append_config('SOTA_CLIENT_PROV = " aktualizr-shared-prov "') |
| 33 | self.qemu, self.s = qemu_launch(efi=True, machine='intel-corei7-64') | 27 | self.qemu, self.s = qemu_launch(efi=True, machine='intel-corei7-64', mem='512M') |
| 34 | 28 | ||
| 35 | def tearDownLocal(self): | 29 | def tearDownLocal(self): |
| 36 | qemu_terminate(self.s) | 30 | qemu_terminate(self.s) |
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 @@ | |||
| 2 | import os | 2 | import os |
| 3 | import logging | 3 | import logging |
| 4 | import re | 4 | import re |
| 5 | import subprocess | ||
| 5 | import unittest | 6 | import unittest |
| 6 | from time import sleep | 7 | from time import sleep |
| 7 | from uuid import uuid4 | 8 | from uuid import uuid4 |
| @@ -9,7 +10,8 @@ from uuid import uuid4 | |||
| 9 | from oeqa.selftest.case import OESelftestTestCase | 10 | from oeqa.selftest.case import OESelftestTestCase |
| 10 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars | 11 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars |
| 11 | from testutils import qemu_launch, qemu_send_command, qemu_terminate, \ | 12 | from 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 | ||
| 15 | class GeneralTests(OESelftestTestCase): | 17 | class 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..d20a9f0 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 |
| 2 | import os | ||
| 3 | import re | 2 | import re |
| 4 | 3 | ||
| 5 | from oeqa.selftest.case import OESelftestTestCase | 4 | from oeqa.selftest.case import OESelftestTestCase |
| 6 | from oeqa.utils.commands import runCmd | 5 | from oeqa.utils.commands import runCmd |
| 7 | from testutils import qemu_launch, qemu_send_command, qemu_terminate | 6 | from testutils import metadir, qemu_launch, qemu_send_command, qemu_terminate |
| 8 | 7 | ||
| 9 | 8 | ||
| 10 | class PtestTests(OESelftestTestCase): | 9 | class 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="768M") | ||
| 30 | 25 | ||
| 31 | def tearDownLocal(self): | 26 | def tearDownLocal(self): |
| 32 | qemu_terminate(self.s) | 27 | qemu_terminate(self.s) |
| @@ -46,7 +41,7 @@ class PtestTests(OESelftestTestCase): | |||
| 46 | if has_failure: | 41 | if has_failure: |
| 47 | print("Full test suite log:") | 42 | print("Full test suite log:") |
| 48 | stdout, _, _ = self.qemu_command('cat /tmp/aktualizr-ptest.log || cat /tmp/aktualizr-ptest.log.tmp', timeout=None) | 43 | stdout, _, _ = self.qemu_command('cat /tmp/aktualizr-ptest.log || cat /tmp/aktualizr-ptest.log.tmp', timeout=None) |
| 49 | print(stdout.decode()) | 44 | print(stdout.decode(errors='replace')) |
| 50 | 45 | ||
| 51 | self.assertEqual(retcode, 0) | 46 | self.assertEqual(retcode, 0) |
| 52 | self.assertFalse(has_failure) | 47 | self.assertFalse(has_failure) |
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 | |||
| 7 | from oeqa.selftest.case import OESelftestTestCase | 7 | from oeqa.selftest.case import OESelftestTestCase |
| 8 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var | 8 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var |
| 9 | 9 | ||
| 10 | from testutils import metadir | ||
| 11 | |||
| 10 | 12 | ||
| 11 | class RpiTests(OESelftestTestCase): | 13 | class 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 75d5bd9..e9efa35 100644 --- a/recipes-sota/aktualizr/aktualizr_git.bb +++ b/recipes-sota/aktualizr/aktualizr_git.bb | |||
| @@ -6,11 +6,11 @@ LICENSE = "MPL-2.0" | |||
| 6 | LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=9741c346eef56131163e13b9db1241b3" | 6 | LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=9741c346eef56131163e13b9db1241b3" |
| 7 | 7 | ||
| 8 | DEPENDS = "boost curl openssl libarchive libsodium sqlite3 asn1c-native" | 8 | DEPENDS = "boost curl openssl libarchive libsodium sqlite3 asn1c-native" |
| 9 | DEPENDS_append = "${@bb.utils.contains('PTEST_ENABLED', '1', ' coreutils-native ostree-native aktualizr-native ', '', d)}" | 9 | DEPENDS_append = "${@bb.utils.contains('PTEST_ENABLED', '1', ' coreutils-native net-tools-native ostree-native aktualizr-native ', '', d)}" |
| 10 | RDEPENDS_${PN}_class-target = "aktualizr-configs lshw" | 10 | RDEPENDS_${PN}_class-target = "aktualizr-configs lshw" |
| 11 | RDEPENDS_${PN}-host-tools = "aktualizr aktualizr-repo aktualizr-cert-provider ${@bb.utils.contains('PACKAGECONFIG', 'sota-tools', 'garage-deploy garage-push', '', d)}" | 11 | RDEPENDS_${PN}-host-tools = "aktualizr aktualizr-repo aktualizr-cert-provider ${@bb.utils.contains('PACKAGECONFIG', 'sota-tools', 'garage-deploy garage-push', '', d)}" |
| 12 | 12 | ||
| 13 | RDEPENDS_${PN}-ptest += "bash cmake curl python3-misc python3-modules openssl-bin sqlite3 valgrind" | 13 | RDEPENDS_${PN}-ptest += "bash cmake curl net-tools python3-misc python3-modules openssl-bin sqlite3 valgrind" |
| 14 | 14 | ||
| 15 | PV = "1.0+git${SRCPV}" | 15 | PV = "1.0+git${SRCPV}" |
| 16 | PR = "7" | 16 | PR = "7" |
| @@ -31,7 +31,7 @@ SRC_URI = " \ | |||
| 31 | SRC_URI[md5sum] = "e104ccd4f32e52571a5fc0e5042db050" | 31 | SRC_URI[md5sum] = "e104ccd4f32e52571a5fc0e5042db050" |
| 32 | SRC_URI[sha256sum] = "c590be1a57523bfe097af82279eda5c97cf40ae47fb27162cf33c469702c8a9b" | 32 | SRC_URI[sha256sum] = "c590be1a57523bfe097af82279eda5c97cf40ae47fb27162cf33c469702c8a9b" |
| 33 | 33 | ||
| 34 | SRCREV = "fce5854ff10e7efd52d69bbaf68dc2af990d5746" | 34 | SRCREV = "17c3713fb3085fe5459ac0e8244a2047d55cb7ec" |
| 35 | BRANCH ?= "master" | 35 | BRANCH ?= "master" |
| 36 | 36 | ||
| 37 | S = "${WORKDIR}/git" | 37 | S = "${WORKDIR}/git" |
| @@ -106,16 +106,6 @@ do_install_append () { | |||
| 106 | printf "[provision]\nprimary_ecu_hardware_id = ${SOTA_HARDWARE_ID}\n" > ${D}${libdir}/sota/conf.d/40-hardware-id.toml | 106 | printf "[provision]\nprimary_ecu_hardware_id = ${SOTA_HARDWARE_ID}\n" > ${D}${libdir}/sota/conf.d/40-hardware-id.toml |
| 107 | fi | 107 | fi |
| 108 | 108 | ||
| 109 | if [ -n "${SOTA_SECONDARY_CONFIG_DIR}" ]; then | ||
| 110 | if [ -d "${SOTA_SECONDARY_CONFIG_DIR}" ]; then | ||
| 111 | install -m 0700 -d ${D}${sysconfdir}/sota/ecus | ||
| 112 | install -m 0644 "${SOTA_SECONDARY_CONFIG_DIR}"/* ${D}${sysconfdir}/sota/ecus/ | ||
| 113 | printf "[uptane]\nsecondary_configs_dir = /etc/sota/ecus/\n" > ${D}${libdir}/sota/conf.d/30-secondary-configs-dir.toml | ||
| 114 | else | ||
| 115 | bbwarn "SOTA_SECONDARY_CONFIG_DIR is set to an invalid directory (${SOTA_SECONDARY_CONFIG_DIR})" | ||
| 116 | fi | ||
| 117 | fi | ||
| 118 | |||
| 119 | install -m 0755 -d ${D}${systemd_unitdir}/system | 109 | install -m 0755 -d ${D}${systemd_unitdir}/system |
| 120 | aktualizr_service=${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'serialcan', '${WORKDIR}/aktualizr-serialcan.service', '${WORKDIR}/aktualizr.service', d)} | 110 | aktualizr_service=${@bb.utils.contains('SOTA_CLIENT_FEATURES', 'serialcan', '${WORKDIR}/aktualizr-serialcan.service', '${WORKDIR}/aktualizr.service', d)} |
| 121 | install -m 0644 ${aktualizr_service} ${D}${systemd_unitdir}/system/aktualizr.service | 111 | install -m 0644 ${aktualizr_service} ${D}${systemd_unitdir}/system/aktualizr.service |
diff --git a/recipes-support/libp11/libp11_git.bb b/recipes-support/libp11/libp11_git.bb deleted file mode 100644 index bedcdc8..0000000 --- a/recipes-support/libp11/libp11_git.bb +++ /dev/null | |||
| @@ -1,40 +0,0 @@ | |||
| 1 | SUMMARY = "Library for using PKCS" | ||
| 2 | DESCRIPTION = "\ | ||
| 3 | Libp11 is a library implementing a small layer on top of PKCS \ | ||
| 4 | make using PKCS" | ||
| 5 | HOMEPAGE = "http://www.opensc-project.org/libp11" | ||
| 6 | SECTION = "Development/Libraries" | ||
| 7 | LICENSE = "LGPLv2+" | ||
| 8 | LIC_FILES_CHKSUM = "file://COPYING;md5=fad9b3332be894bab9bc501572864b29" | ||
| 9 | DEPENDS = "libtool openssl" | ||
| 10 | RDEPENDS_${PN} += " opensc" | ||
| 11 | |||
| 12 | SRC_URI = "git://github.com/OpenSC/libp11.git" | ||
| 13 | SRCREV = "57ca68ff67efa08e3be1f26dec6d23bf5bb977f2" | ||
| 14 | |||
| 15 | PV = "0.4.9+git${SRCPV}" | ||
| 16 | |||
| 17 | S = "${WORKDIR}/git" | ||
| 18 | |||
| 19 | inherit autotools pkgconfig | ||
| 20 | |||
| 21 | # Currently, Makefile dependencies are incorrectly defined which causes build errors | ||
| 22 | # if the number of jobs is high | ||
| 23 | # See https://github.com/OpenSC/libp11/issues/94 | ||
| 24 | PARALLEL_MAKE = "" | ||
| 25 | EXTRA_OECONF = "--disable-static" | ||
| 26 | |||
| 27 | do_install_append () { | ||
| 28 | rm -rf ${D}${libdir}/*.la | ||
| 29 | rm -rf ${D}${docdir}/${BPN} | ||
| 30 | } | ||
| 31 | |||
| 32 | FILES_${PN} = "${libdir}/engines*/pkcs11.so \ | ||
| 33 | ${libdir}/engines*/libpkcs11${SOLIBS} \ | ||
| 34 | ${libdir}/libp11${SOLIBS}" | ||
| 35 | |||
| 36 | FILES_${PN}-dev = " \ | ||
| 37 | ${libdir}/engines*/libpkcs11${SOLIBSDEV} \ | ||
| 38 | ${libdir}/libp11${SOLIBSDEV} \ | ||
| 39 | ${libdir}/pkgconfig/libp11.pc \ | ||
| 40 | /usr/include" | ||
diff --git a/recipes-support/softhsm-testtoken/softhsm-testtoken.bb b/recipes-support/softhsm-testtoken/softhsm-testtoken.bb index 58b521c..68514b2 100644 --- a/recipes-support/softhsm-testtoken/softhsm-testtoken.bb +++ b/recipes-support/softhsm-testtoken/softhsm-testtoken.bb | |||
| @@ -4,7 +4,7 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda | |||
| 4 | 4 | ||
| 5 | inherit systemd | 5 | inherit systemd |
| 6 | 6 | ||
| 7 | RDEPENDS_${PN} = "softhsm libp11 openssl-bin" | 7 | RDEPENDS_${PN} = "softhsm libp11 opensc openssl-bin" |
| 8 | DEPENDS_append = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', ' systemd', '', d)}" | 8 | DEPENDS_append = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', ' systemd', '', d)}" |
| 9 | 9 | ||
| 10 | 10 | ||
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 @@ | |||
| 1 | FROM debian:stable | 1 | FROM debian:stretch |
| 2 | LABEL Description="Image for bitbaking" | 2 | LABEL Description="Image for bitbaking" |
| 3 | 3 | ||
| 4 | RUN 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 | 4 | RUN 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 |
| 5 | RUN 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 | 5 | RUN 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 |
| 6 | RUN apt-get update -q && apt-get install -qy \ | 6 | RUN 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 | ||
| 34 | ARG uid=1000 | 40 | ARG uid=4321 |
| 35 | ARG gid=1000 | 41 | ARG gid=4321 |
| 36 | RUN groupadd -g $gid bitbake | 42 | RUN groupadd -g $gid bitbake |
| 37 | RUN useradd -m -u $uid -g $gid bitbake | 43 | RUN useradd -m -u $uid -g $gid -s /bin/bash bitbake |
| 38 | 44 | ||
| 39 | RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen | 45 | RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen |
| 40 | ENV LC_ALL="en_US.UTF-8" | 46 | ENV LC_ALL="en_US.UTF-8" |
| 41 | ENV LANG="en_US.UTF-8" | 47 | ENV LANG="en_US.UTF-8" |
| 42 | ENV LANGUAGE="en_US.UTF-8" | 48 | ENV LANGUAGE="en_US.UTF-8" |
| 49 | |||
| 50 | # script to mirror kvm group id with host | ||
| 51 | RUN echo "bitbake ALL=NOPASSWD: /usr/local/bin/setup_kvm.sh" >> /etc/sudoers | ||
| 52 | COPY ./docker/setup_kvm.sh /usr/local/bin/setup_kvm.sh | ||
| 53 | |||
| 54 | # other ci scripts | ||
| 55 | RUN mkdir /scripts | ||
| 56 | COPY configure.sh build.sh oe-selftest.sh /scripts/ | ||
| 57 | |||
| 58 | USER "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 @@ | |||
| 1 | FROM debian:stretch-slim | ||
| 2 | LABEL Description="Image for checking out updater-repo" | ||
| 3 | |||
| 4 | RUN 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 | ||
| 5 | RUN 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 | ||
| 6 | RUN apt-get update -q && apt-get install -qy \ | ||
| 7 | git \ | ||
| 8 | repo \ | ||
| 9 | xmlstarlet | ||
| 10 | |||
| 11 | # checkout script | ||
| 12 | RUN mkdir /scripts | ||
| 13 | COPY checkout-oe.sh /scripts/ | ||
diff --git a/scripts/ci/Jenkinsfile.bleeding b/scripts/ci/Jenkinsfile.bleeding deleted file mode 100644 index 6d340fd..0000000 --- a/scripts/ci/Jenkinsfile.bleeding +++ /dev/null | |||
| @@ -1,87 +0,0 @@ | |||
| 1 | // This CI setup checks out aktualizr, meta-updater and updater-repo and builds | ||
| 2 | // master branches whenever a change is pushed to any of these | ||
| 3 | |||
| 4 | // define these for docker image creation | ||
| 5 | node { | ||
| 6 | // might cause some problems: | ||
| 7 | // https://stackoverflow.com/questions/44805076/setting-build-args-for-dockerfile-agent-using-a-jenkins-declarative-pipeline | ||
| 8 | JENKINS_UID = sh(returnStdout: true, script: 'id -u').trim() | ||
| 9 | JENKINS_GID = sh(returnStdout: true, script: 'id -g').trim() | ||
| 10 | } | ||
| 11 | |||
| 12 | pipeline { | ||
| 13 | agent any | ||
| 14 | environment { | ||
| 15 | TEST_AKTUALIZR_REMOTE = 'aktualizr' | ||
| 16 | TEST_AKTUALIZR_DIR = 'aktualizr' | ||
| 17 | TEST_AKTUALIZR_BRANCH = 'master' | ||
| 18 | TEST_BITBAKE_COMMON_DIR = "/opt/jenkins/bitbake-common" | ||
| 19 | } | ||
| 20 | stages { | ||
| 21 | stage('checkout') { | ||
| 22 | steps { | ||
| 23 | |||
| 24 | checkout([$class: 'GitSCM', | ||
| 25 | userRemoteConfigs: [ | ||
| 26 | [url: 'https://github.com/advancedtelematic/aktualizr', name: 'aktualizr'] | ||
| 27 | ], | ||
| 28 | branches: [[name: 'refs/heads/master']], | ||
| 29 | extensions: [ | ||
| 30 | [$class: 'DisableRemotePoll'], | ||
| 31 | [$class: 'PruneStaleBranch'], | ||
| 32 | [$class: 'RelativeTargetDirectory', | ||
| 33 | relativeTargetDir: 'aktualizr' | ||
| 34 | ] | ||
| 35 | ], | ||
| 36 | ]) | ||
| 37 | |||
| 38 | checkout([$class: 'RepoScm', | ||
| 39 | manifestRepositoryUrl: 'https://github.com/advancedtelematic/updater-repo', | ||
| 40 | manifestBranch: null, | ||
| 41 | manifestFile: 'master.xml', | ||
| 42 | manifestGroup: null, | ||
| 43 | mirrorDir: null, | ||
| 44 | jobs: 0, | ||
| 45 | depth: 0, | ||
| 46 | localManifest: null, | ||
| 47 | destinationDir: 'updater-repo', | ||
| 48 | repoUrl: null, | ||
| 49 | currentBranch: false, | ||
| 50 | resetFirst: true, | ||
| 51 | quiet: false, | ||
| 52 | trace: false, | ||
| 53 | showAllChanges: false, | ||
| 54 | ]) | ||
| 55 | |||
| 56 | // ignore bitbake build directories in docker | ||
| 57 | sh 'echo \'build*\' > .dockerignore' | ||
| 58 | |||
| 59 | // override meta-updater commit with currently tested branch | ||
| 60 | sh ''' | ||
| 61 | META_UPDATER_COMMIT=$(git rev-parse HEAD) | ||
| 62 | cd updater-repo/meta-updater | ||
| 63 | git checkout $META_UPDATER_COMMIT | ||
| 64 | ''' | ||
| 65 | } | ||
| 66 | } | ||
| 67 | stage('build-core-image-minimal') { | ||
| 68 | agent { | ||
| 69 | dockerfile { | ||
| 70 | filename 'scripts/ci/Dockerfile.bitbake' | ||
| 71 | args '-v /opt/jenkins/bitbake-common:/opt/jenkins/bitbake-common' | ||
| 72 | additionalBuildArgs "--build-arg uid=${JENKINS_UID} --build-arg gid=${JENKINS_GID}" | ||
| 73 | reuseNode true | ||
| 74 | } | ||
| 75 | } | ||
| 76 | environment { | ||
| 77 | TEST_AKTUALIZR_CREDENTIALS = credentials('garage-credentials') | ||
| 78 | } | ||
| 79 | steps { | ||
| 80 | sh 'scripts/ci/configure.sh' | ||
| 81 | |||
| 82 | sh 'scripts/ci/build.sh core-image-minimal' | ||
| 83 | } | ||
| 84 | } | ||
| 85 | } | ||
| 86 | } | ||
| 87 | // vim: set ft=groovy tabstop=2 shiftwidth=2 expandtab: | ||
diff --git a/scripts/ci/Jenkinsfile.bleeding-selftest b/scripts/ci/Jenkinsfile.bleeding-selftest deleted file mode 100644 index 8c2d1de..0000000 --- a/scripts/ci/Jenkinsfile.bleeding-selftest +++ /dev/null | |||
| @@ -1,91 +0,0 @@ | |||
| 1 | // This CI setup checks out aktualizr, meta-updater and updater-repo and builds | ||
| 2 | // master branches whenever a change is pushed to any of these | ||
| 3 | |||
| 4 | // define these for docker image creation | ||
| 5 | node { | ||
| 6 | // might cause some problems: | ||
| 7 | // https://stackoverflow.com/questions/44805076/setting-build-args-for-dockerfile-agent-using-a-jenkins-declarative-pipeline | ||
| 8 | JENKINS_UID = sh(returnStdout: true, script: 'id -u').trim() | ||
| 9 | JENKINS_GID = sh(returnStdout: true, script: 'id -g').trim() | ||
| 10 | } | ||
| 11 | |||
| 12 | pipeline { | ||
| 13 | agent { | ||
| 14 | node { label 'bitbake' } | ||
| 15 | } | ||
| 16 | environment { | ||
| 17 | TEST_AKTUALIZR_REMOTE = 'aktualizr' | ||
| 18 | TEST_AKTUALIZR_DIR = 'aktualizr' | ||
| 19 | TEST_AKTUALIZR_BRANCH = 'master' | ||
| 20 | TEST_BITBAKE_COMMON_DIR = "/opt/jenkins/bitbake-common" | ||
| 21 | } | ||
| 22 | stages { | ||
| 23 | stage('checkout') { | ||
| 24 | steps { | ||
| 25 | |||
| 26 | checkout([$class: 'GitSCM', | ||
| 27 | userRemoteConfigs: [ | ||
| 28 | [url: 'https://github.com/advancedtelematic/aktualizr', name: 'aktualizr'] | ||
| 29 | ], | ||
| 30 | branches: [[name: 'refs/heads/master']], | ||
| 31 | extensions: [ | ||
| 32 | [$class: 'DisableRemotePoll'], | ||
| 33 | [$class: 'PruneStaleBranch'], | ||
| 34 | [$class: 'RelativeTargetDirectory', | ||
| 35 | relativeTargetDir: 'aktualizr' | ||
| 36 | ] | ||
| 37 | ], | ||
| 38 | ]) | ||
| 39 | |||
| 40 | checkout([$class: 'RepoScm', | ||
| 41 | manifestRepositoryUrl: 'https://github.com/advancedtelematic/updater-repo', | ||
| 42 | manifestBranch: null, | ||
| 43 | manifestFile: 'master.xml', | ||
| 44 | manifestGroup: null, | ||
| 45 | mirrorDir: null, | ||
| 46 | jobs: 0, | ||
| 47 | depth: 0, | ||
| 48 | localManifest: null, | ||
| 49 | destinationDir: 'updater-repo', | ||
| 50 | repoUrl: null, | ||
| 51 | currentBranch: false, | ||
| 52 | resetFirst: true, | ||
| 53 | quiet: false, | ||
| 54 | trace: false, | ||
| 55 | showAllChanges: false, | ||
| 56 | ]) | ||
| 57 | |||
| 58 | // ignore bitbake build directories in docker | ||
| 59 | sh 'echo \'build*\' > .dockerignore' | ||
| 60 | |||
| 61 | // override meta-updater commit with currently tested branch | ||
| 62 | sh ''' | ||
| 63 | META_UPDATER_COMMIT=$(git rev-parse HEAD) | ||
| 64 | cd updater-repo/meta-updater | ||
| 65 | git checkout $META_UPDATER_COMMIT | ||
| 66 | ''' | ||
| 67 | } | ||
| 68 | } | ||
| 69 | stage('build-core-image-minimal+oe-selftest') { | ||
| 70 | agent { | ||
| 71 | dockerfile { | ||
| 72 | filename 'scripts/ci/Dockerfile.bitbake' | ||
| 73 | args '-v /opt/jenkins/bitbake-common:/opt/jenkins/bitbake-common' | ||
| 74 | additionalBuildArgs "--build-arg uid=${JENKINS_UID} --build-arg gid=${JENKINS_GID}" | ||
| 75 | reuseNode true | ||
| 76 | } | ||
| 77 | } | ||
| 78 | environment { | ||
| 79 | TEST_AKTUALIZR_CREDENTIALS = credentials('garage-credentials') | ||
| 80 | } | ||
| 81 | steps { | ||
| 82 | sh 'scripts/ci/configure.sh' | ||
| 83 | |||
| 84 | sh 'scripts/ci/build.sh core-image-minimal' | ||
| 85 | |||
| 86 | sh 'scripts/ci/oe-selftest.sh' | ||
| 87 | } | ||
| 88 | } | ||
| 89 | } | ||
| 90 | } | ||
| 91 | // vim: set ft=groovy tabstop=2 shiftwidth=2 expandtab: | ||
diff --git a/scripts/ci/README.adoc b/scripts/ci/README.adoc deleted file mode 100644 index 222982b..0000000 --- a/scripts/ci/README.adoc +++ /dev/null | |||
| @@ -1,14 +0,0 @@ | |||
| 1 | = Jenkins setup for running meta-updater CI | ||
| 2 | |||
| 3 | As bitbake is quite resource-hungry, there are some special steps that are | ||
| 4 | needed to run Jenkins CI tasks: | ||
| 5 | |||
| 6 | - docker should be installed and the `jenkins` unix user should belong to | ||
| 7 | the `docker` group | ||
| 8 | - `/opt/jenkins` should exist and have `jenkins:jenkins` permissions, it | ||
| 9 | will be mapped as a volume on the same location in the docker build | ||
| 10 | container | ||
| 11 | |||
| 12 | Note that for nodes running Jenkins slaves as a docker container, the | ||
| 13 | `/opt/jenkins` directory must exist on the host system as well, with | ||
| 14 | permissions matching the user and groupd ids in Jenkins' docker | ||
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 | ( |
| 13 | set +euo pipefail | 13 | set +euo pipefail |
| 14 | set +x | 14 | set +x |
| 15 | METADIR=$(realpath "$TEST_REPO_DIR") | ||
| 16 | export 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 | ||
| 19 | set -x | ||
| 17 | bitbake "${IMAGE_NAME}" | 20 | bitbake "${IMAGE_NAME}" |
| 18 | ) | 21 | ) |
diff --git a/scripts/ci/checkout-oe.sh b/scripts/ci/checkout-oe.sh new file mode 100755 index 0000000..fdc0e48 --- /dev/null +++ b/scripts/ci/checkout-oe.sh | |||
| @@ -0,0 +1,76 @@ | |||
| 1 | #!/usr/bin/env bash | ||
| 2 | |||
| 3 | set -euo pipefail | ||
| 4 | |||
| 5 | set -x | ||
| 6 | |||
| 7 | REMOTE_SOURCE=${REMOTE_SOURCE:-https://github.com/advancedtelematic} | ||
| 8 | MANIFEST=${MANIFEST:-master} | ||
| 9 | CURRENT_PROJECT=${CURRENT_PROJECT:-} | ||
| 10 | |||
| 11 | # list of projects to pin to one version in the format: | ||
| 12 | # "project:rev;project2:rev2..." | ||
| 13 | PIN_LIST=${PIN_LIST:-} | ||
| 14 | |||
| 15 | #CURRENT_REV=$(git rev-parse HEAD) | ||
| 16 | LOCAL_REPO=$PWD | ||
| 17 | |||
| 18 | mkdir -p updater-repo | ||
| 19 | |||
| 20 | cd updater-repo | ||
| 21 | |||
| 22 | if [ -d .repo/manifests ]; then | ||
| 23 | git -C .repo/manifests reset --hard | ||
| 24 | fi | ||
| 25 | |||
| 26 | repo init -m "${MANIFEST}.xml" -u "$REMOTE_SOURCE/updater-repo" | ||
| 27 | |||
| 28 | # patch manifest: | ||
| 29 | # - add a new "ats" remote that points to "$REMOTE_SOURCE" | ||
| 30 | # - change projects that contain "advancedtelematic" to use the ats remote | ||
| 31 | MANIFEST_FILE=".repo/manifests/${MANIFEST}.xml" | ||
| 32 | xmlstarlet ed --omit-decl -L \ | ||
| 33 | -s "/manifest" -t elem -n "remote" -v "" \ | ||
| 34 | -i "/manifest/remote[last()]" -t attr -n "name" -v "ats" \ | ||
| 35 | -i "/manifest/remote[last()]" -t attr -n "fetch" -v "$REMOTE_SOURCE" \ | ||
| 36 | -d "/manifest/project[contains(@name, 'advancedtelematic')]/@remote" \ | ||
| 37 | -i "/manifest/project[contains(@name, 'advancedtelematic')]" -t attr -n "remote" -v "ats" \ | ||
| 38 | "$MANIFEST_FILE" | ||
| 39 | |||
| 40 | # hack: sed on `advancedtelematic/` names, to remove this unwanted prefix | ||
| 41 | sed -i 's#name="advancedtelematic/#name="#g' "$MANIFEST_FILE" | ||
| 42 | |||
| 43 | # pin projects from the list | ||
| 44 | ( | ||
| 45 | IFS=";" | ||
| 46 | for pin in $PIN_LIST; do | ||
| 47 | IFS=":" | ||
| 48 | read -r project rev <<< "$pin" | ||
| 49 | xmlstarlet ed --omit-decl -L \ | ||
| 50 | -d "/manifest/project[@name=\"$project\"]/@revision" \ | ||
| 51 | -i "/manifest/project[@name=\"$project\"]/@revision" -t attr -n "revision" -v "$rev" \ | ||
| 52 | -i "/manifest/project[@name=\"$project\"]" -t attr -n "revision" -v "$rev" \ | ||
| 53 | "$MANIFEST_FILE" | ||
| 54 | IFS=";" | ||
| 55 | done | ||
| 56 | ) | ||
| 57 | |||
| 58 | # Remove the current project from the manifest if we have it checked out | ||
| 59 | if [ -n "$CURRENT_PROJECT" ]; then | ||
| 60 | xmlstarlet ed --omit-decl -L \ | ||
| 61 | -d "/manifest/project[@name=\"$CURRENT_PROJECT\"]" \ | ||
| 62 | "$MANIFEST_FILE" | ||
| 63 | fi | ||
| 64 | |||
| 65 | repo manifest | ||
| 66 | |||
| 67 | repo forall -c 'git reset --hard ; git clean -fdx' | ||
| 68 | |||
| 69 | repo sync -d --force-sync | ||
| 70 | |||
| 71 | if [ -n "$CURRENT_PROJECT" ]; then | ||
| 72 | rm -f "$CURRENT_PROJECT" | ||
| 73 | ln -s "$LOCAL_REPO" "$CURRENT_PROJECT" | ||
| 74 | fi | ||
| 75 | |||
| 76 | repo manifest -r | ||
diff --git a/scripts/ci/configure.sh b/scripts/ci/configure.sh index 960a0cc..67563ed 100755 --- a/scripts/ci/configure.sh +++ b/scripts/ci/configure.sh | |||
| @@ -8,9 +8,13 @@ TEST_BUILD_DIR=${TEST_BUILD_DIR:-build} | |||
| 8 | TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo} | 8 | TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo} |
| 9 | TEST_BITBAKE_COMMON_DIR=${TEST_BITBAKE_COMMON_DIR:-} | 9 | TEST_BITBAKE_COMMON_DIR=${TEST_BITBAKE_COMMON_DIR:-} |
| 10 | 10 | ||
| 11 | TEST_AKTUALIZR_DIR=${TEST_AKTUALIZR_DIR:-.} | 11 | TEST_AKTUALIZR_REMOTE=${TEST_AKTUALIZR_REMOTE:-} |
| 12 | TEST_AKTUALIZR_BRANCH=${TEST_AKTUALIZR_BRANCH:-master} | 12 | if [ -n "$TEST_AKTUALIZR_REMOTE" ]; then |
| 13 | TEST_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")} | ||
| 16 | fi | ||
| 17 | |||
| 14 | TEST_AKTUALIZR_CREDENTIALS=${TEST_AKTUALIZR_CREDENTIALS:-} | 18 | TEST_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 | |||
| 21 | set +euo pipefail | 25 | set +euo pipefail |
| 22 | set +x | 26 | set +x |
| 23 | echo ">> Running envsetup.sh" | 27 | echo ">> Running envsetup.sh" |
| 28 | METADIR=$(realpath "$TEST_REPO_DIR") | ||
| 29 | export 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" | |||
| 31 | echo ">> Set common bitbake config options" | 37 | echo ">> Set common bitbake config options" |
| 32 | cat << EOF > "$SITE_CONF" | 38 | cat << EOF > "$SITE_CONF" |
| 33 | SANITY_TESTED_DISTROS = "" | 39 | SANITY_TESTED_DISTROS = "" |
| 34 | SSTATE_MIRRORS ?= "file://.* https://bitbake-cache.atsgarage.com/PATH;downloadfilename=PATH" | ||
| 35 | IMAGE_FEATURES += "ssh-server-openssh" | 40 | IMAGE_FEATURES += "ssh-server-openssh" |
| 36 | 41 | ||
| 37 | EOF | 42 | EOF |
| 38 | 43 | ||
| 39 | echo ">> Set aktualizr branch in bitbake's config" | 44 | if [ -n "$TEST_AKTUALIZR_REMOTE" ]; then |
| 40 | cat << EOF >> "$SITE_CONF" | 45 | echo ">> Set aktualizr branch in bitbake's config" |
| 46 | cat << EOF >> "$SITE_CONF" | ||
| 41 | SRCREV_pn-aktualizr = "$TEST_AKTUALIZR_REV" | 47 | SRCREV_pn-aktualizr = "$TEST_AKTUALIZR_REV" |
| 42 | SRCREV_pn-aktualizr-native = "\${SRCREV_pn-aktualizr}" | 48 | SRCREV_pn-aktualizr-native = "\${SRCREV_pn-aktualizr}" |
| 43 | BRANCH_pn-aktualizr = "$TEST_AKTUALIZR_BRANCH" | 49 | BRANCH_pn-aktualizr = "$TEST_AKTUALIZR_BRANCH" |
| 44 | BRANCH_pn-aktualizr-native = "\${BRANCH_pn-aktualizr}" | 50 | BRANCH_pn-aktualizr-native = "\${BRANCH_pn-aktualizr}" |
| 45 | |||
| 46 | EOF | 51 | EOF |
| 52 | fi | ||
| 47 | 53 | ||
| 48 | if [[ -n $TEST_AKTUALIZR_CREDENTIALS ]]; then | 54 | if [[ -n $TEST_AKTUALIZR_CREDENTIALS ]]; then |
| 49 | echo ">> Set aktualizr credentials" | 55 | echo ">> Set aktualizr credentials" |
| @@ -63,3 +69,6 @@ SSTATE_DIR = "$SSTATE_DIR" | |||
| 63 | DL_DIR = "$DL_DIR" | 69 | DL_DIR = "$DL_DIR" |
| 64 | EOF | 70 | EOF |
| 65 | fi | 71 | fi |
| 72 | |||
| 73 | echo -e ">> Final configuration (site.conf):\n" | ||
| 74 | cat "$SITE_CONF" | ||
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 | |||
| 9 | set -euo pipefail | ||
| 10 | |||
| 11 | kvm_gid=$(stat -c "%g" /dev/kvm) | ||
| 12 | groupmod -g "$kvm_gid" kvm | ||
| 13 | usermod -a -G kvm bitbake | ||
| 14 | ln -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..5b81d77 --- /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:18 | ||
| 10 | stage: docker | ||
| 11 | services: | ||
| 12 | - docker:18-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:18 | ||
| 30 | stage: docker | ||
| 31 | services: | ||
| 32 | - docker:18-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..178e7c1 100755 --- a/scripts/ci/oe-selftest.sh +++ b/scripts/ci/oe-selftest.sh | |||
| @@ -12,7 +12,15 @@ TEST_REPO_DIR=${TEST_REPO_DIR:-updater-repo} | |||
| 12 | ( | 12 | ( |
| 13 | set +euo pipefail | 13 | set +euo pipefail |
| 14 | set +x | 14 | set +x |
| 15 | METADIR=$(realpath "$TEST_REPO_DIR") | ||
| 16 | export 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 | ||
| 17 | oe-selftest -r updater | 19 | set -x |
| 20 | |||
| 21 | # work poky around bug on sumo and thud | ||
| 22 | # see https://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=d3a94e5b9b3c107cf54d5639071cc6609c002f67 | ||
| 23 | mkdir -p "tmp/log" | ||
| 24 | |||
| 25 | oe-selftest -r "$@" | ||
| 18 | ) | 26 | ) |
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 |
| 22 | fi | 22 | fi |
| 23 | 23 | ||
| 24 | METADIR="${SOURCEDIR}/../.." | 24 | METADIR=${METADIR:-${SOURCEDIR}/../..} |
| 25 | 25 | ||
| 26 | if [[ ! -f "${BUILDDIR}/conf/local.conf" ]]; then | 26 | if [[ ! -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 | |||
| 2 | from os import listdir | 2 | from os import listdir |
| 3 | import random | 3 | import random |
| 4 | import socket | 4 | import socket |
| 5 | from subprocess import check_output, CalledProcessError | 5 | from subprocess import check_output |
| 6 | 6 | ||
| 7 | EXTENSIONS = { | 7 | EXTENSIONS = { |
| 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') |
