Merge pull request #266 from Dasharo/develop

Release v2.6.0
This commit is contained in:
Danik Klimuk
2025-08-07 12:55:52 +02:00
committed by GitHub
9 changed files with 451 additions and 5 deletions
+32
View File
@@ -9,6 +9,18 @@ on:
kas-path:
type: string
required: true
ref:
type: string
required: false
default: ${{ github.sha }}
nightly:
type: boolean
required: false
default: false
outputs:
dts_scripts_hash_output:
description: "Hash of dts-scripts main branch used for SRCREV"
value: ${{ jobs.build.outputs.dts_scripts_hash_nightly }}
jobs:
build:
@@ -16,11 +28,31 @@ jobs:
labels: dts-builder
env:
FAILED_ATTEMPTS: 0
outputs:
dts_scripts_hash_nightly: ${{ steps.set_dts_scripts_hash_output.outputs.hash }}
steps:
- name: Checkout meta-dts repo
uses: actions/checkout@v4
with:
path: "meta-dts"
ref: ${{ inputs.ref }}
- name: Prepare nightly SRCREV
if: ${{ inputs.nightly == true }}
id: set_dts_scripts_hash_output
shell: bash
run: |
git clone --depth 1 https://github.com/Dasharo/dts-scripts dts-scripts-tmp
DTS_SCRIPTS_HASH=$(cd dts-scripts-tmp && git rev-parse HEAD)
echo "hash=${DTS_SCRIPTS_HASH}" >> $GITHUB_OUTPUT
rm -rf dts-scripts-tmp
FILE_PATH="meta-dts/meta-dts-distro/recipes-dts/dts-scripts/dts-scripts_git.bb"
if [ -f "$FILE_PATH" ]; then
sed -i "s/^SRCREV = \".*\"/SRCREV = \"${DTS_SCRIPTS_HASH}\"/" "$FILE_PATH"
echo "Updated SRCREV in $FILE_PATH to ${DTS_SCRIPTS_HASH}"
else
echo "Error: File $FILE_PATH not found. Cannot update SRCREV."
exit 1
fi
- name: Prepare cache-less build configuration
if: ${{ inputs.cacheless }}
shell: bash
+13 -2
View File
@@ -60,7 +60,7 @@ jobs:
run: |
cd open-source-firmware-validation
if [ ! -d "venv" ]; then
python3 -m venv venv
python3.13 -m venv venv
fi
source venv/bin/activate
pip install -r requirements.txt
@@ -72,7 +72,14 @@ jobs:
cd open-source-firmware-validation/scripts/ci
mkdir -p qemu-data
touch qemu-data/hdd.qcow2
./qemu-run.sh nographic os &
./qemu-run.sh nographic os --no-audio-emulation &
for _ in {1..60}; do
sleep 1
if [ -f /tmp/qemu-pid ]; then
exit 0
fi
done
exit 1
- name: Create directory for logs
shell: bash
@@ -94,7 +101,10 @@ jobs:
# DPP_PASSWORD="..."
source ~/.secrets/dpp-keys-minio
ip_addr=$(ip -o -4 addr list eno2 | awk '{print $4}' | cut -d/ -f1)
DTS_CONFIG_REF="refs/heads/develop"
DTS_CONFIG_HASH=$(git ls-remote https://github.com/Dasharo/dts-configs.git "${DTS_CONFIG_REF}" | awk '{print $1}')
echo "Using DTS config hash: ${DTS_CONFIG_HASH}"
echo "::add-mask::$DPP_EMAIL"
echo "::add-mask::$DPP_PASSWORD"
@@ -104,6 +114,7 @@ jobs:
-v dpp_email:$DPP_EMAIL \
-v dpp_password:$DPP_PASSWORD \
-v boot_dts_from_ipxe_shell:True \
-v dts_config_ref:"${DTS_CONFIG_REF}" \
-v dts_ipxe_link:http://${ip_addr}:4321/dts.ipxe 2>&1 \
| tee ${{ env.LOG_DIR }}/dts-tests.log | grep --line-buffered "| PASS |\|| FAIL |"
+44 -1
View File
@@ -14,6 +14,9 @@ jobs:
with:
cacheless: true
kas-path: meta-dts/kas-uefi-sb.yml
ref: develop
nightly: true
move-build-artifacts:
needs: build-uefi-sb
runs-on:
@@ -22,12 +25,16 @@ jobs:
- name: Move UEFI SB build artifacts
run: |
mv build build-sb
build:
needs: move-build-artifacts
uses: ./.github/workflows/build.yml
with:
cacheless: true
kas-path: meta-dts/kas.yml
ref: develop
nightly: true
deploy-cache:
name: Deploy cache on cache.dasharo.com
needs: build
@@ -53,10 +60,46 @@ jobs:
run: |
rsync -P -e "ssh -i ~/.ssh/dts-ci-key" -rlptD --delete build/downloads builder@10.1.40.2:cache/yocto/dts
rsync -P -e "ssh -i ~/.ssh/dts-ci-key" -rlptD --delete build-sb/downloads builder@10.1.40.2:cache/yocto/dts/dts-uefi-sb
deploy-nightly-images:
name: Deploy nightly DTS artifacts on boot.dasharo.com
needs: build
runs-on:
labels: dts-builder
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: develop
fetch-depth: 1
path: "meta-dts"
- name: Prepare SSH key
shell: bash
env:
SSH_KEY: ${{secrets.SSH_KEY}}
run: |
echo -e ${SSH_KEY} > ~/.ssh/dts-ci-key
chmod 600 ~/.ssh/dts-ci-key
- name: Deploy DTS on boot.dasharo.com
shell: bash
run: |
cd build/tmp/deploy/images/genericx86-64/
scp -i ~/.ssh/dts-ci-key bzImage builder@10.1.40.2:boot/dts/nightly/
scp -i ~/.ssh/dts-ci-key dts-base-image-genericx86-64.cpio.gz builder@10.1.40.2:boot/dts/nightly/dts-base-image.cpio.gz
- name: Update nightly.ipxe variables
shell: bash
env:
DTS_SCRIPTS_HASH_FROM_BUILD: ${{ needs.build.outputs.dts_scripts_hash_output }}
run: |
META_DTS_REVISION_VALUE=$(cd meta-dts && git rev-parse HEAD)
DTS_SCRIPTS_VERSION_VALUE="${DTS_SCRIPTS_HASH_FROM_BUILD}"
ssh -i ~/.ssh/dts-ci-key builder@10.1.40.2 "sed -i 's/^set meta_dts_version.*/set meta_dts_version ${META_DTS_REVISION_VALUE}/' boot/dts/nightly.ipxe"
ssh -i ~/.ssh/dts-ci-key builder@10.1.40.2 "sed -i 's/^set dts_scripts_version.*/set dts_scripts_version ${DTS_SCRIPTS_VERSION_VALUE}/' boot/dts/nightly.ipxe"
cleanup:
name: Cleanup
if: always()
needs: deploy-cache
needs: [deploy-cache, deploy-nightly-images]
runs-on:
labels: dts-builder
steps:
+22
View File
@@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.6.0 - 2025-08-06
### Added
- docs: testing.md: add DTS end to end testing methodology
- dts-scripts: add DTS end to end tests profile generation, fix HCL report and
password indent
- Add Dasharo (Slim Bootloader+UEFI) for Hardkernel Odroid H4: initial
deployment and transition
### Changed
- HCL report: Fix empty lspci and lsusb in HCL report
- scripts: add remote-update and run-qemu scripts
- Add ability to use another ref for dts-configs
- Add DTS nightly builds
### Fixed
- test workflow: fix by waiting for QEMU to start before continuing, fix SeaBIOS
payload detection mocking
## 2.5.0 - 2025-06-11
### Added
+50
View File
@@ -0,0 +1,50 @@
# Testing
Current E2E tests are defined in [OSFV
repo](https://github.com/Dasharo/open-source-firmware-validation/blob/develop/dts/dts-e2e.robot)
They work by running through different workflows from the moment user sees UI to
the last step (e.g. reboot when updating). Currently, we only check whether we
can get from point A (e.g. start updating) to point B (e.g. printed reboot after
successful update).
## Planned changes
To improve end-to-end (E2E) testing, we plan to create a dedicated profile for
each workflow and platform. This profile will store an ordered list of all
Hardware Abstraction Layer (HAL) calls made during the actual execution of the
workflow. When running tests on QEMU, we will compare the HAL call sequence
generated during the test with the reference profile. The test will pass only if
both sequences are identical.
This change should be fairly trivial, we only have to modify
[tool_wrapper](https://github.com/Dasharo/dts-scripts/blob/bcf7871d4e334a47e7f8722793db5537db67a569/include/hal/dts-hal.sh#L65)
to make sure it appends command we are currently trying to run to a specific
file.
**Specifics**
1. Make `tool_wrapper` function append `<command> <command_args> <return_code>`
to `/tmp/logs/profile`.
- To make debugging easier create `/tmp/logs/debug_profile` which contains
lines in format:
`<script_file>:<script_line> <command> <command_args> <return_code>`
2. Generate profile for single platform and workflow
3. Modify E2E tests
- Add generated profile to `open-source-firmware-validation/dts/profiles/`
- Modify test for this platform and workflow and make it compare real
profile with one generated after workflow finishes
Profile generated on real hardware can be accepted if workflow used to generate
it was successful e.g. there were no DTS errors, platform works after rebooting,
workflow assumptions are fulfilled e.g. firmware version changed to expected
one.
**Pros:**
* Little changes needed to implement
**Cons:**
* Generating profiles for all workflows and platforms might take a while
* Changes in DTS might force us to regenerate all profiles
+1 -1
View File
@@ -4,7 +4,7 @@ DISTRO = "dts-distro"
# distro name
DISTRO_NAME = "Dasharo Tools Suite"
DISTRO_VERSION = "2.5.0"
DISTRO_VERSION = "2.6.0"
SDK_VENDOR = "-dtssdk"
MAINTAINER = "3mdeb Sp. z o. o. <contact@3mdeb.com>"
@@ -8,7 +8,7 @@ LIC_FILES_CHKSUM = "file://LICENSES/Apache-2.0.txt;md5=c846ebb396f8b174b10ded477
PV = "0.1+git${SRCPV}"
SRC_URI = "git://github.com/Dasharo/dts-scripts;protocol=https;branch=main"
SRCREV = "f2e93814b6a58caddd61d503adf8e134b0c19223"
SRCREV = "12e417bbc781ba5e180eba26ef574298ce2b7156"
S = "${WORKDIR}/git"
+131
View File
@@ -0,0 +1,131 @@
#!/usr/bin/env bash
trap cleanup EXIT
set -e
cleanup() {
exit_code=$?
if [ $exit_code -ne 0 ]; then
print_error "$BASH_COMMAND failed"
fi
exit $exit_code
}
print_help() {
cat <<EOF
$(basename "$0") [OPTION]... [remote]
Copy dts-scripts to remote DTS. Copies to root@localhost on port 5222 by default
Options:
-s|--script-dir <dir> Path to dts-scripts directory
-v|--verbose Enable trace output
-h|--help Print this help
EOF
}
print_usage_error() {
print_help
error_exit "$1"
}
print_error() {
local red="\033[31m"
local reset="\033[0m"
echo -e "${red}ERROR: $1${reset}"
}
error_exit() {
print_error "$1"
exit 1
}
parse_args() {
while [[ $# -gt 0 ]]; do
case $1 in
-s|--script-dir)
DTS_SCRIPTS="$(realpath "$2")"
shift 2
;;
-v|--verbose)
set -x
shift
;;
-h|--help)
print_help
exit 0
;;
-*)
print_usage_error "Unknown option $1"
;;
*)
POSITIONAL_ARGS+=( "$1" )
shift
;;
esac
done
}
POSITIONAL_ARGS=()
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
DTS_SCRIPTS="$(realpath "$SCRIPT_DIR/../../dts-scripts")"
parse_args "$@"
set -- "${POSITIONAL_ARGS[@]}"
if [ $# -gt 1 ]; then
print_usage_error "Script accepts 0 or 1 arguments, got $#"
fi
############################################
if [ ! -d "$DTS_SCRIPTS" ]; then
print_usage_error "$DTS_SCRIPTS doesn't exist, use --script-dir to set correct path"
fi
if [ -n "$1" ]; then
REMOTE="$1"
SCP="scp"
SSH="ssh"
else
REMOTE="root@localhost"
SCP="scp -P 5222"
SSH="ssh -p 5222"
fi
$SSH -q "$REMOTE" mkdir -p /dts-scripts
$SCP -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r "$DTS_SCRIPTS"/{Makefile,dts-profile.sh,include,scripts,reports} "$REMOTE":/dts-scripts/
$SSH -q "$REMOTE" 'cat >/dts-scripts/update.sh' <<"EOF"
#!/bin/sh
SBINDIR=/usr/sbin
SYSCONFDIR=/etc
echo "Updating dts-scripts"
install -d ${DESTDIR}${SBINDIR}
install -m 0755 include/dts-environment.sh ${DESTDIR}${SBINDIR}
install -m 0755 include/dts-functions.sh ${DESTDIR}${SBINDIR}
install -m 0755 include/dts-subscription.sh ${DESTDIR}${SBINDIR}
install -m 0755 include/hal/dts-hal.sh ${DESTDIR}${SBINDIR}
install -m 0755 include/hal/common-mock-func.sh ${DESTDIR}${SBINDIR}
install -m 0755 scripts/cloud_list.sh ${DESTDIR}${SBINDIR}/cloud_list
install -m 0755 scripts/dasharo-deploy.sh ${DESTDIR}${SBINDIR}/dasharo-deploy
install -m 0755 scripts/dts.sh ${DESTDIR}${SBINDIR}/dts
install -m 0755 scripts/dts-boot.sh ${DESTDIR}${SBINDIR}/dts-boot
install -m 0755 scripts/ec_transition.sh ${DESTDIR}${SBINDIR}/ec_transition
install -m 0755 scripts/logging.sh ${DESTDIR}${SBINDIR}/logging
install -m 0755 reports/dasharo-hcl-report.sh ${DESTDIR}${SBINDIR}/dasharo-hcl-report
install -m 0755 reports/touchpad-info.sh ${DESTDIR}${SBINDIR}/touchpad-info
install -d ${DESTDIR}${SYSCONFDIR}/profile.d
install -m 0755 dts-profile.sh ${DESTDIR}${SYSCONFDIR}/profile.d
echo "Finished updating dts-scripts"
EOF
$SSH -q "$REMOTE" chmod +x /dts-scripts/update.sh
$SSH -q "$REMOTE" 'cd /dts-scripts && ./update.sh'
+157
View File
@@ -0,0 +1,157 @@
#!/usr/bin/env bash
trap cleanup EXIT
set -e
cleanup() {
exit_code=$?
if [ $exit_code -ne 0 ]; then
print_error "$BASH_COMMAND failed"
fi
if [ -f "${OVMF_VARS}" ]; then
rm "${OVMF_VARS}"
fi
if [ -f "${TPM_DIR}/pid" ]; then
kill "$(cat "${TPM_DIR}/pid")"
fi
if [ -d "${TPM_DIR}" ]; then
rm -rf "${TPM_DIR}"
fi
exit $exit_code
}
print_help() {
cat <<EOF
$(basename "$0") [OPTION]... <image> [image]...
Run <image> in QEMU. Each image is mounted as separate drive.
Options:
-k|--disable-kvm Disable KVM in QEMU. DTS most likely won't boot.
-e|--efi Use EFI BIOS
-s|--secure-boot Enable Secure Boot with EFI BIOS.
-t|--tpm Add TPM2 device
-n|--no-graphics No graphic mode, only serial
-m|--memory <mem> How much RAM should QEMU have (default: 2G)
-c|--cpu <cpu> How many vCPUs should QEMU create (default: 4)
-v|--verbose Enable trace output
-h|--help Print this help
EOF
}
print_usage_error() {
print_help
error_exit "$1"
}
print_error() {
local red="\033[31m"
local reset="\033[0m"
echo -e "${red}ERROR: $1${reset}"
}
error_exit() {
print_error "$1"
exit 1
}
parse_args() {
while [[ $# -gt 0 ]]; do
case $1 in
-k|--disable-kvm)
KVM=
shift
;;
-e|--efi)
EFI="y"
shift
;;
-s|--secure-boot)
EFI="y"
SECBOOT="secboot."
shift
;;
-t|--tpm)
TPM="y"
shift
;;
-n|--no-graphics)
NO_GRAPHIC="-nographic"
shift
;;
-m|--memory)
MEM="$2"
shift 2
;;
-c|--cpu)
CPU="$2"
shift 2
;;
-v|--verbose)
set -x
shift
;;
-h|--help)
print_help
exit 0
;;
-*)
print_usage_error "Unknown option $1"
;;
*)
POSITIONAL_ARGS+=( -drive "file=$1,if=ide,format=raw" )
shift
;;
esac
done
}
POSITIONAL_ARGS=()
KVM="-enable-kvm"
MEM="2G"
CPU="4"
EFI=
SECBOOT=
TPM=
parse_args "$@"
set -- "${POSITIONAL_ARGS[@]}"
if [ $# -eq 0 ]; then
print_usage_error "Script requires at least 1 positional argument, got 0"
fi
############################################
OVMF=()
if [ -n "$EFI" ]; then
OVMF_VARS=$(mktemp --suffix=_OVMF_VARS)
cp "/usr/share/OVMF/OVMF_VARS.${SECBOOT}fd" "${OVMF_VARS}"
OVMF=(
"-drive" "if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.${SECBOOT}fd"
"-drive" "if=pflash,format=raw,file=${OVMF_VARS}"
)
fi
if [ "$TPM" = "y" ]; then
TPM_DIR=$(mktemp -d)
TPM_ARGS=(
-chardev "socket,id=chrtpm,path=${TPM_DIR}/sock"
-tpmdev "emulator,id=tpm0,chardev=chrtpm"
-device "tpm-tis,tpmdev=tpm0"
)
swtpm socket --tpm2 \
--tpmstate dir="${TPM_DIR}" \
--ctrl type=unixio,path="${TPM_DIR}/sock" \
--pid file="${TPM_DIR}/pid" \
--log level=5 &> "${TPM_DIR}/log" &
fi
qemu-system-x86_64 -serial mon:stdio -global ICH9-LPC.disable_s3=1 \
"${OVMF[@]}" \
-device virtio-net,netdev=vmnic \
-netdev user,id=vmnic,hostfwd=tcp::5222-:22 \
-m "$MEM" -smp "$CPU" -M q35 $KVM "${TPM_ARGS[@]}" $NO_GRAPHIC "${POSITIONAL_ARGS[@]}"