Skip to content

Commit cc35ecf

Browse files
authored
feat: add performance test pipeline (#148)
1 parent e117976 commit cc35ecf

12 files changed

Lines changed: 697 additions & 0 deletions

File tree

performance/.babelrc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"presets": ["@babel/env", "@babel/typescript"],
3+
"plugins": [
4+
"@babel/proposal-class-properties",
5+
6+
"@babel/proposal-object-rest-spread"
7+
]
8+
}

performance/.gitignore

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# k6 specific
2+
k6-summary-*.json
3+
4+
# Test results
5+
results/
6+
*.log
7+
*.html
8+
*.csv
9+
*.json
10+
11+
# Environment files
12+
.env
13+
*.env.json
14+
15+
# Dependencies
16+
node_modules/
17+
18+
# OS specific
19+
.DS_Store
20+
Thumbs.db

performance/.npmrc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
@uipath:registry=https://npm.pkg.github.com/
2+
//npm.pkg.github.com/:_authToken=${GH_NPM_REGISTRY_TOKEN}

performance/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
## Run locally
2+
3+
Get `PERF_PASSWORD` from `1Password/Agent Perf Test` vault.
4+
5+
```powershell
6+
$env:PERF_USERNAME='uipath.perf.test@uipath-qa.com'; $env:PERF_PASSWORD=''; $env:MODE='startPlayground'; $env:PROCESS_KEY=''; $env:SOLUTION_PROJECT_ID='48d96482-dfe2-48eb-9361-6eb5fe78bb91'; $env:INPUT_ARGUMENTS='{\"longString\":\"test\"}'; $env:FOLDER_ID='297721'; $env:DURATION='1s'; $env:RATE='1'; $env:TIME_UNIT='1s'; $env:PRE_ALLOCATED_VUS='1200'; $env:MAX_VUS='1200'; $env:CLOUD_ENVIRONMENT='staging'; $env:ORGANIZATION_NAME='testcloudperformance'; $env:ORGANIZATION_ID='c0c241d2-01e4-4c55-82fa-2f70083dd89e'; $env:TENANT_NAME='aop_03_alex_groza'; $env:TENANT_ID='11cb2dc5-c10f-4f0c-a5b1-ac238eb27507'; $env:HALT_WAIT_THRESHOLD='5'; $env:SOCKET_TIMEOUT_MINUTES='5'; ./run.ps1
7+
```
8+
9+

