Skip to content

Commit cb682ee

Browse files
committed
Add scripts to produce reports on the merge queue flake rate
Determining the flake rate helps us decide how much effort to put into improving it. The merge queue flake rate is only half the effective flake rate, since changes have to pass presubmit before they are allowed onto the merge queue. Bug: b/470157423
1 parent 58f4bf3 commit cb682ee

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
err() {
6+
echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
7+
}
8+
9+
# https://jqlang.org/manual/
10+
11+
JQ_TIMELINE_EVENTS=$(cat <<'END'
12+
[.[].data.repository.pullRequests.nodes]
13+
| flatten
14+
| sort_by(.url|split("/")|last|tonumber)
15+
END
16+
)
17+
18+
jq -s "${JQ_TIMELINE_EVENTS}" prs_*.json > timeline_events.json
19+
20+
JQ_COUNT_EVENTS=$(cat <<'END'
21+
map({
22+
url: .url,
23+
events: (
24+
.timelineItems.nodes
25+
| group_by(.__typename)
26+
| map({(.[0].__typename): .|length})
27+
| add)
28+
})
29+
END
30+
)
31+
jq "${JQ_COUNT_EVENTS}" timeline_events.json > count_events.json
32+
33+
JQ_ONLY_MERGE_QUEUE=$(cat <<'END'
34+
.[]
35+
| select(.events|has("RemovedFromMergeQueueEvent"))
36+
| select(.events|(has("MergedEvent")))
37+
END
38+
)
39+
jq "${JQ_ONLY_MERGE_QUEUE}" count_events.json > only_merge_queue.json
40+
41+
JQ_OUTPUT=$(cat <<'END'
42+
[.url,.events.RemovedFromMergeQueueEvent]
43+
| @csv
44+
END
45+
)
46+
jq "${JQ_OUTPUT}" only_merge_queue.json > output.csv
47+
48+
err "Wrote output to output.csv"
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
err() {
6+
echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
7+
}
8+
9+
# - https://docs.github.com/en/graphql
10+
# - https://graphql.org/learn/queries/
11+
# - https://docs.github.com/en/graphql/guides/using-pagination-in-the-graphql-api
12+
13+
page_token=\"\"
14+
15+
for (( page_num = 1;; page_num++ )) do
16+
err "Requesting page $page_num"
17+
query_str=$(cat <<EOF
18+
query {
19+
repository(owner:"google", name:"android-cuttlefish") {
20+
pullRequests(last: 100, before:${page_token}) {
21+
pageInfo {
22+
endCursor
23+
startCursor
24+
hasNextPage
25+
hasPreviousPage
26+
}
27+
nodes {
28+
url
29+
timelineItems(first: 100) {
30+
nodes {
31+
__typename
32+
}
33+
}
34+
}
35+
}
36+
}
37+
}
38+
EOF
39+
)
40+
gh api graphql -f query="${query_str}" | jq > prs_$page_num.json
41+
42+
page_info=.data.repository.pullRequests.pageInfo
43+
if [[ $(jq $page_info.hasPreviousPage prs_$page_num.json) != "true" ]]; then
44+
exit 0;
45+
fi
46+
page_token=$(jq $page_info.startCursor prs_$page_num.json)
47+
done

0 commit comments

Comments
 (0)