-
Notifications
You must be signed in to change notification settings - Fork 510
149 lines (130 loc) · 5.24 KB
/
manual-benchmark.yml
File metadata and controls
149 lines (130 loc) · 5.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# This workflow runs the desired benchmarks on demand.
#
# This workflow triggers whenever a comment is created in any PR.
# If the comment has this format: "/benchmark NAME [GHC]"
# The this workflow will run the benchmark with the given NAME, first against
# the current branch and then comparing the results against the master branch.
# If the optional [GHC] is provided, the benchmark will be run with the given
# GHC version (one of ghc96, ghc98, ghc910), otherwise the default GHC
# version (ghc96) will be used.
name: "🚀 Manual Benchmark"
on:
issue_comment:
types: [created]
jobs:
run:
name: Run
runs-on: [self-hosted, plutus-benchmark]
permissions:
pull-requests: write
if: |
startsWith(github.event.comment.body, '/benchmark') &&
github.event.issue.pull_request
steps:
- name: Checkout
uses: actions/checkout@v6.0.1
with:
# It's possible that new commits get merged into master since the PR
# was opened. We need a safe buffer to make sure that our use of merge-head
# leter always finds the true parent of the first PR commit.
fetch-depth: 100
- name: React With Rocket
uses: actions/github-script@v7.1.0
with:
script: |
github.rest.reactions.createForIssueComment({
owner: context.issue.owner,
repo: context.issue.repo,
comment_id: context.payload.comment.id,
content: "rocket"
});
- name: Extract Benchmark Name
id: extract-benchmark
uses: actions/github-script@v7.1.0
with:
script: |
const regex = /^\/benchmark\s*([^\s]*)\s*(ghc96|ghc98|ghc910)?\s*$/;
const comment = context.payload.comment.body;
const match = comment.match(regex)
if (match !== null && match.length == 3 && match[1] !== '') {
core.setOutput('benchmark', match[1]);
core.setOutput('ghc', match[2] || 'ghc96');
} else {
core.setFailed(`Unable to extract benchmark name and ghc version from comment '${comment}'`);
}
- name: Extract Branch Name
id: extract-branch
uses: actions/github-script@v7.1.0
with:
script: |
async function isPullRequest() {
const result = await github.rest.issues.get({
owner: context.issue.owner,
repo: context.issue.repo,
issue_number: context.issue.number
});
return !!result.data.pull_request;
}
async function getCommentHeadRef() {
const query = `
query pullRequestDetails($repo:String!, $owner:String!, $number:Int!) {
repository(name: $repo, owner: $owner) {
pullRequest(number: $number) {
headRef {
name
}
}
}
}`;
const result = await github.graphql(query, {
owner: context.issue.owner,
repo: context.issue.repo,
number: context.issue.number
});
return result.repository.pullRequest.headRef.name;
}
try {
if (!await isPullRequest()) {
core.setFailed("Comment is not on a pull request");
} else {
core.setOutput("head_ref", await getCommentHeadRef());
}
} catch (error) {
core.setFailed(`Error: ${error}`);
}
- name: Publish GH Action Link
uses: actions/github-script@v7.1.0
with:
script: |
async function getJobUrl() {
return `https://github.com/${context.issue.owner}/${context.issue.repo}/actions/runs/${context.runId}`;
}
await github.rest.issues.createComment({
owner: context.issue.owner,
repo: context.issue.repo,
issue_number: context.issue.number,
body: `Click [here](${await getJobUrl()}) to check the status of your benchmark.`
});
- name: Run Benchmark
run: |
nix develop .#${{ steps.extract-benchmark.outputs.ghc }} \
--no-warn-dirty \
--accept-flake-config \
--command taskset -c 7 bash ./scripts/ci-plutus-benchmark.sh
# We use taskset to pin the benchmark to a single CPU core to improve repeatability
env:
BENCHMARK_NAME: ${{ steps.extract-benchmark.outputs.benchmark }}
PR_NUMBER: ${{ github.event.issue.number }}
PR_BRANCH: ${{ steps.extract-branch.outputs.head_ref }}
- name: Publish Results
uses: actions/github-script@v7.1.0
with:
script: |
const fs = require("fs");
await github.rest.issues.createComment({
owner: context.issue.owner,
repo: context.issue.repo,
issue_number: context.issue.number,
// bench-compare-result.log is generated by ci-plutus-benchmark.sh
body: fs.readFileSync("bench-compare-result.log", "utf-8").toString()
});