Add sponsor action

pull/3513/head
Kamran Ahmed 2 years ago
parent 47e2dbdd12
commit 4f0b08ea93
  1. 41
      .github/workflows/update-sponsors.yml
  2. 109
      bin/roadmap-ads.cjs
  3. 2
      package.json
  4. 3
      pnpm-lock.yaml
  5. 6
      src/data/roadmaps/backend/backend.md
  6. 4
      src/data/roadmaps/devops/devops.md
  7. 6
      src/data/roadmaps/javascript/javascript.md
  8. 4
      src/data/roadmaps/python/python.md

@ -0,0 +1,41 @@
name: Update Sponsors
on:
workflow_dispatch: # allow manual run
schedule:
- cron: '0 */3 * * *' # every 3 hours
env:
SPONSOR_SHEET_API_KEY: ${{ secrets.SPONSOR_SHEET_API_KEY }}
SPONSOR_SHEET_ID: ${{ secrets.SPONSOR_SHEET_ID }}
jobs:
update-sponsors:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v3
with:
node-version: 18
- uses: pnpm/action-setup@v2.2.2
with:
version: 7.13.4
- name: Update the Sponsors
run: |
pnpm install
node bin/roadmap-ads.cjs
- name: Create PR
uses: peter-evans/create-pull-request@v4
with:
delete-branch: false
branch: "update-sponsors"
base: "master"
labels: |
sponsors
automated pr
reviewers: kamranahmedse
commit-message: "chore: update sponsors"
title: "Upgrade Sponsor Banners"
body: |
Updates sponsor banners.
Please review the changes and merge if everything looks good.

