Performance Benchmark #215
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: Performance Benchmark | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| signing: | |
| description: 'true: AFTER phase runs with signature verification on and the same image on both sides, measuring what the feature costs while active. false: both phases run with signing off, so before_image vs after_image measures what the new code costs while the feature is dormant.' | |
| required: false | |
| type: boolean | |
| default: false | |
| before_image: | |
| description: 'Before image (baseline). Defaults to latest release.' | |
| required: false | |
| type: string | |
| after_image: | |
| description: 'After image (candidate). Defaults to building from source.' | |
| required: false | |
| type: string | |
| workflow_call: | |
| inputs: | |
| after_image: | |
| required: true | |
| type: string | |
| before_image: | |
| required: false | |
| type: string | |
| concurrency: | |
| group: benchmark-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| benchmark: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: "1.25" | |
| - name: Install Kind | |
| run: | | |
| curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-amd64 | |
| chmod +x ./kind | |
| sudo mv ./kind /usr/local/bin/kind | |
| - name: Install Helm | |
| run: | | |
| curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash | |
| - name: Resolve before image | |
| id: before-image | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| if [[ -n "${{ inputs.before_image }}" ]]; then | |
| echo "BEFORE_IMAGE=${{ inputs.before_image }}" >> "$GITHUB_OUTPUT" | |
| else | |
| LATEST_TAG=$(gh api repos/${{ github.repository }}/releases/latest --jq '.tag_name') | |
| echo "BEFORE_IMAGE=quay.io/kubescape/node-agent:${LATEST_TAG}" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Build after image | |
| id: after-image | |
| if: ${{ !inputs.after_image }} | |
| run: | | |
| curl https://github.com/inspektor-gadget/inspektor-gadget/releases/download/v0.48.1/ig_0.48.1_amd64.deb -LO && sudo dpkg -i ig_0.48.1_amd64.deb | |
| make gadgets | |
| make binary | |
| make docker-build IMAGE=quay.io/kubescape/node-agent TAG=bench-${{ github.sha }} | |
| echo "AFTER_IMAGE=quay.io/kubescape/node-agent:bench-${{ github.sha }}" >> "$GITHUB_OUTPUT" | |
| - name: Set after image from input | |
| id: after-image-input | |
| if: ${{ inputs.after_image }} | |
| run: | | |
| echo "AFTER_IMAGE=${{ inputs.after_image }}" >> "$GITHUB_OUTPUT" | |
| - name: Determine after image | |
| id: resolve-after | |
| run: | | |
| AFTER="${{ steps.after-image.outputs.AFTER_IMAGE || steps.after-image-input.outputs.AFTER_IMAGE }}" | |
| echo "AFTER_IMAGE=${AFTER}" >> "$GITHUB_OUTPUT" | |
| - name: Load after image into Kind | |
| if: ${{ !inputs.after_image }} | |
| run: | | |
| # Kind cluster is created by dedup-bench.sh, but we need to pre-load the image | |
| # The script's load_image function handles this automatically | |
| echo "After image will be loaded by dedup-bench.sh" | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Install Python dependencies | |
| run: pip install -r benchmark/requirements.txt || pip install -r benchmark/requirements.txt | |
| - name: Run benchmark | |
| env: | |
| BEFORE_IMAGE: ${{ steps.before-image.outputs.BEFORE_IMAGE }} | |
| AFTER_IMAGE: ${{ steps.resolve-after.outputs.AFTER_IMAGE }} | |
| OUTPUT_DIR: ${{ github.workspace }}/benchmark-output | |
| BENCH_SIGNING: ${{ inputs.signing }} | |
| run: | | |
| chmod +x benchmark/dedup-bench.sh | |
| benchmark/dedup-bench.sh "$BEFORE_IMAGE" "$AFTER_IMAGE" | |
| - name: Generate markdown report | |
| if: always() | |
| run: | | |
| python3 benchmark/compare-metrics.py --format markdown \ | |
| "${{ github.workspace }}/benchmark-output/before" \ | |
| "${{ github.workspace }}/benchmark-output/after" > report.md || true | |
| - name: Quality gate - check for performance degradation | |
| if: always() | |
| run: | | |
| python3 benchmark/compare-metrics.py --check \ | |
| "${{ github.workspace }}/benchmark-output/before" \ | |
| "${{ github.workspace }}/benchmark-output/after" | |
| - name: Comment on PR | |
| uses: peter-evans/create-or-update-comment@v4 | |
| if: github.event_name == 'pull_request' && always() | |
| continue-on-error: true | |
| with: | |
| issue-number: ${{ github.event.pull_request.number }} | |
| body-path: report.md | |
| comment-tag: benchmark-results | |
| - name: Upload artifacts | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: benchmark-results | |
| path: ${{ github.workspace }}/benchmark-output/ | |
| retention-days: 30 |