Skip to content

ci: add integration tests #77

ci: add integration tests

ci: add integration tests #77

Workflow file for this run

name: CI
on:
# When added to a merge queue.
# See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#triggering-merge-group-checks-with-github-actions
merge_group:
pull_request:
branches: ['main', 'release/**']
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
env:
KERNEL_VERSION: "6.12.46"
jobs:
linters:
permissions:
contents: read # for actions/checkout to fetch code
pull-requests: read # for golangci/golangci-lint-action to fetch pull requests
name: Linters
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
- run: make validate
#
# Project checks
#
project:
name: Project Checks
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
path: src/github.com/containerd/nerdbox
fetch-depth: 100
- uses: ./src/github.com/containerd/nerdbox/.github/actions/install-go
- uses: containerd/project-checks@d7751f3c375b8fe4a84c02a068184ee4c1f59bc4 # v1.2.2
if: github.repository == 'containerd/nerdbox'
with:
working-directory: src/github.com/containerd/nerdbox
repo-access-token: ${{ secrets.GITHUB_TOKEN }}
- name: verify go modules and vendor directory
run: |
make verify-vendor
working-directory: src/github.com/containerd/nerdbox
#
# Protobuf checks
#
protos:
name: Protobuf
runs-on: ubuntu-latest
timeout-minutes: 5
defaults:
run:
working-directory: src/github.com/containerd/nerdbox
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
path: src/github.com/containerd/nerdbox
# Needed for proto lookup during generation
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
repository: containerd/containerd
path: src/github.com/containerd/containerd
- uses: ./src/github.com/containerd/nerdbox/.github/actions/install-go
- name: Set env
shell: bash
run: |
echo "GOPATH=${{ github.workspace }}" >> $GITHUB_ENV
echo "${{ github.workspace }}/bin" >> $GITHUB_PATH
- name: Install protobuf
run: |
sudo -E PATH=$PATH script/install-protobuf
sudo chmod +x /usr/local/bin/protoc
sudo chmod og+rx /usr/local/include/google /usr/local/include/google/protobuf /usr/local/include/google/protobuf/compiler
sudo chmod -R og+r /usr/local/include/google/protobuf/
protoc --version
- run: script/install-proto-tools
- run: make proto-fmt
- run: make check-protos check-api-descriptors
#
# Build kernels on cache miss
#
build-kernel-x86_64:
name: Build Kernel x86_64 (if needed)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/build-kernel
with:
kernel_version: ${{ env.KERNEL_VERSION }}
kernel_arch: "x86_64"
build-kernel-arm64:
name: Build Kernel arm64 (if needed)
runs-on: ubuntu-24.04-arm
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/build-kernel
with:
kernel_version: ${{ env.KERNEL_VERSION }}
kernel_arch: "arm64"
#
# Integration tests
#
integration:
name: Integration Tests (${{ matrix.os }})
needs: [build-kernel-x86_64, build-kernel-arm64]
# Always run after kernel builds complete (whether they were cached or not)
if: |
always() &&
(needs.build-kernel-x86_64.result == 'success' || needs.build-kernel-x86_64.result == 'skipped') &&
(needs.build-kernel-arm64.result == 'success' || needs.build-kernel-arm64.result == 'skipped')
runs-on: ${{ matrix.os }}
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
env:
KERNEL_ARCH: ""
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Set architecture variable
id: arch
run: |
echo "KERNEL_ARCH=$(uname -m)" >> $GITHUB_ENV
echo "Testing with architecture: ${{ env.KERNEL_ARCH }}"
- name: Calculate kernel cache key
id: cache-key
run: |
# Hash the kernel config and patches to create a unique cache key
CONFIG_FILE="kernel/config-${KERNEL_VERSION}-${KERNEL_ARCH}"
if [ ! -f "$CONFIG_FILE" ]; then
echo "Error: Kernel config file $CONFIG_FILE not found"
exit 1
fi
# Calculate hash of config file and all patches
CONFIG_HASH=$(sha256sum "$CONFIG_FILE" | cut -d' ' -f1)
PATCHES_HASH=$(find kernel/patches -type f -name "*.patch" -exec sha256sum {} \; | sort | sha256sum | cut -d' ' -f1)
# Combine version, arch, config hash, and patches hash
CACHE_KEY="kernel-${KERNEL_VERSION}-${KERNEL_ARCH}-${CONFIG_HASH:0:8}-${PATCHES_HASH:0:8}"
echo "cache-key=${CACHE_KEY}" >> $GITHUB_OUTPUT
echo "Kernel cache key: ${CACHE_KEY}"
- name: Restore cached kernel
id: cache-kernel
uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
with:
path: _output/nerdbox-kernel-${{ env.KERNEL_ARCH }}
key: ${{ steps.cache-key.outputs.cache-key }}
- name: Verify kernel from cache
run: |
if [ "${{ steps.cache-kernel.outputs.cache-hit }}" = "true" ]; then
echo "✅ Kernel restored from cache"
else
echo "❌ Kernel not in cache - this should not happen after build-kernels-on-demand"
exit 1
fi
ls -lh _output/nerdbox-kernel-${KERNEL_ARCH}
file _output/nerdbox-kernel-${KERNEL_ARCH}
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
- name: Build remaining artifacts (initrd and shim)
run: |
echo "Building host and guest binaries:"
docker buildx bake host-binaries guest-binaries
- name: Verify all artifacts
run: |
echo "Verifying build artifacts:"
ls -lh _output/
echo ""
echo "Kernel:"
file _output/nerdbox-kernel-${KERNEL_ARCH}
echo ""
echo "Initrd:"
file _output/nerdbox-initrd
echo ""
echo "Shim:"
file _output/containerd-shim-nerdbox-v1
- uses: ./.github/actions/install-go
- name: Run integration tests
run: go test -v ./integration/...