Compare commits

...

14 Commits

Author SHA1 Message Date
Simon Glass
90acabc390 emulation: Drop the snap description
To allow us to build for an EFI snap, drop the QEMU description. The
snapcraft files are kept in separate repos:

  https://code.launchpad.net/~sjg1/u-boot/+git/u-boot-concept-efi
  https://code.launchpad.net/~sjg1/u-boot/+git/u-boot-concept-qemu/+ref/master

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-22 12:24:24 -06:00
Simon Glass
a3d82ed485 Merge branch 'snap' into 'master'
emulation: snap: Add python3-setuptools

See merge request u-boot/u-boot!128
2025-07-22 15:19:11 +00:00
Simon Glass
f999808c5c emulation: snap: Add python3-setuptools
Add a missing build-package which did not show up in local testing.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-22 09:16:43 -06:00
Simon Glass
fc213cf3b5 Merge branch 'snap' into 'master'
emulation: Add a snap description

See merge request u-boot/u-boot!127
2025-07-22 14:08:52 +00:00
Simon Glass
c6cd58b4a5 emulation: Add a snap description
To enable building U-Boot for QEMU as a snap, add an initial snapcraft
file.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-22 08:08:05 -06:00
Simon Glass
53d438936d Merge branch 'labf' into 'master'
test/py: Minor improvement to labgrid integration

See merge request u-boot/u-boot!126
2025-07-22 03:38:22 +00:00
Simon Glass
4e875bf63e sandbox: Drop expect_reset from restart_uboot_with_flags()
No caller uses this argument, so drop it.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:45:43 -06:00
Simon Glass
f9f05c7237 hooks: Allow writing the console log to a file
Labgrid has a --log-output option to allow writing its log output to a
file. Add a way to control this from Labgrid's U-Boot scripts.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:44:01 -06:00
Simon Glass
d40c8f0b87 test/py: Fix a spurious tab in get_details()
One line is indented with tab instead of space. Fix it.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:44:01 -06:00
Simon Glass
327d8cb960 hooks: Pass the verbose flag to labgrid
The V variable includes the -v flag if verbose operation is requested
in Labgrid. Add it to the console cmdline.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:44:01 -06:00
Simon Glass
4674784f5b test/py: Provide an option to abort on an exception
It is quite tricky to debug problems in the test.py code itself, as when
something goes wrong the exception failure is caught and reported as a
test failure.

Add a -E option to simplify debugging.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:44:01 -06:00
Simon Glass
6776eb2133 beagleplay: Drop EFI self-tests
These don't actually seem to work, since the rest cannot be handled by
the lab. Disable them.

   Preparing for reset. Press any key...
   FAILED:
   test/py/tests/test_efi_selftest.py:20: in test_efi_selftest_base
       raise Exception('Failures occurred during the EFI selftest')
   E   Exception: Failures occurred during the EFI selftest 48053.8 ms

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:43:20 -06:00
Simon Glass
290829cc0d Merge branch 'devops' into 'master'
CI: Automate final release workflow with version bumping

See merge request u-boot/u-boot!125
2025-07-18 12:07:44 +00:00
Simon Glass
6a3532c0db CI: Automate final release workflow with version bumping
Introduce a new CI job in .gitlab-ci-release.yml to automate the
creation of project releases.

This change implements two new jobs in .gitlab-ci-release.yml:

1. A version:bump job that runs on a schedule. On the first Monday of an
even-numbered month, it automatically updates the VERSION and PATCHLEVEL
in the Makefile and pushes the change to the master branch.

2. A release:create job that is triggered by the version bump commit. It
creates the final GitLab Release and corresponding Git tag on the commit
containing the updated Makefile.

This ensures that the repository's version is correctly updated and
committed just before the official release tag is applied, creating a
clean and reliable release history.

This single job, designed to run on a schedule, contains logic to:

  - create a final release (e.g. 2025.08) on the first Monday of an
    even-numbered month.
  - create a release candidate (e.g. 2025.07-rc1) on all other
    scheduled days.

This uses official release-cli to create both the git tag and the
corresponding GitLab Release entry automatically.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-18 05:32:55 -06:00
6 changed files with 86 additions and 54 deletions

View File

