Skip to content

Ci/workflows into scripts and i225 support - #1700

Merged
awilczyns merged 4 commits into
mainfrom
ci/workflows-into-scripts
Sep 1, 2026
Merged

Ci/workflows into scripts and i225 support#1700
awilczyns merged 4 commits into
mainfrom
ci/workflows-into-scripts

Conversation

@DawidWesierski4

Copy link
Copy Markdown
Collaborator

No description provided.

@DawidWesierski4 DawidWesierski4 changed the title Ci/workflows into scripts Ci/workflows into scripts and i225 support Aug 28, 2026
@DawidWesierski4
DawidWesierski4 force-pushed the ci/workflows-into-scripts branch from 276858b to d25abd5 Compare August 28, 2026 14:23
Every workflow held its own inline shell. The same host preparation, the same
cache key and the same build step were written more than one time, so a repair
had to be made in each copy, and no step could be run on a development host.

This change puts one copy of each step in .github/scripts/ci/, and each
workflow calls it. Taskfile.yml gives the same tasks a name on a development
host, so a step can be run and read before a run is started.

What is new:

* .github/workflows/pr-gate.yml -- one required check. It waits for the build
  workflow, then starts the test legs. A cancelled or a skipped check is not a
  result, so the gate drops those runs before it decides. Without that, a
  commit that reached the branch through a push and a pull_request event left a
  cancelled check that the gate read as a failure.
* .github/workflows/provision-runner.yml -- repairs a build host from the same
  apt list that setup_environment.sh holds. A build job installs nothing, so
  before this no commit could repair a host that missed a package.
* .github/workflows/unit_tests.yml -- the unit tier, which needs no NIC.
* .github/actions/validate-host and .github/actions/wait-for-workflow -- host
  state and cross-workflow waiting, with the wait logic in wait.js.

What goes away: validation-tests.yml and run_validation_tests.sh, replaced by
custom-pytest.yml and the scripts; upstream_sync.yml, which no longer runs.

Host and cache rules that a test now depends on:

* activate-ice.sh loads the cached ice and iavf modules always. A srcversion
  match only says the source was the same; it does not say the driver is in a
  state a test can use. So the VFs go down, irdma and ice are removed, and the
  cached modules take their place.
* configure-host.sh takes the seven MTL GStreamer plugins out of the system
  plugin directories. GST_PLUGIN_PATH adds a directory; it does not take one
  away, so a plugin an earlier install left behind was a second plugin of the
  same name. GST_REGISTRY now names a file of the job.
* The host prerequisite check asks python3 for the elftools module, which DPDK's
  buildtools/meson.build needs. A missing module used to stop `meson setup`
  after the whole patch series had been applied, with a message that names no
  package and no host.

Test suites, so a job can run on a fleet host:

* tests/integration_tests/tests.cpp -- the host octet of each port after the
  primary one counted up from p_ip[0], the network octet. With the --p_sip that
  gtest.sh now passes, p_ip[0] is 192, so the redundant port always took .193
  and a primary address of .193 stopped the run. The octet now counts up from
  the primary host octet and stays in 1..254.
* noctx/run.sh and run_pf.sh -- the test list was read through a pipeline, so
  the status was awk's and a crashed enumerator read as zero tests.
* The acceptance suite reaches a host as an ordinary account with sudo, not as
  root: the VFIO group node of each new VF is handed to that account, ldconfig
  and the ffmpeg links run under sudo, and netsniff-ng captures under sudo and
  is reaped by argv, because sudo does not pass a signal to its child.
* The EBU LIST password goes to upload_pcap.py over standard input.
  mfd_connect logs every command it runs, and those logs are the artifact of a
  public run.
* A `low_bandwidth` marker names each case that stays under 2 Gbps, so a 2.5 GbE
  card (i225/i226) can carry a smoke leg. gen_config.py gained
  --interface_type, because a card with no SR-IOV has no VF, and a single-port
  card takes the kernel-socket path.