@ -0,0 +1,109 @@
const path = require('path');
const fs = require('fs');
const yaml = require('js-yaml');
const apiKey = process.env.SPONSOR_SHEET_API_KEY;
const sheetId = process.env.SPONSOR_SHEET_ID;
if (!apiKey || !sheetId) {
console.error('Missing API key or sheet ID');
process.exit(1);
}
const sheetRange = 'A3:I1001';
const sheetUrl = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${sheetRange}?key=${apiKey}`;
function populateRoadmapAds({
roadmapUrl,
company,
redirectUrl,
imageUrl,
adTitle,
adDescription,
startDate,
endDate,
isActive,
}) {
const isConfiguredActive = isActive.toLowerCase() === 'yes';
const currentDate = new Date();
const isDateInRange = currentDate >= new Date(startDate) && currentDate <= new Date(endDate);
const shouldShowAd = isConfiguredActive && isDateInRange;
// get id from the roadmap URL
const roadmapId = roadmapUrl
.split('/')
.pop()
.replace(/\?.+?$/, '');
const roadmapFilePath = path.join(__dirname, '../src/data/roadmaps', `${roadmapId}/${roadmapId}.md`);
if (!fs.existsSync(roadmapFilePath)) {
console.error(`Roadmap file not found: ${roadmapFilePath}`);
process.exit(1);
}
console.log(`Updating roadmap: ${roadmapId}`);
const roadmapFileContent = fs.readFileSync(roadmapFilePath, 'utf8');
const frontMatterRegex = /---\n([\s\S]*?)\n---/;
const existingFrontmatter = roadmapFileContent.match(frontMatterRegex)[1];
const contentWithoutFrontmatter = roadmapFileContent.replace(frontMatterRegex, ``).trim();
const yamlObject = yaml.load(existingFrontmatter);
if (shouldShowAd) {
yamlObject.sponsor = {
url: redirectUrl,
title: adTitle,
imageUrl,
description: adDescription,
event: {
category: 'SponsorClick',
action: `${company} Redirect`,
label: `Clicked ${company} Link`,
},
};
} else {
delete yamlObject.sponsor;
}
const newFrontmatter = yaml.dump(yamlObject, { lineWidth: 10000, forceQuotes: true, quotingType: '"' });
const newContent = `---\n${newFrontmatter}---\n\n${contentWithoutFrontmatter}`;
fs.writeFileSync(roadmapFilePath, newContent, 'utf8');
}
fetch(sheetUrl)
.then((res) => res.json())
.then((rawData) => {
const rows = rawData.values;
rows.map((row) => {
// prettier-ignore
const [
roadmapUrl,
company,
redirectUrl,
imageUrl,
adTitle,
adDescription,
startDate,
endDate,
isActive,
] = row;
populateRoadmapAds({
roadmapUrl,
company,
redirectUrl,
imageUrl,
adTitle,
adDescription,
startDate,
endDate,
isActive,
});
});
});

@ -32,7 +32,7 @@
"@playwright/test": "^1.31.1", "@playwright/test": "^1.31.1",
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"gh-pages": "^5.0.0", "gh-pages": "^5.0.0",
"json-to-pretty-yaml": "^1.2.2", "js-yaml": "^4.1.0",
"markdown-it": "^13.0.1", "markdown-it": "^13.0.1",
"prettier": "^2.8.4", "prettier": "^2.8.4",
"prettier-plugin-astro": "^0.8.0" "prettier-plugin-astro": "^0.8.0"

@ -8,6 +8,7 @@ specifiers:
astro: ^2.0.15 astro: ^2.0.15
astro-compress: ^1.1.34 astro-compress: ^1.1.34
gh-pages: ^5.0.0 gh-pages: ^5.0.0
js-yaml: ^4.1.0
json-to-pretty-yaml: ^1.2.2 json-to-pretty-yaml: ^1.2.2
markdown-it: ^13.0.1 markdown-it: ^13.0.1
node-html-parser: ^6.1.5 node-html-parser: ^6.1.5
@ -33,6 +34,7 @@ devDependencies:
'@playwright/test': 1.31.1 '@playwright/test': 1.31.1
'@tailwindcss/typography': 0.5.9_tailwindcss@3.2.7 '@tailwindcss/typography': 0.5.9_tailwindcss@3.2.7
gh-pages: 5.0.0 gh-pages: 5.0.0
js-yaml: 4.1.0
json-to-pretty-yaml: 1.2.2 json-to-pretty-yaml: 1.2.2
markdown-it: 13.0.1 markdown-it: 13.0.1
prettier: 2.8.4 prettier: 2.8.4
@ -2719,7 +2721,6 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
argparse: 2.0.1 argparse: 2.0.1
dev: false
/jsesc/2.5.2: /jsesc/2.5.2:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}

@ -13,13 +13,13 @@ dimensions:
height: 2840.4 height: 2840.4
sponsor: sponsor:
url: "https://www.fermyon.com/spin?utm_source=backend&utm_medium=banner&utm_campaign=roadmap-sh" url: "https://www.fermyon.com/spin?utm_source=backend&utm_medium=banner&utm_campaign=roadmap-sh"
title: "Severless Backend Apps" title: "Serverless Backend Apps"
imageUrl: "https://i.imgur.com/2ONZopb.jpg" imageUrl: "https://i.imgur.com/2ONZopb.jpg"
description: "Go from blinking cursor to deployed serverless Backend apps in 66 seconds with Fermyon Cloud." description: "Go from blinking cursor to deployed serverless Backend apps in 66 seconds with Fermyon Cloud."
event: event:
category: "SponsorClick" category: "SponsorClick"
action: "Ambassador Product Redirect" action: "Fermyon Redirect"
label: "Clicked Ambassador Product Link" label: "Clicked Fermyon Link"
schema: schema:
headline: "Backend Developer Roadmap" headline: "Backend Developer Roadmap"
description: "Learn how to become a Backend Developer with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place." description: "Learn how to become a Backend Developer with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place."

@ -24,8 +24,8 @@ sponsor:
description: "Get your Kubernetes API Gateway up and running in 5 minutes with Ambassador Edge Stack!" description: "Get your Kubernetes API Gateway up and running in 5 minutes with Ambassador Edge Stack!"
event: event:
category: "SponsorClick" category: "SponsorClick"
action: "Ambassador Product Redirect" action: "Ambassador Redirect"
label: "Clicked Ambassador Product Link" label: "Clicked Ambassador Link"
seo: seo:
title: "DevOps Roadmap: Learn to become a DevOps Engineer or SRE" title: "DevOps Roadmap: Learn to become a DevOps Engineer or SRE"
description: "Community driven, articles, resources, guides, interview questions, quizzes for DevOps. Learn to become a modern DevOps engineer by following the steps, skills, resources and guides listed in this roadmap." description: "Community driven, articles, resources, guides, interview questions, quizzes for DevOps. Learn to become a modern DevOps engineer by following the steps, skills, resources and guides listed in this roadmap."

@ -15,11 +15,11 @@ sponsor:
url: "https://www.fermyon.com/spin?utm_source=javascript&utm_medium=banner&utm_campaign=roadmap-sh" url: "https://www.fermyon.com/spin?utm_source=javascript&utm_medium=banner&utm_campaign=roadmap-sh"
title: "Serverless JavaScript Apps" title: "Serverless JavaScript Apps"
imageUrl: "https://i.imgur.com/2ONZopb.jpg" imageUrl: "https://i.imgur.com/2ONZopb.jpg"
description: "Go from blinking cursor to deployed serverless JavaScript apps in 66 seconds with Fermyon Cloud." description: "Go from blinking cursor to deployed serverless JavaScript apps in 66 seconds with Fermyon Cloud"
event: event:
category: "SponsorClick" category: "SponsorClick"
action: "Fermyon Product Redirect" action: "Fermyon Redirect"
label: "Clicked Fermyon Product Link" label: "Clicked Fermyon Link"
schema: schema:
headline: "JavaScript Roadmap" headline: "JavaScript Roadmap"
description: "Learn JavaScript with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place." description: "Learn JavaScript with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place."

@ -17,8 +17,8 @@ sponsor:
description: "Go from blinking cursor to deployed serverless Python apps in 66 seconds with Fermyon Cloud." description: "Go from blinking cursor to deployed serverless Python apps in 66 seconds with Fermyon Cloud."
event: event:
category: "SponsorClick" category: "SponsorClick"
action: "Ambassador Product Redirect" action: "Fermyon Redirect"
label: "Clicked Ambassador Product Link" label: "Clicked Fermyon Link"
schema: schema:
headline: "Python Roadmap" headline: "Python Roadmap"
description: "Learn Python with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place." description: "Learn Python with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place."

Loading…
Cancel
Save