public inbox for kdevops@lists.linux.dev
 help / color / mirror / Atom feed
From: Daniel Gomez <da.gomez@kernel.org>
To: Luis Chamberlain <mcgrof@kernel.org>
Cc: kdevops@lists.linux.dev, Daniel Gomez <da.gomez@samsung.com>
Subject: Re: [PATCH] github: unify docker-tests and linux-ab
Date: Sat, 27 Sep 2025 01:01:58 +0200	[thread overview]
Message-ID: <108a9a59-1ab2-40fc-a1bc-962bc8d088d7@kernel.org> (raw)
In-Reply-To: <20250926-ci-unify-github-hosted-runners-workflows-v1-1-582cad197315@samsung.com>



On 26/09/2025 23.52, Daniel Gomez wrote:
> From: Daniel Gomez <da.gomez@samsung.com>
> 
> This consolidates docker-tests.yml and linux-ab.yml into a single
> config-tests.yml workflow that builds kdevops containers once and
> reuses them across all test jobs via GitHub Container Registry.
> The unified approach eliminates duplicate container builds while
> providing comprehensive validation across Debian, Fedora, and OpenSUSE
> distributions.
> 
> The A/B testing script is modified to work in GitHub containers
> by generating only the configuration files needed for validation
> (extra_vars.yaml) instead of running the full make target that requires
> systemd services unavailable in GitHub-hosted runners (container
> environments).
> 
> Generated-by: Claude AI
> Signed-off-by: Daniel Gomez <da.gomez@samsung.com>
> ---
> This change makes the linux-ab workflow compatible with GitHub-hosted
> runners and merges it with docker-tests. The unified workflow first
> builds a kdevops Docker image (Debian/Fedora/openSUSE) and then uses
> it for validating kdevops configurations (.extra_vars_auto.yaml,
> extra_vars.yaml, and .config) as well as linux-ab.
> 
> Due to container limitations on GitHub-hosted runners, the workflow
> skips Makefile targets that are not supported in these environments
> (e.g., systemd/libvirt). For more details on these limitations, see
> commit 61b3c999a3fc ("ci: add initial GitHub / GitLab workflow tests
> scripts").
> ---
>  .github/workflows/config-tests.yml | 258 +++++++++++++++++++++++++++++++++++++
>  .github/workflows/docker-tests.yml |  55 --------
>  .github/workflows/linux-ab.yml     |  47 -------
>  scripts/test-linux-ab.sh           |  17 ++-
>  4 files changed, 270 insertions(+), 107 deletions(-)
> 
> diff --git a/.github/workflows/config-tests.yml b/.github/workflows/config-tests.yml
> new file mode 100644
> index 00000000..f9b10557
> --- /dev/null
> +++ b/.github/workflows/config-tests.yml
> @@ -0,0 +1,258 @@
> +# SPDX-License-Identifier: GPL-2.0
> +---
> +# Configuration validation tests that run in GitHub-hosted containers.
> +# This workflow validates kdevops configuration generation and A/B testing
> +# setup without requiring infrastructure provisioning, making it suitable
> +# for GitHub-hosted runners with limited resources.
> +name: Configuration Tests
> +
> +on:
> +  push:
> +    branches:
> +      - main
> +      - 'ci-testing/**'
> +  pull_request:
> +    branches:
> +      - main
> +  workflow_dispatch:
> +
> +env:
> +  REGISTRY: ghcr.io
> +  IMAGE_NAME: ${{ github.repository }}/kdevops-ci
> +
> +jobs:
> +  build-kdevops-containers:
> +    name: Build kdevops Container (${{ matrix.base_image_name }})
> +    runs-on: ubuntu-latest
> +    permissions:
> +      contents: read
> +      packages: write
> +    outputs:
> +      debian-image: ${{ steps.set-outputs-debian.outputs.debian-image }}
> +      fedora-image: ${{ steps.set-outputs-fedora.outputs.fedora-image }}
> +      opensuse-image: ${{ steps.set-outputs-opensuse.outputs.opensuse-image }}
> +    strategy:
> +      fail-fast: false
> +      matrix:
> +        include:
> +          - base_image: debian:testing
> +            base_image_name: debian
> +            install_cmd: >
> +              apt update && apt-get install -y
> +              ansible-core
> +              bash
> +              bison
> +              coreutils
> +              flex
> +              gawk
> +              gcc
> +              git
> +              hostname
> +              libvirt-clients
> +              libvirt0
> +              make
> +              ncurses-dev
> +              netcat-openbsd
> +              pkg-config
> +              python3
> +              sudo
> +              traceroute
> +              which
> +          - base_image: fedora:latest
> +            base_image_name: fedora
> +            install_cmd: >
> +              dnf install -y
> +              ansible
> +              bash
> +              bison
> +              coreutils
> +              flex
> +              gawk
> +              gcc
> +              git
> +              hostname
> +              libvirt-client
> +              make
> +              ncurses-devel
> +              nmap-ncat
> +              pkgconf
> +              python3
> +              sudo
> +              traceroute
> +              which
> +          - base_image: opensuse/tumbleweed
> +            base_image_name: opensuse
> +            install_cmd: >
> +              zypper refresh && zypper install -y
> +              ansible
> +              bash
> +              bison
> +              coreutils
> +              flex
> +              gawk
> +              gcc
> +              git
> +              hostname
> +              libvirt
> +              make
> +              ncurses-devel
> +              netcat-openbsd
> +              pkg-config
> +              python3
> +              sudo
> +              traceroute
> +              which
> +    steps:
> +      - name: Checkout repository
> +        uses: actions/checkout@v4
> +
> +      - name: Log in to Container Registry
> +        uses: docker/login-action@v3
> +        with:
> +          registry: ${{ env.REGISTRY }}
> +          username: ${{ github.actor }}
> +          password: ${{ secrets.GITHUB_TOKEN }}
> +
> +      - name: Create Dockerfile for ${{ matrix.base_image_name }}
> +        run: |
> +          cat > Dockerfile.${{ matrix.base_image_name }} << 'EOF'
> +          FROM ${{ matrix.base_image }}
> +          RUN ${{ matrix.install_cmd }}
> +          RUN git config --global --add safe.directory '*' && \
> +              git config --global user.name "kdevops-ci" && \
> +              git config --global user.email "kdevops@lists.linux.dev"
> +          RUN mkdir -p /github/home/.ssh && chmod 700 /github/home/.ssh
> +          ENV USER=kdevops-ci
> +          ENV HOME=/github/home
> +          WORKDIR /workspace
> +          EOF
> +
> +      - name: Build and test ${{ matrix.base_image_name }} container
> +        run: |
> +          IMAGE_TAG="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-${{ matrix.base_image_name }}:${{ github.sha }}"
> +
> +          # Build container
> +          docker build -f Dockerfile.${{ matrix.base_image_name }} -t "$IMAGE_TAG" .
> +
> +          # Test basic functionality
> +          docker run --rm -v "$PWD:/workspace" "$IMAGE_TAG" sh -c "
> +            echo '🧪 Testing kdevops build in ${{ matrix.base_image_name }} container'
> +            make mrproper
> +            echo '✅ Basic kdevops build validation passed'
> +          "
> +
> +          # Push container
> +          docker push "$IMAGE_TAG"
> +
> +      - name: Set outputs for downstream jobs (debian only)
> +        id: set-outputs-debian
> +        if: matrix.base_image_name == 'debian'
> +        run: |
> +          ./scripts/github_output.sh debian-image "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-debian:${{ github.sha }}"
> +
> +      - name: Set outputs for downstream jobs (fedora only)
> +        id: set-outputs-fedora
> +        if: matrix.base_image_name == 'fedora'
> +        run: |
> +          ./scripts/github_output.sh fedora-image "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-fedora:${{ github.sha }}"
> +
> +      - name: Set outputs for downstream jobs (opensuse only)
> +        id: set-outputs-opensuse
> +        if: matrix.base_image_name == 'opensuse'
> +        run: |
> +          ./scripts/github_output.sh opensuse-image "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-opensuse:${{ github.sha }}"
> +
> +  linux-ab-config-tests:
> +    name: Linux A/B Tests (${{ matrix.distro_name }})
> +    runs-on: ubuntu-latest
> +    needs: build-kdevops-containers
> +    strategy:
> +      fail-fast: false
> +      matrix:
> +        include:
> +          - distro_name: debian
> +            container_image: ${{ needs.build-kdevops-containers.outputs.debian-image }}
> +          - distro_name: fedora
> +            container_image: ${{ needs.build-kdevops-containers.outputs.fedora-image }}
> +          - distro_name: opensuse
> +            container_image: ${{ needs.build-kdevops-containers.outputs.opensuse-image }}
> +    container: ${{ matrix.container_image }}
> +    steps:
> +      - name: Checkout repository
> +        uses: actions/checkout@v4
> +
> +      - name: Run Linux A/B testing configuration validation
> +        run: |
> +          echo "🧪 Running comprehensive A/B configuration tests on ${{ matrix.distro_name }}..."
> +          echo "This validates all 3 build methods without requiring VMs"
> +          make check-linux-ab
> +
> +      - name: Validate A/B test results and generated files
> +        run: |
> +          echo "✅ All A/B configuration tests passed on ${{ matrix.distro_name }}!"
> +          echo "📋 Validated configurations:"
> +          echo "  - Target build method A/B setup"
> +          echo "  - 9P build method A/B setup"
> +          echo "  - Builder method A/B setup"
> +          echo "  - Kernel reference differentiation"
> +          echo "  - Configuration file generation (.config, .extra_vars_auto.yaml, extra_vars.yaml)"
> +          echo "  - Cross-distribution compatibility: ${{ matrix.distro_name }}"
> +
> +  quick-config-validation:
> +    name: Quick Config Tests (${{ matrix.defconfig }}) on ${{ matrix.distro_name }}
> +    runs-on: ubuntu-latest
> +    needs: build-kdevops-containers
> +    strategy:
> +      fail-fast: false
> +      matrix:
> +        defconfig: [blktests_nvme, xfs_reflink_4k, lbs-xfs, linux-ab-testing]
> +        distro_name: [debian, fedora, opensuse]
> +        include:
> +          - distro_name: debian
> +            container_image: ${{ needs.build-kdevops-containers.outputs.debian-image }}
> +          - distro_name: fedora
> +            container_image: ${{ needs.build-kdevops-containers.outputs.fedora-image }}
> +          - distro_name: opensuse
> +            container_image: ${{ needs.build-kdevops-containers.outputs.opensuse-image }}
> +    container: ${{ matrix.container_image }}
> +    steps:
> +      - name: Checkout repository
> +        uses: actions/checkout@v4
> +
> +      - name: Test defconfig-${{ matrix.defconfig }} configuration
> +        run: |
> +          echo "🔧 Testing defconfig-${{ matrix.defconfig }} configuration on ${{ matrix.distro_name }}..."
> +          make mrproper
> +          make defconfig-${{ matrix.defconfig }}
> +          echo "📁 Checking files after defconfig..."
> +          test -f .config || (echo "❌ .config not generated by defconfig" && exit 1)
> +          test -f .extra_vars_auto.yaml || (echo "❌ .extra_vars_auto.yaml not generated by defconfig" && exit 1)
> +          echo "✅ defconfig generated .config and .extra_vars_auto.yaml successfully"
> +
> +      - name: Generate configuration files (container-safe)
> +        run: |
> +          echo "🔨 Generating core configuration files without systemd services..."
> +          # Generate the essential files from DEFAULT_DEPS but skip LOCALHOST_SETUP_WORK (systemd)
> +          # This generates: .kdevops.depcheck, extra_vars.yaml, ansible.cfg, hosts
> +          make .kdevops.depcheck
> +          make extra_vars.yaml
> +          make $PWD/ansible.cfg
> +          make $PWD/hosts
> +          echo "✅ Core configuration files generated successfully"
> +
> +      - name: Verify all generated configuration files
> +        run: |
> +          echo "📁 Validating all generated configuration files..."
> +          test -f .config || (echo "❌ .config not found" && exit 1)
> +          test -f .extra_vars_auto.yaml || (echo "❌ .extra_vars_auto.yaml not found" && exit 1)
> +          test -f extra_vars.yaml || (echo "❌ extra_vars.yaml not generated by make" && exit 1)
> +          test -f .kdevops.depcheck || (echo "❌ .kdevops.depcheck not found" && exit 1)
> +          test -f ansible.cfg || (echo "❌ ansible.cfg not found" && exit 1)
> +          test -f hosts || (echo "❌ hosts not found" && exit 1)
> +          echo "✅ All required configuration files generated:"
> +          echo "  - .config (kernel-style configuration)"
> +          echo "  - .extra_vars_auto.yaml (auto-generated from defconfig)"
> +          echo "  - extra_vars.yaml (final ansible variables from make)"
> +          echo "  - .kdevops.depcheck (dependency verification)"
> +          echo "  - ansible.cfg (ansible configuration)"
> +          echo "  - hosts (inventory file)"
> diff --git a/.github/workflows/docker-tests.yml b/.github/workflows/docker-tests.yml
> deleted file mode 100644
> index 33d67f09..00000000
> --- a/.github/workflows/docker-tests.yml
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -name: kdevops Docker Tests
> -
> -on:
> -  push:
> -    branches:
> -      - '**'
> -  pull_request:
> -    branches:
> -      - '**'
> -
> -jobs:
> -  setup-and-make:
> -    name: Setup and Run Make Targets
> -    runs-on: ubuntu-latest
> -    strategy:
> -      matrix:
> -        distro_container:
> -          - debian:testing
> -          - fedora:latest
> -          - opensuse/tumbleweed
> -
> -    container: ${{ matrix.distro_container }}
> -    steps:
> -      - name: Document supported kdevops distribution
> -        run: |
> -          echo "Running test on ${{ matrix.distro_container }} container"
> -          uname -a
> -
> -      - name: Install kdevops dependencies
> -        run: |
> -          # Conditional package installation based on the container
> -          if [ "${{ matrix.distro_container }}" = "debian:testing" ]; then
> -            echo "Installing packages for Debian"
> -            apt-get update
> -            apt-get install -y ansible-core make gcc ncurses-dev bison flex
> -          elif [ "${{ matrix.distro_container }}" = "fedora:latest" ]; then
> -            echo "Installing packages for Fedora"
> -            dnf install -y ansible make gcc ncurses-devel bison flex
> -          elif [ "${{ matrix.distro_container }}" = "opensuse/tumbleweed" ]; then
> -            echo "Installing packages for OpenSUSE"
> -            zypper refresh
> -            zypper install -y ansible make gcc ncurses-devel bison flex
> -          else
> -            echo "Unknown distribution: ${{ matrix.distro_container }}"
> -            exit 1
> -          fi
> -
> -      - name: Checkout repository
> -        uses: actions/checkout@v4
> -
> -      - name: Run make targets
> -        run: |
> -          echo "Running simple make targets on ${{ matrix.distro_container }} environment"
> -          make mrproper
> -
> diff --git a/.github/workflows/linux-ab.yml b/.github/workflows/linux-ab.yml
> deleted file mode 100644
> index 9162c887..00000000
> --- a/.github/workflows/linux-ab.yml
> +++ /dev/null
> @@ -1,47 +0,0 @@
> -name: Run kdevops linux-ab tests on self-hosted runner
> -
> -on:
> -  push:
> -    branches:
> -      - '**'
> -  pull_request:
> -    branches:
> -      - '**'
> -  workflow_dispatch:  # Add this for manual triggering of the workflow
> -
> -jobs:
> -  run-kdevops:
> -    name: Run kdevops CI
> -    runs-on: [self-hosted, Linux, X64]
> -    steps:
> -      - name: Checkout repository
> -        uses: actions/checkout@v4
> -
> -      - name: Set CI metadata for kdevops-results-archive
> -        run: |
> -          echo "$(basename ${{ github.repository }})" > ci.trigger
> -          git log -1 --pretty=format:"%s" > ci.subject
> -          # Start out pessimistic
> -          echo "not ok" > ci.result
> -          echo "Nothing to write home about." > ci.commit_extra
> -
> -      - name: Set kdevops path
> -        run: echo "KDEVOPS_PATH=$GITHUB_WORKSPACE" >> $GITHUB_ENV
> -
> -      - name: Configure git
> -        run: |
> -          git config --global --add safe.directory '*'
> -          git config --global user.name "kdevops"
> -          git config --global user.email "kdevops@lists.linux.dev"
> -
> -      - name: Run kdevops check-linux-ab
> -        run: |
> -          make check-linux-ab
> -          echo "ok" > ci.result
> -
> -      # Ensure make destroy always runs, even on failure
> -      - name: Run kdevops make destroy
> -        if: always()  # This ensures the step runs even if previous steps failed
> -        run: |
> -          make destroy
> -          make mrproper
> diff --git a/scripts/test-linux-ab.sh b/scripts/test-linux-ab.sh
> index a13964e4..02f9fb12 100755
> --- a/scripts/test-linux-ab.sh
> +++ b/scripts/test-linux-ab.sh
> @@ -1,11 +1,18 @@
>  #!/bin/bash
>  # SPDX-License-Identifier: copyleft-next-0.3.1
>  #
> -# Test A/B configuration locally of all Linux AB configurations posisble.
> +# Test A/B configuration locally of all Linux AB configurations possible.
>  # The goal is to verify your extra_vars.yaml ends up with different kernel
>  # target refs for A and B group hosts. It does so also by checking that
>  # ansible will use these. No real bringup or live test is done.
>  #
> +# Note: Originally this script ran full 'make' for each build method, but
> +# GitHub Actions containers lack systemd and infrastructure dependencies
> +# that kdevops requires. Since we only need to verify configuration
> +# generation (not infrastructure setup), we run 'make extra_vars.yaml'
> +# which generates the ansible variables needed for A/B validation while
> +# skipping systemd services and other GitHub-incompatible components.
> +#
>  # Outputs TAP (Test Anything Protocol) format results
>  
>  set -e
> @@ -115,11 +122,11 @@ for method in $BUILD_METHODS; do
>          continue
>      fi
>  
> -    # Generate configuration
> -    if make >/dev/null 2>&1; then
> -        tap_result "ok" "$method: Generate configuration (make)"
> +    # Generate configuration (container-safe)
> +    if make extra_vars.yaml >/dev/null 2>&1; then
> +        tap_result "ok" "$method: Generate configuration (extra_vars.yaml)"
>      else
> -        tap_result "not ok" "$method: Generate configuration (make)" "Failed to run make"
> +        tap_result "not ok" "$method: Generate configuration (extra_vars.yaml)" "Failed to generate extra_vars.yaml"
>          continue
>      fi
>  
> 
> ---
> base-commit: 8dbe585321511e839b0cbab5b2bb3048eb5346e9
> change-id: 20250926-ci-unify-github-hosted-runners-workflows-05f2125620ce
> 
> Best regards,
> --  
> Daniel Gomez <da.gomez@samsung.com>
> 

Applied and pushed!

      reply	other threads:[~2025-09-26 23:02 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-26 21:52 [PATCH] github: unify docker-tests and linux-ab Daniel Gomez
2025-09-26 23:01 ` Daniel Gomez [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=108a9a59-1ab2-40fc-a1bc-962bc8d088d7@kernel.org \
    --to=da.gomez@kernel.org \
    --cc=da.gomez@samsung.com \
    --cc=kdevops@lists.linux.dev \
    --cc=mcgrof@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox