ci: add integration tests #78
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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/... |