performance/package.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"name": "performance",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "test.js",
6+
"scripts": {
7+
"build": "webpack"
8+
},
9+
"repository": {
10+
"type": "git",
11+
"url": "https://github.com/UiPath/uipath-agents-python.git"
12+
},
13+
"private": true,
14+
"dependencies": {
15+
"k6": "^0.0.0"
16+
},
17+
"devDependencies": {
18+
"@uipath/k6-login": "^2.0.0",
19+
"@types/k6": "^0.54.2",
20+
"@babel/core": "7.13.16",
21+
"@babel/plugin-proposal-class-properties": "7.13.0",
22+
"@babel/plugin-proposal-object-rest-spread": "7.13.8",
23+
"@babel/preset-env": "7.13.15",
24+
"@babel/preset-typescript": "^7.13.0",
25+
"@types/webpack": "5.28.0",
26+
"babel-loader": "8.3.0",
27+
"clean-webpack-plugin": "4.0.0-alpha.0",
28+
"copy-webpack-plugin": "^9.0.1",
29+
"typescript": "4.2.4",
30+
"webpack": "5.75.0",
31+
"webpack-cli": "4.6.0",
32+
"webpack-glob-entries": "^1.0.1"
33+
}
34+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
trigger: none
2+
3+
parameters:
4+
- name: scenarios
5+
type: object
6+
default:
7+
- mode: 'startUnattended'
8+
processKey: '23899934-E6C1-4055-A481-66C0F890FD47'
9+
solutionProjectId: ''
10+
inputArguments: '{\"longString\":\"test\"}'
11+
folderId: '297704'
12+
duration: '1s'
13+
rate: '1'
14+
timeUnit: '1s'
15+
preAllocatedVUs: '1200'
16+
maxVUs: '1200'
17+
testId: 'Simple_Agent_Unattended'
18+
dependsOn: []
19+
- mode: 'startPlayground'
20+
processKey: ''
21+
solutionProjectId: '48d96482-dfe2-48eb-9361-6eb5fe78bb91'
22+
inputArguments: '{\"longString\":\"test\"}'
23+
folderId: '297721'
24+
duration: '1s'
25+
rate: '1'
26+
preAllocatedVUs: '1200'
27+
maxVUs: '1200'
28+
testId: 'Simple_Agent_Playground'
29+
dependsOn: 'Simple_Agent_Unattended'
30+
- name: cloudEnvironment
31+
type: string
32+
default: 'staging'
33+
- name: organizationName
34+
type: string
35+
default: 'testcloudperformance'
36+
- name: organizationId
37+
type: string
38+
default: 'c0c241d2-01e4-4c55-82fa-2f70083dd89e'
39+
- name: tenantName
40+
type: string
41+
default: 'aop_03_alex_groza'
42+
- name: tenantId
43+
type: string
44+
default: '11cb2dc5-c10f-4f0c-a5b1-ac238eb27507'
45+
- name: haltWaitThreshold
46+
type: string
47+
default: '5'
48+
- name: socketTimeoutMinutes
49+
type: string
50+
default: '5'
51+
52+
53+
pool:
54+
name: 'Agents-Perf-Test-Pool'
55+
56+
stages:
57+
- stage: PerformanceTests
58+
displayName: Run Performance Tests
59+
jobs:
60+
- ${{ each scenario in parameters.scenarios }}:
61+
- job: ${{ scenario.testId }}
62+
timeoutInMinutes: 0
63+
displayName: Run ${{ scenario.agent }} in ${{ scenario.mode }} mode
64+
dependsOn:
65+
- ${{ scenario.dependsOn }}
66+
steps:
67+
- task: PowerShell@2
68+
displayName: 'Run ${{ scenario.agent }} in ${{ scenario.mode }} mode'
69+
inputs:
70+
targetType: 'inline'
71+
script: |
72+
Set-Location -Path "$(Build.SourcesDirectory)/performance"
73+
$env:PERF_USERNAME='$(username)'
74+
$env:PERF_PASSWORD='$(password)'
75+
$env:MODE='${{ scenario.mode }}'
76+
$env:PROCESS_KEY='${{ scenario.processKey }}'
77+
$env:SOLUTION_PROJECT_ID='${{ scenario.solutionProjectId }}'
78+
$env:INPUT_ARGUMENTS='${{ scenario.inputArguments }}'
79+
$env:FOLDER_ID='${{ scenario.folderId }}'
80+
$env:DURATION='${{ scenario.duration }}'
81+
$env:RATE='${{ scenario.rate }}'
82+
$env:TIME_UNIT='${{ scenario.timeUnit }}'
83+
$env:PRE_ALLOCATED_VUS='${{ scenario.preAllocatedVUs }}'
84+
$env:MAX_VUS='${{ scenario.maxVUs }}'
85+
$env:CLOUD_ENVIRONMENT='${{ parameters.cloudEnvironment }}'
86+
$env:ORGANIZATION_NAME='${{ parameters.organizationName }}'
87+
$env:ORGANIZATION_ID='${{ parameters.organizationId }}'
88+
$env:TENANT_NAME='${{ parameters.tenantName }}'
89+
$env:TENANT_ID='${{ parameters.tenantId }}'
90+
$env:HALT_WAIT_THRESHOLD='${{ parameters.haltWaitThreshold }}'
91+
$env:SOCKET_TIMEOUT_MINUTES='${{ parameters.socketTimeoutMinutes }}'
92+
./run.ps1
93+
continueOnError: true
94+
95+
- task: PublishBuildArtifacts@1
96+
displayName: 'Publish Results'
97+
inputs:
98+
PathtoPublish: '$(Build.SourcesDirectory)/performance/results'
99+
ArtifactName: '${{ scenario.testId }}'

