-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Factor out tar-artifacts action #148
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# Tar build artifacts | ||
|
||
This action creates a tarball with kbuild-output and other build | ||
artifacts necessary to run the selftests. | ||
|
||
The action is expected to be executed by a workflow with access to the | ||
Linux kernel repository. | ||
|
||
## Required inputs | ||
|
||
* `kbuild-output` - Path to the kernel build output. | ||
* `repo-root` - Path to the root of the Linux kernel repository. | ||
* `arch` - Kernel build architecture. | ||
* `toolchain` - Toolchain name: `gcc` (default) or `llvm`. | ||
|
||
# Outputs | ||
|
||
* `archive-name` - full path to zstd-compressed tarball with the artifacts | ||
|
||
# Archive options | ||
|
||
Essential content of the directory passed via `kbuild-output` input is | ||
always included in the tarball. | ||
|
||
For selftests artifacts the script checks environment variables to | ||
determine what to include. These are handled as bash flags: | ||
emptystring means false, any other value means true. | ||
|
||
* `ARCHIVE_BPF_SELFTESTS` - add `tools/testing/selftests/bpf` binaries | ||
under `selftests/bpf` in the tarball | ||
* `ARCHIVE_MAKE_HELPERS` - add all the Linux repo makefiles and other | ||
scripts | ||
* `ARCHIVE_SCHED_EXT_SELFTESTS` - add | ||
`tools/testing/selftests/sched_ext` binaries under | ||
`selftests/sched_ext` in the tarball | ||
|
||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
name: 'Tar build artifacts' | ||
inputs: | ||
kbuild-output: | ||
description: 'Path to the kernel build output' | ||
required: true | ||
repo-root: | ||
description: "Path to the root of the kernel repository" | ||
required: true | ||
arch: | ||
required: true | ||
toolchain: | ||
required: true | ||
outputs: | ||
archive-name: | ||
description: 'Artifacts tarball name' | ||
value: ${{ steps.run-script.outputs.archive-name }} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. toolchain is only needed so we can generate the final archive name. I wonder if we should rather provide the destination file as an input, this way we can give it the name we like from the caller. It also seems to be what other actions doing something similar would do: https://github.com/marketplace/actions/tar-action There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added I thought about this, and wasn't sure what's the best API would be. The caller obviously needs to know the archive name, so why don't just allow them to set it. Also, it seems so far that using env variables to control action-driven scripts is very convenient. We should think about a convention for when to use env variables vs script argument vs action inputs, because right now it's quite chaotic. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
could not agree more :D |
||
|
||
runs: | ||
using: "composite" | ||
steps: | ||
- name: Run tar-artifacts.sh | ||
id: run-script | ||
env: | ||
KBUILD_OUTPUT: ${{ inputs.kbuild-output }} | ||
REPO_ROOT: ${{ inputs.repo-root }} | ||
shell: bash | ||
run: | ||
${GITHUB_ACTION_PATH}/tar-artifacts.sh "${{ inputs.arch }}" "${{ inputs.toolchain }}" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
#!/bin/bash | ||
|
||
set -eux -o pipefail | ||
|
||
if [ ! -d "${REPO_ROOT:-}" ]; then | ||
echo "REPO_ROOT must be a directory: ${REPO_ROOT}" | ||
exit 1 | ||
fi | ||
|
||
if [ ! -d "${KBUILD_OUTPUT:-}" ]; then | ||
echo "KBUILD_OUTPUT must be a directory: ${KBUILD_OUTPUT}" | ||
exit 1 | ||
fi | ||
|
||
ARCHIVE_BPF_SELFTESTS="${ARCHIVE_BPF_SELFTESTS:-true}" | ||
ARCHIVE_MAKE_HELPERS="${ARCHIVE_MAKE_HELPERS:-}" | ||
ARCHIVE_SCHED_EXT_SELFTESTS="${ARCHIVE_SCHED_EXT_SELFTESTS:-}" | ||
|
||
arch="${1}" | ||
toolchain="${2}" | ||
|
||
tarball="vmlinux-${arch}-${toolchain}.tar" | ||
|
||
source "${GITHUB_ACTION_PATH}/../helpers.sh" | ||
|
||
# Strip debug information, which is excessively large (consuming | ||
# bandwidth) while not actually being used (the kernel does not use | ||
# DWARF to symbolize stacktraces). | ||
"${arch}"-linux-gnu-strip --strip-debug "${KBUILD_OUTPUT}"/vmlinux | ||
|
||
image_name=$(make -C ${REPO_ROOT} ARCH="$(platform_to_kernel_arch "${arch}")" -s image_name) | ||
kbuild_output_file_list=( | ||
".config" | ||
"${image_name}" | ||
"include/config/auto.conf" | ||
"include/generated/autoconf.h" | ||
"vmlinux" | ||
) | ||
|
||
tar -rf "${tarball}" -C "${KBUILD_OUTPUT}" \ | ||
--transform "s,^,kbuild-output/," \ | ||
"${kbuild_output_file_list[@]}" | ||
|
||
# In case artifacts are restored not to the kernel repo root, | ||
# package up a bunch of additional infrastructure to support running | ||
# 'make kernelrelease' and bpf tool checks later on. | ||
if [[ -n "${ARCHIVE_MAKE_HELPERS}" ]]; then | ||
find "${REPO_ROOT}" -iname Makefile -printf '%P\n' \ | ||
| tar -rf "${tarball}" -C "${REPO_ROOT}" -T - | ||
tar -rf "${tarball}" -C "${REPO_ROOT}" \ | ||
--exclude '*.o' \ | ||
--exclude '*.d' \ | ||
"scripts/" \ | ||
"tools/testing/selftests/bpf/" \ | ||
"tools/include/" \ | ||
"tools/bpf/bpftool/" | ||
fi | ||
|
||
if [[ -n "${ARCHIVE_BPF_SELFTESTS}" ]]; then | ||
# add .bpf.o files | ||
find "${REPO_ROOT}/tools/testing/selftests/bpf" -name "*.bpf.o" -printf 'selftests/bpf/%P\n' \ | ||
| tar -rf "${tarball}" -C "${REPO_ROOT}/tools/testing" -T - | ||
# add other relevant files | ||
tar -rf "${tarball}" -C "${REPO_ROOT}/tools/testing" \ | ||
--exclude '*.cmd' \ | ||
--exclude '*.d' \ | ||
--exclude '*.h' \ | ||
--exclude '*.o' \ | ||
--exclude '*.output' \ | ||
selftests/bpf/ | ||
fi | ||
|
||
if [[ -n "${ARCHIVE_SCHED_EXT_SELFTESTS}" ]]; then | ||
tar -rf "${tarball}" -C "${REPO_ROOT}/tools/testing" selftests/sched_ext/ | ||
fi | ||
|
||
zst_tarball="vmlinux-${arch}-${toolchain}.tar.zst" | ||
zstd -T0 -19 -i "${tarball}" -o "${zst_tarball}" | ||
echo "archive-name=$(realpath "${zst_tarball}")" >> $GITHUB_OUTPUT |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thought for later: maybe we should move this out of libbpf/ci eventually and let the caller set it through an env var or input (probably preferred)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, this is why I made them env vars in the first place. They are set in the workflow step right now, I guess you're talking about a case when the workflow itself is called from outside.
When we figure out how to actually use reusable workflows in kernel-patches/vmtest, this might be worth revisiting.