Skip to content

Commit c8e5420

Browse files
Merge branch 'prebid:master' into master
2 parents 72715fe + 04adbcd commit c8e5420

270 files changed

Lines changed: 8474 additions & 1616 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.

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
- uses: actions/checkout@v4
1919
with:
2020
fetch-depth: 0
21-
- uses: tj-actions/changed-files@v44
21+
- uses: tj-actions/changed-files@v46
2222
id: changed-files
2323
with:
2424
files: '**/*.md'
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: Notify Code Path Changes
2+
3+
on:
4+
pull_request_target:
5+
types: [opened, synchronize]
6+
paths:
7+
- '**'
8+
9+
env:
10+
OAUTH2_CLIENT_ID: ${{ secrets.OAUTH2_CLIENT_ID }}
11+
OAUTH2_CLIENT_SECRET: ${{ secrets.OAUTH2_CLIENT_SECRET }}
12+
OAUTH2_REFRESH_TOKEN: ${{ secrets.OAUTH2_REFRESH_TOKEN }}
13+
GITHUB_REPOSITORY: ${{ github.repository }}
14+
GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }}
15+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
16+
17+
permissions:
18+
contents: read
19+
20+
jobs:
21+
notify:
22+
runs-on: ubuntu-latest
23+
steps:
24+
- name: Checkout Code
25+
uses: actions/checkout@v3
26+
27+
- name: Set up Node.js
28+
uses: actions/setup-node@v3
29+
with:
30+
node-version: '18'
31+
32+
- name: Install dependencies
33+
run: npm install axios nodemailer
34+
35+
- name: Run Notification Script
36+
run: |
37+
node .github/workflows/scripts/send-notification-on-change.js
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# when a changed file paths matches the regex, send an alert email
2+
# structure of the file is:
3+
#
4+
# javascriptRegex : email address
5+
#
6+
# For example, in the Prebid docs repo, the file pattern is generally
7+
#
8+
# /dev-docs/bidders/BIDDERCODE.md
9+
#
10+
# The aim is to find a minimal set of regex patterns that matches any file in these paths
11+
12+
/dev-docs/bidders/rubicon : header-bidding@magnite.com
13+
/dev-docs/bidders/ix : pdu-supply-prebid@indexexchange.com
14+
/dev-docs/bidders/appnexus|/dev-docs/bidders/msft : prebid@microsoft.com
15+
/dev-docs/bidders/pubmatic : header-bidding@pubmatic.com
16+
/dev-docs/bidders/openx : prebid@openx.com
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
// send-notification-on-change.js
2+
//
3+
// called by the code-path-changes.yml workflow, this script queries github for
4+
// the changes in the current PR, checks the config file for whether any of those
5+
// file paths are set to alert an email address, and sends email to multiple
6+
// parties if needed
7+
8+
const fs = require('fs');
9+
const path = require('path');
10+
const axios = require('axios');
11+
const nodemailer = require('nodemailer');
12+
13+
async function getAccessToken(clientId, clientSecret, refreshToken) {
14+
try {
15+
const response = await axios.post('https://oauth2.googleapis.com/token', {
16+
client_id: clientId,
17+
client_secret: clientSecret,
18+
refresh_token: refreshToken,
19+
grant_type: 'refresh_token',
20+
});
21+
return response.data.access_token;
22+
} catch (error) {
23+
console.error('Failed to fetch access token:', error.response?.data || error.message);
24+
process.exit(1);
25+
}
26+
}
27+
28+
(async () => {
29+
const configFilePath = path.join(__dirname, 'codepath-notification');
30+
const repo = process.env.GITHUB_REPOSITORY;
31+
const prNumber = process.env.GITHUB_PR_NUMBER;
32+
const token = process.env.GITHUB_TOKEN;
33+
34+
// Generate OAuth2 access token
35+
const clientId = process.env.OAUTH2_CLIENT_ID;
36+
const clientSecret = process.env.OAUTH2_CLIENT_SECRET;
37+
const refreshToken = process.env.OAUTH2_REFRESH_TOKEN;
38+
39+
// validate params
40+
if (!repo || !prNumber || !token || !clientId || !clientSecret || !refreshToken) {
41+
console.error('Missing required environment variables.');
42+
process.exit(1);
43+
}
44+
45+
// the whole process is in a big try/catch. e.g. if the config file doesn't exist, github is down, etc.
46+
try {
47+
// Read and process the configuration file
48+
const configFileContent = fs.readFileSync(configFilePath, 'utf-8');
49+
const configRules = configFileContent
50+
.split('\n')
51+
.filter(line => line.trim() !== '' && !line.trim().startsWith('#')) // Ignore empty lines and comments
52+
.map(line => {
53+
const [regex, email] = line.split(':').map(part => part.trim());
54+
return { regex: new RegExp(regex), email };
55+
});
56+
57+
// Fetch changed files from github
58+
const [owner, repoName] = repo.split('/');
59+
const apiUrl = `https://api.github.com/repos/${owner}/${repoName}/pulls/${prNumber}/files`;
60+
const response = await axios.get(apiUrl, {
61+
headers: {
62+
Authorization: `Bearer ${token}`,
63+
Accept: 'application/vnd.github.v3+json',
64+
},
65+
});
66+
67+
const changedFiles = response.data.map(file => file.filename);
68+
console.log('Changed files:', changedFiles);
69+
70+
// match file pathnames that are in the config and group them by email address
71+
const matchesByEmail = {};
72+
changedFiles.forEach(file => {
73+
configRules.forEach(rule => {
74+
if (rule.regex.test(file)) {
75+
if (!matchesByEmail[rule.email]) {
76+
matchesByEmail[rule.email] = [];
77+
}
78+
matchesByEmail[rule.email].push(file);
79+
}
80+
});
81+
});
82+
83+
// Exit successfully if no matches were found
84+
if (Object.keys(matchesByEmail).length === 0) {
85+
console.log('No matches found. Exiting successfully.');
86+
process.exit(0);
87+
}
88+
89+
console.log('Grouped matches by email:', matchesByEmail);
90+
91+
// get ready to email the changes
92+
const accessToken = await getAccessToken(clientId, clientSecret, refreshToken);
93+
94+
// Configure Nodemailer with OAuth2
95+
// service: 'Gmail',
96+
const transporter = nodemailer.createTransport({
97+
host: "smtp.gmail.com",
98+
port: 465,
99+
secure: true,
100+
auth: {
101+
type: 'OAuth2',
102+
user: 'info@prebid.org',
103+
clientId: clientId,
104+
clientSecret: clientSecret,
105+
refreshToken: refreshToken,
106+
accessToken: accessToken
107+
},
108+
});
109+
110+
// Send one email per recipient
111+
for (const [email, files] of Object.entries(matchesByEmail)) {
112+
const emailBody = `
113+
${email},
114+
<p>
115+
Files owned by you have been changed in open source ${repo}. The <a href="https://github.com/${repo}/pull/${prNumber}">pull request is #${prNumber}</a>. These are the files you own that have been modified:
116+
<ul>
117+
${files.map(file => `<li>${file}</li>`).join('')}
118+
</ul>
119+
`;
120+
121+
try {
122+
await transporter.sendMail({
123+
from: `"Prebid Info" <info@prebid.org>`,
124+
to: email,
125+
subject: `Files have been changed in open source ${repo}`,
126+
html: emailBody,
127+
});
128+
129+
console.log(`Email sent successfully to ${email}`);
130+
console.log(`${emailBody}`);
131+
} catch (error) {
132+
console.error(`Failed to send email to ${email}:`, error.message);
133+
}
134+
}
135+
} catch (error) {
136+
console.error('Error:', error.message);
137+
process.exit(1);
138+
}
139+
})();

AGENTS.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Agent Guidelines
2+
3+
- Run `markdownlint` on any edited Markdown files using the repository configuration with `markdownlint --config .markdownlint.json README.md`. Replace `README.md` with each file you change.
4+
- If lint errors occur, fix them before creating a pull request.
5+
- Verify the site builds with `bundle exec jekyll build` when possible.
6+
- Please name your branch to include codex or agent in the branch name
7+
- If you cannot run markdownlint please warn your user to setup their environment using the instructions in README.md and document your failure in your pr description

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,26 @@ This means an adaptor is not available to download from Prebid.org as soon as th
112112

113113
* [jekyll - check for non empty](https://michaelcurrin.github.io/dev-cheatsheets/cheatsheets/jekyll/liquid/conditionals/non-empty.html)
114114

115+
## Codex
116+
117+
To get started with Codex with Ruby 3.4.4 preinstalled on this repo, you can set up your environment like this
118+
119+
```bash
120+
echo "3.4.4" > .ruby-version
121+
export NOKOGIRI_USE_SYSTEM_LIBRARIES=1
122+
gem install jekyll bundler
123+
npm install boostrap
124+
gem install github-pages --no-document --force
125+
npm install -g markdownlint-cli
126+
bundle install
127+
```
128+
129+
Codex can then check for linting success with
130+
131+
```bash
132+
markdownlint --config .markdownlint.json "**/*.md"
133+
```
134+
115135
## Thanks
116136

117137
Many thanks to the following people who have submitted content to Prebid.org. We really appreciate the help!

_data/sidebar.yml

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@
258258
subgroup: 1
259259

260260
- sbSecId: 1
261-
title: Running without an ad server
261+
title: Running Prebid.js as an ad server
262262
link: /dev-docs/examples/no-adserver.html
263263
isHeader: 0
264264
isSectionHeader: 0
@@ -316,6 +316,15 @@
316316
sectionTitle:
317317
subgroup: 1
318318

319+
- sbSecId: 1
320+
title: In-renderer Integration
321+
link: /dev-docs/examples/in-renderer-integration.html
322+
Item: 1
323+
isHeader: 0
324+
isSectionHeader: 0
325+
sectionTitle:
326+
subgroup: 1
327+
319328
- sbSecId: 1
320329
title: Troubleshooting
321330
link:
@@ -390,6 +399,14 @@
390399
sectionTitle:
391400
subgroup: 3
392401

402+
- sbSecId: 1
403+
title: Renderer
404+
link: /dev-docs/renderer.html
405+
isHeader: 0
406+
isSectionHeader: 0
407+
sectionTitle:
408+
subgroup: 3
409+
393410
- sbSecId: 1
394411
title: Bidder Params
395412
link: /dev-docs/bidders.html
@@ -441,6 +458,14 @@
441458
sectionTitle:
442459
subgroup: 4
443460

461+
- sbSecId: 1
462+
title: How to Add A User ID submodule
463+
link: /dev-docs/userId-module.html
464+
isHeader: 0
465+
isSectionHeader: 0
466+
sectionTitle:
467+
subgroup: 4
468+
444469
- sbSecId: 1
445470
title: How to Add a Prebid.js Video submodule
446471
link: /dev-docs/add-video-submodule.html
@@ -650,6 +675,14 @@
650675
sectionTitle:
651676
subgroup: 0
652677

678+
- sbSecId: 2
679+
title: Prebid Mobile 3.0
680+
link: /prebid-mobile/updates-3.0/sdk-key-features.html
681+
isHeader: 0
682+
isSectionHeader: 0
683+
sectionTitle:
684+
subgroup: 0
685+
653686
- sbSecId: 2
654687
title: Prebid AMP
655688
link: /dev-docs/show-prebid-ads-on-amp-pages.html
@@ -806,6 +839,14 @@
806839
sectionTitle:
807840
subgroup: 2
808841

842+
- sbSecId: 2
843+
title: Prebid Mobile 3.0 API Changes
844+
link: /prebid-mobile/updates-3.0/ios/api-changes.html
845+
isHeader: 0
846+
isSectionHeader: 0
847+
sectionTitle:
848+
subgroup: 2
849+
809850
- sbSecId: 2
810851
title: API Reference
811852
link: /prebid-mobile-ios/index.html
@@ -903,6 +944,14 @@
903944
sectionTitle:
904945
subgroup: 3
905946

947+
- sbSecId: 2
948+
title: Prebid Mobile 3.0 API Changes
949+
link: /prebid-mobile/updates-3.0/android/api-changes.html
950+
isHeader: 0
951+
isSectionHeader: 0
952+
sectionTitle:
953+
subgroup: 3
954+
906955
- sbSecId: 2
907956
title: API Reference
908957
link: /prebid-mobile-android/index.html

_includes/body-end.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script src="https://cdn.jsdelivr.net/npm/@docsearch/js@3"></script>
22
<script type="text/javascript"> docsearch({
3-
apiKey: 'a5def27499db73d2fd930c58f8dac145',
3+
apiKey: '6f0eda209a805cfa66b415043ab5fbfc',
44
appId: 'FN26QH8JE9',
55
indexName: 'prebid',
66
container: '.pb-header .c-search',

0 commit comments

Comments
 (0)