Add Ubuntu 26.04 x86_64 with non-blocking tests

Ubuntu 26.04 comes with GCC 15.2.0 and GNOME 50 which drops X11/xorg and
is Wayland only. X11 programs may run with XWayland within the Wayland
session.

The tier-1 -50 and -51 images are created and configured with Packer
instead of doing it manually. OS configurations can be checked at:

coin/pre-provisioning/qtci-linux-Ubuntu-26.04-x86_64/scripts/
coin/pre-provisioning/qtci-linux-Ubuntu-26.04-x86_64/http/user-data

Provisioning changes compared to x64 24.04:
- Pulseaudio backport is removed:
    03-install-pulseaudio-16-bugfix-backports.sh
- 80-docker.sh is updated to noble -> resolute
- apt: python3-pypdf2 -> python3-pypdf
- '-snld20' param added to 7z commands
- 62-install-swiftly.sh: apt install swiftlang instead
- vx_works.sh: /etc/sysctl.conf -> /sysctl.d/ for net.ipv4.ip_forward=1
- 92-sbuild.sh: sbuild-update is deprecated -> comment out
- enable_test_stacktraces.sh: /usr/lib/sysctl.d/55-ptrace.conf for U26
[CI Platforms]

Pick-to: 6.12
Task-number: QTQAINFRA-8001
Task-number: QTQAINFRA-5844
Change-Id: Ic6951f46845f8de8ca012a7c4f353fb042a16ae4
Reviewed-by: Simo Fält <[email protected]>
This commit is contained in:
Elias Toivola
2026-09-17 21:40:01 +00:00
parent 6e7735f5db
commit 574f06fdcc
82 changed files with 2122 additions and 8 deletions
@@ -105,6 +105,20 @@ Configurations:
'VCPKG_HOST_TRIPLET=x64-linux-qt',
'VCPKG_TARGET_TRIPLET=x64-linux-qt',
]
# Ubuntu 26.04 x64 Wayland
-
Id: 'ubuntu-26.04-x64-developer-build'
Template: 'qtci-linux-Ubuntu-26.04-x86_64-51'
Compiler: 'GCC'
Features: ['Sccache', 'UseConfigure', 'InsignificantTests', 'VerboseCTestOutput', 'StandaloneExamples']
Configure arguments: '-make examples -developer-build -c++std c++20 -linker gold -qtlibinfix TestInfix -qtnamespace TestNamespace'
Environment variables: [
'COMMON_TEST_CMAKE_ARGS=-DQT_SKIP_DOCKER_COMPOSE=ON',
'NON_QTBASE_CMAKE_ARGS=-DFFMPEG_DIR={{.Env.FFMPEG_DIR}} -DQT_DEPLOY_FFMPEG=TRUE',
'VCPKG_HOST_TRIPLET=x64-linux-qt',
'VCPKG_TARGET_TRIPLET=x64-linux-qt',
]
# Ubuntu 24.04 x64 Wayland
-
Id: 'ubuntu-24.04-x64'
Template: 'qtci-linux-Ubuntu-24.04-x86_64-50'
@@ -118,6 +132,20 @@ Configurations:
'VCPKG_HOST_TRIPLET=x64-linux-qt',
'VCPKG_TARGET_TRIPLET=x64-linux-qt',
]
# Ubuntu 26.04 x64 Wayland
-
Id: 'ubuntu-26.04-x64'
Template: 'qtci-linux-Ubuntu-26.04-x86_64-51'
Compiler: 'GCC'
Features: ['Sccache', 'UseConfigure', 'InsignificantTests', 'VerboseCTestOutput', 'GenerateSBOM', 'VerifySBOM', 'DocsGenerationV2']
Configure arguments: '-nomake examples -release -force-debug-info -separate-debug-info -headersclean -qt-libjpeg -qt-libpng -qt-pcre -qt-harfbuzz -qt-doubleconversion -no-libudev -bundled-xcb-xinput'
Environment variables: [
'CMAKE_ARGS=-DOpenGL_GL_PREFERENCE=LEGACY',
'COMMON_TEST_CMAKE_ARGS=-DQT_SKIP_DOCKER_COMPOSE=ON',
'NON_QTBASE_CMAKE_ARGS=-DFFMPEG_DIR={{.Env.FFMPEG_DIR}} -DQT_DEPLOY_FFMPEG=TRUE -DINPUT_headersclean=ON',
'VCPKG_HOST_TRIPLET=x64-linux-qt',
'VCPKG_TARGET_TRIPLET=x64-linux-qt',
]
# Test on Ubuntu 24.04 x64 X11
-
Id: 'ubuntu-24.04-x64-developer-build-x11-tests'
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# Distribution-specific build settings.
# For another distro/version, copy the bundle and change these values first.
DISTRO_NAME="ubuntu"
DISTRO_VERSION="26.04"
ISO_PATH="/tmp/ubuntu-26.04-desktop-amd64.iso"
# ISO_CHECKSUM_FILE="/tmp/SHA256SUMS"
# Usually reusable without changes.
IMAGE_PREFIX="qtci-linux"
ARCH="x86_64"
MINIMAL_INDEX="50"
CUSTOM_INDEX="51"
DISK_SIZE="500G"
CPUS="8"
MEMORY_MB="16184"
SSH_USERNAME="qt"
SSH_PASSWORD="$(cat /tmp/PASS)"
PROJECT_DIR="/tmp/packer-linux"
ARTIFACT_DIR="/tmp/output-linux-images"
@@ -0,0 +1,111 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -euo pipefail
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=build-config.sh
source "${script_dir}/build-config.sh"
image_base_name="${IMAGE_PREFIX}-${DISTRO_NAME}-${DISTRO_VERSION}-${ARCH}"
image_50_name="${image_base_name}-${MINIMAL_INDEX}"
image_51_name="${image_base_name}-${CUSTOM_INDEX}"
image_50="${ARTIFACT_DIR}/${image_50_name}"
image_51="${ARTIFACT_DIR}/${image_51_name}"
image_51_seed="/tmp/${image_51_name}-seed.qcow2"
stage_50_output="/tmp/packer-output-${MINIMAL_INDEX}"
stage_51_output="/tmp/packer-output-${CUSTOM_INDEX}"
template="linux-image.pkr.hcl"
# Pass one source of configuration into Packer without duplicating distro and
# version literals in HCL or a second variable file.
export PKR_VAR_distro_name="$DISTRO_NAME"
export PKR_VAR_distro_version="$DISTRO_VERSION"
export PKR_VAR_image_prefix="$IMAGE_PREFIX"
export PKR_VAR_arch="$ARCH"
export PKR_VAR_minimal_index="$MINIMAL_INDEX"
export PKR_VAR_custom_index="$CUSTOM_INDEX"
export PKR_VAR_iso_path="$ISO_PATH"
# export PKR_VAR_iso_checksum_file="$ISO_CHECKSUM_FILE"
export PKR_VAR_project_dir="$PROJECT_DIR"
export PKR_VAR_artifact_dir="$ARTIFACT_DIR"
export PKR_VAR_disk_size="$DISK_SIZE"
export PKR_VAR_cpus="$CPUS"
export PKR_VAR_memory_mb="$MEMORY_MB"
export PKR_VAR_ssh_username="$SSH_USERNAME"
export PKR_VAR_ssh_password="$SSH_PASSWORD"
if [[ "$script_dir" != "$PROJECT_DIR" ]]; then
echo "ERROR: Bundle is at '$script_dir', but PROJECT_DIR is '$PROJECT_DIR'." >&2
echo "Move/extract it there or update PROJECT_DIR in build-config.sh." >&2
exit 1
fi
for required_file in $ISO_PATH; do
if [[ ! -f "$required_file" ]]; then
echo "ERROR: Required file is missing: $required_file" >&2
exit 1
fi
done
# Stage 51 is always regenerated. Stage 50 is retained
rm -rf "$stage_50_output" "$stage_51_output"
rm -f "$image_51" "$image_51_seed"
rm -f "${image_51}.sha256"
packer init "$template"
packer validate "$template"
if [[ -f "$image_50" ]]; then
echo "Stage ${MINIMAL_INDEX}: existing image found:"
echo " $image_50"
echo "Validating existing image before skipping the build..."
if ! qemu-img check "$image_50"; then
echo "ERROR: Existing stage-${MINIMAL_INDEX} image failed validation:" >&2
echo " $image_50" >&2
echo "The image was not deleted or overwritten." >&2
echo "Remove it manually" >&2
exit 1
fi
echo "Stage ${MINIMAL_INDEX}: image is valid, skipping Packer build."
sha256sum "$image_50" > "${image_50}.sha256"
else
echo "Stage ${MINIMAL_INDEX}: no existing image found, starting Packer."
PACKER_LOG=1 \
PACKER_LOG_PATH="/tmp/packer-stage-${MINIMAL_INDEX}.log" \
packer build -only=stage-50.qemu.stage_50 "$template"
qemu-img check "$image_50"
sha256sum "$image_50" > "${image_50}.sha256"
fi
echo "Creating independent stage-${CUSTOM_INDEX} seed..."
qemu-img convert -p -f qcow2 -O qcow2 "$image_50" "$image_51_seed"
qemu-img check "$image_51_seed"
PACKER_LOG=1 \
PACKER_LOG_PATH="/tmp/packer-stage-${CUSTOM_INDEX}.log" \
packer build -only=stage-51.qemu.stage_51 "$template"
qemu-img check "$image_51"
sha256sum "$image_51" > "${image_51}.sha256"
(
cd "$ARTIFACT_DIR"
sha256sum --check "$(basename "${image_50}.sha256")"
)
rm -f "$image_51_seed"
echo
echo "Created independent images:"
echo " $image_50"
echo " $image_51"
echo "Checksums:"
echo " ${image_50}.sha256"
echo " ${image_51}.sha256"
@@ -0,0 +1,2 @@
instance-id: qtci-ubuntu26-packer
local-hostname: qtci-ubuntu26-x64
@@ -0,0 +1,22 @@
#cloud-config
# This file is installer/distribution-specific. The generic HCL and wrapper can
# be reused, but replace this file for a distro that does not use autoinstall.
autoinstall:
version: 1
source:
id: ubuntu-desktop-minimal
locale: en_US.UTF-8
keyboard:
layout: us
timezone: UTC
identity:
hostname: qtci-ubuntu26-x64
username: qt
password: "$6$qtciubuntu2604$FAeHIUtg1iOarKFnnDZim5fWEJ6ZaaYXSc360m68XFTqurIBWNBxsmUDKj.8mGJkVDKlWjFdKZLfrqHYhuBH8/"
ssh:
install-server: true
allow-pw: true
storage:
layout:
name: direct
shutdown: reboot
@@ -0,0 +1,192 @@
packer {
required_version = ">= 1.14.0"
required_plugins {
qemu = {
version = "~> 1"
source = "github.com/hashicorp/qemu"
}
}
}
variable "distro_name" {
type = string
}
variable "distro_version" {
type = string
}
variable "image_prefix" {
type = string
}
variable "arch" {
type = string
}
variable "minimal_index" {
type = string
}
variable "custom_index" {
type = string
}
variable "iso_path" {
type = string
}
variable "project_dir" {
type = string
}
variable "artifact_dir" {
type = string
}
variable "disk_size" {
type = string
}
variable "cpus" {
type = number
}
variable "memory_mb" {
type = number
}
variable "ssh_username" {
type = string
}
variable "ssh_password" {
type = string
sensitive = true
}
locals {
image_base_name = "${var.image_prefix}-${var.distro_name}-${var.distro_version}-${var.arch}"
image_50_name = "${local.image_base_name}-${var.minimal_index}"
image_51_name = "${local.image_base_name}-${var.custom_index}"
image_50_path = "${var.artifact_dir}/${local.image_50_name}"
image_51_path = "${var.artifact_dir}/${local.image_51_name}"
image_51_seed = "/tmp/${local.image_51_name}-seed.qcow2"
stage_50_output = "/tmp/packer-output-${var.minimal_index}"
stage_51_output = "/tmp/packer-output-${var.custom_index}"
}
source "qemu" "stage_50" {
vm_name = local.image_50_name
output_directory = local.stage_50_output
iso_url = var.iso_path
iso_checksum = "none"
accelerator = "kvm"
qemu_binary = "qemu-system-x86_64"
format = "qcow2"
disk_size = var.disk_size
disk_interface = "virtio"
net_device = "virtio-net"
cpus = var.cpus
memory = var.memory_mb
communicator = "ssh"
ssh_username = var.ssh_username
ssh_password = var.ssh_password
ssh_timeout = "60m"
ssh_handshake_attempts = 100
http_directory = "${var.project_dir}/http"
boot_wait = "10s"
# This boot sequence is installer-family-specific. Replace it when adapting
# the bundle to a distro that does not use Ubuntu/Subiquity autoinstall.
boot_command = [
"c<wait>",
"linux /casper/vmlinuz autoinstall ds=nocloud-net\\;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ ---<enter><wait>",
"initrd /casper/initrd<enter><wait>",
"boot<enter>"
]
headless = true
vnc_bind_address = "127.0.0.1"
shutdown_command = "echo '${var.ssh_password}' | sudo -S shutdown -P now"
}
source "qemu" "stage_51" {
vm_name = local.image_51_name
output_directory = local.stage_51_output
# build-images.sh creates this independent seed from immutable image -50.
iso_url = local.image_51_seed
iso_checksum = "none"
disk_image = true
accelerator = "kvm"
qemu_binary = "qemu-system-x86_64"
format = "qcow2"
disk_size = var.disk_size
disk_interface = "virtio"
net_device = "virtio-net"
cpus = var.cpus
memory = var.memory_mb
communicator = "ssh"
ssh_username = var.ssh_username
ssh_password = var.ssh_password
ssh_timeout = "30m"
ssh_handshake_attempts = 100
headless = true
vnc_bind_address = "127.0.0.1"
shutdown_command = "echo '${var.ssh_password}' | sudo -S shutdown -P now"
}
build {
name = "stage-50"
sources = ["source.qemu.stage_50"]
provisioner "shell" {
execute_command = "echo '${var.ssh_password}' | {{ .Vars }} sudo -S -E bash '{{ .Path }}'"
script = "${var.project_dir}/scripts/01-minimal-50.sh"
}
post-processor "shell-local" {
inline = [
"mkdir -p '${var.artifact_dir}'",
"rm -f '${local.image_50_path}'",
"mv '${local.stage_50_output}/${local.image_50_name}' '${local.image_50_path}'",
"qemu-img check '${local.image_50_path}'",
"qemu-img info '${local.image_50_path}'"
]
}
}
build {
name = "stage-51"
sources = ["source.qemu.stage_51"]
provisioner "shell" {
execute_command = "echo '${var.ssh_password}' | {{ .Vars }} sudo -S -E bash '{{ .Path }}'"
script = "${var.project_dir}/scripts/02-coin-configuration-51.sh"
}
provisioner "shell" {
execute_command = "echo '${var.ssh_password}' | {{ .Vars }} sudo -S -E bash '{{ .Path }}'"
script = "${var.project_dir}/scripts/03-gnome-configuration-51.sh"
}
provisioner "shell" {
execute_command = "echo '${var.ssh_password}' | {{ .Vars }} sudo -S -E bash '{{ .Path }}'"
script = "${var.project_dir}/scripts/04-no-overview-extension-51.sh"
}
provisioner "shell" {
execute_command = "echo '${var.ssh_password}' | {{ .Vars }} sudo -S -E bash '{{ .Path }}'"
script = "${var.project_dir}/scripts/05-check-configurations-51.sh"
}
post-processor "shell-local" {
inline = [
"mkdir -p '${var.artifact_dir}'",
"rm -f '${local.image_51_path}'",
"mv '${local.stage_51_output}/${local.image_51_name}' '${local.image_51_path}'",
"qemu-img check '${local.image_51_path}'",
"qemu-img info '${local.image_51_path}'"
]
}
}
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -euo pipefail
# This script is run on the minimal -50 image
# Other scripts will be run on the -50 -> -51 cloned image
readonly CI_USER="${CI_USER:-qt}"
export DEBIAN_FRONTEND=noninteractive
# Debian/Ubuntu implementation. Replace this script with the distro's package
# manager commands when reusing the generic wrapper and HCL elsewhere.
apt-get update
apt-get -y full-upgrade
apt-get install -y qemu-guest-agent
systemctl enable qemu-guest-agent
dpkg-query -W -f='${binary:Package}\t${Version}\n' \
> /var/tmp/qtci-minimal-image-packages.txt
apt-get -y autoremove
apt-get clean
rm -rf /var/lib/apt/lists/*
qemu-ga --version
@@ -0,0 +1,169 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -euo pipefail
# Initial Coin configuration for the customized image (-51).
readonly CI_USER="${CI_USER:-qt}"
readonly GRUB_GFXMODE_VALUE="${GRUB_GFXMODE_VALUE:-1280x800}"
export DEBIAN_FRONTEND=noninteractive
log() {
printf '\n[51-coin-configuration] %s\n' "$*"
}
require_root() {
if [[ "${EUID}" -ne 0 ]]; then
echo "ERROR: This script must run as root." >&2
exit 1
fi
}
require_user() {
if ! id "$CI_USER" >/dev/null 2>&1; then
echo "ERROR: Required CI user does not exist: $CI_USER" >&2
exit 1
fi
}
require_root
require_user
log "Installing required base packages"
apt-get update
apt-get install -y \
openssh-server \
ufw
# Remove GNOME welcome window at boot
log "Removing gnome-initial-setup"
apt-get purge -y gnome-initial-setup
# No sudo PW
log "Configuring passwordless sudo for ${CI_USER}"
cat > "/etc/sudoers.d/${CI_USER}" <<EOF
${CI_USER} ALL=(ALL) NOPASSWD: ALL
EOF
chmod 0440 "/etc/sudoers.d/${CI_USER}"
visudo --check
# UTC
log "Setting the system timezone to UTC"
timedatectl set-timezone UTC
# Enable SSH
log "Enabling SSH"
# Current Ubuntu releases may use socket activation. Enabling both units is
# harmless and keeps the image compatible with service- and socket-based SSH.
systemctl enable ssh.service
systemctl enable ssh.socket 2>/dev/null || true
# Enable QEMU GA
log "Enabling QEMU guest agent"
systemctl enable qemu-guest-agent
# Disable firewall
log "Disabling UFW"
ufw --force disable
systemctl disable ufw.service 2>/dev/null || true
# Set resolution
log "Configuring GRUB graphics mode: ${GRUB_GFXMODE_VALUE}"
if grep -qE '^GRUB_GFXMODE=' /etc/default/grub; then
sed -i "s/^GRUB_GFXMODE=.*/GRUB_GFXMODE=${GRUB_GFXMODE_VALUE}/" /etc/default/grub
else
printf '\nGRUB_GFXMODE=%s\n' "$GRUB_GFXMODE_VALUE" >> /etc/default/grub
fi
update-grub
# Disable auto upgrade/update
log "Disabling periodic APT update checks"
cat > /etc/apt/apt.conf.d/99-qtci-no-periodic-updates << EOF
APT::Periodic "0";
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";
EOF
sudo systemctl disable --now \
apt-daily.timer \
apt-daily-upgrade.timer
sudo systemctl mask \
apt-daily.service \
apt-daily-upgrade.service \
apt-daily.timer \
apt-daily-upgrade.timer
log "Disabling release-upgrade notifications"
if [[ -f /etc/update-manager/release-upgrades ]]; then
if grep -qE '^Prompt=' /etc/update-manager/release-upgrades; then
sed -i 's/^Prompt=.*/Prompt=never/' \
/etc/update-manager/release-upgrades
else
printf '\nPrompt=never\n' >> /etc/update-manager/release-upgrades
fi
fi
# GDM Auto login
log "Configuring GDM for ${CI_USER}"
if [[ -d /etc/gdm3 ]]; then
gdm_config="/etc/gdm3/custom.conf"
touch "$gdm_config"
if ! grep -qE '^\[daemon\]' "$gdm_config"; then
printf '\n[daemon]\n' >> "$gdm_config"
fi
sed -i \
'/^AutomaticLoginEnable=/d; /^AutomaticLogin=/d; /^InitialSetupEnable=/d' \
"$gdm_config"
sed -i \
"/^\[daemon\]/a InitialSetupEnable=False\nAutomaticLogin=${CI_USER}\nAutomaticLoginEnable=True" \
"$gdm_config"
else
log "GDM is not installed; skipping GDM configuration"
fi
# Run Coin-setup
log "Downloading and running coin-setup"
coin_setup_url="https://ci-files01-hki.ci.qt.io/input/linux/coin-setup-linux-amd64.zip"
coin_setup_zip="/tmp/coin-setup-linux-amd64.zip"
coin_setup_dir="/tmp/coin-setup-linux-amd64"
coin_setup_binary="${coin_setup_dir}/coin-setup"
rm -rf "$coin_setup_dir"
rm -f "$coin_setup_zip"
mkdir -p "$coin_setup_dir"
wget --quiet --output-document="$coin_setup_zip" "$coin_setup_url"
unzip -q "$coin_setup_zip" -d "$coin_setup_dir"
if [[ ! -f "$coin_setup_binary" ]]; then
echo "ERROR: coin-setup binary was not found at ${coin_setup_binary}" >&2
echo "Archive contents:" >&2
unzip -l "$coin_setup_zip" >&2
exit 1
fi
chmod 0755 "$coin_setup_binary"
sudo -H -u "$CI_USER" "$coin_setup_binary"
rm -rf "$coin_setup_dir"
rm -f "$coin_setup_zip"
log "coin-setup completed successfully"
# Clean apt
log "Cleaning APT metadata"
apt-get clean
rm -rf /var/lib/apt/lists/*
log "Configuration completed successfully"
echo "A reboot is required for all GRUB and login-manager changes to take effect."
@@ -0,0 +1,150 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -euo pipefail
readonly CI_USER="${CI_USER:-qt}"
log() {
printf '\n[gnome-configuration] %s\n' "$*"
}
if [[ "$EUID" -ne 0 ]]; then
echo "ERROR: This script must run as root." >&2
exit 1
fi
if ! id "$CI_USER" >/dev/null 2>&1; then
echo "ERROR: User does not exist: $CI_USER" >&2
exit 1
fi
ci_home="$(getent passwd "$CI_USER" | cut -d: -f6)"
if [[ -z "$ci_home" || ! -d "$ci_home" ]]; then
echo "ERROR: Cannot determine home directory for $CI_USER" >&2
exit 1
fi
log "Applying GNOME preferences for ${CI_USER}"
# GNOME preferences are stored per user in the dconf database. Packer runs this
# provisioner as root over SSH, without a graphical login or user D-Bus session.
# Run gsettings as the CI user inside a temporary D-Bus session so the values
# are written to the CI user's dconf database rather than root's configuration.
sudo -H -u "$CI_USER" HOME="$ci_home" dbus-run-session -- bash <<'GNOME_SETTINGS'
set -euo pipefail
schema_exists() {
local schema="$1"
gsettings list-schemas |
grep -Fx "$schema" >/dev/null
}
key_exists() {
local schema="$1"
local key="$2"
gsettings list-keys "$schema" |
grep -Fx "$key" >/dev/null
}
set_setting() {
local schema="$1"
local key="$2"
local value="$3"
if ! schema_exists "$schema"; then
echo "ERROR: Missing GSettings schema: $schema" >&2
exit 1
fi
if ! key_exists "$schema" "$key"; then
echo "ERROR: Missing GSettings key: $schema $key" >&2
exit 1
fi
echo "Setting: $schema $key = $value"
gsettings set "$schema" "$key" "$value"
actual="$(gsettings get "$schema" "$key")"
echo "Result: $schema $key = $actual"
}
set_setting \
org.gnome.desktop.notifications \
show-banners \
false
set_setting \
org.gnome.desktop.notifications \
show-in-lock-screen \
false
set_setting \
org.gnome.desktop.screensaver \
lock-enabled \
false
if key_exists \
org.gnome.desktop.screensaver \
ubuntu-lock-on-suspend; then
set_setting \
org.gnome.desktop.screensaver \
ubuntu-lock-on-suspend \
false
fi
set_setting \
org.gnome.desktop.privacy \
remember-recent-files \
false
rm -f "${XDG_DATA_HOME:-$HOME/.local/share}/recently-used.xbel"
set_setting \
org.gnome.desktop.session \
idle-delay \
'uint32 0'
set_setting \
org.gnome.settings-daemon.plugins.power \
sleep-inactive-ac-type \
"'nothing'"
set_setting \
org.gnome.settings-daemon.plugins.power \
sleep-inactive-battery-type \
"'nothing'"
set_setting \
org.gnome.settings-daemon.plugins.power \
sleep-inactive-ac-timeout \
0
set_setting \
org.gnome.settings-daemon.plugins.power \
sleep-inactive-battery-timeout \
0
set_setting \
org.gnome.shell.extensions.dash-to-dock \
dock-fixed \
true
set_setting \
org.gnome.shell.extensions.dash-to-dock \
autohide \
false
set_setting \
org.gnome.shell.extensions.dash-to-dock \
intellihide \
false
GNOME_SETTINGS
log "GNOME preferences applied successfully"
@@ -0,0 +1,46 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -euo pipefail
# Install no-overview gnome extension to prevent desktop overview at boot (QTBUG-132070)
readonly CI_USER="${CI_USER:-qt}"
readonly EXTENSION_UUID="no-overview@fthx"
readonly EXTENSION_URL="https://ci-files01-hki.ci.qt.io/input/linux/no-overviewfthx.v23.shell-extension.zip" # GNOME <50
readonly EXTENSION_ZIP="/tmp/${EXTENSION_UUID}.zip"
readonly EXTENSION_DIR="/usr/share/gnome-shell/extensions/${EXTENSION_UUID}"
if [[ "$EUID" -ne 0 ]]; then
echo "ERROR: This script must run as root." >&2
exit 1
fi
if ! id "$CI_USER" >/dev/null 2>&1; then
echo "ERROR: User does not exist: $CI_USER" >&2
exit 1
fi
ci_home="$(getent passwd "$CI_USER" | cut -d: -f6)"
echo "Installing No Overview GNOME extension"
wget --quiet --output-document="$EXTENSION_ZIP" "$EXTENSION_URL"
install -d -o root -g root -m 0755 "$EXTENSION_DIR"
unzip -q "$EXTENSION_ZIP" -d "$EXTENSION_DIR"
chown -R root:root "$EXTENSION_DIR"
find "$EXTENSION_DIR" -type d -exec chmod 0755 {} +
find "$EXTENSION_DIR" -type f -exec chmod 0644 {} +
# gnome-extensions writes the enabled state to the CI user's dconf database.
# Packer runs over SSH without a user session, so provide a temporary D-Bus.
sudo -H -u "$CI_USER" HOME="$ci_home" dbus-run-session -- gnome-extensions enable "$EXTENSION_UUID"
rm -f "$EXTENSION_ZIP"
echo "Installed and enabled: $EXTENSION_UUID"
echo "After a reboot, check with: gnome-extensions list --enabled"
@@ -0,0 +1,138 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -euo pipefail
failures=0
pass() {
printf 'PASS: %s\n' "$1"
}
fail() {
printf 'FAIL: %s\n' "$1"
failures=$((failures + 1))
}
echo "=== Image -51 verification ==="
# No PW prompt
if sudo -n true 2>/dev/null; then
pass "passwordless sudo"
else
fail "passwordless sudo"
fi
if sudo visudo --check >/dev/null 2>&1; then
pass "sudoers syntax"
else
fail "sudoers syntax"
fi
# Timezone
timezone="$(timedatectl show --property=Timezone --value)"
if [[ "$timezone" == "UTC" || "$timezone" == "Etc/UTC" ]]; then
pass "timezone is UTC"
else
fail "timezone is '$timezone', expected UTC"
fi
# SSH
if dpkg-query -W -f='${db:Status-Abbrev}' openssh-server 2>/dev/null | grep -q '^ii'; then
pass "openssh-server installed"
else
fail "openssh-server installed"
fi
if systemctl is-active --quiet ssh.socket || systemctl is-active --quiet ssh.service; then
pass "SSH listener active"
else
fail "SSH listener active"
fi
if sudo ss -ltn |
grep -qE 'LISTEN.+:22[[:space:]]'; then
pass "TCP port 22 listening"
else
fail "TCP port 22 listening"
fi
# QEMU GA
if dpkg-query -W -f='${db:Status-Abbrev}' qemu-guest-agent 2>/dev/null | grep -q '^ii'; then
pass "qemu-guest-agent installed"
else
fail "qemu-guest-agent installed"
fi
if systemctl is-enabled --quiet qemu-guest-agent; then
pass "qemu-guest-agent enabled"
else
fail "qemu-guest-agent enabled"
fi
# UFW
if sudo ufw status | grep -Fxq 'Status: inactive'; then
pass "UFW inactive"
else
fail "UFW inactive"
fi
# Resolution
if grep -Fxq 'GRUB_GFXMODE=1280x800' /etc/default/grub; then
pass "GRUB graphics mode"
else
fail "GRUB graphics mode"
fi
# Auto update/upgrade disabled
if apt-config dump | grep -i 'APT::Periodic \"0\";'; then
pass "APT periodic processing disabled"
else
apt-config dump | grep -i APT::Periodic
fail "APT periodic processing enabled"
fi
if apt-config dump | grep -i 'APT::Periodic::Unattended-Upgrade \"0\";'; then
pass "APT unattended upgrades disabled"
else
apt-config dump | grep -i APT::Periodic
fail "APT unattended upgrades enabled"
fi
if grep -Fxq 'Prompt=never' /etc/update-manager/release-upgrades; then
pass "release-upgrade notifications disabled"
else
fail "release-upgrade notifications enabled"
fi
# Auto login
if sudo grep -Fxq 'AutomaticLoginEnable=True' /etc/gdm3/custom.conf && sudo grep -Fxq 'AutomaticLogin=qt' /etc/gdm3/custom.conf; then
pass "GDM automatic login configured"
else
fail "GDM automatic login configured"
fi
# Broken packages
if [[ -z "$(sudo dpkg --audit)" ]]; then
pass "dpkg audit"
else
fail "dpkg audit"
fi
# GNOME initial setup executable removed
if [[ ! -x /usr/libexec/gnome-initial-setup ]]; then
pass "GNOME initial setup executable is absent"
else
fail "/usr/libexec/gnome-initial-setup exists. There might be a welcome window popup"
fi
# Summary
echo
if (( failures == 0 )); then
echo "All conf checks passed."
else
echo "${failures} check(s) failed."
# exit 1
fi
@@ -11,8 +11,12 @@ PROVISIONING_DIR="$(dirname "$0")/../.."
# shellcheck source=../unix/common.sourced.sh
source "$PROVISIONING_DIR/common/unix/common.sourced.sh"
if [ -f /usr/lib/sysctl.d/55-ptrace.conf ]; then
f="/usr/lib/sysctl.d/55-ptrace.conf" # New location in Ubuntu 26.04
else
f="/etc/sysctl.d/10-ptrace.conf"
fi
f="/etc/sysctl.d/10-ptrace.conf"
if [ -f $f ]
then
echo "Modifying $f ..."
+6 -1
View File
@@ -77,7 +77,12 @@ targetFolder="/opt/itl_generic_skylake_VSB/"
InstallFromCompressedFileFromURL "$PrimaryUrl" "$AltUrl" "$sha1" "$targetFolder" ""
# Enable ipv4 routing from vxWorks to Qt DNS
sudo sed -i s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g /etc/sysctl.conf
if [ -f /etc/sysctl.conf ]; then
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
else
# There's no /etc/sysctl.conf in Ubuntu 26.04, use sysctl.d instead
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-vxworks.conf
fi
sudo iptables -I FORWARD 1 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
@@ -38,10 +38,10 @@ zip="/tmp/libclang.7z"
destination="/usr/local/libclang-dynlibs-$version"
DownloadURL "$url_cached" "$url" "$sha1" "$zip"
if command -v 7zr &> /dev/null; then
sudo 7zr x $zip -o/usr/local/
else
if command -v 7z &> /dev/null; then
sudo 7z x $zswitch $zip -o/usr/local/
else
sudo 7zr x $zip -o/usr/local/
fi
sudo mv /usr/local/libclang "$destination"
rm -rf $zip
+3 -3
View File
@@ -59,10 +59,10 @@ zip="/tmp/libclang.7z"
destination="/usr/local/libclang-$version"
DownloadURL $url_cached $url $sha1 $zip
if command -v 7zr &> /dev/null; then
sudo 7zr x $zip -o/usr/local/
else
if command -v 7z &> /dev/null; then
sudo 7z x $zswitch $zip -o/usr/local/
else
sudo 7zr x $zip -o/usr/local/
fi
sudo mv /usr/local/libclang "$destination"
rm -rf $zip
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# Disalbe updates
echo "Disabling auto-upgrades"
sudo sed -i 's/"1"/"0"/g' /etc/apt/apt.conf.d/20auto-upgrades
@@ -0,0 +1,6 @@
#!/bin/sh
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
echo "ethtool -K \${DEVICE_IFACE} tso off" | sudo tee -a /etc/NetworkManager/dispatcher.d/pre-up.d/net_tso_off
sudo chmod +x /etc/NetworkManager/dispatcher.d/pre-up.d/net_tso_off
@@ -0,0 +1,3 @@
#!/bin/sh
"$(dirname "$0")"/../common/unix/telegraf_install.sh
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/set_ulimit.sh"
@@ -0,0 +1,51 @@
#!/usr/bin/env bash
# Copyright (C) 2017 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# This script modifies system settings for automated use
set -ex
BASEDIR=$(dirname "$0")
# shellcheck source=../common/unix/check_and_set_proxy.sh
source "${BASH_SOURCE%/*}/../common/unix/check_and_set_proxy.sh"
# shellcheck source=../common/linux/distro_version_check.sh
source "$BASEDIR/../common/linux/distro_version_check.sh"
# Get distro version to later check if version has changed at the end of the provisioning
record_os_version
NTS_IP=10.212.2.216
echo "Set timezone to UTC."
sudo timedatectl set-timezone Etc/UTC
"$BASEDIR/../common/linux/configure-gnome-shell.sh"
echo "Disable windows key from showing the GNOME Shell Activities overlay"
gsettings set org.gnome.mutter overlay-key ""
echo "Set grub timeout to 0"
sudo sed -i 's|GRUB_TIMEOUT=10|GRUB_TIMEOUT=0|g' /etc/default/grub
sudo update-grub
# https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1624320
# Checking if Ubuntu 20.04 works without this
#echo "Setting up workaround for Ubuntu systemd resolve bug"
#sudo rm -f /etc/resolv.conf
#sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
# remove hostname to get unique based on IP address
sudo rm /etc/hostname
echo "Set Network Test Server address to $NTS_IP in /etc/hosts"
echo "$NTS_IP qt-test-server qt-test-server.qt-test-net" | sudo tee -a /etc/hosts
echo 'LC_ALL=en_US.UTF8' | sudo tee /etc/default/locale
if [ "$http_proxy" != "" ]; then
echo "Acquire::http::Proxy \"$proxy\";" | sudo tee -a /etc/apt/apt.conf
fi
# This script diverts qtlogging.ini file so we don't get debugging related auto-test failures.
sudo dpkg-divert --divert /etc/xdg/QtProject/qtlogging.ini.foo --rename /etc/xdg/QtProject/qtlogging.ini
@@ -0,0 +1,302 @@
#!/usr/bin/env bash
# Copyright (C) 2025 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# Install required packages with APT
# shellcheck source=../common/linux/apt_wait_loop.sh
source "${BASH_SOURCE%/*}/../common/linux/apt_wait_loop.sh"
echo "Disabling auto update"
sudo sed -i 's/APT::Periodic::Update-Package-Lists "1";/APT::Periodic::Update-Package-Lists "0";/' /etc/apt/apt.conf.d/10periodic
for service in apt-daily.timer apt-daily-upgrade.timer apt-daily.service apt-daily-upgrade.service; do
sudo systemctl stop $service
sudo systemctl disable $service
done
function set_internal_repo {
# Stop fetching the dep-11 metadata, since our mirrors do not handle them well
sudo mv /etc/apt/apt.conf.d/50appstream{,.disabled}
sudo tee "/etc/apt/sources.list.d/ubuntu.list" > /dev/null <<-EOC
deb [arch=amd64 trusted=yes] http://repo-clones-apt.ci.qt.io:8080 resolute-amd64 main restricted universe multiverse
deb [arch=amd64 trusted=yes] http://repo-clones-apt.ci.qt.io:8080 resolute-updates-amd64 main restricted universe multiverse
deb [arch=amd64 trusted=yes] http://repo-clones-apt.ci.qt.io:8080 resolute-backports-amd64 main restricted universe
deb [arch=amd64 trusted=yes] http://repo-clones-apt.ci.qt.io:8080 resolute-security-amd64 main restricted universe multiverse
deb [arch=i386 trusted=yes] http://repo-clones-apt.ci.qt.io:8080 resolute-i386 main restricted universe multiverse
deb [arch=i386 trusted=yes] http://repo-clones-apt.ci.qt.io:8080 resolute-updates-i386 main restricted universe multiverse
EOC
}
#(ping -c 3 repo-clones-apt.ci.qt.io && set_internal_repo) || echo "Internal package repository not found. Using public repositories."
# Make sure needed ca-certificates are available
sudo apt-get install --reinstall ca-certificates
# Git is not needed by builds themselves, but is nice to have
# immediately as one starts debugging
installPackages+=(git)
# 7zip is a needed decompressing tool
installPackages+=(p7zip-full)
# To be able to mount yocto-cache during builds
installPackages+=(nfs-common)
# libssl-dev provides headers for OpenSSL
installPackages+=(libssl-dev)
# Needed for qioring
installPackages+=(liburing-dev)
# Needed libraries for X11 support accordingly to https://wiki.qt.io/Building_Qt_5_from_Git
installPackages+=("^libxcb.*")
installPackages+=(libxkbcommon-dev)
installPackages+=(libxkbcommon-x11-dev)
installPackages+=(libx11-xcb-dev)
installPackages+=(libglu1-mesa-dev)
installPackages+=(libxrender-dev)
installPackages+=(libxi-dev)
# Enable linking to system dbus
installPackages+=(libdbus-1-dev)
# Needed libraries for WebEngine
installPackages+=(udev)
installPackages+=(libudev-dev)
installPackages+=(libdrm-dev)
installPackages+=(libegl1-mesa-dev)
installPackages+=(libfontconfig1-dev)
installPackages+=(libgbm-dev)
installPackages+=(liblcms2-dev)
installPackages+=(libpci-dev)
installPackages+=(libre2-dev)
installPackages+=(libsnappy-dev)
installPackages+=(libva-dev)
installPackages+=(libvpx-dev)
installPackages+=(libxkbfile-dev)
installPackages+=(libxshmfence-dev)
installPackages+=(libxss-dev)
installPackages+=(rustc)
installPackages+=(bindgen)
installPackages+=(clang)
installPackages+=(libclang-dev)
installPackages+=(python3-html5lib)
# Common event loop handling
installPackages+=(libglib2.0-dev)
# MySQL support
installPackages+=(libmysqlclient-dev)
# PostgreSQL support
installPackages+=(libpq-dev)
# SQLite support
installPackages+=(libsqlite3-dev)
# ODBC support
installPackages+=(unixodbc-dev)
# Support for FreeType font engine
installPackages+=(libfreetype6-dev)
# Enable the usage of system jpeg libraries
installPackages+=(libjpeg-dev)
# Enable support for printer driver
installPackages+=(libcups2-dev)
# Install libraries needed for QtMultimedia to be able to support all plugins
installPackages+=(libasound2-dev)
installPackages+=(libgstreamer1.0-dev)
installPackages+=(libgstreamer-plugins-extra1.0-dev)
installPackages+=(libgstreamer-plugins-base1.0-dev)
installPackages+=(libgstreamer-plugins-bad1.0-dev)
installPackages+=(libgstreamer-gl1.0-0)
installPackages+=(gstreamer1.0-libav)
installPackages+=(gstreamer1.0-plugins-base)
installPackages+=(gstreamer1.0-plugins-good)
installPackages+=(gstreamer1.0-plugins-bad)
installPackages+=(gstreamer1.0-plugins-rtp)
installPackages+=(gstreamer1.0-plugins-ugly)
installPackages+=(gir1.2-gst-plugins-base-1.0)
installPackages+=(gir1.2-gst-plugins-bad-1.0)
installPackages+=(libpipewire-0.3-dev)
installPackages+=(libspa-0.2-dev)
installPackages+=(yasm)
installPackages+=(libva-dev)
# for QtMultimedia streaming tests
installPackages+=(vlc-bin)
installPackages+=(vlc-plugin-base)
# Required FFmpeg packages
required_ffmpeg_packages=()
while IFS= read -r line; do required_ffmpeg_packages+=("$line"); done < "${BASH_SOURCE%/*}/../common/linux/ffmpeg_required_ubuntu_packages.txt"
installPackages+=("${required_ffmpeg_packages[@]}")
# for tst_qfloat16format, see also QTQAINFRA-6390
installPackages+=(locales-all)
# Support for cross-building to x86 (needed by WebEngine boot2qt builds)
installPackages+=(g++-multilib)
# python3 development package
installPackages+=(python3-dev)
installPackages+=(python3-pip)
installPackages+=(python3-venv)
installPackages+=(virtualenv)
installPackages+=(python3-wheel)
installPackages+=(python-is-python3)
# TODO: Ubuntu 24.04 Removal - not available
# python2 development package
#installPackages+=(python2-dev)
# Automates interactive applications (Needed by RTA to automate configure testing)
installPackages+=(expect)
installPackages+=(mesa-common-dev)
# TODO: Ubuntu 24.04 Replacement
#installPackages+=(libgl1-mesa-glx)
installPackages+=(libglx-mesa0)
installPackages+=(libgl1-mesa-dev)
installPackages+=(libegl1-mesa-dev)
installPackages+=(libegl1)
installPackages+=(libegl-mesa0)
installPackages+=(libegl-dev)
installPackages+=(libglvnd-dev)
installPackages+=(libgles2-mesa-dev)
installPackages+=(curl)
installPackages+=(libcurl4-openssl-dev)
installPackages+=(libicu-dev)
installPackages+=(zlib1g-dev)
installPackages+=(zlib1g)
# 32-bit zlib is needed for for qemu-armv7 toolchain + WebEngine
installPackages+=(lib32z1-dev)
#Java 21 for Android
installPackages+=(openjdk-21-jdk)
installPackages+=(libgtk-3-dev)
installPackages+=(ninja-build)
installPackages+=(libssl-dev)
installPackages+=(libxcursor-dev)
installPackages+=(libxcomposite-dev)
installPackages+=(libxdamage-dev)
installPackages+=(libxrandr-dev)
installPackages+=(libfontconfig1-dev)
installPackages+=(libsrtp2-dev)
installPackages+=(libwebp-dev)
installPackages+=(libjsoncpp-dev)
installPackages+=(libopus-dev)
installPackages+=(libminizip-dev)
installPackages+=(libavutil-dev)
installPackages+=(libavformat-dev)
installPackages+=(libavcodec-dev)
installPackages+=(libevent-dev)
installPackages+=(bison)
installPackages+=(flex)
installPackages+=(gperf)
installPackages+=(libasound2-dev)
installPackages+=(libpulse-dev)
installPackages+=(libxtst-dev)
installPackages+=(libnspr4-dev)
installPackages+=(libnss3-dev)
installPackages+=(libnss3)
installPackages+=(libopenal-dev)
installPackages+=(libbluetooth-dev)
#VirtualBox for RTA
installPackages+=(virtualbox)
installPackages+=(dkms)
# Needed for qtspeech
installPackages+=(libspeechd-dev)
installPackages+=(flite1-dev)
#Pypdf for PDF reading in RTA tests
installPackages+=(python3-pypdf)
# Needed for b2qt
installPackages+=(git-lfs)
installPackages+=(chrpath)
installPackages+=(gawk)
installPackages+=(texinfo)
# Needed for Poppler test in QtWebEngine
installPackages+=(libpoppler-cpp-dev)
# Needed for QtCore
installPackages+=(libdouble-conversion-dev)
installPackages+=(libpcre2-dev)
# Needed for testlib selftests
installPackages+=(valgrind)
# Needed for qtgampepad
installPackages+=(libsdl2-2.0)
installPackages+=(libsdl2-dev)
# Needed for qtwebkit
installPackages+=(ruby)
installPackages+=(libxslt1-dev)
installPackages+=(libxml2-dev)
installPackages+=(libhyphen-dev)
# For remote access
installPackages+=(ssh)
# For bitbake
installPackages+=(diffstat)
installPackages+=(binfmt-support)
installPackages+=(zstd)
installPackages+=(libzstd-dev)
installPackages+=(lz4)
# Vulkan is needed for examples
installPackages+=(libvulkan-dev)
# Needed for qtdltlogging
installPackages+=(libdlt-dev)
# For integrity
installPackages+=(libc6:i386)
# TODO: Ubuntu 24.04 Removal - not available
#installPackages+=(libncurses5:i386)
installPackages+=(libstdc++6:i386)
installPackages+=(libx11-6:i386)
installPackages+=(lib32z1)
installPackages+=(linux-libc-dev:i386)
installPackages+=(libxcursor1:i386)
installPackages+=(libc6-dev-i386)
sudo dpkg --add-architecture i386
# For QNX
installPackages+=(nfs-kernel-server)
installPackages+=(net-tools)
installPackages+=(bridge-utils)
# For Debian packaging
installPackages+=(sbuild)
installPackages+=(ubuntu-dev-tools)
# cifs-utils, for mounting smb drive
installPackages+=(keyutils)
installPackages+=(cifs-utils)
# VxWorks QEMU network setup (tunctl)
installPackages+=(uml-utilities)
# For swiftly
installPackages+=(gnupg2)
installPackages+=(pkg-config)
# For Qt bridges swift
installPackages+=(swiftlang)
# Keep zoneinfo up-to-date (COIN-1282)
installPackages+=(tzdata)
# Autotools needed by vcpkg ports (gperf, icu, fontconfig)
installPackages+=(autoconf autoconf-archive automake libtool)
# For RTA: QTQAINFRA-7368
installPackages+=(xclip)
# Extra utils to include newgrp
installPackages+=(util-linux-extra)
# Install gold linker for faster developer builds
installPackages+=(binutils-gold)
echo "Running update for apt"
waitLoop
sudo apt-get update
echo "Installing packages"
waitLoop
sudo DEBIAN_FRONTEND=noninteractive apt-get -q -y -o DPkg::Lock::Timeout=300 install "${installPackages[@]}"
# Configure pip
pip config --user set global.index https://ci-files01-hki.ci.qt.io/input/python_module_cache
pip config --user set global.extra-index-url https://pypi.org/simple/
# Ubuntu 24.04 comes with a newer pip that disallows installing into the system site-packages,
# so we explicitly ask it to allow it.
pip install --user -r "${BASH_SOURCE%/*}/../common/shared/requirements.txt" --break-system-packages
source "${BASH_SOURCE%/*}/../common/unix/SetEnvVar.sh"
# SetEnvVar "PATH" "/usr/lib/nodejs-mozilla/bin:\$PATH"
# Provisioning during installation says:
# 'The script sbom2doc is installed in '/home/qt/.local/bin' which is not on PATH.'
# hence the explicit assignment to SBOM_PYTHON_APPS_PATH.
SetEnvVar "SBOM_PYTHON_APPS_PATH" "/home/qt/.local/bin"
# Set SBOM_PYTHON_INTERP_PATH to Python3 instance which was used to install SBOM packages from requirements
SetEnvVar "SBOM_PYTHON_INTERP_PATH" "/usr/bin/python3"
gccVersion="$(gcc --version |grep -Eo '[0-9]+\.[0-9]+(\.[0-9]+)?' |head -n 1)"
echo "GCC = $gccVersion" >> versions.txt
glibcVersion="$(ldd --version |grep -Eo '[0-9]+\.[0-9]+(\.[0-9]+)?' |head -n 1)"
echo "glibc = $glibcVersion" >> versions.txt
OpenSSLVersion="$(openssl version |cut -b 9-14)"
echo "System's OpenSSL = $OpenSSLVersion" >> ~/versions.txt
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/linux/disable-notifications.sh
source "${BASH_SOURCE%/*}/../common/linux/disable-notifications.sh"
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/linux/disable-ntp_linux.sh
source "${BASH_SOURCE%/*}/../common/linux/disable-ntp_linux.sh"
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/linux/remove-apport.sh
source "${BASH_SOURCE%/*}/../common/linux/remove-apport.sh"
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/linux/remove-update_notifier.sh
source "${BASH_SOURCE%/*}/../common/linux/remove-update_notifier.sh"
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/linux/fix-bitbake-apparmor.sh
source "${BASH_SOURCE%/*}/../common/linux/fix-bitbake-apparmor.sh"
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
sudo sed -i -e '/nfs4/s/permissions/skip/' /etc/xattr.conf
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/linux/fix-bwrap-apparmor.sh
source "${BASH_SOURCE%/*}/../common/linux/fix-bwrap-apparmor.sh"
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/linux/install-nodejs.sh
source "${BASH_SOURCE%/*}/../common/linux/install-nodejs.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/limit-avahi-interfaces.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/mount-vcpkg-cache-drive.sh
source "${BASH_SOURCE%/*}/../common/linux/mount-vcpkg-cache-drive.sh"
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Copyright (C) 2021 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/SetEnvVar.sh
source "${BASH_SOURCE%/*}/../common/unix/SetEnvVar.sh"
# First test using QFont fails if fonts-noto-cjk is installed. This happens because
# running fontcache for that font takes > 5 mins when run on QEMU. Running fc-cache
# doesn't help since host version creates cache for a wrong architecture and running
# armv7 fc-cache segfaults on QEMU.
sudo DEBIAN_FRONTEND=noninteractive apt-get -y remove fonts-noto-cjk
# Disable QtWayland window decorations, as they cause flakiness when used inside qemu (QTBUG-66173)
qemu_env="QT_WAYLAND_DISABLE_WINDOWDECORATION=1"
SetEnvVar "QEMU_SET_ENV" "\"${qemu_env}\""
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
#Copyright (C) 2026 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/unix/libclang-dyn.sh" "-snld20"
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
#Copyright (C) 2026 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/unix/libclang.sh" "-snld20"
@@ -0,0 +1,124 @@
#!/usr/bin/env bash
# Copyright (C) 2025 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# This script installs the Yocto toolchain
set -ex
# shellcheck source=../common/unix/DownloadURL.sh
source "${BASH_SOURCE%/*}/../common/unix/DownloadURL.sh"
# shellcheck source=../common/unix/SetEnvVar.sh
source "${BASH_SOURCE%/*}/../common/unix/SetEnvVar.sh"
primaryBaseUrlPath="http://ci-files01-hki.ci.qt.io/input/boot2qt/scarthgap"
altBaseUrlPath="http://download.qt.io/development_releases/prebuilt/boot2qt/scarthgap"
echo "Installing Yocto toolchain for 32-bit b2qt ARMV7..."
versionARM="5.0"
package="b2qt-x86_64-meta-toolchain-b2qt-ci-sdk-qemuarm-126db6b9.sh"
PrimaryUrl="$primaryBaseUrlPath/$package"
AltUrl="$altBaseUrlPath/$package"
SHA1="4ee043f851440c231a1faba3003c251cbdee9947"
yoctoInstaller="/tmp/yocto-toolchain-ARMv7.sh"
yoctoLocationARMv7="/opt/b2qt/$versionARM"
sysrootARMv7="cortexa15t2hf-neon-poky-linux-gnueabi"
crosscompileARMv7="sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-"
envSetupARMv7="environment-setup-$sysrootARMv7"
toolchainFileARMv7="sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake"
DownloadURL "$PrimaryUrl" "$AltUrl" "$SHA1" "$yoctoInstaller"
chmod +x "$yoctoInstaller"
/bin/bash "$yoctoInstaller" -y -d "$yoctoLocationARMv7"
rm -rf "$yoctoInstaller"
echo "Installing Yocto toolchain for 64-bit b2qt ARM64..."
versionARM64="5.0"
package="b2qt-x86_64-meta-toolchain-b2qt-ci-sdk-qemuarm64-126db6b9.sh"
PrimaryUrl="$primaryBaseUrlPath/$package"
AltUrl="$altBaseUrlPath/$package"
SHA1="c7f8838e724f3802f68a9c9154eec8690748e8b0"
yoctoInstaller="/tmp/yocto-toolchain-ARM64.sh"
yoctoLocationARM64="/opt/b2qt/$versionARM64"
sysrootARM64="cortexa57-poky-linux"
crosscompileARM64="sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-"
envSetupARM64="environment-setup-$sysrootARM64"
toolchainFileARM64="sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake"
DownloadURL "$PrimaryUrl" "$AltUrl" "$SHA1" "$yoctoInstaller"
chmod +x "$yoctoInstaller"
/bin/bash "$yoctoInstaller" -y -d "$yoctoLocationARM64"
rm -rf "$yoctoInstaller"
echo "Installing Yocto toolchain for 64-bit b2qt MIPS64..."
versionMIPS64="5.0"
package="b2qt-x86_64-meta-toolchain-b2qt-ci-sdk-qemumips64-126db6b9.sh"
PrimaryUrl="$primaryBaseUrlPath/$package"
AltUrl="$altBaseUrlPath/$package"
SHA1="aa95da9a61910baa7f1700ce91fd9ee3cea027be"
yoctoInstaller="/tmp/yocto-toolchain-mips64.sh"
yoctoLocationMIPS64="/opt/b2qt/$versionMIPS64"
sysrootMIPS64="mips64r2-poky-linux"
crosscompileMIPS64="sysroots/x86_64-pokysdk-linux/usr/bin/mips64-poky-linux/mips64-poky-linux-"
envSetupMIPS64="environment-setup-$sysrootMIPS64"
toolchainFileMIPS64="sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake"
DownloadURL "$PrimaryUrl" "$AltUrl" "$SHA1" "$yoctoInstaller"
chmod +x "$yoctoInstaller"
/bin/bash "$yoctoInstaller" -y -d "$yoctoLocationMIPS64"
rm -rf "$yoctoInstaller"
if [ -e "$yoctoLocationARMv7/sysroots/$sysrootARMv7" ] && [ -e "$yoctoLocationARMv7/${crosscompileARMv7}g++" ] && \
[ -e "$yoctoLocationARMv7/$envSetupARMv7" ] && [ -e "$yoctoLocationARMv7/$toolchainFileARMv7" ] && \
[ -e "$yoctoLocationARM64/sysroots/$sysrootARM64" ] && [ -e "$yoctoLocationARM64/${crosscompileARM64}g++" ] && \
[ -e "$yoctoLocationARM64/$envSetupARM64" ] && [ -e "$yoctoLocationARM64/$toolchainFileARM64" ] && \
[ -e "$yoctoLocationMIPS64/sysroots/$sysrootMIPS64" ] && [ -e "$yoctoLocationMIPS64/${crosscompileMIPS64}g++" ] && \
[ -e "$yoctoLocationMIPS64/$envSetupMIPS64" ] && [ -e "$yoctoLocationMIPS64/$toolchainFileMIPS64" ]; then
SetEnvVar "QEMUARMV7_TOOLCHAIN_SYSROOT" "$yoctoLocationARMv7/sysroots/$sysrootARMv7"
SetEnvVar "QEMUARMV7_TOOLCHAIN_CROSS_COMPILE" "$yoctoLocationARMv7/$crosscompileARMv7"
SetEnvVar "QEMUARMV7_TOOLCHAIN_ENVSETUP" "$yoctoLocationARMv7/$envSetupARMv7"
SetEnvVar "QEMUARMV7_TOOLCHAIN_FILE" "$yoctoLocationARMv7/$toolchainFileARMv7"
SetEnvVar "QEMUARM64_TOOLCHAIN_SYSROOT" "$yoctoLocationARM64/sysroots/$sysrootARM64"
SetEnvVar "QEMUARM64_TOOLCHAIN_CROSS_COMPILE" "$yoctoLocationARM64/$crosscompileARM64"
SetEnvVar "QEMUARM64_TOOLCHAIN_ENVSETUP" "$yoctoLocationARM64/$envSetupARM64"
SetEnvVar "QEMUARM64_TOOLCHAIN_FILE" "$yoctoLocationARM64/$toolchainFileARM64"
SetEnvVar "QEMUMIPS64_TOOLCHAIN_SYSROOT" "$yoctoLocationMIPS64/sysroots/$sysrootMIPS64"
SetEnvVar "QEMUMIPS64_TOOLCHAIN_CROSS_COMPILE" "$yoctoLocationMIPS64/$crosscompileMIPS64"
SetEnvVar "QEMUMIPS64_TOOLCHAIN_ENVSETUP" "$yoctoLocationMIPS64/$envSetupMIPS64"
SetEnvVar "QEMUMIPS64_TOOLCHAIN_FILE" "$yoctoLocationMIPS64/$toolchainFileMIPS64"
else
echo "Error! Couldn't find installation paths for Yocto toolchain. Aborting provisioning." 1>&2
exit 1
fi
cat << EOB >> ~/versions.txt
Yocto ARMv7 toolchain = $versionARM
Yocto ARM64 toolchain = $versionARM64
Yocto MIPS64 toolchain = $versionMIPS64
EOB
# List qt user in qemu toolchain sysroots
sudo sh -c "grep ^qt /etc/passwd >> $yoctoLocationARMv7/sysroots/$sysrootARMv7/etc/passwd"
sudo sh -c "grep ^qt /etc/group >> $yoctoLocationARMv7/sysroots/$sysrootARMv7/etc/group"
sudo sh -c "grep ^qt /etc/passwd >> $yoctoLocationARM64/sysroots/$sysrootARM64/etc/passwd"
sudo sh -c "grep ^qt /etc/group >> $yoctoLocationARM64/sysroots/$sysrootARM64/etc/group"
# Fix mdns to support both docker and network tests
# See also https://bugreports.qt.io/browse/QTBUG-106013
sudo sed -i '/^hosts:/s/.*/hosts: files myhostname mdns_minimal [NOTFOUND=return] mdns4 dns/' \
$yoctoLocationARMv7/sysroots/$sysrootARMv7/etc/nsswitch.conf \
$yoctoLocationARM64/sysroots/$sysrootARM64/etc/nsswitch.conf
# Install qemu binfmt for 32bit and 64bit arm architectures
sudo update-binfmts --package qemu-arm --install arm $yoctoLocationARMv7/sysroots/x86_64-pokysdk-linux/usr/bin/qemu-arm \
--magic "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff"
sudo update-binfmts --package qemu-aarch64 --install aarch64 $yoctoLocationARM64/sysroots/x86_64-pokysdk-linux/usr/bin/qemu-aarch64 \
--magic "\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2017 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/integrity.sh
source "${BASH_SOURCE%/*}/../common/linux/integrity.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
#Copyright (C) 2026 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/syft.sh"
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
source "${BASH_SOURCE%/*}/../common/linux/sccache.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2018 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/mqtt_broker.sh
source "${BASH_SOURCE%/*}/../common/unix/mqtt_broker.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/fbx_linux.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/unix/install-conan.sh" "linux" "--break-system-packages"
@@ -0,0 +1,49 @@
#!/usr/bin/env bash
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/unix/DownloadURL.sh
source "${BASH_SOURCE%/*}/../common/unix/DownloadURL.sh"
set -ex
# This script will install ICU
icuVersion="73.2"
icuLocationLib="/usr/local/lib"
icuLocationInclude="/usr/local/include"
sha1="5699987afcceb0390e52fb860bb3b4ab8b39cabe"
baseBinaryPackageURL="http://ci-files01-hki.ci.qt.io/input/icu/$icuVersion/icu-linux-g++-Ubuntu22.04-x64.7z"
baseBinaryPackageExternalURL="http://master.qt.io/development_releases/prebuilt/icu/prebuilt/$icuVersion/icu-linux-g++-Ubuntu22.04-x64.7z"
sha1Dev="6b9da2fa5fd88db88e9957ee5e3cf9dbcd08fe6b"
develPackageURL="http://ci-files01-hki.ci.qt.io/input/icu/$icuVersion/icu-linux-g++-Ubuntu22.04-x64-devel.7z"
develPackageExternalURL="http://master.qt.io/development_releases/prebuilt/icu/prebuilt/$icuVersion/icu-linux-g++-Ubuntu22.04-x64-devel.7z"
echo "Installing custom ICU $icuVersion $sha1 packages on Ubuntu to $icuLocationLib"
targetFile=$(mktemp)
sudo mkdir -p "$icuLocationLib"
sudo mkdir -p "$icuLocationInclude"
DownloadURL "$baseBinaryPackageURL" "$baseBinaryPackageExternalURL" "$sha1" "$targetFile"
sudo 7z x -snld20 -y -o$icuLocationLib "$targetFile"
sudo rm "$targetFile"
echo "Installing custom ICU devel packages on Ubuntu"
tempDir=$(mktemp -d)
targetFile=$(mktemp)
DownloadURL "$develPackageURL" "$develPackageExternalURL" "$sha1Dev" "$targetFile"
7z x -snld20 -y -o"$tempDir" "$targetFile"
sudo cp -a "$tempDir"/lib/* "$icuLocationLib"
sudo cp -a "$tempDir"/include/* "$icuLocationInclude"
sudo rm "$targetFile"
sudo rm -fr "$tempDir"
sudo /sbin/ldconfig
echo "ICU = $icuVersion" >> ~/versions.txt
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/install-breakpad.sh
source "${BASH_SOURCE%/*}/../common/unix/install-breakpad.sh"
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
#Copyright (C) 2025 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
source "${BASH_SOURCE%/*}/../common/unix/install-maven.sh"
@@ -0,0 +1,8 @@
#!/bin/bash
# Copyright (C) 2017 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/android_linux.sh
source "${BASH_SOURCE%/*}/../common/linux/android_linux.sh"
@@ -0,0 +1,8 @@
#!/bin/bash
# Copyright (C) 2025 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/harmonyos_linux.sh
source "${BASH_SOURCE%/*}/../common/linux/harmonyos_linux.sh"
@@ -0,0 +1,7 @@
#!/bin/bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/cmake_linux.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/gradle.sh
source "${BASH_SOURCE%/*}/../common/linux/gradle.sh"
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/unix/install-vcpkg.sh"
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/unix/install-vcpkg-ports.sh" x64-linux-qt
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
#Copyright (C) 2025 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
source "${BASH_SOURCE%/*}/../common/unix/install-golang.sh" "linux"
@@ -0,0 +1,8 @@
#!/bin/bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/install-vcpkg-ports-ohos.sh
source "${BASH_SOURCE%/*}/../common/unix/install-vcpkg-ports-ohos.sh"
@@ -0,0 +1,8 @@
#!/bin/bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/install-openssl-headers-ohos.sh
source "${BASH_SOURCE%/*}/../common/unix/install-openssl-headers-ohos.sh"
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# This script install cpdb from sources.
# Requires GCC and Perl to be in PATH.
set -ex
# Install the dependencies
sudo apt install -y autopoint libglib2.0-dev libdbus-1-dev
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/install-cpdb.sh"
@@ -0,0 +1,8 @@
#!/bin/bash
# Copyright (C) 2021 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/openssl_for_android.sh
source "${BASH_SOURCE%/*}/../common/unix/openssl_for_android.sh"
@@ -0,0 +1,7 @@
#!/bin/bash
#Copyright (C) 2025 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/unix/install_openapi.sh"
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Copyright (C) 2018 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/install_protobuf.sh
source "${BASH_SOURCE%/*}/../common/unix/install_protobuf.sh"
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/install_grpc.sh
source "${BASH_SOURCE%/*}/../common/unix/install_grpc.sh"
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
#Copyright (C) 2026 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/unix/DownloadURL.sh
source "${BASH_SOURCE%/*}/../common/unix/DownloadURL.sh"
# shellcheck source=../common/unix/SetEnvVar.sh
source "${BASH_SOURCE%/*}/../common/unix/SetEnvVar.sh"
checksum="83051570e514a10b6f60d732cd2c35eb3fcc9d3d"
url="https://download.swift.org/swiftly/linux/swiftly-1.1.1-x86_64.tar.gz"
url_cached="http://ci-files01-hki.ci.qt.io/input/swiftly-1.1.1-x86_64.tar.gz"
target=swiftly.tar.gz
# Ubuntu 26.04 has issues with swiftly installer, it's installed with apt instead
if command -v swift >/dev/null 2>&1; then
echo "Swift is already installed"
swift --version
else
DownloadURL $url_cached $url $checksum $target
tar zxf swiftly.tar.gz
./swiftly init --quiet-shell-followup -y
# The installer leaves out line feed when modifying .profile
echo " " >> /home/qt/.profile
fi
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
# Copyright (C) 2020 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# This script installs QEMU Guest Agent
set -ex
sudo apt -y install qemu-guest-agent
sudo systemctl start qemu-guest-agent
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
# Copyright (C) 2021 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/qnx_710.sh
source "${BASH_SOURCE%/*}/../common/linux/qnx_710.sh"
# setup NFS
sudo bash -c "echo '/home/qt/work ${qemuNetwork}/24(rw,sync,root_squash,no_subtree_check,anonuid=1000,anongid=1000)' >> /etc/exports"
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/qnx_800.sh
source "${BASH_SOURCE%/*}/../common/linux/qnx_800.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2021 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/vx_works.sh
source "${BASH_SOURCE%/*}/../common/linux/vx_works.sh"
@@ -0,0 +1,60 @@
#!/usr/bin/env bash
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -e
PROVISIONING_DIR="$(dirname "$0")/../"
# shellcheck source=../common/unix/common.sourced.sh
source "$PROVISIONING_DIR"/common/unix/common.sourced.sh
# shellcheck source=../common/unix/DownloadURL.sh
source "$PROVISIONING_DIR"/common/unix/DownloadURL.sh
localRepo=http://ci-files01-hki.ci.qt.io/input/docker
# upstreamRepo=https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64
#upstreamRepo=https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64
#upstreamRepo=https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/amd64
upstreamRepo=https://download.docker.com/linux/ubuntu/dists/resolute/pool/stable/amd64
echo '
40e42f4d1f868c68e3bdb19d8e1e82872e0328a7 containerd.io_2.3.3-1~ubuntu.26.04~resolute_amd64.deb
14cedb6de2737bc165c0460ad86604bc510aca4f docker-ce_29.7.2-1~ubuntu.26.04~resolute_amd64.deb
36c54832eb62cf9af38b5101276b36f145abbd07 docker-ce-cli_29.7.2-1~ubuntu.26.04~resolute_amd64.deb
' \
| xargs -n2 | while read -r sha f
do
DownloadURL "$localRepo/$f" "$upstreamRepo/$f" "$sha"
done
sudo apt-get -y install ./containerd.io_*.deb ./docker-ce_*.deb ./docker-ce-cli_*.deb
rm -f ./containerd.io_*.deb ./docker-ce_*.deb ./docker-ce-cli_*.deb
sudo usermod -a -G docker "$USER"
sudo docker --version
# Download and install the docker-compose extension from https://github.com/docker/compose/releases
f=docker-compose-$(uname -s)-$(uname -m)
DownloadURL \
"$localRepo/$f-1.24.1" \
"https://github.com/docker/compose/releases/download/1.24.1/$f" \
cfb3439956216b1248308141f7193776fcf4b9c9b49cbbe2fb07885678e2bb8a
sudo install -m 755 ./docker-compose* /usr/local/bin/docker-compose
sudo docker-compose --version
rm ./docker-compose*
# Install Avahi to discover Docker containers in the test network
sudo apt-get install avahi-daemon -y
# Add registry mirror for docker images
sudo tee -a /etc/docker/daemon.json <<"EOF"
{
"registry-mirrors": ["http://repo-clones.ci.qt.io:5000"]
}
EOF
echo "Restart Docker"
sudo systemctl daemon-reload
sudo systemctl restart docker
# Start testserver provisioning
sudo "$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")/../common/shared/testserver/docker_testserver.sh"
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Copyright (C) 2021 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# The new version of libnss-mdns resolver library automatically rejects all
# hostnames with more than two labels (i.e. subdomains deep), for example
# vsftpd.test-net.qt.local is automatically rejected. The changes here fix
# this, see also https://github.com/lathiat/nss-mdns#etcmdnsallow
cat <<EOT | sudo tee /etc/mdns.allow
.local.
.local
EOT
sudo sed -i '/^hosts:/s/.*/hosts: files mdns_minimal [NOTFOUND=return] mdns4 dns/' /etc/nsswitch.conf
@@ -0,0 +1,33 @@
#!/usr/bin/env bash
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# Provisions qdoc and qtattributionsscanner binaries; these are used for
# documentation testing without the need for a dependency to qttools.
set -e
# shellcheck source=../common/unix/check_and_set_proxy.sh
"${BASH_SOURCE%/*}/../common/unix/check_and_set_proxy.sh"
# shellcheck source=../common/unix/DownloadURL.sh
source "${BASH_SOURCE%/*}/../common/unix/DownloadURL.sh"
version="68bdc5764da2d4e442181b408751b6572f36fa74"
sha1="dac76e8f6cb69990661e7d814bea6f32fea29bf4"
url="https://download.qt.io/development_releases/prebuilt/qdoc/qt/qdoc-qtattributionsscanner_${version//\./}-based-linux-Ubuntu22.04-gcc11.4-x86_64.7z"
url_cached="http://ci-files01-hki.ci.qt.io/input/qdoc/qt/qdoc-qtattributionsscanner_${version//\./}-based-linux-Ubuntu22.04-gcc11.4-x86_64.7z"
zip="/tmp/qdoc-qtattributionsscanner.7z"
destination="/opt/qt-doctools"
sudo mkdir -p "$destination"
sudo chmod 755 "$destination"
DownloadURL "$url_cached" "$url" "$sha1" "$zip"
if command -v 7zr &> /dev/null; then
sudo 7zr -snld20 x "$zip" "-o$destination/"
else
sudo 7z -snld20 x "$zip" "-o$destination/"
fi
sudo chown -R qt:users "$destination"
rm -rf "$zip"
echo -e "qdoc = $version\nqtattributionsscanner = $version" >> ~/versions.txt
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
source "${BASH_SOURCE%/*}/../common/unix/install-patchelf.sh"
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
source "${BASH_SOURCE%/*}/../common/linux/bootstrap-autostart.sh"
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
source "${BASH_SOURCE%/*}/../common/linux/install-ffmpeg-linux.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/mimersql.sh" "openssl-3" "deb"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/install-dummy-alsa-device.sh
source "${BASH_SOURCE%/*}/../common/linux/install-dummy-alsa-device.sh"
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
# shellcheck source=../common/linux/install-vivid-camera.sh
source "${BASH_SOURCE%/*}/../common/linux/install-vivid-camera.sh"
@@ -0,0 +1,6 @@
#!/bin/bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# shellcheck source=../common/linux/squish-coco.sh
source "${BASH_SOURCE%/*}/../common/linux/squish-coco.sh"
@@ -0,0 +1,57 @@
#!/usr/bin/env bash
# Copyright (C) 2021 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# Setups sbuild environment
tee ~/.sbuildrc << EOF
##############################################################################
# PACKAGE BUILD RELATED (additionally produce _source.changes)
##############################################################################
# -d
\$distribution = 'stable';
# -A
\$build_arch_all = 1;
# -s
\$build_source = 1;
# -v
\$verbose = 1;
# parallel build
\$ENV{'DEB_BUILD_OPTIONS'} = 'parallel=8';
##############################################################################
# POST-BUILD RELATED (turn off functionality by setting variables to 0)
##############################################################################
\$run_lintian = 1;
\$lintian_opts = ['-i', '-I'];
\$run_piuparts = 0;
\$piuparts_opts = ['--schroot', 'stable-amd64-sbuild', '--no-eatmydata'];
\$run_autopkgtest = 0;
\$autopkgtest_root_args = '';
\$autopkgtest_opts = [ '--', 'schroot', '%r-%a-sbuild' ];
##############################################################################
# PERL MAGIC
##############################################################################
1;
EOF
# Add user group
sudo sbuild-adduser "$LOGNAME"
newgrp sbuild
# Create chroot
sudo sbuild-createchroot --include=eatmydata,ccache,gnupg,ca-certificates stable /srv/chroot/stable-amd64
# For ubuntu 26.04
echo "Create chroot for Ubuntu Resolute"
## ccache can't be found with Jammy (TODO: but now we have Noble - this should be tested)
# Noble -> Resolute
sudo sbuild-createchroot --include=eatmydata,gnupg,ca-certificates resolute /srv/chroot/resolute-amd64 http://archive.ubuntu.com/ubuntu/
echo "Done creating chroot for Ubuntu Resolute"
# Update chroot.
# sudo sbuild-update -udcar stable
# -> sbuild-update is likely deprecated in Ubuntu 26.04, running it errors to:
# "With the "unshare" mode, it is without function.
# Instead, recreate tarballs from scratch or let sbuild
# manage them for you and use mmdebstrap_extra_args to do the custom setup."
@@ -0,0 +1,40 @@
#!/bin/bash
#Copyright (C) 2024 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# This script installs Axivion Bauhaus Suite tool.
set -ex
# shellcheck source=../common/unix/DownloadURL.sh
source "${BASH_SOURCE%/*}/../common/unix/DownloadURL.sh"
DownloadAndExtract () {
url=$1
sha=$2
file=$3
DownloadURL "$url" "$url" "$sha" "$file"
tar -xzvf "$file"
rm -rf "$file"
}
# Axivion Bauhaus Suite
version="7.11.3"
sourceFile="http://ci-files01-hki.ci.qt.io/input/axivion/bauhaus-suite-$version-x86_64-gnu_linux.tar.gz"
targetFile="bauhaus-suite.tar.gz"
sha1="8ca558908b38ca99500b7e0687609a1531b19121"
cd "$HOME"
DownloadAndExtract "$sourceFile" "$sha1" "$targetFile"
mkdir "$HOME/.bauhaus"
cd "$HOME/.bauhaus"
wget http://ci-files01-hki.ci.qt.io/input/axivion/QT_11427439_2026-12-31.key
cd "$HOME"
#Axivion configuration
cp -r "${BASH_SOURCE%/*}/../common/linux/axivion/" "$HOME/"
echo "Axivion Bauhaus Suite = $version" >> ~/versions.txt
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# Get required deb files for sbuild to build qt debian packages for Ubuntu jammy
mkdir -p /home/qt/debian_packages
cd /home/qt/debian_packages || exit
# Backported cmake 3.24
wget https://ci-files01-hki.ci.qt.io/input/debian/cmake/amd64-jammy/cmake-3.24-deb.tar.gz
tar xzf cmake-3.24-deb.tar.gz
rm -rf cmake-3.24-deb.tar.gz
# TODO: Adapt this from jammy to noble Ubuntu 24.04:
# get rest of ready made Ubuntu jammy arm debian packages
# so that sbuild can find those
#wget http://ci-files01-hki.ci.qt.io/input/debian/icu/amd64-jammy/libicu-56.1-qt_56.1-1_amd64.deb
#wget http://ci-files01-hki.ci.qt.io/input/debian/icu/amd64-jammy/libicu-56.1-qt-dev_56.1-1_amd64.deb
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# Install lcov 2.4 from 26.04/resolute raccoon
echo "Installing lcov"
wget https://ci-files01-hki.ci.qt.io/input/lcov/lcov_2.4-3_all.deb
sudo DEBIAN_FRONTEND=noninteractive apt-get -q -y -o DPkg::Lock::Timeout=300 install -f ./lcov_2.4-3_all.deb
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -e
set -o pipefail
export PROVISIONING_DIR="${BASH_SOURCE%/*}/../"
source "$PROVISIONING_DIR"/common/unix/install-mosquitto-mqtt.sh
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
"$(dirname "$0")"/../common/linux/cleanup_cache.sh
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
set -ex
BASEDIR=$(dirname "$0")
"$BASEDIR"/../common/linux/enable_test_stacktraces.sh
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/install-network-test.sh" "--warn-only"
@@ -0,0 +1,13 @@
#!/bin/bash
#Copyright (C) 2023 The Qt Company Ltd
#SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
BASEDIR=$(dirname "$0")
# shellcheck source=../common/linux/distro_version_check.sh
source "$BASEDIR/../common/linux/distro_version_check.sh"
# Check distro version if it has changed
verify_os_version_unchanged
BASEDIR=$(dirname "$0")
"$BASEDIR/../common/linux/ubuntu-version.sh"