Skip to content
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

Merged
merged 3 commits into from
Oct 24, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 0 additions & 107 deletions .github/scripts/tar-artifact.sh

This file was deleted.

17 changes: 12 additions & 5 deletions .github/workflows/kernel-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ jobs:
runs-on: ${{ fromJSON(inputs.runs_on) }}
timeout-minutes: 100
env:
ARCHIVE_MAKE_HELPERS: ${{ github.repository != 'kernel-patches/bpf' && 'true' || '' }}
KERNEL: ${{ inputs.kernel }}
REPO_ROOT: ${{ github.workspace }}
REPO_PATH: ""
Expand Down Expand Up @@ -140,9 +139,17 @@ jobs:
max-make-jobs: 32
llvm-version: ${{ inputs.llvm-version }}
- name: Tar artifacts
working-directory: ${{ env.REPO_ROOT }}
run: |
bash .github/scripts/tar-artifact.sh ${{ inputs.arch }} ${{ inputs.toolchain_full }}
id: tar-artifacts
uses: ./tar-artifacts
env:
ARCHIVE_BPF_SELFTESTS: 'true'
ARCHIVE_MAKE_HELPERS: ${{ github.repository != 'kernel-patches/bpf' && 'true' || '' }}
Copy link
Collaborator

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)

Copy link
Contributor Author

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.

ARCHIVE_SCHED_EXT_SELFTESTS: ${{ env.BUILD_SCHED_EXT_SELFTESTS }}
with:
kbuild-output: ${{ env.KBUILD_OUTPUT }}
repo-root: ${{ env.REPO_ROOT }}
arch: ${{ inputs.arch }}
toolchain: ${{ inputs.toolchain_full }}
- if: ${{ github.event_name != 'push' }}
name: Remove KBUILD_OUTPUT content
shell: bash
Expand All @@ -155,4 +162,4 @@ jobs:
with:
name: vmlinux-${{ inputs.arch }}-${{ inputs.toolchain_full }}${{ inputs.release && '-release' || '' }}
if-no-files-found: error
path: vmlinux-${{ inputs.arch }}-${{ inputs.toolchain_full }}.tar.zst
path: ${{ steps.tar-artifacts.outputs.archive-name }}
38 changes: 38 additions & 0 deletions tar-artifacts/README.md
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



28 changes: 28 additions & 0 deletions tar-artifacts/action.yml
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 }}
Copy link
Collaborator

Choose a reason for hiding this comment

The 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

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Added archive input and removed output.

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.

Copy link
Collaborator

Choose a reason for hiding this comment

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

because right now it's quite chaotic.

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 }}"
79 changes: 79 additions & 0 deletions tar-artifacts/tar-artifacts.sh
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
Loading