.gitignore holds the new build and report artifacts of all four branches of
this work, so each one does not have to change the same file.

Signed-off-by: Wesierski, Dawid <dawid.wesierski@intel.com>
The scripts under `script/` are what the jobs call. Three changes here let
the workflows of the commit before this one do their work.

build_ebpf_xdp.sh checks the host, and can check only

These dependencies are invisible until something far away breaks:
`libdpdk.pc` names libelf and zlib in `Requires.private`, so a host
without `libelf-dev` fails inside a `pkg-config` call minutes into a
build, with nothing in the log that points at the cause. The script now
collects everything it finds missing and prints the apt line for each one,
rather than stopping at the first.

`--check` runs that check alone and installs nothing. `--check build`
narrows it to what consuming DPDK asks of the host. The two sets are not
the same, and treating them as one stopped the fleet: the build job builds
DPDK, MTL, the plugins, FFmpeg and GStreamer, and never builds xdp-tools,
so when `cap-ng.h` joined one shared list every build on every host that
had not been reprovisioned failed on a header nothing it builds includes.
The caller now says which set it needs.

The build scope holds `libelf.h`, `zlib.h`, `make`, and the python3
`elftools` module. `elftools` is there because DPDK's
`buildtools/meson.build` asks python3 for it and stops `meson setup` with
"python3 is missing modules: elftools" — the stop that ended the build job
of run 33168999034 on mtl-runner-12, after the job had downloaded,
unpacked and patched the whole of DPDK. The message names no package and
no host, so the cause was not readable from the log. mtl-runner-12 was the
one host of the fleet without `python3-pyelftools`.

The full scope adds xdp-tools' own prerequisites — `cap-ng.h`,
`pcap/pcap.h`, m4, clang, llvm-strip, wget, unzip — and the three kernel
config symbols AF_XDP needs, which no package can supply. The kernel check
is skipped where `/boot/config-$(uname -r)` is unreadable, as in a
container.

The install path also picks its library directory by planting a probe
`.pc` file and asking `pkg-config` whether it reads it. Both xdp-tools and
libbpf default `LIBDIR` to `${PREFIX}/lib64`, which Debian's pkg-config
does not search, and the multiarch directory Debian does search does not
exist on the RHEL family, so neither upstream default is portable.
`pkg-config --variable pc_path pkg-config` cannot answer this either: it
is a string in a file the distribution ships, and on Rocky 9 it leaves out
`/usr/local/lib64/pkgconfig`, which pkgconf's compiled-in default does
search. Getting this wrong was silent — `make install` succeeded,
pkg-config then reported the library absent, and MTL configured itself
without AF_XDP. If no directory under the prefix is read at all, the `.pc`
files are linked into one that is, because a `.pc` file records its own
libdir and so answers correctly from wherever it is read.

build_drivers.sh produces a bundle, and honors the prefix

`build-dependencies.sh` had two gates and two producers. A `standard_miss`
loop repeated the `any_miss` gate that the workflow already applies to the
step, and it left ICE out, so an ICE-only miss took a second code path
into `build-ice.sh`. That script did by hand what every other component
does through `MTL_INSTALL_PREFIX`.

So `build_drivers.sh` now honors the prefix as `build_dpdk.sh` does. With
one set, the two `.ko` files go to `<prefix parent>/ice/<kernel
release>/<architecture>` and nothing is installed and nothing is loaded,
because a kernel module cannot go in a prefix and be loaded. ICE then maps
to `SETUP_BUILD_AND_INSTALL_DRIVERS_ICE` and `_IAVF` like every other
component maps to its own flag, so the second gate and the second producer
go, and `build-ice.sh` goes with them.