@@ -1,48 +1,73 @@
# .gitlab-ci-release.yml
# This single job handles the creation of both final releases and release candidates.
# It determines which type of release to create based on the date.
release:create:
stage: release
# We use the official release-cli image provided by GitLab.
image: registry.gitlab.com/gitlab-org/release-cli:latest
# Job to automatically update the version in the Makefile and push a commit.
# This runs on a schedule and only acts when a final release is due.
version:bump:
stage: version_bump
image: alpine:3.18 # A small image with git and bash
rules:
# This job only runs on scheduled pipelines that target the 'master' branch.
# Run only on scheduled pipelines targeting the 'master' branch.
- if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_REF_NAME == "master"'
script:
- |
echo "🚀 Checking release conditions for pipeline on branch '$CI_COMMIT_REF_NAME'..."
# Use %-m, %-u, %-d to avoid issues with zero-padding (e.g., '08' being an invalid octal number).
echo "Checking if a final release is scheduled today..."
MONTH=$(date +%-m)
DAY_OF_WEEK=$(date +%-u) # 1=Monday, 7=Sunday
DAY_OF_WEEK=$(date +%-u)
DAY_OF_MONTH=$(date +%-d)
# FINAL RELEASE: Occurs on the first Monday of an even-numbered month.
# 1. The month is even (e.g., February, April...).
# 2. The day of the week is Monday.
# 3. The day is within the first 7 days of the month.
if [ $((MONTH % 2)) -eq 0 ] && [ "$DAY_OF_WEEK" -eq 1 ] && [ "$DAY_OF_MONTH" -le 7 ]; then
# This is a Final Release
TAG_NAME=$(date +%Y.%m)
RELEASE_TITLE="Release $TAG_NAME"
echo "✅ Conditions met for a Final Release. Creating tag: $TAG_NAME"
else
# This is a Release Candidate (RC)
# RC index is calculated based on the day of the month:
# Days 1-14 -> rc1, Days 15-28 -> rc2, etc.
RC_INDEX=$(( (DAY_OF_MONTH - 1) / 14 + 1 ))
TAG_NAME="$(date +%Y.%m)-rc${RC_INDEX}"
RELEASE_TITLE="Release Candidate $TAG_NAME"
echo "📝 Conditions met for a Release Candidate. Creating tag: $TAG_NAME"
# Only proceed on the first Monday of an even-numbered month.
if ! { [ $((MONTH % 2)) -eq 0 ] && [ "$DAY_OF_WEEK" -eq 1 ] && [ "$DAY_OF_MONTH" -le 7 ]; }; then
echo "Not a final release day. Nothing to do."
exit 0
fi
echo "Executing release-cli to create the release..."
echo "✅ Final release day detected. Updating Makefile..."
# Set up Git
apk add --no-cache git
git config --global user.name "GitLab CI"
git config --global user.email "gitlab-ci@${CI_SERVER_HOST}"
# Set the new version details
NEW_VERSION=$(date +%Y)
NEW_PATCHLEVEL=$(printf "%02d" $MONTH)
# Use sed to update the Makefile
sed -i "s/^VERSION = .*/VERSION = $NEW_VERSION/" Makefile
sed -i "s/^PATCHLEVEL = .*/PATCHLEVEL = $NEW_PATCHLEVEL/" Makefile
sed -i "s/^SUBLEVEL = .*/SUBLEVEL =/" Makefile
sed -i "s/^EXTRAVERSION = .*/EXTRAVERSION =/" Makefile
# If there are no changes, exit.
if git diff --quiet Makefile; then
echo "Makefile is already up-to-date."
exit 0
fi
# Commit and push the changes
echo "Pushing version bump to master branch..."
git add Makefile
COMMIT_MESSAGE="chore: Bump version to $NEW_VERSION.$NEW_PATCHLEVEL"
git commit -m "$COMMIT_MESSAGE"
# The GIT_WRITE_TOKEN is a variable you need to create (see setup below)
git push "https://gitlab-ci-token:${GIT_WRITE_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git" HEAD:master
# Job to create the release. This job now triggers from the commit pushed by the 'version:bump' job.
release:create:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
# Run only on commits to master with a specific commit message.
- if: '$CI_COMMIT_BRANCH == "master" && $CI_COMMIT_MESSAGE =~ /^chore: Bump version to/'
script:
- |
echo "🚀 Release commit detected. Creating GitLab Release..."
# Extract the tag name directly from the commit message (e.g., "2025.08")
TAG_NAME=$(echo "$CI_COMMIT_MESSAGE" | sed -n 's/chore: Bump version to //p')
RELEASE_TITLE="Release $TAG_NAME"
release-cli create \
--name "$RELEASE_TITLE" \
--tag-name "$TAG_NAME" \
--description "Automated release created by GitLab CI. Based on commit $CI_COMMIT_SHORT_SHA on the '$CI_COMMIT_REF_NAME' branch." \
--description "Automated release created by GitLab CI for commit $CI_COMMIT_SHORT_SHA." \
--ref "$CI_COMMIT_SHA"

View File

@@ -27,6 +27,7 @@ stages:
- test.py
- sjg-lab
- world build
- version_bump
- release
.buildman_and_testpy_template: &buildman_and_testpy_dfn

View File

