* [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI
@ 2025-04-01 9:24 Alan Maguire
2025-04-01 9:24 ` [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test Alan Maguire
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Alan Maguire @ 2025-04-01 9:24 UTC (permalink / raw)
To: acme
Cc: ihor.solodrai, yonghong.song, dwarves, ast, andrii, bpf, daniel,
song, eddyz87, olsajiri, Alan Maguire
libbpf and bpf kernel patch infrastructure have made great use
of github actions to provide continuous integration (CI) testing.
Here the libbpf CI is adapted to build pahole and run the associated
selftests. Examples of what the action workflows look like are
at [1] and [2].
Details about the workflows can be found in patch 1.
Patch 2 fixes an issue exposed by the dwarves-build workflow -
a compilation error when building dwarves with clang.
Changes since v1:
- rework to be locally executable as bash scripts as well as via
GitHub actions (Ihor, patch 1)
- add note to README about various ways of running tests via
GitHub actions, local scripts (Arnaldo, patch 1)
[1] https://github.com/alan-maguire/dwarves/actions/runs/14191907449
[2] https://github.com/alan-maguire/dwarves/actions/runs/14191907451
Alan Maguire (2):
dwarves: Add github actions to build, test
dwarves: Fix clang warning about unused variable
.github/scripts/build-debian.sh | 92 ++++++++++++++++++++++++++++++++
.github/scripts/build-kernel.sh | 35 ++++++++++++
.github/scripts/build-pahole.sh | 17 ++++++
.github/scripts/run-selftests.sh | 15 ++++++
.github/scripts/travis_wait.bash | 61 +++++++++++++++++++++
.github/workflows/build.yml | 34 ++++++++++++
.github/workflows/codeql.yml | 53 ++++++++++++++++++
.github/workflows/coverity.yml | 33 ++++++++++++
.github/workflows/lint.yml | 20 +++++++
.github/workflows/ondemand.yml | 31 +++++++++++
.github/workflows/test.yml | 36 +++++++++++++
.github/workflows/vmtest.yml | 62 +++++++++++++++++++++
README | 18 +++++++
dwarves_fprintf.c | 2 +-
14 files changed, 508 insertions(+), 1 deletion(-)
create mode 100755 .github/scripts/build-debian.sh
create mode 100755 .github/scripts/build-kernel.sh
create mode 100755 .github/scripts/build-pahole.sh
create mode 100755 .github/scripts/run-selftests.sh
create mode 100755 .github/scripts/travis_wait.bash
create mode 100644 .github/workflows/build.yml
create mode 100644 .github/workflows/codeql.yml
create mode 100644 .github/workflows/coverity.yml
create mode 100644 .github/workflows/lint.yml
create mode 100644 .github/workflows/ondemand.yml
create mode 100644 .github/workflows/test.yml
create mode 100644 .github/workflows/vmtest.yml
--
2.43.5
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test
2025-04-01 9:24 [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI Alan Maguire
@ 2025-04-01 9:24 ` Alan Maguire
2025-04-08 19:09 ` Ihor Solodrai
2025-04-01 9:24 ` [PATCH v2 dwarves 2/2] dwarves: Fix clang warning about unused variable Alan Maguire
2025-04-10 18:04 ` [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI Alan Maguire
2 siblings, 1 reply; 8+ messages in thread
From: Alan Maguire @ 2025-04-01 9:24 UTC (permalink / raw)
To: acme
Cc: ihor.solodrai, yonghong.song, dwarves, ast, andrii, bpf, daniel,
song, eddyz87, olsajiri, Alan Maguire
Borrowing heavily from libbpf github actions, add workflows to
- build dwarves for gcc, LLVM
- build dwarves for x86_64/aarch64 and use it to build a Linux
kernel including BTF generation; then run dwarves selftests
using generated vmlinux
These workflows trigger on all pushes. This will allow both
developers working on dwarves to push a branch to their github
repo and test, and also for maintainer pushes from git.kernel.org
pahole repo to trigger tests.
The build/test workflows can also be run as bash scripts locally,
as is described in the toplevel README.
Similar to libbpf, additional workflows for coverity etc
are triggered for pushes to master/next.
Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
---
.github/scripts/build-debian.sh | 92 ++++++++++++++++++++++++++++++++
.github/scripts/build-kernel.sh | 35 ++++++++++++
.github/scripts/build-pahole.sh | 17 ++++++
.github/scripts/run-selftests.sh | 15 ++++++
.github/scripts/travis_wait.bash | 61 +++++++++++++++++++++
.github/workflows/build.yml | 34 ++++++++++++
.github/workflows/codeql.yml | 53 ++++++++++++++++++
.github/workflows/coverity.yml | 33 ++++++++++++
.github/workflows/lint.yml | 20 +++++++
.github/workflows/ondemand.yml | 31 +++++++++++
.github/workflows/test.yml | 36 +++++++++++++
.github/workflows/vmtest.yml | 62 +++++++++++++++++++++
README | 18 +++++++
13 files changed, 507 insertions(+)
create mode 100755 .github/scripts/build-debian.sh
create mode 100755 .github/scripts/build-kernel.sh
create mode 100755 .github/scripts/build-pahole.sh
create mode 100755 .github/scripts/run-selftests.sh
create mode 100755 .github/scripts/travis_wait.bash
create mode 100644 .github/workflows/build.yml
create mode 100644 .github/workflows/codeql.yml
create mode 100644 .github/workflows/coverity.yml
create mode 100644 .github/workflows/lint.yml
create mode 100644 .github/workflows/ondemand.yml
create mode 100644 .github/workflows/test.yml
create mode 100644 .github/workflows/vmtest.yml
diff --git a/.github/scripts/build-debian.sh b/.github/scripts/build-debian.sh
new file mode 100755
index 0000000..5a0789a
--- /dev/null
+++ b/.github/scripts/build-debian.sh
@@ -0,0 +1,92 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (c) 2025, Oracle and/or its affiliates.
+#
+
+PHASES=(${@:-SETUP RUN CLEANUP})
+DEBIAN_RELEASE="${DEBIAN_RELEASE:-testing}"
+CONT_NAME="${CONT_NAME:-dwarves-debian-$DEBIAN_RELEASE}"
+ENV_VARS="${ENV_VARS:-}"
+DOCKER_RUN="${DOCKER_RUN:-docker run}"
+REPO_ROOT="${REPO_ROOT:-$PWD}"
+ADDITIONAL_DEPS=(pkgconf)
+EXTRA_CFLAGS=""
+EXTRA_LDFLAGS=""
+
+function info() {
+ echo -e "\033[33;1m$1\033[0m"
+}
+
+function error() {
+ echo -e "\033[31;1m$1\033[0m"
+}
+
+function docker_exec() {
+ docker exec $ENV_VARS $CONT_NAME "$@"
+}
+
+set -eu
+
+source "$(dirname $0)/travis_wait.bash"
+
+for phase in "${PHASES[@]}"; do
+ case $phase in
+ SETUP)
+ info "Setup phase"
+ info "Using Debian $DEBIAN_RELEASE"
+
+ docker --version
+
+ docker pull debian:$DEBIAN_RELEASE
+ info "Starting container $CONT_NAME"
+ $DOCKER_RUN -v $REPO_ROOT:/build:rw \
+ -w /build --privileged=true --name $CONT_NAME \
+ -dit --net=host debian:$DEBIAN_RELEASE /bin/bash
+ echo -e "::group::Build Env Setup"
+
+ docker_exec apt-get -y update
+ docker_exec apt-get -y install aptitude
+ docker_exec aptitude -y install make cmake libz-dev libelf-dev libdw-dev git
+ docker_exec aptitude -y install "${ADDITIONAL_DEPS[@]}"
+ echo -e "::endgroup::"
+ ;;
+ RUN|RUN_CLANG|RUN_CLANG16|RUN_GCC12)
+ CC="cc"
+ if [[ "$phase" =~ "RUN_CLANG(\d+)(_ASAN)?" ]]; then
+ ENV_VARS="-e CC=clang-${BASH_REMATCH[1]} -e CXX=clang++-${BASH_REMATCH[1]}"
+ CC="clang-${BASH_REMATCH[1]}"
+ elif [[ "$phase" = *"CLANG"* ]]; then
+ ENV_VARS="-e CC=clang -e CXX=clang++"
+ CC="clang"
+ elif [[ "$phase" =~ "RUN_GCC(\d+)(_ASAN)?" ]]; then
+ ENV_VARS="-e CC=gcc-${BASH_REMATCH[1]} -e CXX=g++-${BASH_REMATCH[1]}"
+ CC="gcc-${BASH_REMATCH[1]}"
+ fi
+ if [[ "$CC" != "cc" ]]; then
+ docker_exec aptitude -y install "$CC"
+ else
+ docker_exec aptitude -y install gcc
+ fi
+ git config --global --add safe.directory $REPO_ROOT
+ pushd $REPO_ROOT
+ git submodule update --init
+ popd
+ docker_exec mkdir build install
+ docker_exec ${CC} --version
+ info "build"
+ docker_exec cmake -DGIT_SUBMODULE=OFF .
+ docker_exec make -j$((4*$(nproc)))
+ info "install"
+ docker_exec make DESTDIR=../install install
+ ;;
+ CLEANUP)
+ info "Cleanup phase"
+ docker stop $CONT_NAME
+ docker rm -f $CONT_NAME
+ ;;
+ *)
+ echo >&2 "Unknown phase '$phase'"
+ exit 1
+ esac
+done
diff --git a/.github/scripts/build-kernel.sh b/.github/scripts/build-kernel.sh
new file mode 100755
index 0000000..41a3cf8
--- /dev/null
+++ b/.github/scripts/build-kernel.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/bash
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (c) 2025, Oracle and/or its affiliates.
+#
+
+GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(dirname $0)/../..}
+INPUTS_ARCH=${INPUTS_ARCH:-$(uname -m)}
+REPO=${REPO:-https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git}
+REPO_BRANCH=${REPO_BRANCH:-master}
+REPO_TARGET=${GITHUB_WORKSPACE}/.kernel
+
+export PATH=${GITHUB_WORKSPACE}/install/usr/local/bin:${PATH}
+export PAHOLE=${GITHUB_WORKSPACE}/install/usr/local/bin/pahole
+
+which pahole
+$PAHOLE --version
+
+if [[ ! -d $REPO_TARGET ]]; then
+ git clone $REPO $REPO_TARGET
+fi
+cd $REPO_TARGET
+git checkout $REPO_BRANCH
+
+cat tools/testing/selftests/bpf/config \
+ tools/testing/selftests/bpf/config.${INPUTS_ARCH} > .config
+# this file might or might not exist depending on kernel version
+if [[ -f tools/testing/selftests/bpf/config.vm ]]; then
+ cat tools/testing/selftests/bpf/config.vm >> .config
+fi
+make olddefconfig && make prepare
+grep PAHOLE .config
+grep _BTF .config
+make -j $((4*$(nproc))) all
+
diff --git a/.github/scripts/build-pahole.sh b/.github/scripts/build-pahole.sh
new file mode 100755
index 0000000..64f9eea
--- /dev/null
+++ b/.github/scripts/build-pahole.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/bash
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (c) 2025, Oracle and/or its affiliates.
+#
+
+GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(dirname $0)/../..}
+cd $GITHUB_WORKSPACE
+git config --global --add safe.directory $GITHUB_WORKSPACE
+git submodule update --init
+mkdir -p build
+cd build
+pwd
+cmake -DGIT_SUBMODULE=OFF -DBUILD_SHARED_LIBS=OFF ..
+make -j$((4*$(nproc))) all
+make DESTDIR=../install install
+
diff --git a/.github/scripts/run-selftests.sh b/.github/scripts/run-selftests.sh
new file mode 100755
index 0000000..f9ba24e
--- /dev/null
+++ b/.github/scripts/run-selftests.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/bash
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (c) 2025, Oracle and/or its affiliates.
+#
+
+GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(pwd)}
+VMLINUX=${GITHUB_WORKSPACE}/.kernel/vmlinux
+SELFTESTS=${GITHUB_WORKSPACE}/tests
+cd $SELFTESTS
+export PATH=${GITHUB_WORKSPACE}/install/usr/local/bin:${PATH}
+which pahole
+pahole --version
+vmlinux=$VMLINUX ./tests
+
diff --git a/.github/scripts/travis_wait.bash b/.github/scripts/travis_wait.bash
new file mode 100755
index 0000000..acf6ad1
--- /dev/null
+++ b/.github/scripts/travis_wait.bash
@@ -0,0 +1,61 @@
+# This was borrowed from https://github.com/travis-ci/travis-build/tree/master/lib/travis/build/bash
+# to get around https://github.com/travis-ci/travis-ci/issues/9979. It should probably be removed
+# as soon as Travis CI has started to provide an easy way to export the functions to bash scripts.
+
+travis_jigger() {
+ local cmd_pid="${1}"
+ shift
+ local timeout="${1}"
+ shift
+ local count=0
+
+ echo -e "\\n"
+
+ while [[ "${count}" -lt "${timeout}" ]]; do
+ count="$((count + 1))"
+ echo -ne "Still running (${count} of ${timeout}): ${*}\\r"
+ sleep 60
+ done
+
+ echo -e "\\n${ANSI_RED}Timeout (${timeout} minutes) reached. Terminating \"${*}\"${ANSI_RESET}\\n"
+ kill -9 "${cmd_pid}"
+}
+
+travis_wait() {
+ local timeout="${1}"
+
+ if [[ "${timeout}" =~ ^[0-9]+$ ]]; then
+ shift
+ else
+ timeout=20
+ fi
+
+ local cmd=("${@}")
+ local log_file="travis_wait_${$}.log"
+
+ "${cmd[@]}" &>"${log_file}" &
+ local cmd_pid="${!}"
+
+ travis_jigger "${!}" "${timeout}" "${cmd[@]}" &
+ local jigger_pid="${!}"
+ local result
+
+ {
+ set +e
+ wait "${cmd_pid}" 2>/dev/null
+ result="${?}"
+ ps -p"${jigger_pid}" &>/dev/null && kill "${jigger_pid}"
+ set -e
+ }
+
+ if [[ "${result}" -eq 0 ]]; then
+ echo -e "\\n${ANSI_GREEN}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}"
+ else
+ echo -e "\\n${ANSI_RED}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}"
+ fi
+
+ echo -e "\\n${ANSI_GREEN}Log:${ANSI_RESET}\\n"
+ cat "${log_file}"
+
+ return "${result}"
+}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..25a395f
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,34 @@
+name: dwarves-build
+
+on:
+ pull_request:
+ push:
+ schedule:
+ - cron: '0 18 * * *'
+
+concurrency:
+ group: ci-build-${{ github.head_ref }}
+ cancel-in-progress: true
+
+jobs:
+
+ debian:
+ runs-on: ubuntu-latest
+ name: Debian Build (${{ matrix.name }})
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - name: default
+ target: RUN
+ - name: gcc-12
+ target: RUN_GCC12
+ - name: clang
+ target: RUN_CLANG
+ steps:
+ - uses: actions/checkout@v4
+ name: Checkout
+ - name: setup
+ shell: bash
+ run: ./.github/scripts/build-debian.sh SETUP ${{ matrix.target }}
+
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..a140be1
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,53 @@
+---
+# vi: ts=2 sw=2 et:
+
+name: "CodeQL"
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - master
+ - next
+
+permissions:
+ contents: read
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+ concurrency:
+ group: ${{ github.workflow }}-${{ matrix.language }}-${{ github.ref }}
+ cancel-in-progress: true
+ permissions:
+ actions: read
+ security-events: write
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: ['cpp', 'python']
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: ${{ matrix.language }}
+ queries: +security-extended,security-and-quality
+
+ - name: Setup
+ uses: ./.github/actions/setup
+
+ - name: Build
+ run: |
+ source /tmp/ci_setup
+ make -C ./src
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml
new file mode 100644
index 0000000..97a04d4
--- /dev/null
+++ b/.github/workflows/coverity.yml
@@ -0,0 +1,33 @@
+name: dwarves-ci-coverity
+
+on:
+ push:
+ branches:
+ - master
+ - next
+ schedule:
+ - cron: '0 18 * * *'
+
+jobs:
+ coverity:
+ runs-on: ubuntu-latest
+ name: Coverity
+ env:
+ COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: ./.github/actions/setup
+ - name: Run coverity
+ if: ${{ env.COVERITY_SCAN_TOKEN }}
+ run: |
+ source /tmp/ci_setup
+ export COVERITY_SCAN_NOTIFICATION_EMAIL="${AUTHOR_EMAIL}"
+ export COVERITY_SCAN_BRANCH_PATTERN=${GITHUB_REF##refs/*/}
+ export TRAVIS_BRANCH=${COVERITY_SCAN_BRANCH_PATTERN}
+ scripts/coverity.sh
+ env:
+ COVERITY_SCAN_PROJECT_NAME: dwarves
+ COVERITY_SCAN_BUILD_COMMAND_PREPEND: 'cmake .'
+ COVERITY_SCAN_BUILD_COMMAND: 'make'
+ - name: SCM log
+ run: cat /home/runner/work/dwarves/cov-int/scm_log.txt
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 0000000..ca13052
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,20 @@
+name: "lint"
+
+on:
+ pull_request:
+ push:
+ branches:
+ - master
+ - next
+
+jobs:
+ shellcheck:
+ name: ShellCheck
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Run ShellCheck
+ uses: ludeeus/action-shellcheck@master
+ env:
+ SHELLCHECK_OPTS: --severity=error
diff --git a/.github/workflows/ondemand.yml b/.github/workflows/ondemand.yml
new file mode 100644
index 0000000..5f3034f
--- /dev/null
+++ b/.github/workflows/ondemand.yml
@@ -0,0 +1,31 @@
+name: ondemand
+
+on:
+ workflow_dispatch:
+ inputs:
+ arch:
+ default: 'x86_64'
+ required: true
+ llvm-version:
+ default: '18'
+ required: true
+ kernel:
+ default: 'LATEST'
+ required: true
+ pahole:
+ default: "master"
+ required: true
+ runs-on:
+ default: 'ubuntu-24.04'
+ required: true
+
+jobs:
+ vmtest:
+ name: ${{ inputs.kernel }} kernel llvm-${{ inputs.llvm-version }} pahole@${{ inputs.pahole }}
+ uses: ./.github/workflows/vmtest.yml
+ with:
+ runs_on: ${{ inputs.runs-on }}
+ kernel: ${{ inputs.kernel }}
+ arch: ${{ inputs.arch }}
+ llvm-version: ${{ inputs.llvm-version }}
+ pahole: ${{ inputs.pahole }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..f11ebfe
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,36 @@
+name: dwarves-ci
+
+on:
+ pull_request:
+ push:
+ schedule:
+ - cron: '0 18 * * *'
+
+concurrency:
+ group: ci-test-${{ github.head_ref }}
+ cancel-in-progress: true
+
+jobs:
+ vmtest:
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - kernel: 'LATEST'
+ runs_on: 'ubuntu-24.04'
+ arch: 'x86_64'
+ llvm-version: '18'
+ pahole: 'master'
+ - kernel: 'LATEST'
+ runs_on: 'ubuntu-24.04-arm'
+ arch: 'aarch64'
+ llvm-version: '18'
+ pahole: 'tmp.master'
+ name: Linux ${{ matrix.kernel }}
+ uses: ./.github/workflows/vmtest.yml
+ with:
+ runs_on: ${{ matrix.runs_on }}
+ kernel: ${{ matrix.kernel }}
+ arch: ${{ matrix.arch }}
+ llvm-version: ${{ matrix.llvm-version }}
+ pahole: ${{ matrix.pahole }}
diff --git a/.github/workflows/vmtest.yml b/.github/workflows/vmtest.yml
new file mode 100644
index 0000000..0f66eed
--- /dev/null
+++ b/.github/workflows/vmtest.yml
@@ -0,0 +1,62 @@
+name: 'Build kernel run selftests via vmtest'
+
+on:
+ workflow_call:
+ inputs:
+ runs_on:
+ required: true
+ default: 'ubuntu-24.04'
+ type: string
+ arch:
+ description: 'what arch to test'
+ required: true
+ default: 'x86_64'
+ type: string
+ kernel:
+ description: 'kernel version or LATEST'
+ required: true
+ default: 'LATEST'
+ type: string
+ pahole:
+ description: 'pahole rev or branch'
+ required: false
+ default: 'master'
+ type: string
+ llvm-version:
+ description: 'llvm version'
+ required: false
+ default: '18'
+ type: string
+jobs:
+ vmtest:
+ name: pahole@${{ inputs.arch }}
+ runs-on: ${{ inputs.runs_on }}
+ steps:
+
+ - uses: actions/checkout@v4
+
+ - name: Setup environment
+ uses: libbpf/ci/setup-build-env@v3
+ with:
+ pahole: ${{ inputs.pahole }}
+ arch: ${{ inputs.arch }}
+ llvm-version: ${{ inputs.llvm-version }}
+
+ - name: Build,install current pahole
+ shell: bash
+ run: .github/scripts/build-pahole.sh
+
+ - name: Get kernel source
+ uses: libbpf/ci/get-linux-source@v3
+ with:
+ repo: 'https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git'
+ dest: '${{ github.workspace }}/.kernel'
+
+ - name: Configure, build kernel with current pahole
+ shell: bash
+ run: .github/scripts/build-kernel.sh
+
+ - name: Run selftests
+ shell: bash
+ run: .github/scripts/run-selftests.sh
+
diff --git a/README b/README
index 7ee3b87..a938266 100644
--- a/README
+++ b/README
@@ -21,3 +21,21 @@ cmake Options:
You may need to update the libbpf git submodule:
git submodule update --init --recursive
+
+Testing:
+
+Tests are available in the tests subdirectory and should be run prior to
+submitting patches. Patches that add functionality should add to tests
+here also. Tests can be run by
+
+- running the scripts directly using a pre-existing vmlinux binary; i.e.
+ cd tests ; vmlinux=/path/2/vmlinux ./tests
+ (the vmlinux binary must contain DWARF to be converted to BTF)
+
+- running the tests via local scripts in .github/scripts; i.e.
+ bash .github/scripts/build-pahole.sh; \
+ bash .github/scripts/build-kernel.sh; \
+ bash .github/scripts/run-selftests.sh
+- via GitHub actions: push a branch to a GitHub repo; actions will be
+ triggered for build and test matching the above steps. See the "Actions"
+ tab in the github repo for info on job pass/fail and logs.
--
2.43.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 dwarves 2/2] dwarves: Fix clang warning about unused variable
2025-04-01 9:24 [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI Alan Maguire
2025-04-01 9:24 ` [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test Alan Maguire
@ 2025-04-01 9:24 ` Alan Maguire
2025-04-10 18:04 ` [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI Alan Maguire
2 siblings, 0 replies; 8+ messages in thread
From: Alan Maguire @ 2025-04-01 9:24 UTC (permalink / raw)
To: acme
Cc: ihor.solodrai, yonghong.song, dwarves, ast, andrii, bpf, daniel,
song, eddyz87, olsajiri, Alan Maguire
With dwarves CI, clang builds give a legit warning:
/build/dwarves_fprintf.c:2102:9: error: variable 'printed' set but not used [-Werror,-Wunused-but-set-variable]
2102 | size_t printed = fprintf(fp, "namespace %s {\n", namespace__name(space));
| ^
1 error generated.
And in fact we accumulate values in printed but never use it
for the return value. Add the printed count to the final fprintf().
Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
---
dwarves_fprintf.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dwarves_fprintf.c b/dwarves_fprintf.c
index c3e7f3c..4407fd1 100644
--- a/dwarves_fprintf.c
+++ b/dwarves_fprintf.c
@@ -2110,7 +2110,7 @@ static size_t namespace__fprintf(const struct tag *tag, const struct cu *cu,
printed += fprintf(fp, "\n\n");
}
- return fprintf(fp, "%.*s}", conf->indent, tabs);
+ return printed + fprintf(fp, "%.*s}", conf->indent, tabs);
}
size_t tag__fprintf(struct tag *tag, const struct cu *cu,
--
2.43.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test
2025-04-01 9:24 ` [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test Alan Maguire
@ 2025-04-08 19:09 ` Ihor Solodrai
2025-04-09 8:59 ` Alan Maguire
0 siblings, 1 reply; 8+ messages in thread
From: Ihor Solodrai @ 2025-04-08 19:09 UTC (permalink / raw)
To: Alan Maguire, acme
Cc: yonghong.song, dwarves, ast, andrii, bpf, daniel, song, eddyz87,
olsajiri, Alan Maguire
On 4/1/25 2:24 AM, Alan Maguire wrote:
> Borrowing heavily from libbpf github actions, add workflows to
>
> - build dwarves for gcc, LLVM
>
> - build dwarves for x86_64/aarch64 and use it to build a Linux
> kernel including BTF generation; then run dwarves selftests
> using generated vmlinux
>
> These workflows trigger on all pushes. This will allow both
> developers working on dwarves to push a branch to their github
> repo and test, and also for maintainer pushes from git.kernel.org
> pahole repo to trigger tests.
>
> The build/test workflows can also be run as bash scripts locally,
> as is described in the toplevel README.
>
> Similar to libbpf, additional workflows for coverity etc
> are triggered for pushes to master/next.
>
> Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
Hi Alan. Thanks for addressing my comments.
Acked-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Some nits and questions below.
> ---
> .github/scripts/build-debian.sh | 92 ++++++++++++++++++++++++++++++++
> .github/scripts/build-kernel.sh | 35 ++++++++++++
> .github/scripts/build-pahole.sh | 17 ++++++
> .github/scripts/run-selftests.sh | 15 ++++++
> .github/scripts/travis_wait.bash | 61 +++++++++++++++++++++
> .github/workflows/build.yml | 34 ++++++++++++
> .github/workflows/codeql.yml | 53 ++++++++++++++++++
> .github/workflows/coverity.yml | 33 ++++++++++++
> .github/workflows/lint.yml | 20 +++++++
> .github/workflows/ondemand.yml | 31 +++++++++++
> .github/workflows/test.yml | 36 +++++++++++++
> .github/workflows/vmtest.yml | 62 +++++++++++++++++++++
> README | 18 +++++++
> 13 files changed, 507 insertions(+)
> create mode 100755 .github/scripts/build-debian.sh
> create mode 100755 .github/scripts/build-kernel.sh
> create mode 100755 .github/scripts/build-pahole.sh
> create mode 100755 .github/scripts/run-selftests.sh
> create mode 100755 .github/scripts/travis_wait.bash
> create mode 100644 .github/workflows/build.yml
> create mode 100644 .github/workflows/codeql.yml
> create mode 100644 .github/workflows/coverity.yml
> create mode 100644 .github/workflows/lint.yml
> create mode 100644 .github/workflows/ondemand.yml
> create mode 100644 .github/workflows/test.yml
> create mode 100644 .github/workflows/vmtest.yml
>
> diff --git a/.github/scripts/build-debian.sh b/.github/scripts/build-debian.sh
> new file mode 100755
> index 0000000..5a0789a
> --- /dev/null
> +++ b/.github/scripts/build-debian.sh
> @@ -0,0 +1,92 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0-only
> +#
> +# Copyright (c) 2025, Oracle and/or its affiliates.
> +#
> +
> +PHASES=(${@:-SETUP RUN CLEANUP})
> +DEBIAN_RELEASE="${DEBIAN_RELEASE:-testing}"
> +CONT_NAME="${CONT_NAME:-dwarves-debian-$DEBIAN_RELEASE}"
> +ENV_VARS="${ENV_VARS:-}"
> +DOCKER_RUN="${DOCKER_RUN:-docker run}"
> +REPO_ROOT="${REPO_ROOT:-$PWD}"
> +ADDITIONAL_DEPS=(pkgconf)
> +EXTRA_CFLAGS=""
> +EXTRA_LDFLAGS=""
> +
> +function info() {
> + echo -e "\033[33;1m$1\033[0m"
> +}
> +
> +function error() {
> + echo -e "\033[31;1m$1\033[0m"
> +}
> +
> +function docker_exec() {
> + docker exec $ENV_VARS $CONT_NAME "$@"
> +}
> +
> +set -eu
> +
> +source "$(dirname $0)/travis_wait.bash"
> +
> +for phase in "${PHASES[@]}"; do
> + case $phase in
> + SETUP)
> + info "Setup phase"
> + info "Using Debian $DEBIAN_RELEASE"
> +
> + docker --version
> +
> + docker pull debian:$DEBIAN_RELEASE
> + info "Starting container $CONT_NAME"
> + $DOCKER_RUN -v $REPO_ROOT:/build:rw \
> + -w /build --privileged=true --name $CONT_NAME \
> + -dit --net=host debian:$DEBIAN_RELEASE /bin/bash
> + echo -e "::group::Build Env Setup"
> +
> + docker_exec apt-get -y update
> + docker_exec apt-get -y install aptitude
> + docker_exec aptitude -y install make cmake libz-dev libelf-dev libdw-dev git
> + docker_exec aptitude -y install "${ADDITIONAL_DEPS[@]}"
> + echo -e "::endgroup::"
> + ;;
> + RUN|RUN_CLANG|RUN_CLANG16|RUN_GCC12)
> + CC="cc"
> + if [[ "$phase" =~ "RUN_CLANG(\d+)(_ASAN)?" ]]; then
> + ENV_VARS="-e CC=clang-${BASH_REMATCH[1]} -e CXX=clang++-${BASH_REMATCH[1]}"
> + CC="clang-${BASH_REMATCH[1]}"
> + elif [[ "$phase" = *"CLANG"* ]]; then
> + ENV_VARS="-e CC=clang -e CXX=clang++"
> + CC="clang"
> + elif [[ "$phase" =~ "RUN_GCC(\d+)(_ASAN)?" ]]; then
> + ENV_VARS="-e CC=gcc-${BASH_REMATCH[1]} -e CXX=g++-${BASH_REMATCH[1]}"
> + CC="gcc-${BASH_REMATCH[1]}"
> + fi
> + if [[ "$CC" != "cc" ]]; then
> + docker_exec aptitude -y install "$CC"
> + else
> + docker_exec aptitude -y install gcc
> + fi
> + git config --global --add safe.directory $REPO_ROOT
> + pushd $REPO_ROOT
> + git submodule update --init
> + popd
> + docker_exec mkdir build install
> + docker_exec ${CC} --version
> + info "build"
> + docker_exec cmake -DGIT_SUBMODULE=OFF .
> + docker_exec make -j$((4*$(nproc)))
> + info "install"
> + docker_exec make DESTDIR=../install install
> + ;;
> + CLEANUP)
> + info "Cleanup phase"
> + docker stop $CONT_NAME
> + docker rm -f $CONT_NAME
> + ;;
> + *)
> + echo >&2 "Unknown phase '$phase'"
> + exit 1
> + esac
> +done
> diff --git a/.github/scripts/build-kernel.sh b/.github/scripts/build-kernel.sh
> new file mode 100755
> index 0000000..41a3cf8
> --- /dev/null
> +++ b/.github/scripts/build-kernel.sh
> @@ -0,0 +1,35 @@
> +#!/usr/bin/bash
> +# SPDX-License-Identifier: GPL-2.0-only
> +#
> +# Copyright (c) 2025, Oracle and/or its affiliates.
> +#
> +
> +GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(dirname $0)/../..}
> +INPUTS_ARCH=${INPUTS_ARCH:-$(uname -m)}
> +REPO=${REPO:-https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git}
> +REPO_BRANCH=${REPO_BRANCH:-master}
> +REPO_TARGET=${GITHUB_WORKSPACE}/.kernel
> +
> +export PATH=${GITHUB_WORKSPACE}/install/usr/local/bin:${PATH}
> +export PAHOLE=${GITHUB_WORKSPACE}/install/usr/local/bin/pahole
> +
> +which pahole
> +$PAHOLE --version
> +
> +if [[ ! -d $REPO_TARGET ]]; then
> + git clone $REPO $REPO_TARGET
> +fi
> +cd $REPO_TARGET
> +git checkout $REPO_BRANCH
> +
> +cat tools/testing/selftests/bpf/config \
> + tools/testing/selftests/bpf/config.${INPUTS_ARCH} > .config
> +# this file might or might not exist depending on kernel version
> +if [[ -f tools/testing/selftests/bpf/config.vm ]]; then
> + cat tools/testing/selftests/bpf/config.vm >> .config
> +fi
> +make olddefconfig && make prepare
> +grep PAHOLE .config
> +grep _BTF .config
This looks like debugging code, but instead of removing it I think it
is useful to dump entire config to the output (hence job log) in case
something goes wrong. How about `cat .config` before make
olddefconfig?
> +make -j $((4*$(nproc))) all
> +
> diff --git a/.github/scripts/build-pahole.sh b/.github/scripts/build-pahole.sh
> new file mode 100755
> index 0000000..64f9eea
> --- /dev/null
> +++ b/.github/scripts/build-pahole.sh
> @@ -0,0 +1,17 @@
> +#!/usr/bin/bash
> +# SPDX-License-Identifier: GPL-2.0-only
> +#
> +# Copyright (c) 2025, Oracle and/or its affiliates.
> +#
> +
> +GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(dirname $0)/../..}
> +cd $GITHUB_WORKSPACE
> +git config --global --add safe.directory $GITHUB_WORKSPACE
> +git submodule update --init
> +mkdir -p build
> +cd build
> +pwd
> +cmake -DGIT_SUBMODULE=OFF -DBUILD_SHARED_LIBS=OFF ..
With these cmake options, what version of libbpf is used?
On CI a build/test of both static and shared variants should be
tested, ideally. But that doesn't have to be a part of this patchset.
> +make -j$((4*$(nproc))) all
> +make DESTDIR=../install install
> +
> diff --git a/.github/scripts/run-selftests.sh b/.github/scripts/run-selftests.sh
> new file mode 100755
> index 0000000..f9ba24e
> --- /dev/null
> +++ b/.github/scripts/run-selftests.sh
> @@ -0,0 +1,15 @@
> +#!/usr/bin/bash
> +# SPDX-License-Identifier: GPL-2.0-only
> +#
> +# Copyright (c) 2025, Oracle and/or its affiliates.
> +#
> +
> +GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(pwd)}
> +VMLINUX=${GITHUB_WORKSPACE}/.kernel/vmlinux
> +SELFTESTS=${GITHUB_WORKSPACE}/tests
> +cd $SELFTESTS
> +export PATH=${GITHUB_WORKSPACE}/install/usr/local/bin:${PATH}
> +which pahole
> +pahole --version
> +vmlinux=$VMLINUX ./tests
> +
> diff --git a/.github/scripts/travis_wait.bash b/.github/scripts/travis_wait.bash
> new file mode 100755
> index 0000000..acf6ad1
> --- /dev/null
> +++ b/.github/scripts/travis_wait.bash
> @@ -0,0 +1,61 @@
> +# This was borrowed from https://github.com/travis-ci/travis-build/tree/master/lib/travis/build/bash
> +# to get around https://github.com/travis-ci/travis-ci/issues/9979. It should probably be removed
> +# as soon as Travis CI has started to provide an easy way to export the functions to bash scripts.
This comment makes me think travis_wait.bash could be removed.
Do you know if it's actually necessary (for build-debian.sh)?
> +
> +travis_jigger() {
> + local cmd_pid="${1}"
> + shift
> + local timeout="${1}"
> + shift
> + local count=0
> +
> + echo -e "\\n"
> +
> + while [[ "${count}" -lt "${timeout}" ]]; do
> + count="$((count + 1))"
> + echo -ne "Still running (${count} of ${timeout}): ${*}\\r"
> + sleep 60
> + done
> +
> + echo -e "\\n${ANSI_RED}Timeout (${timeout} minutes) reached. Terminating \"${*}\"${ANSI_RESET}\\n"
> + kill -9 "${cmd_pid}"
> +}
> +
> +travis_wait() {
> + local timeout="${1}"
> +
> + if [[ "${timeout}" =~ ^[0-9]+$ ]]; then
> + shift
> + else
> + timeout=20
> + fi
> +
> + local cmd=("${@}")
> + local log_file="travis_wait_${$}.log"
> +
> + "${cmd[@]}" &>"${log_file}" &
> + local cmd_pid="${!}"
> +
> + travis_jigger "${!}" "${timeout}" "${cmd[@]}" &
> + local jigger_pid="${!}"
> + local result
> +
> + {
> + set +e
> + wait "${cmd_pid}" 2>/dev/null
> + result="${?}"
> + ps -p"${jigger_pid}" &>/dev/null && kill "${jigger_pid}"
> + set -e
> + }
> +
> + if [[ "${result}" -eq 0 ]]; then
> + echo -e "\\n${ANSI_GREEN}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}"
> + else
> + echo -e "\\n${ANSI_RED}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}"
> + fi
> +
> + echo -e "\\n${ANSI_GREEN}Log:${ANSI_RESET}\\n"
> + cat "${log_file}"
> +
> + return "${result}"
> +}
> diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
> new file mode 100644
> index 0000000..25a395f
> --- /dev/null
> +++ b/.github/workflows/build.yml
> @@ -0,0 +1,34 @@
> +name: dwarves-build
> +
> +on:
> + pull_request:
> + push:
> + schedule:
> + - cron: '0 18 * * *'
> +
> +concurrency:
> + group: ci-build-${{ github.head_ref }}
> + cancel-in-progress: true
> +
> +jobs:
> +
> + debian:
> + runs-on: ubuntu-latest
> + name: Debian Build (${{ matrix.name }})
> + strategy:
> + fail-fast: false
> + matrix:
> + include:
> + - name: default
> + target: RUN
> + - name: gcc-12
> + target: RUN_GCC12
> + - name: clang
> + target: RUN_CLANG
> + steps:
> + - uses: actions/checkout@v4
> + name: Checkout
> + - name: setup
> + shell: bash
> + run: ./.github/scripts/build-debian.sh SETUP ${{ matrix.target }}
> +
> diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
> new file mode 100644
> index 0000000..a140be1
> --- /dev/null
> +++ b/.github/workflows/codeql.yml
> @@ -0,0 +1,53 @@
> +---
> +# vi: ts=2 sw=2 et:
> +
> +name: "CodeQL"
> +
> +on:
> + push:
> + branches:
> + - master
> + pull_request:
> + branches:
> + - master
> + - next
> +
> +permissions:
> + contents: read
> +
> +jobs:
> + analyze:
> + name: Analyze
> + runs-on: ubuntu-latest
> + concurrency:
> + group: ${{ github.workflow }}-${{ matrix.language }}-${{ github.ref }}
> + cancel-in-progress: true
> + permissions:
> + actions: read
> + security-events: write
> +
> + strategy:
> + fail-fast: false
> + matrix:
> + language: ['cpp', 'python']
> +
> + steps:
> + - name: Checkout repository
> + uses: actions/checkout@v4
> +
> + - name: Initialize CodeQL
> + uses: github/codeql-action/init@v2
> + with:
> + languages: ${{ matrix.language }}
> + queries: +security-extended,security-and-quality
> +
> + - name: Setup
> + uses: ./.github/actions/setup
> +
> + - name: Build
> + run: |
> + source /tmp/ci_setup
> + make -C ./src
> +
> + - name: Perform CodeQL Analysis
> + uses: github/codeql-action/analyze@v2
> diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml
> new file mode 100644
> index 0000000..97a04d4
> --- /dev/null
> +++ b/.github/workflows/coverity.yml
> @@ -0,0 +1,33 @@
> +name: dwarves-ci-coverity
> +
> +on:
> + push:
> + branches:
> + - master
> + - next
> + schedule:
> + - cron: '0 18 * * *'
> +
> +jobs:
> + coverity:
> + runs-on: ubuntu-latest
> + name: Coverity
> + env:
> + COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
> + steps:
> + - uses: actions/checkout@v4
> + - uses: ./.github/actions/setup
> + - name: Run coverity
> + if: ${{ env.COVERITY_SCAN_TOKEN }}
> + run: |
> + source /tmp/ci_setup
> + export COVERITY_SCAN_NOTIFICATION_EMAIL="${AUTHOR_EMAIL}"
> + export COVERITY_SCAN_BRANCH_PATTERN=${GITHUB_REF##refs/*/}
> + export TRAVIS_BRANCH=${COVERITY_SCAN_BRANCH_PATTERN}
> + scripts/coverity.sh
> + env:
> + COVERITY_SCAN_PROJECT_NAME: dwarves
> + COVERITY_SCAN_BUILD_COMMAND_PREPEND: 'cmake .'
> + COVERITY_SCAN_BUILD_COMMAND: 'make'
> + - name: SCM log
> + run: cat /home/runner/work/dwarves/cov-int/scm_log.txt
> diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
> new file mode 100644
> index 0000000..ca13052
> --- /dev/null
> +++ b/.github/workflows/lint.yml
> @@ -0,0 +1,20 @@
> +name: "lint"
> +
> +on:
> + pull_request:
> + push:
> + branches:
> + - master
> + - next
> +
> +jobs:
> + shellcheck:
> + name: ShellCheck
> + runs-on: ubuntu-latest
> + steps:
> + - name: Checkout repository
> + uses: actions/checkout@v4
> + - name: Run ShellCheck
> + uses: ludeeus/action-shellcheck@master
> + env:
> + SHELLCHECK_OPTS: --severity=error
> diff --git a/.github/workflows/ondemand.yml b/.github/workflows/ondemand.yml
> new file mode 100644
> index 0000000..5f3034f
> --- /dev/null
> +++ b/.github/workflows/ondemand.yml
> @@ -0,0 +1,31 @@
> +name: ondemand
> +
> +on:
> + workflow_dispatch:
> + inputs:
> + arch:
> + default: 'x86_64'
> + required: true
> + llvm-version:
> + default: '18'
> + required: true
> + kernel:
> + default: 'LATEST'
> + required: true
> + pahole:
> + default: "master"
> + required: true
> + runs-on:
> + default: 'ubuntu-24.04'
> + required: true
> +
> +jobs:
> + vmtest:
> + name: ${{ inputs.kernel }} kernel llvm-${{ inputs.llvm-version }} pahole@${{ inputs.pahole }}
> + uses: ./.github/workflows/vmtest.yml
> + with:
> + runs_on: ${{ inputs.runs-on }}
> + kernel: ${{ inputs.kernel }}
> + arch: ${{ inputs.arch }}
> + llvm-version: ${{ inputs.llvm-version }}
> + pahole: ${{ inputs.pahole }}
> diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
> new file mode 100644
> index 0000000..f11ebfe
> --- /dev/null
> +++ b/.github/workflows/test.yml
> @@ -0,0 +1,36 @@
> +name: dwarves-ci
> +
> +on:
> + pull_request:
> + push:
> + schedule:
> + - cron: '0 18 * * *'
> +
> +concurrency:
> + group: ci-test-${{ github.head_ref }}
> + cancel-in-progress: true
> +
> +jobs:
> + vmtest:
> + strategy:
> + fail-fast: false
> + matrix:
> + include:
> + - kernel: 'LATEST'
> + runs_on: 'ubuntu-24.04'
> + arch: 'x86_64'
> + llvm-version: '18'
> + pahole: 'master'
> + - kernel: 'LATEST'
> + runs_on: 'ubuntu-24.04-arm'
> + arch: 'aarch64'
> + llvm-version: '18'
> + pahole: 'tmp.master'
> + name: Linux ${{ matrix.kernel }}
> + uses: ./.github/workflows/vmtest.yml
> + with:
> + runs_on: ${{ matrix.runs_on }}
> + kernel: ${{ matrix.kernel }}
> + arch: ${{ matrix.arch }}
> + llvm-version: ${{ matrix.llvm-version }}
> + pahole: ${{ matrix.pahole }}
> diff --git a/.github/workflows/vmtest.yml b/.github/workflows/vmtest.yml
> new file mode 100644
> index 0000000..0f66eed
> --- /dev/null
> +++ b/.github/workflows/vmtest.yml
> @@ -0,0 +1,62 @@
> +name: 'Build kernel run selftests via vmtest'
> +
> +on:
> + workflow_call:
> + inputs:
> + runs_on:
> + required: true
> + default: 'ubuntu-24.04'
> + type: string
> + arch:
> + description: 'what arch to test'
> + required: true
> + default: 'x86_64'
> + type: string
> + kernel:
> + description: 'kernel version or LATEST'
> + required: true
> + default: 'LATEST'
> + type: string
> + pahole:
> + description: 'pahole rev or branch'
> + required: false
> + default: 'master'
> + type: string
> + llvm-version:
> + description: 'llvm version'
> + required: false
> + default: '18'
> + type: string
> +jobs:
> + vmtest:
> + name: pahole@${{ inputs.arch }}
> + runs-on: ${{ inputs.runs_on }}
> + steps:
> +
> + - uses: actions/checkout@v4
> +
> + - name: Setup environment
> + uses: libbpf/ci/setup-build-env@v3
> + with:
> + pahole: ${{ inputs.pahole }}
> + arch: ${{ inputs.arch }}
> + llvm-version: ${{ inputs.llvm-version }}
I think I mentioned it before, but libbpf/ci/setup-build-env checks
out and installs pahole too, which is unnecessary here. Have you tried
removing this step from the job?
You should be able to reuse a piece of SETUP logic from
build-debian.sh to install pahole's dependencies. Although you kernel
build deps are needed too.
I could make a change in libbpf/ci/setup-build-env to accept a special
`pahole` input value or check for env variable to NOT build pahole.
What do you think?
> +
> + - name: Build,install current pahole
> + shell: bash
> + run: .github/scripts/build-pahole.sh
> +
> + - name: Get kernel source
> + uses: libbpf/ci/get-linux-source@v3
> + with:
> + repo: 'https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git'
> + dest: '${{ github.workspace }}/.kernel'
> +
> + - name: Configure, build kernel with current pahole
> + shell: bash
> + run: .github/scripts/build-kernel.sh
> +
> + - name: Run selftests
> + shell: bash
> + run: .github/scripts/run-selftests.sh
> +
> diff --git a/README b/README
> index 7ee3b87..a938266 100644
> --- a/README
> +++ b/README
> @@ -21,3 +21,21 @@ cmake Options:
> You may need to update the libbpf git submodule:
>
> git submodule update --init --recursive
> +
> +Testing:
> +
> +Tests are available in the tests subdirectory and should be run prior to
> +submitting patches. Patches that add functionality should add to tests
> +here also. Tests can be run by
> +
> +- running the scripts directly using a pre-existing vmlinux binary; i.e.
> + cd tests ; vmlinux=/path/2/vmlinux ./tests
> + (the vmlinux binary must contain DWARF to be converted to BTF)
> +
> +- running the tests via local scripts in .github/scripts; i.e.
> + bash .github/scripts/build-pahole.sh; \
> + bash .github/scripts/build-kernel.sh; \
> + bash .github/scripts/run-selftests.sh
> +- via GitHub actions: push a branch to a GitHub repo; actions will be
> + triggered for build and test matching the above steps. See the "Actions"
> + tab in the github repo for info on job pass/fail and logs.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test
2025-04-08 19:09 ` Ihor Solodrai
@ 2025-04-09 8:59 ` Alan Maguire
2025-04-09 15:52 ` Ihor Solodrai
0 siblings, 1 reply; 8+ messages in thread
From: Alan Maguire @ 2025-04-09 8:59 UTC (permalink / raw)
To: Ihor Solodrai, acme
Cc: yonghong.song, dwarves, ast, andrii, bpf, daniel, song, eddyz87,
olsajiri
On 08/04/2025 20:09, Ihor Solodrai wrote:
> On 4/1/25 2:24 AM, Alan Maguire wrote:
>> Borrowing heavily from libbpf github actions, add workflows to
>>
>> - build dwarves for gcc, LLVM
>>
>> - build dwarves for x86_64/aarch64 and use it to build a Linux
>> kernel including BTF generation; then run dwarves selftests
>> using generated vmlinux
>>
>> These workflows trigger on all pushes. This will allow both
>> developers working on dwarves to push a branch to their github
>> repo and test, and also for maintainer pushes from git.kernel.org
>> pahole repo to trigger tests.
>>
>> The build/test workflows can also be run as bash scripts locally,
>> as is described in the toplevel README.
>>
>> Similar to libbpf, additional workflows for coverity etc
>> are triggered for pushes to master/next.
>>
>> Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
>
> Hi Alan. Thanks for addressing my comments.
>
> Acked-by: Ihor Solodrai <ihor.solodrai@linux.dev>
>
> Some nits and questions below.
>
thanks for the feedback! replies below..
>> ---
>> .github/scripts/build-debian.sh | 92 ++++++++++++++++++++++++++++++++
>> .github/scripts/build-kernel.sh | 35 ++++++++++++
>> .github/scripts/build-pahole.sh | 17 ++++++
>> .github/scripts/run-selftests.sh | 15 ++++++
>> .github/scripts/travis_wait.bash | 61 +++++++++++++++++++++
>> .github/workflows/build.yml | 34 ++++++++++++
>> .github/workflows/codeql.yml | 53 ++++++++++++++++++
>> .github/workflows/coverity.yml | 33 ++++++++++++
>> .github/workflows/lint.yml | 20 +++++++
>> .github/workflows/ondemand.yml | 31 +++++++++++
>> .github/workflows/test.yml | 36 +++++++++++++
>> .github/workflows/vmtest.yml | 62 +++++++++++++++++++++
>> README | 18 +++++++
>> 13 files changed, 507 insertions(+)
>> create mode 100755 .github/scripts/build-debian.sh
>> create mode 100755 .github/scripts/build-kernel.sh
>> create mode 100755 .github/scripts/build-pahole.sh
>> create mode 100755 .github/scripts/run-selftests.sh
>> create mode 100755 .github/scripts/travis_wait.bash
>> create mode 100644 .github/workflows/build.yml
>> create mode 100644 .github/workflows/codeql.yml
>> create mode 100644 .github/workflows/coverity.yml
>> create mode 100644 .github/workflows/lint.yml
>> create mode 100644 .github/workflows/ondemand.yml
>> create mode 100644 .github/workflows/test.yml
>> create mode 100644 .github/workflows/vmtest.yml
>>
>> diff --git a/.github/scripts/build-debian.sh b/.github/scripts/build-debian.sh
>> new file mode 100755
>> index 0000000..5a0789a
>> --- /dev/null
>> +++ b/.github/scripts/build-debian.sh
>> @@ -0,0 +1,92 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +#
>> +# Copyright (c) 2025, Oracle and/or its affiliates.
>> +#
>> +
>> +PHASES=(${@:-SETUP RUN CLEANUP})
>> +DEBIAN_RELEASE="${DEBIAN_RELEASE:-testing}"
>> +CONT_NAME="${CONT_NAME:-dwarves-debian-$DEBIAN_RELEASE}"
>> +ENV_VARS="${ENV_VARS:-}"
>> +DOCKER_RUN="${DOCKER_RUN:-docker run}"
>> +REPO_ROOT="${REPO_ROOT:-$PWD}"
>> +ADDITIONAL_DEPS=(pkgconf)
>> +EXTRA_CFLAGS=""
>> +EXTRA_LDFLAGS=""
>> +
>> +function info() {
>> + echo -e "\033[33;1m$1\033[0m"
>> +}
>> +
>> +function error() {
>> + echo -e "\033[31;1m$1\033[0m"
>> +}
>> +
>> +function docker_exec() {
>> + docker exec $ENV_VARS $CONT_NAME "$@"
>> +}
>> +
>> +set -eu
>> +
>> +source "$(dirname $0)/travis_wait.bash"
>> +
>> +for phase in "${PHASES[@]}"; do
>> + case $phase in
>> + SETUP)
>> + info "Setup phase"
>> + info "Using Debian $DEBIAN_RELEASE"
>> +
>> + docker --version
>> +
>> + docker pull debian:$DEBIAN_RELEASE
>> + info "Starting container $CONT_NAME"
>> + $DOCKER_RUN -v $REPO_ROOT:/build:rw \
>> + -w /build --privileged=true --name $CONT_NAME \
>> + -dit --net=host debian:$DEBIAN_RELEASE /bin/bash
>> + echo -e "::group::Build Env Setup"
>> +
>> + docker_exec apt-get -y update
>> + docker_exec apt-get -y install aptitude
>> + docker_exec aptitude -y install make cmake libz-dev libelf-dev libdw-dev git
>> + docker_exec aptitude -y install "${ADDITIONAL_DEPS[@]}"
>> + echo -e "::endgroup::"
>> + ;;
>> + RUN|RUN_CLANG|RUN_CLANG16|RUN_GCC12)
>> + CC="cc"
>> + if [[ "$phase" =~ "RUN_CLANG(\d+)(_ASAN)?" ]]; then
>> + ENV_VARS="-e CC=clang-${BASH_REMATCH[1]} -e CXX=clang++-${BASH_REMATCH[1]}"
>> + CC="clang-${BASH_REMATCH[1]}"
>> + elif [[ "$phase" = *"CLANG"* ]]; then
>> + ENV_VARS="-e CC=clang -e CXX=clang++"
>> + CC="clang"
>> + elif [[ "$phase" =~ "RUN_GCC(\d+)(_ASAN)?" ]]; then
>> + ENV_VARS="-e CC=gcc-${BASH_REMATCH[1]} -e CXX=g++-${BASH_REMATCH[1]}"
>> + CC="gcc-${BASH_REMATCH[1]}"
>> + fi
>> + if [[ "$CC" != "cc" ]]; then
>> + docker_exec aptitude -y install "$CC"
>> + else
>> + docker_exec aptitude -y install gcc
>> + fi
>> + git config --global --add safe.directory $REPO_ROOT
>> + pushd $REPO_ROOT
>> + git submodule update --init
>> + popd
>> + docker_exec mkdir build install
>> + docker_exec ${CC} --version
>> + info "build"
>> + docker_exec cmake -DGIT_SUBMODULE=OFF .
>> + docker_exec make -j$((4*$(nproc)))
>> + info "install"
>> + docker_exec make DESTDIR=../install install
>> + ;;
>> + CLEANUP)
>> + info "Cleanup phase"
>> + docker stop $CONT_NAME
>> + docker rm -f $CONT_NAME
>> + ;;
>> + *)
>> + echo >&2 "Unknown phase '$phase'"
>> + exit 1
>> + esac
>> +done
>> diff --git a/.github/scripts/build-kernel.sh b/.github/scripts/build-kernel.sh
>> new file mode 100755
>> index 0000000..41a3cf8
>> --- /dev/null
>> +++ b/.github/scripts/build-kernel.sh
>> @@ -0,0 +1,35 @@
>> +#!/usr/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +#
>> +# Copyright (c) 2025, Oracle and/or its affiliates.
>> +#
>> +
>> +GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(dirname $0)/../..}
>> +INPUTS_ARCH=${INPUTS_ARCH:-$(uname -m)}
>> +REPO=${REPO:-https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git}
>> +REPO_BRANCH=${REPO_BRANCH:-master}
>> +REPO_TARGET=${GITHUB_WORKSPACE}/.kernel
>> +
>> +export PATH=${GITHUB_WORKSPACE}/install/usr/local/bin:${PATH}
>> +export PAHOLE=${GITHUB_WORKSPACE}/install/usr/local/bin/pahole
>> +
>> +which pahole
>> +$PAHOLE --version
>> +
>> +if [[ ! -d $REPO_TARGET ]]; then
>> + git clone $REPO $REPO_TARGET
>> +fi
>> +cd $REPO_TARGET
>> +git checkout $REPO_BRANCH
>> +
>> +cat tools/testing/selftests/bpf/config \
>> + tools/testing/selftests/bpf/config.${INPUTS_ARCH} > .config
>> +# this file might or might not exist depending on kernel version
>> +if [[ -f tools/testing/selftests/bpf/config.vm ]]; then
>> + cat tools/testing/selftests/bpf/config.vm >> .config
>> +fi
>> +make olddefconfig && make prepare
>> +grep PAHOLE .config
>> +grep _BTF .config
>
> This looks like debugging code, but instead of removing it I think it
> is useful to dump entire config to the output (hence job log) in case
> something goes wrong. How about `cat .config` before make
> olddefconfig?
>
Sounds good, but would doing it after "make olddefconfig" be more
informative maybe since some additional values may be set?
>> +make -j $((4*$(nproc))) all
>> +
>> diff --git a/.github/scripts/build-pahole.sh b/.github/scripts/build-pahole.sh
>> new file mode 100755
>> index 0000000..64f9eea
>> --- /dev/null
>> +++ b/.github/scripts/build-pahole.sh
>> @@ -0,0 +1,17 @@
>> +#!/usr/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +#
>> +# Copyright (c) 2025, Oracle and/or its affiliates.
>> +#
>> +
>> +GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(dirname $0)/../..}
>> +cd $GITHUB_WORKSPACE
>> +git config --global --add safe.directory $GITHUB_WORKSPACE
>> +git submodule update --init
>> +mkdir -p build
>> +cd build
>> +pwd
>> +cmake -DGIT_SUBMODULE=OFF -DBUILD_SHARED_LIBS=OFF ..
>
> With these cmake options, what version of libbpf is used?
>
> On CI a build/test of both static and shared variants should be
> tested, ideally. But that doesn't have to be a part of this patchset.
>
Good idea; I think we'll follow up with that as it is somewhat dependent
on what shared library versions of libbpf we have available.
>> +make -j$((4*$(nproc))) all
>> +make DESTDIR=../install install
>> +
>> diff --git a/.github/scripts/run-selftests.sh b/.github/scripts/run-selftests.sh
>> new file mode 100755
>> index 0000000..f9ba24e
>> --- /dev/null
>> +++ b/.github/scripts/run-selftests.sh
>> @@ -0,0 +1,15 @@
>> +#!/usr/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +#
>> +# Copyright (c) 2025, Oracle and/or its affiliates.
>> +#
>> +
>> +GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-$(pwd)}
>> +VMLINUX=${GITHUB_WORKSPACE}/.kernel/vmlinux
>> +SELFTESTS=${GITHUB_WORKSPACE}/tests
>> +cd $SELFTESTS
>> +export PATH=${GITHUB_WORKSPACE}/install/usr/local/bin:${PATH}
>> +which pahole
>> +pahole --version
>> +vmlinux=$VMLINUX ./tests
>> +
>> diff --git a/.github/scripts/travis_wait.bash b/.github/scripts/travis_wait.bash
>> new file mode 100755
>> index 0000000..acf6ad1
>> --- /dev/null
>> +++ b/.github/scripts/travis_wait.bash
>> @@ -0,0 +1,61 @@
>> +# This was borrowed from https://github.com/travis-ci/travis-build/tree/master/lib/travis/build/bash
>> +# to get around https://github.com/travis-ci/travis-ci/issues/9979. It should probably be removed
>> +# as soon as Travis CI has started to provide an easy way to export the functions to bash scripts.
>
> This comment makes me think travis_wait.bash could be removed.
> Do you know if it's actually necessary (for build-debian.sh)?
>
I tried removing it, and if I recall the github action fell over without
a pause between setup and build, so I think it's still needed.
>> +
>> +travis_jigger() {
>> + local cmd_pid="${1}"
>> + shift
>> + local timeout="${1}"
>> + shift
>> + local count=0
>> +
>> + echo -e "\\n"
>> +
>> + while [[ "${count}" -lt "${timeout}" ]]; do
>> + count="$((count + 1))"
>> + echo -ne "Still running (${count} of ${timeout}): ${*}\\r"
>> + sleep 60
>> + done
>> +
>> + echo -e "\\n${ANSI_RED}Timeout (${timeout} minutes) reached. Terminating \"${*}\"${ANSI_RESET}\\n"
>> + kill -9 "${cmd_pid}"
>> +}
>> +
>> +travis_wait() {
>> + local timeout="${1}"
>> +
>> + if [[ "${timeout}" =~ ^[0-9]+$ ]]; then
>> + shift
>> + else
>> + timeout=20
>> + fi
>> +
>> + local cmd=("${@}")
>> + local log_file="travis_wait_${$}.log"
>> +
>> + "${cmd[@]}" &>"${log_file}" &
>> + local cmd_pid="${!}"
>> +
>> + travis_jigger "${!}" "${timeout}" "${cmd[@]}" &
>> + local jigger_pid="${!}"
>> + local result
>> +
>> + {
>> + set +e
>> + wait "${cmd_pid}" 2>/dev/null
>> + result="${?}"
>> + ps -p"${jigger_pid}" &>/dev/null && kill "${jigger_pid}"
>> + set -e
>> + }
>> +
>> + if [[ "${result}" -eq 0 ]]; then
>> + echo -e "\\n${ANSI_GREEN}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}"
>> + else
>> + echo -e "\\n${ANSI_RED}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}"
>> + fi
>> +
>> + echo -e "\\n${ANSI_GREEN}Log:${ANSI_RESET}\\n"
>> + cat "${log_file}"
>> +
>> + return "${result}"
>> +}
>> diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
>> new file mode 100644
>> index 0000000..25a395f
>> --- /dev/null
>> +++ b/.github/workflows/build.yml
>> @@ -0,0 +1,34 @@
>> +name: dwarves-build
>> +
>> +on:
>> + pull_request:
>> + push:
>> + schedule:
>> + - cron: '0 18 * * *'
>> +
>> +concurrency:
>> + group: ci-build-${{ github.head_ref }}
>> + cancel-in-progress: true
>> +
>> +jobs:
>> +
>> + debian:
>> + runs-on: ubuntu-latest
>> + name: Debian Build (${{ matrix.name }})
>> + strategy:
>> + fail-fast: false
>> + matrix:
>> + include:
>> + - name: default
>> + target: RUN
>> + - name: gcc-12
>> + target: RUN_GCC12
>> + - name: clang
>> + target: RUN_CLANG
>> + steps:
>> + - uses: actions/checkout@v4
>> + name: Checkout
>> + - name: setup
>> + shell: bash
>> + run: ./.github/scripts/build-debian.sh SETUP ${{ matrix.target }}
>> +
>> diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
>> new file mode 100644
>> index 0000000..a140be1
>> --- /dev/null
>> +++ b/.github/workflows/codeql.yml
>> @@ -0,0 +1,53 @@
>> +---
>> +# vi: ts=2 sw=2 et:
>> +
>> +name: "CodeQL"
>> +
>> +on:
>> + push:
>> + branches:
>> + - master
>> + pull_request:
>> + branches:
>> + - master
>> + - next
>> +
>> +permissions:
>> + contents: read
>> +
>> +jobs:
>> + analyze:
>> + name: Analyze
>> + runs-on: ubuntu-latest
>> + concurrency:
>> + group: ${{ github.workflow }}-${{ matrix.language }}-${{ github.ref }}
>> + cancel-in-progress: true
>> + permissions:
>> + actions: read
>> + security-events: write
>> +
>> + strategy:
>> + fail-fast: false
>> + matrix:
>> + language: ['cpp', 'python']
>> +
>> + steps:
>> + - name: Checkout repository
>> + uses: actions/checkout@v4
>> +
>> + - name: Initialize CodeQL
>> + uses: github/codeql-action/init@v2
>> + with:
>> + languages: ${{ matrix.language }}
>> + queries: +security-extended,security-and-quality
>> +
>> + - name: Setup
>> + uses: ./.github/actions/setup
>> +
>> + - name: Build
>> + run: |
>> + source /tmp/ci_setup
>> + make -C ./src
>> +
>> + - name: Perform CodeQL Analysis
>> + uses: github/codeql-action/analyze@v2
>> diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml
>> new file mode 100644
>> index 0000000..97a04d4
>> --- /dev/null
>> +++ b/.github/workflows/coverity.yml
>> @@ -0,0 +1,33 @@
>> +name: dwarves-ci-coverity
>> +
>> +on:
>> + push:
>> + branches:
>> + - master
>> + - next
>> + schedule:
>> + - cron: '0 18 * * *'
>> +
>> +jobs:
>> + coverity:
>> + runs-on: ubuntu-latest
>> + name: Coverity
>> + env:
>> + COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
>> + steps:
>> + - uses: actions/checkout@v4
>> + - uses: ./.github/actions/setup
>> + - name: Run coverity
>> + if: ${{ env.COVERITY_SCAN_TOKEN }}
>> + run: |
>> + source /tmp/ci_setup
>> + export COVERITY_SCAN_NOTIFICATION_EMAIL="${AUTHOR_EMAIL}"
>> + export COVERITY_SCAN_BRANCH_PATTERN=${GITHUB_REF##refs/*/}
>> + export TRAVIS_BRANCH=${COVERITY_SCAN_BRANCH_PATTERN}
>> + scripts/coverity.sh
>> + env:
>> + COVERITY_SCAN_PROJECT_NAME: dwarves
>> + COVERITY_SCAN_BUILD_COMMAND_PREPEND: 'cmake .'
>> + COVERITY_SCAN_BUILD_COMMAND: 'make'
>> + - name: SCM log
>> + run: cat /home/runner/work/dwarves/cov-int/scm_log.txt
>> diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
>> new file mode 100644
>> index 0000000..ca13052
>> --- /dev/null
>> +++ b/.github/workflows/lint.yml
>> @@ -0,0 +1,20 @@
>> +name: "lint"
>> +
>> +on:
>> + pull_request:
>> + push:
>> + branches:
>> + - master
>> + - next
>> +
>> +jobs:
>> + shellcheck:
>> + name: ShellCheck
>> + runs-on: ubuntu-latest
>> + steps:
>> + - name: Checkout repository
>> + uses: actions/checkout@v4
>> + - name: Run ShellCheck
>> + uses: ludeeus/action-shellcheck@master
>> + env:
>> + SHELLCHECK_OPTS: --severity=error
>> diff --git a/.github/workflows/ondemand.yml b/.github/workflows/ondemand.yml
>> new file mode 100644
>> index 0000000..5f3034f
>> --- /dev/null
>> +++ b/.github/workflows/ondemand.yml
>> @@ -0,0 +1,31 @@
>> +name: ondemand
>> +
>> +on:
>> + workflow_dispatch:
>> + inputs:
>> + arch:
>> + default: 'x86_64'
>> + required: true
>> + llvm-version:
>> + default: '18'
>> + required: true
>> + kernel:
>> + default: 'LATEST'
>> + required: true
>> + pahole:
>> + default: "master"
>> + required: true
>> + runs-on:
>> + default: 'ubuntu-24.04'
>> + required: true
>> +
>> +jobs:
>> + vmtest:
>> + name: ${{ inputs.kernel }} kernel llvm-${{ inputs.llvm-version }} pahole@${{ inputs.pahole }}
>> + uses: ./.github/workflows/vmtest.yml
>> + with:
>> + runs_on: ${{ inputs.runs-on }}
>> + kernel: ${{ inputs.kernel }}
>> + arch: ${{ inputs.arch }}
>> + llvm-version: ${{ inputs.llvm-version }}
>> + pahole: ${{ inputs.pahole }}
>> diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
>> new file mode 100644
>> index 0000000..f11ebfe
>> --- /dev/null
>> +++ b/.github/workflows/test.yml
>> @@ -0,0 +1,36 @@
>> +name: dwarves-ci
>> +
>> +on:
>> + pull_request:
>> + push:
>> + schedule:
>> + - cron: '0 18 * * *'
>> +
>> +concurrency:
>> + group: ci-test-${{ github.head_ref }}
>> + cancel-in-progress: true
>> +
>> +jobs:
>> + vmtest:
>> + strategy:
>> + fail-fast: false
>> + matrix:
>> + include:
>> + - kernel: 'LATEST'
>> + runs_on: 'ubuntu-24.04'
>> + arch: 'x86_64'
>> + llvm-version: '18'
>> + pahole: 'master'
>> + - kernel: 'LATEST'
>> + runs_on: 'ubuntu-24.04-arm'
>> + arch: 'aarch64'
>> + llvm-version: '18'
>> + pahole: 'tmp.master'
>> + name: Linux ${{ matrix.kernel }}
>> + uses: ./.github/workflows/vmtest.yml
>> + with:
>> + runs_on: ${{ matrix.runs_on }}
>> + kernel: ${{ matrix.kernel }}
>> + arch: ${{ matrix.arch }}
>> + llvm-version: ${{ matrix.llvm-version }}
>> + pahole: ${{ matrix.pahole }}
>> diff --git a/.github/workflows/vmtest.yml b/.github/workflows/vmtest.yml
>> new file mode 100644
>> index 0000000..0f66eed
>> --- /dev/null
>> +++ b/.github/workflows/vmtest.yml
>> @@ -0,0 +1,62 @@
>> +name: 'Build kernel run selftests via vmtest'
>> +
>> +on:
>> + workflow_call:
>> + inputs:
>> + runs_on:
>> + required: true
>> + default: 'ubuntu-24.04'
>> + type: string
>> + arch:
>> + description: 'what arch to test'
>> + required: true
>> + default: 'x86_64'
>> + type: string
>> + kernel:
>> + description: 'kernel version or LATEST'
>> + required: true
>> + default: 'LATEST'
>> + type: string
>> + pahole:
>> + description: 'pahole rev or branch'
>> + required: false
>> + default: 'master'
>> + type: string
>> + llvm-version:
>> + description: 'llvm version'
>> + required: false
>> + default: '18'
>> + type: string
>> +jobs:
>> + vmtest:
>> + name: pahole@${{ inputs.arch }}
>> + runs-on: ${{ inputs.runs_on }}
>> + steps:
>> +
>> + - uses: actions/checkout@v4
>> +
>> + - name: Setup environment
>> + uses: libbpf/ci/setup-build-env@v3
>> + with:
>> + pahole: ${{ inputs.pahole }}
>> + arch: ${{ inputs.arch }}
>> + llvm-version: ${{ inputs.llvm-version }}
>
> I think I mentioned it before, but libbpf/ci/setup-build-env checks
> out and installs pahole too, which is unnecessary here. Have you tried
> removing this step from the job?
>
> You should be able to reuse a piece of SETUP logic from
> build-debian.sh to install pahole's dependencies. Although you kernel
> build deps are needed too.
>
Yeah it's the latter that are needed I think.
> I could make a change in libbpf/ci/setup-build-env to accept a special
> `pahole` input value or check for env variable to NOT build pahole.
> What do you think?
That would be great! Something like "pahole: none"?
I'll probably try and land this more or less as-is as we're hoping to
get 1.30 out the door this week, but definitely will follow up with
builds with shared library libbpf etc. Thanks for taking a look!
Alan
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test
2025-04-09 8:59 ` Alan Maguire
@ 2025-04-09 15:52 ` Ihor Solodrai
2025-04-17 23:23 ` Ihor Solodrai
0 siblings, 1 reply; 8+ messages in thread
From: Ihor Solodrai @ 2025-04-09 15:52 UTC (permalink / raw)
To: Alan Maguire, acme
Cc: yonghong.song, dwarves, ast, andrii, bpf, daniel, song, eddyz87,
olsajiri
On 4/9/25 1:59 AM, Alan Maguire wrote:
>
>>> [...]
>>> +
>>> +cat tools/testing/selftests/bpf/config \
>>> + tools/testing/selftests/bpf/config.${INPUTS_ARCH} > .config
>>> +# this file might or might not exist depending on kernel version
>>> +if [[ -f tools/testing/selftests/bpf/config.vm ]]; then
>>> + cat tools/testing/selftests/bpf/config.vm >> .config
>>> +fi
>>> +make olddefconfig && make prepare
>>> +grep PAHOLE .config
>>> +grep _BTF .config
>>
>> This looks like debugging code, but instead of removing it I think it
>> is useful to dump entire config to the output (hence job log) in case
>> something goes wrong. How about `cat .config` before make
>> olddefconfig?
>>
>
> Sounds good, but would doing it after "make olddefconfig" be more
> informative maybe since some additional values may be set?
I think as long as you know what is being printed it's ok. The config
after olddefconfig is the full expanded config, which is quite big.
> [...]
>
>>> diff --git a/.github/workflows/vmtest.yml b/.github/workflows/vmtest.yml
>>> new file mode 100644
>>> index 0000000..0f66eed
>>> --- /dev/null
>>> +++ b/.github/workflows/vmtest.yml
>>> @@ -0,0 +1,62 @@
>>> +name: 'Build kernel run selftests via vmtest'
>>> +
>>> +on:
>>> + workflow_call:
>>> + inputs:
>>> + runs_on:
>>> + required: true
>>> + default: 'ubuntu-24.04'
>>> + type: string
>>> + arch:
>>> + description: 'what arch to test'
>>> + required: true
>>> + default: 'x86_64'
>>> + type: string
>>> + kernel:
>>> + description: 'kernel version or LATEST'
>>> + required: true
>>> + default: 'LATEST'
>>> + type: string
>>> + pahole:
>>> + description: 'pahole rev or branch'
>>> + required: false
>>> + default: 'master'
>>> + type: string
>>> + llvm-version:
>>> + description: 'llvm version'
>>> + required: false
>>> + default: '18'
>>> + type: string
>>> +jobs:
>>> + vmtest:
>>> + name: pahole@${{ inputs.arch }}
>>> + runs-on: ${{ inputs.runs_on }}
>>> + steps:
>>> +
>>> + - uses: actions/checkout@v4
>>> +
>>> + - name: Setup environment
>>> + uses: libbpf/ci/setup-build-env@v3
>>> + with:
>>> + pahole: ${{ inputs.pahole }}
>>> + arch: ${{ inputs.arch }}
>>> + llvm-version: ${{ inputs.llvm-version }}
>>
>> I think I mentioned it before, but libbpf/ci/setup-build-env checks
>> out and installs pahole too, which is unnecessary here. Have you tried
>> removing this step from the job?
>>
>> You should be able to reuse a piece of SETUP logic from
>> build-debian.sh to install pahole's dependencies. Although you kernel
>> build deps are needed too.
>>
>
> Yeah it's the latter that are needed I think.
>
>> I could make a change in libbpf/ci/setup-build-env to accept a special
>> `pahole` input value or check for env variable to NOT build pahole.
>> What do you think?
>
> That would be great! Something like "pahole: none"?
Yes, something like that. It's a small change. I'll let you know when
it's done.
>
> I'll probably try and land this more or less as-is as we're hoping to
> get 1.30 out the door this week, but definitely will follow up with
> builds with shared library libbpf etc. Thanks for taking a look!
>
> Alan
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI
2025-04-01 9:24 [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI Alan Maguire
2025-04-01 9:24 ` [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test Alan Maguire
2025-04-01 9:24 ` [PATCH v2 dwarves 2/2] dwarves: Fix clang warning about unused variable Alan Maguire
@ 2025-04-10 18:04 ` Alan Maguire
2 siblings, 0 replies; 8+ messages in thread
From: Alan Maguire @ 2025-04-10 18:04 UTC (permalink / raw)
To: acme
Cc: ihor.solodrai, yonghong.song, dwarves, ast, andrii, bpf, daniel,
song, eddyz87, olsajiri
On 01/04/2025 10:24, Alan Maguire wrote:
> libbpf and bpf kernel patch infrastructure have made great use
> of github actions to provide continuous integration (CI) testing.
> Here the libbpf CI is adapted to build pahole and run the associated
> selftests. Examples of what the action workflows look like are
> at [1] and [2].
>
> Details about the workflows can be found in patch 1.
>
> Patch 2 fixes an issue exposed by the dwarves-build workflow -
> a compilation error when building dwarves with clang.
>
> Changes since v1:
>
> - rework to be locally executable as bash scripts as well as via
> GitHub actions (Ihor, patch 1)
> - add note to README about various ways of running tests via
> GitHub actions, local scripts (Arnaldo, patch 1)
>
> [1] https://github.com/alan-maguire/dwarves/actions/runs/14191907449
> [2] https://github.com/alan-maguire/dwarves/actions/runs/14191907451
>
series is applied with Ihor's suggested change to dump config info;
for now I've removed the codeql and coverity jobs as further testing
revealed they didn't work. We can look at adding them back later.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test
2025-04-09 15:52 ` Ihor Solodrai
@ 2025-04-17 23:23 ` Ihor Solodrai
0 siblings, 0 replies; 8+ messages in thread
From: Ihor Solodrai @ 2025-04-17 23:23 UTC (permalink / raw)
To: Alan Maguire, acme
Cc: yonghong.song, dwarves, ast, andrii, bpf, daniel, song, eddyz87,
olsajiri
On 4/9/25 8:52 AM, Ihor Solodrai wrote:
> On 4/9/25 1:59 AM, Alan Maguire wrote:
>>
>> [...]
>>
>>>> diff --git a/.github/workflows/vmtest.yml b/.github/workflows/vmtest.yml
>>>> new file mode 100644
>>>> index 0000000..0f66eed
>>>> --- /dev/null
>>>> +++ b/.github/workflows/vmtest.yml
>>>> @@ -0,0 +1,62 @@
>>>> +name: 'Build kernel run selftests via vmtest'
>>>> +
>>>> +on:
>>>> + workflow_call:
>>>> + inputs:
>>>> + runs_on:
>>>> + required: true
>>>> + default: 'ubuntu-24.04'
>>>> + type: string
>>>> + arch:
>>>> + description: 'what arch to test'
>>>> + required: true
>>>> + default: 'x86_64'
>>>> + type: string
>>>> + kernel:
>>>> + description: 'kernel version or LATEST'
>>>> + required: true
>>>> + default: 'LATEST'
>>>> + type: string
>>>> + pahole:
>>>> + description: 'pahole rev or branch'
>>>> + required: false
>>>> + default: 'master'
>>>> + type: string
>>>> + llvm-version:
>>>> + description: 'llvm version'
>>>> + required: false
>>>> + default: '18'
>>>> + type: string
>>>> +jobs:
>>>> + vmtest:
>>>> + name: pahole@${{ inputs.arch }}
>>>> + runs-on: ${{ inputs.runs_on }}
>>>> + steps:
>>>> +
>>>> + - uses: actions/checkout@v4
>>>> +
>>>> + - name: Setup environment
>>>> + uses: libbpf/ci/setup-build-env@v3
>>>> + with:
>>>> + pahole: ${{ inputs.pahole }}
>>>> + arch: ${{ inputs.arch }}
>>>> + llvm-version: ${{ inputs.llvm-version }}
>>>
>>> I think I mentioned it before, but libbpf/ci/setup-build-env checks
>>> out and installs pahole too, which is unnecessary here. Have you tried
>>> removing this step from the job?
>>>
>>> You should be able to reuse a piece of SETUP logic from
>>> build-debian.sh to install pahole's dependencies. Although you kernel
>>> build deps are needed too.
>>>
>>
>> Yeah it's the latter that are needed I think.
>>
>>> I could make a change in libbpf/ci/setup-build-env to accept a special
>>> `pahole` input value or check for env variable to NOT build pahole.
>>> What do you think?
>>
>> That would be great! Something like "pahole: none"?
>
> Yes, something like that. It's a small change. I'll let you know when
> it's done.
Hi Alan. I pushed a change to libbpf/ci today that skips pahole build
and install if 'pahole' is 'none' string. You can now use it.
>
>>
>> I'll probably try and land this more or less as-is as we're hoping to
>> get 1.30 out the door this week, but definitely will follow up with
>> builds with shared library libbpf etc. Thanks for taking a look!
>>
>> Alan
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-04-17 23:23 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-01 9:24 [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI Alan Maguire
2025-04-01 9:24 ` [PATCH v2 dwarves 1/2] dwarves: Add github actions to build, test Alan Maguire
2025-04-08 19:09 ` Ihor Solodrai
2025-04-09 8:59 ` Alan Maguire
2025-04-09 15:52 ` Ihor Solodrai
2025-04-17 23:23 ` Ihor Solodrai
2025-04-01 9:24 ` [PATCH v2 dwarves 2/2] dwarves: Fix clang warning about unused variable Alan Maguire
2025-04-10 18:04 ` [PATCH v2 dwarves 0/2] dwarves: Introduce github actions for CI Alan Maguire
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox