Skip to content

Commit 3559092

Browse files
committed
Merge branch 'release-please--branches--main' of https://github.com/googleapis/google-cloud-node into release-please--branches--main
# Conflicts: # .release-please-manifest.json # changelog.json # librarian.yaml # packages/google-ads-datamanager/CHANGELOG.md # packages/google-ads-datamanager/package.json # packages/google-cloud-alloydb/CHANGELOG.md # packages/google-cloud-alloydb/package.json # packages/google-cloud-alloydb/samples/package.json # packages/google-cloud-speech/CHANGELOG.md # packages/google-cloud-speech/package.json # packages/google-cloud-speech/samples/package.json # packages/google-maps-mapmanagement/CHANGELOG.md # packages/google-maps-mapmanagement/package.json
2 parents 965bc90 + 8600859 commit 3559092

505 files changed

Lines changed: 521992 additions & 198242 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
name: Auto Assign Reviewers
2+
3+
on:
4+
pull_request:
5+
types: [opened, ready_for_review]
6+
7+
permissions:
8+
pull-requests: write
9+
contents: read
10+
11+
jobs:
12+
assign-reviewers:
13+
runs-on: ubuntu-latest
14+
if: github.event.pull_request.draft == false
15+
steps:
16+
- name: Assign Reviewers
17+
uses: actions/github-script@v7
18+
with:
19+
github-token: ${{ secrets.GOOGLER_CHECK_TOKEN || secrets.GITHUB_TOKEN }}
20+
script: |
21+
const author = context.payload.pull_request.user.login;
22+
23+
const ALLOWED_BOTS = new Set([
24+
'gcf-owl-bot[bot]',
25+
'gcf-owl-bot',
26+
'release-please[bot]',
27+
'release-please',
28+
'dependabot[bot]',
29+
'dependabot',
30+
'renovate-bot',
31+
'renovate',
32+
'yoshi-code-bot'
33+
]);
34+
35+
let isGoogler = ALLOWED_BOTS.has(author);
36+
37+
if (isGoogler) {
38+
console.log(`${author} is a trusted bot. Treating as Googler.`);
39+
} else {
40+
const orgs = ['googlers', 'GoogleCloudPlatform', 'googleapis'];
41+
for (const org of orgs) {
42+
try {
43+
const res = await github.rest.orgs.checkMembershipForUser({
44+
org: org,
45+
username: author,
46+
});
47+
if (res.status === 204) {
48+
isGoogler = true;
49+
console.log(`${author} is a member of '${org}' organization.`);
50+
break;
51+
}
52+
} catch (error) {
53+
if (error.status === 404) {
54+
console.log(`${author} is NOT a member of '${org}' organization.`);
55+
} else {
56+
console.warn(`Could not check membership in '${org}' organization: Status ${error.status}.`);
57+
}
58+
}
59+
}
60+
}
61+
62+
if (!isGoogler) {
63+
console.log("PR not opened by a Googler. Skipping auto-assignment.");
64+
return;
65+
}
66+
67+
// 2. Get list of files modified in the PR
68+
const { data: files } = await github.rest.pulls.listFiles({
69+
owner: context.repo.owner,
70+
repo: context.repo.repo,
71+
pull_number: context.payload.pull_request.number,
72+
});
73+
74+
const PATH_ROUTING = [
75+
{ prefix: 'handwritten/bigquery/', team: 'bigquery-team' },
76+
{ prefix: 'handwritten/cloud-profiler/', team: 'cloud-profiler-team' },
77+
{ prefix: 'handwritten/storage/', team: 'gcs-team' },
78+
{ prefix: 'handwritten/firestore/', team: 'firestore-team' },
79+
{ prefix: 'handwritten/spanner/', team: 'spanner-team' },
80+
{ prefix: 'handwritten/bigquery-storage/', team: 'bigquery-team' },
81+
{ prefix: 'handwritten/pubsub/', team: 'pubsub-team' },
82+
{ prefix: 'handwritten/bigtable/', team: 'bigtable-team' },
83+
{ prefix: 'core/packages/google-auth-library-nodejs/', team: 'aion-team' }
84+
];
85+
86+
const assignedTeams = new Set();
87+
for (const route of PATH_ROUTING) {
88+
if (files.some(file => file.filename.startsWith(route.prefix))) {
89+
assignedTeams.add(route.team);
90+
}
91+
}
92+
93+
if (assignedTeams.size > 0) {
94+
const teamReviewers = Array.from(assignedTeams);
95+
console.log(`PR contains changes matching specific routes. Requesting review from: ${teamReviewers.join(', ')}`);
96+
await github.rest.pulls.requestReviewers({
97+
owner: context.repo.owner,
98+
repo: context.repo.repo,
99+
pull_number: context.payload.pull_request.number,
100+
team_reviewers: teamReviewers,
101+
});
102+
} else {
103+
// Route to cloud-sdk-nodejs-team members with load balancing
104+
console.log("Requesting review from a member of cloud-sdk-nodejs-team using load balancing.");
105+
try {
106+
const { data: members } = await github.rest.teams.listMembersInOrg({
107+
org: 'googleapis',
108+
team_slug: 'cloud-sdk-nodejs-team',
109+
});
110+
111+
const memberLogins = members
112+
.map(m => m.login)
113+
.filter(login => login !== author);
114+
115+
if (memberLogins.length > 0) {
116+
// Retrieve active open PRs to calculate load
117+
const { data: openPRs } = await github.rest.pulls.list({
118+
owner: context.repo.owner,
119+
repo: context.repo.repo,
120+
state: 'open',
121+
per_page: 100,
122+
});
123+
124+
const loadMap = {};
125+
for (const member of memberLogins) {
126+
loadMap[member] = 0;
127+
}
128+
129+
for (const pr of openPRs) {
130+
// Count pending review requests
131+
if (pr.requested_reviewers) {
132+
for (const reviewer of pr.requested_reviewers) {
133+
if (loadMap[reviewer.login] !== undefined) {
134+
loadMap[reviewer.login]++;
135+
}
136+
}
137+
}
138+
// Count assignees
139+
if (pr.assignees) {
140+
for (const assignee of pr.assignees) {
141+
if (loadMap[assignee.login] !== undefined) {
142+
loadMap[assignee.login]++;
143+
}
144+
}
145+
}
146+
}
147+
148+
console.log("Current team workload:", loadMap);
149+
150+
// Find members with the minimum load
151+
let minLoad = Infinity;
152+
let selectedReviewers = [];
153+
for (const member of memberLogins) {
154+
const load = loadMap[member];
155+
if (load < minLoad) {
156+
minLoad = load;
157+
selectedReviewers = [member];
158+
} else if (load === minLoad) {
159+
selectedReviewers.push(member);
160+
}
161+
}
162+
163+
const leastLoadedReviewer = selectedReviewers[Math.floor(Math.random() * selectedReviewers.length)];
164+
console.log(`Selected reviewer with least load (load: ${minLoad}): ${leastLoadedReviewer}`);
165+
166+
await github.rest.pulls.requestReviewers({
167+
owner: context.repo.owner,
168+
repo: context.repo.repo,
169+
pull_number: context.payload.pull_request.number,
170+
reviewers: [leastLoadedReviewer],
171+
team_reviewers: ['cloud-sdk-nodejs-team'],
172+
});
173+
} else {
174+
console.log("No other members found in cloud-sdk-nodejs-team. Requesting team review only.");
175+
await github.rest.pulls.requestReviewers({
176+
owner: context.repo.owner,
177+
repo: context.repo.repo,
178+
pull_number: context.payload.pull_request.number,
179+
team_reviewers: ['cloud-sdk-nodejs-team'],
180+
});
181+
}
182+
} catch (err) {
183+
console.error("Failed to fetch team members or assign reviewers:", err);
184+
// Fallback to just requesting the team review
185+
await github.rest.pulls.requestReviewers({
186+
owner: context.repo.owner,
187+
repo: context.repo.repo,
188+
pull_number: context.payload.pull_request.number,
189+
team_reviewers: ['cloud-sdk-nodejs-team'],
190+
});
191+
}
192+
}

.release-please-manifest.json

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"core/packages/teeny-request": "10.1.3",
1818
"core/packages/tools": "1.0.6",
1919
"core/packages/typeless-sample-bot": "3.1.2",
20-
"core/paginator": "6.0.1",
20+
"core/paginator": "6.0.2",
2121
"core/precise-date": "5.0.1",
2222
"core/projectify": "5.0.1",
2323
"core/promisify": "5.0.1",
@@ -29,14 +29,14 @@
2929
"handwritten/error-reporting": "3.0.6",
3030
"handwritten/firestore": "8.6.0",
3131
"handwritten/google-cloud-dns": "5.3.2",
32-
"handwritten/logging": "11.2.2",
32+
"handwritten/logging": "11.2.3",
3333
"handwritten/logging-bunyan": "5.1.2",
3434
"handwritten/logging-winston": "6.0.2",
3535
"handwritten/pubsub": "5.3.1",
3636
"handwritten/spanner": "8.7.1",
3737
"handwritten/storage": "7.21.0",
3838
"packages/google-ads-admanager": "0.6.0",
39-
"packages/google-ads-datamanager": "0.4.0",
39+
"packages/google-ads-datamanager": "0.5.0",
4040
"packages/google-ai-generativelanguage": "3.7.1",
4141
"packages/google-analytics-admin": "9.1.0",
4242
"packages/google-analytics-data": "6.1.0",
@@ -53,7 +53,7 @@
5353
"packages/google-cloud-accessapproval": "4.2.2",
5454
"packages/google-cloud-advisorynotifications": "2.2.2",
5555
"packages/google-cloud-aiplatform": "6.8.1",
56-
"packages/google-cloud-alloydb": "2.6.0",
56+
"packages/google-cloud-alloydb": "2.7.0",
5757
"packages/google-cloud-apigateway": "4.3.0",
5858
"packages/google-cloud-apigeeconnect": "4.3.0",
5959
"packages/google-cloud-apigeeregistry": "2.2.2",
@@ -85,13 +85,13 @@
8585
"packages/google-cloud-certificatemanager": "2.1.3",
8686
"packages/google-cloud-ces": "0.4.1",
8787
"packages/google-cloud-channel": "4.1.3",
88-
"packages/google-cloud-chronicle": "0.4.0",
88+
"packages/google-cloud-chronicle": "0.5.0",
8989
"packages/google-cloud-cloudcontrolspartner": "0.6.2",
9090
"packages/google-cloud-clouddms": "4.1.2",
9191
"packages/google-cloud-cloudsecuritycompliance": "0.2.1",
9292
"packages/google-cloud-commerce-consumer-procurement": "0.7.2",
9393
"packages/google-cloud-compute": "6.13.0",
94-
"packages/google-cloud-confidentialcomputing": "2.2.3",
94+
"packages/google-cloud-confidentialcomputing": "2.3.0",
9595
"packages/google-cloud-config": "0.12.1",
9696
"packages/google-cloud-configdelivery": "0.1.2",
9797
"packages/google-cloud-connectors": "0.5.2",
@@ -111,7 +111,7 @@
111111
"packages/google-cloud-devicestreaming": "0.2.2",
112112
"packages/google-cloud-dialogflow": "7.6.2",
113113
"packages/google-cloud-dialogflow-cx": "5.8.2",
114-
"packages/google-cloud-discoveryengine": "2.7.0",
114+
"packages/google-cloud-discoveryengine": "2.8.0",
115115
"packages/google-cloud-documentai": "9.6.2",
116116
"packages/google-cloud-domains": "4.2.2",
117117
"packages/google-cloud-edgecontainer": "0.8.2",
@@ -150,15 +150,15 @@
150150
"packages/google-cloud-memorystore": "0.6.1",
151151
"packages/google-cloud-metastore": "5.2.2",
152152
"packages/google-cloud-migrationcenter": "2.2.2",
153-
"packages/google-cloud-modelarmor": "0.5.0",
154-
"packages/google-cloud-monitoring": "5.3.3",
153+
"packages/google-cloud-modelarmor": "0.6.0",
154+
"packages/google-cloud-monitoring": "5.4.0",
155155
"packages/google-cloud-netapp": "0.18.0",
156156
"packages/google-cloud-networkconnectivity": "4.6.1",
157-
"packages/google-cloud-networkmanagement": "5.4.0",
157+
"packages/google-cloud-networkmanagement": "5.5.0",
158158
"packages/google-cloud-networksecurity": "3.5.0",
159-
"packages/google-cloud-networkservices": "0.12.1",
159+
"packages/google-cloud-networkservices": "0.13.0",
160160
"packages/google-cloud-notebooks": "4.2.2",
161-
"packages/google-cloud-oracledatabase": "0.7.1",
161+
"packages/google-cloud-oracledatabase": "0.8.0",
162162
"packages/google-cloud-orchestration-airflow-service": "4.3.2",
163163
"packages/google-cloud-orgpolicy": "4.3.2",
164164
"packages/google-cloud-osconfig": "4.3.2",
@@ -190,7 +190,7 @@
190190
"packages/google-cloud-servicedirectory": "6.2.0",
191191
"packages/google-cloud-servicehealth": "0.8.0",
192192
"packages/google-cloud-shell": "4.2.0",
193-
"packages/google-cloud-speech": "7.4.0",
193+
"packages/google-cloud-speech": "7.5.0",
194194
"packages/google-cloud-sql": "0.24.1",
195195
"packages/google-cloud-storagebatchoperations": "0.5.0",
196196
"packages/google-cloud-storageinsights": "2.3.0",
@@ -236,7 +236,7 @@
236236
"packages/google-maps-routing": "2.2.1",
237237
"packages/google-maps-solar": "0.5.2",
238238
"packages/google-marketingplatform-admin": "0.4.1",
239-
"packages/google-monitoring-dashboard": "4.1.2",
239+
"packages/google-monitoring-dashboard": "4.2.0",
240240
"packages/google-privacy-dlp": "6.7.0",
241241
"packages/google-shopping-css": "0.11.1",
242242
"packages/google-shopping-merchant-accounts": "3.2.1",
@@ -262,5 +262,5 @@
262262
"packages/google-cloud-appoptimize": "0.2.0",
263263
"packages/google-devicesandservices-health": "0.3.0",
264264
"packages/google-cloud-databasecenter": "0.3.0",
265-
"packages/google-maps-mapmanagement": "0.1.0"
265+
"packages/google-maps-mapmanagement": "0.1.1"
266266
}

0 commit comments

Comments
 (0)