@@ -53,7 +53,6 @@ CONFIG_SPL_DM_MAILBOX=y
CONFIG_SPL_POWER_DOMAIN=y
CONFIG_SPL_RAM_DEVICE=y
CONFIG_SPL_YMODEM_SUPPORT=y
CONFIG_CMD_BOOTEFI_SELFTEST=y
CONFIG_CMD_NVEDIT_EFI=y
CONFIG_CMD_DFU=y
CONFIG_CMD_GPIO=y

View File

@@ -38,6 +38,6 @@
exec labgrid-client -V do-bootstrap ${bootstrap:-1} -V do-build ${build:-1} \
-V do-send ${send:-0} -V do-clean ${clean:-0} ${vars} \
-V process-limit ${BUILDMAN_PROCESS_LIMIT:-0} \
-V process-limit ${BUILDMAN_PROCESS_LIMIT:-0} ${log_output} ${V} \
-r "${U_BOOT_BOARD_IDENTITY}" ${strategy} ${verbose} -a console \
${console_log}

View File

@@ -87,6 +87,9 @@ def pytest_addoption(parser):
help='Compile U-Boot before running tests')
parser.addoption('--buildman', default=False, action='store_true',
help='Use buildman to build U-Boot (assuming --build is given)')
parser.addoption(
'-E', '--allow-exceptions', '-E', default=False, action='store_true',
help='Avoid catching exceptions with test failures')
parser.addoption('--gdbserver', default=None,
help='Run sandbox under gdbserver. The argument is the channel '+
'over which gdbserver should communicate, e.g. localhost:1234')
@@ -167,7 +170,7 @@ def get_details(config):
if build_dir_extra:
env['U_BOOT_BUILD_DIR_EXTRA'] = build_dir_extra
# Make sure the script sees that it is being run from pytest
# Make sure the script sees that it is being run from pytest
env['U_BOOT_SOURCE_DIR'] = source_dir
proc = subprocess.run(cmd, stdout=subprocess.PIPE,
@@ -336,6 +339,7 @@ def pytest_configure(config):
ubconfig.connection_ok = True
ubconfig.timing = config.getoption('timing')
ubconfig.role = config.getoption('role')
ubconfig.allow_exceptions = config.getoption('allow_exceptions')
env_vars = (
'board_type',
@@ -507,6 +511,9 @@ def ubman(request):
if not ubconfig.connection_ok:
pytest.skip('Cannot get target connection')
return None
if ubman_fix.config.allow_exceptions:
ubman_fix.ensure_spawned()
return ubman_fix
try:
ubman_fix.ensure_spawned()
except OSError as err:
@@ -880,20 +887,23 @@ def pytest_runtest_protocol(item, nextitem):
test_list.append(item.name)
tests_not_run.remove(item.name)
try:
if ubman_fix.config.allow_exceptions:
msg_log(msg)
except:
# If something went wrong with logging, it's better to let the test
# process continue, which may report other exceptions that triggered
# the logging issue (e.g. ubman_fix.log wasn't created). Hence, just
# squash the exception. If the test setup failed due to e.g. syntax
# error somewhere else, this won't be seen. However, once that issue
# is fixed, if this exception still exists, it will then be logged as
# part of the test's stdout.
import traceback
print('Exception occurred while logging runtest status:')
traceback.print_exc()
# FIXME: Can we force a test failure here?
else:
try:
msg_log(msg)
except:
# If something went wrong with logging, it's better to let the test
# process continue, which may report other exceptions that triggered
# the logging issue (e.g. ubman_fix.log wasn't created). Hence, just
# squash the exception. If the test setup failed due to e.g. syntax
# error somewhere else, this won't be seen. However, once that issue
# is fixed, if this exception still exists, it will then be logged
# as part of the test's stdout.
import traceback
print('Exception occurred while logging runtest status:')
traceback.print_exc()
# FIXME: Can we force a test failure here?
log.end_section(item.name)

View File

@@ -60,14 +60,11 @@ class ConsoleSandbox(ConsoleBase):
cmd += self.sandbox_flags
return Spawn(cmd, cwd=self.config.source_dir, decode_signal=True)
def restart_uboot_with_flags(self, flags, expect_reset=False, use_dtb=True):
def restart_uboot_with_flags(self, flags, use_dtb=True):
"""Run U-Boot with the given command-line flags
Args:
flags: List of flags to pass, each a string
expect_reset: Boolean indication whether this boot is expected
to be reset while the 1st boot process after main boot before
prompt. False by default.
use_dtb: True to use a device tree file, False to run without one
Returns:
@@ -77,7 +74,7 @@ class ConsoleSandbox(ConsoleBase):
try:
self.sandbox_flags = flags
self.use_dtb = use_dtb
return self.restart_uboot(expect_reset)
return self.restart_uboot(False)
finally:
self.sandbox_flags = []
self.use_dtb = True