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

feat: add bench workflow for AWS #1330

Merged
merged 1 commit into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all 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
144 changes: 144 additions & 0 deletions .github/workflows/bench-benchmark.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
name: "Benchmark with Bench client"

on:
push:
branches:
- main
release:
types: [published, prereleased]
workflow_dispatch:
inputs:
destroy-on-session-end:
description: "Whether to destroy infrastructure right after the bench job has ended"
type: boolean
required: false
default: true
prefix:
description: "Prefix for the infrastructure. The bucket associated with this prefix must be created before."
required: false
default: "ci-bench"

jobs:
define-matrix:
name: Define matrix
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.types.outputs.matrix }}
steps:
- id: types
name: Define matrix
env:
TRIGGER: ${{ github.event_name }}
REF_NAME: ${{ github.ref_name }}
run: |
set -ex
if [ "$TRIGGER" == 'push' ]; then
echo '{"include":[{"type": "localhost", "ntasks":3000, "polling-limit": 300}]}' > matrix.json
echo "FILE_PREFIX=$REF_NAME" >> $GITHUB_ENV
elif [ "$TRIGGER" == 'release' ]; then
echo '{"include":[{"type": "localhost", "ntasks":3000, "polling-limit": 300}, {"type": "aws", "ntasks":1200000, "polling-limit": 1000, "parameters-file-path": "benchmarking/aws/parameters.tfvars"}]}' > matrix.json
echo "FILE_PREFIX=release/$REF_NAME" >> $GITHUB_ENV
elif [ "$TRIGGER" == 'workflow_dispatch' ]; then
echo '{"include":[{"type": "aws", "ntasks":1200000, "polling-limit": 1000, "parameters-file-path": "benchmarking/aws/parameters.tfvars"}]}' > matrix.json
echo "FILE_PREFIX=manual/$REF_NAME" >> $GITHUB_ENV
fi
echo "matrix=$(cat matrix.json)" >> "$GITHUB_OUTPUT"

benchmark:
name: ${{ matrix.type }}
runs-on: ubuntu-latest
needs: define-matrix
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.define-matrix.outputs.matrix) }}
env:
prefix: ${{ inputs.prefix || 'ci-bench' }}
parameters-file-path: ${{ matrix.parameters-file-path }}
outputs:
terraform-output: ${{ steps.deploy.outputs.terraform-output }}
armonik-endpoint: ${{ steps.get-armonik-endpoint.outputs.endpoint }}
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4

- name: Install Dependencies
uses: aneoconsulting/ArmoniK.Action.Deploy/dependencies@main
with:
terraform: true
k3s: true
docker: true
aws: true
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: eu-west-3

- name: Get Core version
run: |
set -ex
echo "core-version=$(cat versions.tfvars.json | jq -r '.armonik_versions.core')" >> $GITHUB_ENV

- id: deploy
name: "Deploy ArmoniK"
uses: aneoconsulting/ArmoniK.Action.Deploy/deploy@main
with:
type: ${{ matrix.type }}
prefix: ${{ env.prefix }}
core-version: ${{ env.core-version }}
parameters-file-path: ${{ env.parameters-file-path }}

- id: get-armonik-endpoint
name: "Get ArmoniK's control plane endpoint"
env:
TYPE: ${{ matrix.type }}
run: |
set -ex
grpc_endpoint=$(cat "infrastructure/quick-deploy/$TYPE/generated/armonik-output.json" | jq -r '.armonik.control_plane_url' | sed -r 's/(http:\/\/)([^:]*)(:.*)/\2/')
echo "grpc-endpoint=$grpc_endpoint" >> "$GITHUB_OUTPUT"
sleep 60

- id: bench
name: Run Bench
uses: aneoconsulting/ArmoniK.Action.Deploy/bench@main
with:
type: ${{ matrix.type }}
armonik-core-version: ${{ env.core-version }}
ntasks: ${{ matrix.ntasks }}
session-name: bench
grpc-client-endpoint: ${{ steps.get-armonik-endpoint.outputs.grpc-endpoint }}
timeout: 1200

- id: get-bench-stats
name: Get Bench Stats
uses: aneoconsulting/ArmoniK.Action.Deploy/get-throughput@main
with:
grpc-client-endpoint: ${{ steps.get-armonik-endpoint.outputs.grpc-endpoint }}
session-name: ${{ steps.bench.outputs.session-name }}
poll-duration-limit: ${{ matrix.polling-limit }}

- name: Upload benchmark results to artifact registry
uses: actions/upload-artifact@v4
with:
name: benchclient_benchmark_${{ github.event_name }}_${{ matrix.type }}_${{ github.run_id }}
path: ${{ steps.get-bench-stats.outputs.bench-file-path }}

- name: Upload benchmark results to s3
env:
EVENT_NAME: ${{ github.event_name }}
BENCH_RESULTS_PATH: ${{ steps.get-bench-stats.outputs.bench-file-path }}
TYPE: ${{ matrix.type }}
GHRUNID: ${{ github.run_id }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_EC2_METADATA_DISABLED: true
run: |
DATE=$(date +"%Y-%m-%d")
aws s3 cp "$BENCH_RESULTS_PATH" "s3://armonik-bench-storage/${FILE_PREFIX}/${GHRUNID}_${DATE}/benchclient_benchmark_${EVENT_NAME}_${TYPE}.json"

- if: ${{ (github.event_name == 'workflow_dispatch' && inputs.destroy-on-session-end) || (github.event_name != 'workflow_dispatch' && always()) }}
Copy link
Contributor

Choose a reason for hiding this comment

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

Is the 'always()' really necessary?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

always() is here to ensure that if the workflow isn't triggered manually the infrastructure on AWS is always destroyed even when a previous step has failed.

id: destroy
name: Destroy deployment
uses: aneoconsulting/ArmoniK.Action.Deploy/destroy@main
with:
type: ${{ matrix.type }}
prefix: ${{ env.prefix }}
parameters-file-path: ${{ env.parameters-file-path }}
Loading
Loading