performance/run.ps1

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
$requiredVars = @(
2+
"PERF_USERNAME",
3+
"PERF_PASSWORD",
4+
"MODE",
5+
"INPUT_ARGUMENTS",
6+
"FOLDER_ID",
7+
"DURATION",
8+
"RATE",
9+
"TIME_UNIT",
10+
"PRE_ALLOCATED_VUS",
11+
"MAX_VUS",
12+
"CLOUD_ENVIRONMENT",
13+
"ORGANIZATION_NAME",
14+
"ORGANIZATION_ID",
15+
"TENANT_NAME",
16+
"TENANT_ID",
17+
"HALT_WAIT_THRESHOLD")
18+
foreach ($var in $requiredVars) {
19+
if (-not (Get-Item "env:$var" -ErrorAction SilentlyContinue)) {
20+
Write-Error "$var environment variable is required"
21+
exit 1
22+
}
23+
}
24+
25+
function MoveResultFiles($targetDir) {
26+
$filesToMove = @("summary.json", "k6.log")
27+
foreach ($file in $filesToMove) {
28+
if (Test-Path -Path $file) {
29+
Move-Item -Path $file -Destination "$targetDir\" -Force
30+
}
31+
}
32+
}
33+
34+
$start_timestamp = [DateTime]::UtcNow.ToString('yyyyMMdd_HHmmss')
35+
Write-Output "Started at $start_timestamp"
36+
37+
$OUTPUT_DIR = "results\$start_timestamp"
38+
39+
npm install
40+
npm run build
41+
42+
$START_OUTPUT_DIR = "${OUTPUT_DIR}_start"
43+
New-Item -ItemType Directory -Path $START_OUTPUT_DIR -Force | Out-Null
44+
45+
k6 run `
46+
--out "json=$START_OUTPUT_DIR\raw_results.json" `
47+
-e "PERF_USERNAME=$($env:PERF_USERNAME)" `
48+
-e "PERF_PASSWORD=$($env:PERF_PASSWORD)" `
49+
-e "EXEC=$($env:MODE)" `
50+
-e "PROCESS_KEY=$($env:PROCESS_KEY)" `
51+
-e "SOLUTION_PROJECT_ID=$($env:SOLUTION_PROJECT_ID)" `
52+
-e "INPUT_ARGUMENTS=$($env:INPUT_ARGUMENTS)" `
53+
-e "FOLDER_ID=$($env:FOLDER_ID)" `
54+
-e "DURATION=$($env:DURATION)" `
55+
-e "RATE=$($env:RATE)" `
56+
-e "TIME_UNIT=$($env:TIME_UNIT)" `
57+
-e "PRE_ALLOCATED_VUS=$($env:PRE_ALLOCATED_VUS)" `
58+
-e "MAX_VUS=$($env:MAX_VUS)" `
59+
-e "CLOUD_ENVIRONMENT=$($env:CLOUD_ENVIRONMENT)" `
60+
-e "ORGANIZATION_NAME=$($env:ORGANIZATION_NAME)" `
61+
-e "ORGANIZATION_ID=$($env:ORGANIZATION_ID)" `
62+
-e "TENANT_NAME=$($env:TENANT_NAME)" `
63+
-e "TENANT_ID=$($env:TENANT_ID)" `
64+
-e "HALT_WAIT_THRESHOLD=$($env:HALT_WAIT_THRESHOLD)" `
65+
-e "SOCKET_TIMEOUT_MINUTES=$($env:SOCKET_TIMEOUT_MINUTES)" `
66+
--log-output=file=.\k6.log `
67+
--log-format json `
68+
./dist/main.js
69+
70+
MoveResultFiles $START_OUTPUT_DIR
71+
72+
$end_timestamp = [DateTime]::UtcNow.ToString('yyyyMMdd_HHmmss')
73+
Write-Output "Finished at $end_timestamp"

performance/src/config/urls.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const PLAYGROUND_BASE_URL = `https://${__ENV.CLOUD_ENVIRONMENT}.uipath.com/${__ENV.ORGANIZATION_ID}/${__ENV.TENANT_ID}/agenthub_`;
2+
const ORCH_BASE_URL = `https://${__ENV.CLOUD_ENVIRONMENT}.uipath.com/${__ENV.ORGANIZATION_ID}/${__ENV.TENANT_ID}/orchestrator_`;
3+
4+
export const PLAYGROUND_START_URL = `${PLAYGROUND_BASE_URL}/design/debug`;
5+
export const ORCH_START_URL = `${ORCH_BASE_URL}/odata/Jobs/UiPath.Server.Configuration.OData.StartJobs`;
6+
export const ORCH_GET_JOBS_URL = `${ORCH_BASE_URL}/odata/Jobs`;
7+
export const ORCH_KILL_JOBS_URL = `${ORCH_BASE_URL}/odata/Jobs/UiPath.Server.Configuration.OData.StopJobs`;
8+
export const ORCH_SIGNALR_URL = `${ORCH_BASE_URL}/signalr/robotdebug`;

0 commit comments

Comments
 (0)