Skip to content

allow bytecode image to ship multiple programs #66

allow bytecode image to ship multiple programs

allow bytecode image to ship multiple programs #66

Workflow file for this run

name: bpfman-image-build
on: # yamllint disable-line rule:truthy
push:
branches: [main]
tags:
- v*
pull_request:
paths: [.github/workflows/image-build.yaml]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build bpfman binary
run: cargo build -p bpfman --verbose
- name: archive bpfman binary
run: |
cd target/debug
tar -czvf bpfman.tar.gz bpfman
- name: Archive bpfman Binaries
uses: actions/upload-artifact@v4
with:
name: bpfman
path: |
./target/debug/bpfman.tar.gz
build-and-push-images:
permissions:
contents: read
packages: write
id-token: write # needed for signing the images with GitHub OIDC Token
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
image:
- registry: quay.io
# build_language: rust - Not building locally, so don't install rust toolchain
repository: bpfman
image: bpfman
dockerfile: ./Containerfile.bpfman
context: .
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman
image: bpfman-agent
dockerfile: ./bpfman-operator/Containerfile.bpfman-agent
context: .
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman
image: bpfman-operator
dockerfile: ./bpfman-operator/Containerfile.bpfman-operator
context: .
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman
image: bpfman-operator-bundle
context: ./bpfman-operator
dockerfile: ./bpfman-operator/Containerfile.bundle
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman-userspace
image: go-xdp-counter
context: .
dockerfile: ./examples/go-xdp-counter/container-deployment/Containerfile.go-xdp-counter
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman-userspace
image: go-tc-counter
context: .
dockerfile: ./examples/go-tc-counter/container-deployment/Containerfile.go-tc-counter
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman-userspace
image: go-tracepoint-counter
context: .
dockerfile: ./examples/go-tracepoint-counter/container-deployment/Containerfile.go-tracepoint-counter
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman-userspace
image: go-kprobe-counter
context: .
dockerfile: ./examples/go-kprobe-counter/container-deployment/Containerfile.go-kprobe-counter
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman-userspace
image: go-uprobe-counter
context: .
dockerfile: ./examples/go-uprobe-counter/container-deployment/Containerfile.go-uprobe-counter
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman-userspace
image: go-uretprobe-counter
context: .
dockerfile: ./examples/go-uretprobe-counter/container-deployment/Containerfile.go-uretprobe-counter
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
- registry: quay.io
# build_language: go - Not building locally, so don't install go tools
repository: bpfman-userspace
image: go-target
context: .
dockerfile: ./examples/go-target/container-deployment/Containerfile.go-target
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
name: Build Image (${{ matrix.image.image }})
steps:
- name: Checkout bpfman
uses: actions/checkout@v4
- name: Install cosign
uses: sigstore/[email protected]
- name: Generate olm bundle on disk
if: ${{ matrix.image.image == 'bpfman-operator-bundle' }}
run: |
cd bpfman-operator && make bundle
- name: Login to quay.io/bpfman
uses: redhat-actions/podman-login@v1
if: ${{ github.event_name == 'push' && matrix.image.repository == 'bpfman'}}
with:
registry: ${{ matrix.image.registry }}
username: ${{ secrets.BPFMAN_USERNAME }}
password: ${{ secrets.BPFMAN_ROBOT_TOKEN }}
- name: Login to quay.io/bpfman-userspace
uses: redhat-actions/podman-login@v1
if: ${{ github.event_name == 'push' && matrix.image.repository == 'bpfman-userspace'}}
with:
registry: ${{ matrix.image.registry }}
username: ${{ secrets.BPFMAN_USERSPACE_USERNAME }}
password: ${{ secrets.BPFMAN_USERSPACE_ROBOT_TOKEN }}
- name: Extract metadata (tags, labels) for image
id: meta
uses: docker/[email protected]
with:
images: ${{ matrix.image.registry }}/${{ matrix.image.repository }}/${{ matrix.image.image }}
tags: ${{ matrix.image.tags }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set push flag
id: set-push
run: |
if [ ${{ github.event_name }} == 'push' ]; then
echo "push_flag=true" >> "$GITHUB_OUTPUT"
else
echo "push_flag=false" >> "$GITHUB_OUTPUT"
fi
- name: Build and push
id: build-push-image
uses: docker/build-push-action@v5
with:
platforms: linux/amd64, linux/arm64
# TBD: linux/ppc64le, linux/s390x
push: ${{ fromJSON(steps.set-push.outputs.push_flag) }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
file: ${{ matrix.image.dockerfile }}
build-args: ${{ matrix.image.build_args }}
context: ${{ matrix.image.context }}
- name: Sign the images with GitHub OIDC Token
if: ${{ github.event_name == 'push' }}
run: |
readarray -t tags <<<"${{ steps.meta.outputs.tags }}"
for tag in ${tags[@]}; do
cosign sign -y "${tag}@${{ steps.build-push-image.outputs.digest }}"
done
build-and-push-bytecode-images:
needs: [build]
permissions:
contents: read
packages: write
id-token: write # needed for signing the images with GitHub OIDC Token
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
image:
- registry: quay.io
build_language: go
bpf_build_wrapper: go
repository: bpfman-bytecode
image: go-xdp-counter
context: .
dockerfile: ./Containerfile.bytecode
bytecode_path: ./examples/go-xdp-counter/bpf_bpfel.o
tags: |
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha,format=long
# set latest tag for default branch
type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: go
# bpf_build_wrapper: go
# repository: bpfman-bytecode
# image: go-tc-counter
# context: ./examples/go-tc-counter
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=go-tc-counter
# BPF_FUNCTION_NAME=stats
# PROGRAM_TYPE=tc
# BYTECODE_FILENAME=bpf_bpfel.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: go
# bpf_build_wrapper: go
# repository: bpfman-bytecode
# image: go-tracepoint-counter
# context: ./examples/go-tracepoint-counter
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=go-tracepoint-counter
# BPF_FUNCTION_NAME=tracepoint_kill_recorder
# PROGRAM_TYPE=tracepoint
# BYTECODE_FILENAME=bpf_bpfel.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: go
# bpf_build_wrapper: go
# repository: bpfman-bytecode
# image: go-kprobe-counter
# context: ./examples/go-kprobe-counter
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=kprobe_counter
# BPF_FUNCTION_NAME=kprobe_counter
# PROGRAM_TYPE=kprobe
# BYTECODE_FILENAME=bpf_bpfel.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: go
# bpf_build_wrapper: go
# repository: bpfman-bytecode
# image: go-uprobe-counter
# context: ./examples/go-uprobe-counter
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=uprobe_counter
# BPF_FUNCTION_NAME=uprobe_counter
# PROGRAM_TYPE=uprobe
# BYTECODE_FILENAME=bpf_bpfel.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: go
# bpf_build_wrapper: go
# repository: bpfman-bytecode
# image: go-uretprobe-counter
# context: ./examples/go-uretprobe-counter
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=uretprobe_counter
# BPF_FUNCTION_NAME=uretprobe_counter
# PROGRAM_TYPE=uretprobe
# BYTECODE_FILENAME=bpf_x86_bpfel.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: xdp_pass
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=xdp_pass
# BPF_FUNCTION_NAME=pass
# PROGRAM_TYPE=xdp
# BYTECODE_FILENAME=xdp_pass.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: xdp_pass_private
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=xdp_pass_private
# BPF_FUNCTION_NAME=pass
# PROGRAM_TYPE=xdp
# BYTECODE_FILENAME=xdp_pass.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: tc_pass
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=tc_pass
# BPF_FUNCTION_NAME=pass
# PROGRAM_TYPE=tc
# BYTECODE_FILENAME=tc_pass.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: tracepoint
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=tracepoint
# BPF_FUNCTION_NAME=enter_openat
# PROGRAM_TYPE=tracepoint
# BYTECODE_FILENAME=tp_openat.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: uprobe
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=uprobe
# BPF_FUNCTION_NAME=my_uprobe
# PROGRAM_TYPE=uprobe
# BYTECODE_FILENAME=uprobe.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: uretprobe
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=uretprobe
# BPF_FUNCTION_NAME=my_uretprobe
# PROGRAM_TYPE=uretprobe
# BYTECODE_FILENAME=uprobe.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: kprobe
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=kprobe
# BPF_FUNCTION_NAME=my_kprobe
# PROGRAM_TYPE=kprobe
# BYTECODE_FILENAME=kprobe.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: kretprobe
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=kretprobe
# BPF_FUNCTION_NAME=my_kretprobe
# PROGRAM_TYPE=kretprobe
# BYTECODE_FILENAME=kprobe.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: fentry
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=do_unlinkat
# BPF_FUNCTION_NAME=test_fentry
# PROGRAM_TYPE=fentry
# BYTECODE_FILENAME=fentry.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman-bytecode
# image: fexit
# context: ./tests/integration-test/bpf/.output
# dockerfile: ./Containerfile.bytecode
# build_args: |
# PROGRAM_NAME=do_unlinkat
# BPF_FUNCTION_NAME=test_fexit
# PROGRAM_TYPE=fexit
# BYTECODE_FILENAME=fentry.bpf.o
# tags: |
# type=ref,event=branch
# type=ref,event=tag
# type=ref,event=pr
# type=sha,format=long
# # set latest tag for default branch
# type=raw,value=latest,enable={{is_default_branch}}
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman
# image: xdp-dispatcher
# context: .
# dockerfile: ./Containerfile.xdp_dispatcher_v1
# tags: |
# type=sha,format=long
# type=raw,value=v1,enable=true
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman
# image: xdp-dispatcher
# context: .
# dockerfile: ./Containerfile.xdp_dispatcher_v2
# tags: |
# type=sha,format=long
# type=raw,value=v2,enable=true
# - registry: quay.io
# build_language: rust
# bpf_build_wrapper: rust
# repository: bpfman
# image: tc-dispatcher
# context: .
# dockerfile: ./Containerfile.tc_dispatcher
# tags: |
# type=sha,format=long
# type=raw,value=v1,enable=true
name: Build eBPF Image (${{ matrix.image.image }})
steps:
- name: Checkout bpfman
uses: actions/checkout@v4
- name: Install Golang
uses: actions/setup-go@v5
if: ${{ matrix.image.build_language == 'go' }}
with:
# prettier-ignore
go-version: '1.22' # yamllint disable-line rule:quoted-strings
- name: Install cosign
uses: sigstore/[email protected]
- name: Checkout libbpf
uses: actions/checkout@v4
if: ${{ matrix.image.bpf_build_wrapper == 'rust' }}
with:
repository: libbpf/libbpf
path: libbpf
- name: Install rust toolchain - stable
uses: actions-rs/toolchain@v1
if: ${{ matrix.image.build_language == 'rust' }}
with:
toolchain: stable
override: true
- name: Install libelf-dev
if: ${{ matrix.image.bpf_build_wrapper == 'rust' || matrix.image.bpf_build_wrapper == 'go' }}
run: |
sudo apt-get update
sudo apt-get install -y linux-headers-`uname -r` clang lldb lld libelf-dev gcc-multilib libbpf-dev
- name: Build rust wrapped eBPF
if: ${{ matrix.image.bpf_build_wrapper == 'rust' }}
run: |
cargo xtask build-ebpf --libbpf-dir ./libbpf
- name: Generate go wrapped eBPF
if: ${{ matrix.image.bpf_build_wrapper == 'go' }}
run: |
cd examples && make generate
- name: Download bpfman binary
uses: actions/download-artifact@v4
with:
name: bpfman
- name: Unpack binary and put bpfman in path
run: |
tar -C /usr/local/bin -xzvf bpfman.tar.gz
- name: Login to quay.io/bpfman-bytecode
uses: redhat-actions/podman-login@v1
if: ${{ github.event_name == 'push' && matrix.image.repository == 'bpfman-bytecode' }}
with:
registry: ${{ matrix.image.registry }}
username: ${{ secrets.BPFMAN_BYTECODE_USERNAME }}
password: ${{ secrets.BPFMAN_BYTECODE_ROBOT_TOKEN }}
- name: Extract metadata (tags, labels) for image
id: meta
uses: docker/[email protected]
with:
images: ${{ matrix.image.registry }}/${{ matrix.image.repository }}/${{ matrix.image.image }}
tags: ${{ matrix.image.tags }}
- name: Generate build args
id: build-tags
run: |
echo "BUILD_ARGS=$(bpfman image generate-build-args -b ${{ matrix.image.bytecode_path }})"
- name: Build image
id: build-image
uses: redhat-actions/buildah-build@v2
with:
image: ${{ matrix.image.image }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
containerfiles: ${{ matrix.image.dockerfile }}
build-args: format('{0}\n{1}\n{2}', matrix.image.build_args, 'BYTECODE_FILE=${{ matrix.image.bytecode_path }}', ${{ env.BUILD_ARGS }})
'${{ matrix.image.build_args }}/nBYTECODE_FILE=${{ matrix.image.bytecode_path }}'

Check failure on line 715 in .github/workflows/image-build.yaml

View workflow run for this annotation

GitHub Actions / .github/workflows/image-build.yaml

Invalid workflow file

You have an error in your yaml syntax on line 715
context: ${{ matrix.image.context }}
- name: Push to registry
id: push-image
uses: redhat-actions/push-to-registry@v2
if: ${{ github.event_name == 'push' }}
with:
tags: ${{ steps.meta.outputs.tags }}
- name: Sign the images with GitHub OIDC Token
if: ${{ github.event_name == 'push' }}
run: |
readarray -t tags <<<"${{ steps.meta.outputs.tags }}"
for tag in ${tags[@]}; do
cosign sign -y "${tag}@${{ steps.push-image.outputs.digest }}"
done