The bundle is `ice.ko` and `iavf.ko` and nothing else, like every other
stash. The 19-field `metadata.env` it used to carry, and the cache key
built from a hash of every kernel header plus a producer-compiler
contract, decided nothing: a bundle that reaches a host is already keyed
on the patch hash, the kernel release and the architecture, and the rest
is answered by the files themselves. Validation reads `vermagic` and the
`ice_vc_cfg_q_bw` symbol — the kernel it loads into, and that it is the
Kahawai build. Activation compares `srcversion`. Dropping the header ABI
and compiler hashes from the key also stops a bundle built for the fleet
kernel from missing on a fleet host whose kernel build tree differs in a
file that has no bearing on the module.

The kernel header check moves here with the work, so a build stops with
the package to install instead of with a missing make target deep in the
driver tree.

`build_drivers.sh` can also build the out-of-tree IAVF module, from
`--iavf-version` / `IAVF_VER` and `patches/iavf_drv/<version>/`. The
version pin and that patch folder come with the driver pull request; until
it lands, only the ICE half of the bundle can be produced.

hash_sources.sh keys JPEG XS and ICE

The waterfall gains two entries. `jpegxs` hashes its own paths over the
`mtl` checksum, and `ffmpeg` now hangs off `jpegxs` rather than off `mtl`,
because the FFmpeg plugin consumes the JPEG XS bundle. `ice` hashes its
own paths and nothing else, because the module does not depend on DPDK or
on MTL. `script/hash_sources_ice.env` and
`script/hash_sources_jpegxs.env` name the paths, one file per component
like the five that were already there.

The ICE key covers `patches/ice_drv/` and `patches/iavf_drv/` together,
because both modules leave in one cached package, so a change to either
one's patches must rebuild it.

nicctl.sh
The usage text goes to standard error and the exit code becomes 2, so a
job that calls the script with the wrong arguments fails instead of
reading an empty success. `create_dcf_vf` goes: no test, no job and no
document names it.

`doc/xdp.md` records `--check`, `task ebpf:check`, the libpcap package
that xdp-tools' configure calls required, and how the install directory is
chosen.

Signed-off-by: Wesierski, Dawid <dawid.wesierski@intel.com>
@awilczyns
awilczyns force-pushed the ci/workflows-into-scripts branch from d25abd5 to 4e922b7 Compare August 31, 2026 14:05
IAVF 4.13.35 is not an independent version pin: it is the VF half of the
ICE 2.6.7 virtchnl MAP_QUEUE_VECTOR size fix, which has to be applied to
the PF and the VF driver together or VF traffic stalls on opcode 111. The
matching patch pair lives in the DPDK 26.07 / ICE 2.6.7 change, so the
build flow that consumes it belongs there too, not here.

Split across two changes, neither half worked. This one carried
build_iavf() and the bundle, cache-key and activation plumbing while
versions.env had no IAVF_VER, so build_drivers.sh aborted under set -u on
an unbound variable before it built anything. The other carries the
version keys and both virtchnl patches with no code that builds them.

So drop IAVF here and leave it whole in the change that owns the patches.
The ICE bundle becomes ice.ko alone, and this change goes back to being a
CI refactor with no driver-version content of its own.

The DPDK iavf PMD references stay: iavf_tm_node_add and vf->qos_cap are
the stock-driver segfault symptom, unrelated to the out-of-tree module.

Signed-off-by: Wilczynski, Andrzej <andrzej.wilczynski@intel.com>
The example is an exhaustive struct literal, so it stops compiling every
time the header gains a field. port_packet_loss arrived in 29d416e and
MTL_DMA_DEV_MAX went from 8 to 32 in 101dd49, and neither reached here,
so the example has not built since. cargo skips examples and clippy runs
without --all-targets, so nothing in CI noticed.

Signed-off-by: Wilczynski, Andrzej <andrzej.wilczynski@intel.com>
@awilczyns
awilczyns force-pushed the ci/workflows-into-scripts branch from a32e489 to db53016 Compare September 1, 2026 12:01

@moleksy moleksy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@awilczyns
awilczyns merged commit 0aff97f into main Sep 1, 2026
76 of 92 checks passed
@awilczyns
awilczyns deleted the ci/workflows-into-scripts branch September 1, 2026 13:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants