Syncing a fork's main branch triggers the push workflows if actions are enabled, which then run the full CI matrix and use up the fork owner's Actions minutes for no benefit. Only skip push events so that PRs within a fork still run CI, which is useful for testing actions. Signed-off-by: Paul Meyer <katexochen0@gmail.com> (cherry picked from commit 4c63532c28094aeba6dccc5afb9690e02fd98d66)
265 lines
8.9 KiB
YAML
265 lines
8.9 KiB
YAML
---
|
|
# vi: ts=2 sw=2 et:
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
# Simple boot tests that build and boot the mkosi images generated by the mkosi config files in mkosi.conf.d/.
|
|
name: mkosi
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
- v[0-9]+-stable
|
|
paths:
|
|
- "**"
|
|
- "!README*"
|
|
- "!LICENSE*"
|
|
- "!LICENSES/**"
|
|
- "!TODO"
|
|
- "!docs/**"
|
|
- "!man/**"
|
|
- "!catalog/**"
|
|
- "!shell-completion/**"
|
|
- "!po/**"
|
|
- "!.**"
|
|
- ".github/**"
|
|
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
- v[0-9]+-stable
|
|
paths:
|
|
- "**"
|
|
- "!README*"
|
|
- "!LICENSE*"
|
|
- "!LICENSES/**"
|
|
- "!TODO"
|
|
- "!docs/**"
|
|
- "!man/**"
|
|
- "!catalog/**"
|
|
- "!shell-completion/**"
|
|
- "!po/**"
|
|
- "!.**"
|
|
- ".github/**"
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
ci:
|
|
# Don't run on pushes to forks, only on pushes to the upstream repositories
|
|
if: github.event_name != 'push' || github.repository == 'systemd/systemd' || github.repository == 'systemd/systemd-stable'
|
|
runs-on: ${{ matrix.runner || 'ubuntu-24.04' }}
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ matrix.distro }}-${{ matrix.release }}-${{ github.ref }}-${{ matrix.runner || 'ubuntu-24.04' }}
|
|
cancel-in-progress: true
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- distro: arch
|
|
release: rolling
|
|
cflags: "-O2 -D_FORTIFY_SOURCE=3"
|
|
vm: 1
|
|
- distro: debian
|
|
release: stable
|
|
- distro: debian
|
|
release: testing
|
|
shim: 1
|
|
- distro: debian
|
|
release: testing
|
|
runner: ubuntu-24.04-arm
|
|
no_qemu: 1
|
|
no_kvm: 1
|
|
- distro: ubuntu
|
|
release: noble
|
|
- distro: ubuntu
|
|
release: resolute
|
|
- distro: fedora
|
|
release: "44"
|
|
sanitizers: address,undefined
|
|
llvm: 1
|
|
- distro: fedora
|
|
release: rawhide
|
|
- distro: opensuse
|
|
release: tumbleweed
|
|
- distro: centos
|
|
release: "9"
|
|
- distro: centos
|
|
release: "10"
|
|
- distro: nura
|
|
release: edge
|
|
libc: musl
|
|
skip: TEST-92-TPM2-SWTPM
|
|
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
|
|
with:
|
|
persist-credentials: false
|
|
- uses: systemd/mkosi@71d7b67e01dc47ab5c51f24866c3e2195b9701d2
|
|
with:
|
|
# Bootstrapping a Nura tools tree on the Ubuntu host needs apk
|
|
apk: ${{ matrix.distro == 'nura' }}
|
|
|
|
# Freeing up disk space with rm -rf can take multiple minutes. Since we don't need the extra free space
|
|
# immediately, we remove the files in the background. However, we first move them to a different location
|
|
# so that nothing tries to use anything in these directories anymore while we're busy deleting them.
|
|
- name: Free disk space
|
|
run: |
|
|
sudo mv /usr/local /usr/local.trash
|
|
sudo mv /opt/hostedtoolcache /opt/hostedtoolcache.trash
|
|
sudo systemd-run rm -rf /usr/local.trash /opt/hostedtoolcache.trash
|
|
|
|
- name: Btrfs
|
|
run: |
|
|
truncate --size=100G btrfs.raw
|
|
mkfs.btrfs btrfs.raw
|
|
sudo mkdir -p /mnt/mkosi
|
|
LOOP="$(sudo losetup --find --show --direct-io=on btrfs.raw)"
|
|
rm -f btrfs.raw
|
|
sudo mount "$LOOP" /mnt/mkosi --options compress=zstd:1,user_subvol_rm_allowed,noatime,discard=async,space_cache=v2
|
|
sudo chown "$(id -u):$(id -g)" /mnt/mkosi
|
|
mkdir -p /mnt/mkosi/tmp
|
|
echo "TMPDIR=/mnt/mkosi/tmp" >>"$GITHUB_ENV"
|
|
ln -sf /mnt/mkosi/build build
|
|
|
|
- name: Configure
|
|
run: |
|
|
tee mkosi/mkosi.local.conf <<EOF
|
|
[Distribution]
|
|
Distribution=${{ matrix.distro }}
|
|
Release=${{ matrix.release }}
|
|
|
|
[Output]
|
|
# Build a disk image in CI as this logic is much more prone to breakage.
|
|
Format=disk
|
|
|
|
[Build]
|
|
UseSubvolumes=yes
|
|
ToolsTreeDistribution=${{ matrix.distro }}
|
|
ToolsTreeRelease=${{ matrix.release }}
|
|
WithTests=yes
|
|
|
|
WorkspaceDirectory=$TMPDIR
|
|
PackageCacheDirectory=$TMPDIR/cache
|
|
|
|
Environment=
|
|
# Build debuginfo packages since we'll be publishing the packages as artifacts.
|
|
WITH_DEBUG=1
|
|
CFLAGS="${{ matrix.cflags || '-Og' }}"
|
|
SANITIZERS="${{ matrix.sanitizers || '' }}"
|
|
MESON_OPTIONS=--werror
|
|
LLVM="${{ matrix.llvm || 0 }}"
|
|
SYSEXT=1
|
|
|
|
[Runtime]
|
|
RAM=4G
|
|
EOF
|
|
|
|
# Preferred for cloud/CIs
|
|
if [ "${{ matrix.distro }}" = opensuse ]; then
|
|
tee -a mkosi/mkosi.local.conf <<EOF
|
|
|
|
[Distribution]
|
|
Mirror=https://cdn.opensuse.org/
|
|
EOF
|
|
fi
|
|
|
|
- name: Generate secure boot key
|
|
run: mkosi --debug genkey
|
|
|
|
- name: Show image summary
|
|
run: mkosi summary
|
|
|
|
- name: Build tools tree
|
|
run: sudo mkosi -f box -- true
|
|
|
|
- name: Configure meson
|
|
run: |
|
|
# /usr/sbin/bpftool is completely broken inside containers on Ubuntu which makes meson blow up so
|
|
# disable the bpf-framework stuff to avoid the issue.
|
|
# TODO: Drop when we move off Ubuntu Noble as this will be fixed in the next Ubuntu LTS release.
|
|
sudo mkosi box -- \
|
|
meson setup \
|
|
--buildtype=debugoptimized \
|
|
-Dbpf-framework=disabled \
|
|
-Dlibc="${{ matrix.libc || 'glibc' }}" \
|
|
build
|
|
|
|
- name: Prepare shim integration
|
|
run: |
|
|
if [ "${{ matrix.shim || 0 }}" = 1 ]; then
|
|
{ printf '[Content]\nPackages=shim-signed\nShimBootloader=signed\n'; \
|
|
printf '[Runtime]\nFirmware=uefi-secure-boot\nFirmwareVariables=%%O/ovmf_vars_shim.fd\n'; } \
|
|
>>mkosi/mkosi.local.conf
|
|
|
|
sudo mkdir -p build/mkosi.output/
|
|
sudo mkosi -f box -- \
|
|
virt-fw-vars \
|
|
--secure-boot \
|
|
--enroll-cert mkosi/mkosi.crt \
|
|
--add-mok 605dab50-e046-4300-abb6-3dd810dd8b23 mkosi/mkosi.crt \
|
|
--input /usr/share/OVMF/OVMF_VARS_4M.fd \
|
|
--output build/mkosi.output/ovmf_vars_shim.fd
|
|
fi
|
|
|
|
- name: Build image
|
|
run: sudo mkosi box -- meson compile -C build mkosi
|
|
|
|
- name: Make sure sources weren't polluted by package build scripts
|
|
run: |
|
|
git status
|
|
git diff
|
|
test -z "$(git status --porcelain)"
|
|
# There will only be one subdirectory, so we don't have to know exactly which one. Also, the
|
|
# subdirectory will be owned by root since we used sudo to build the image, so use sudo here as well.
|
|
sudo git -C pkg/* status
|
|
sudo git -C pkg/* diff
|
|
test -z "$(sudo git -C pkg/* status --porcelain)"
|
|
|
|
- name: Run integration tests
|
|
run: |
|
|
if [[ "$(sudo mkosi box -- meson test --help)" == *"--max-lines"* ]]; then
|
|
MAX_LINES=(--max-lines 300)
|
|
else
|
|
MAX_LINES=()
|
|
fi
|
|
|
|
if [ "${{ matrix.no_kvm || 0 }}" = 1 ] && [ "${{ matrix.no_qemu || 0 }}" = 0 ]; then
|
|
timeout_multiplier=4
|
|
fi
|
|
|
|
# --preserve-env makes sure all the github actions environment variables are propagated which are
|
|
# used in integration-test-wrapper.py to construct the `gh` command line to download the journals
|
|
# of failed tests.
|
|
sudo --preserve-env mkosi box -- \
|
|
env \
|
|
TEST_PREFER_QEMU="${{ matrix.vm || 0 }}" \
|
|
TEST_NO_QEMU="${{ matrix.no_qemu || 0 }}" \
|
|
TEST_NO_KVM="${{ matrix.no_kvm || 0 }}" \
|
|
TEST_RUNNER="${{ matrix.runner || 'ubuntu-24.04' }}" \
|
|
TEST_SKIP="${{ matrix.skip }}" \
|
|
meson test \
|
|
-C build \
|
|
--timeout-multiplier="${timeout_multiplier:-1}" \
|
|
--no-rebuild \
|
|
--setup=integration \
|
|
--suite=integration-tests \
|
|
--print-errorlogs \
|
|
--no-stdsplit \
|
|
--num-processes "$(($(nproc) - 1))" \
|
|
"${MAX_LINES[@]}"
|
|
|
|
- name: Fix journal ownership
|
|
if: failure() && (github.repository == 'systemd/systemd' || github.repository == 'systemd/systemd-stable')
|
|
run: sudo chown -R "$(id -u):$(id -g)" build/test/journal build/meson-logs || true
|
|
|
|
- name: Archive failed test journals
|
|
uses: actions/upload-artifact@v7
|
|
if: failure() && (github.repository == 'systemd/systemd' || github.repository == 'systemd/systemd-stable')
|
|
with:
|
|
name: ci-mkosi-${{ github.run_id }}-${{ github.run_attempt }}-${{ matrix.distro }}-${{ matrix.release }}-${{ matrix.runner || 'ubuntu-24.04' }}-failed-test-journals
|
|
path: |
|
|
build/test/journal/*.journal
|
|
build/meson-logs/*
|
|
retention-days: 7
|