Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions .github/workflows/m3h-landing-browser-acceptance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ name: ARStack Latest Stable Landing Browser and Mobile Acceptance
on:
push:
branches: [main]
paths: ['index.html', '.github/workflows/m3h-landing-browser-acceptance.yml']
paths: ['index.html', 'assets/screenshots/arstack-studio-windows.png', 'assets/studio_icon/**', 'scripts/check_site_visual_assets.py', '.github/workflows/m3h-landing-browser-acceptance.yml']
pull_request:
paths: ['index.html', '.github/workflows/m3h-landing-browser-acceptance.yml']
paths: ['index.html', 'assets/screenshots/arstack-studio-windows.png', 'assets/studio_icon/**', 'scripts/check_site_visual_assets.py', '.github/workflows/m3h-landing-browser-acceptance.yml']
workflow_dispatch:

permissions:
Expand All @@ -17,6 +17,8 @@ jobs:
timeout-minutes: 12
steps:
- uses: actions/checkout@v4
- name: Validate canonical visual asset sources and dimensions
run: python3 scripts/check_site_visual_assets.py
- name: Install isolated browser automation
shell: bash
run: |
Expand All @@ -40,20 +42,27 @@ jobs:
const page=await browser.newPage({viewport:{width,height:900},deviceScaleFactor:1});
const response=await page.goto('http://127.0.0.1:4173/',{waitUntil:'domcontentloaded',timeout:30000});
if(response.status()!==200)throw new Error('LIVE_HTTP_'+response.status());
await Promise.all([page.locator('.brand img').evaluate(el=>el.decode()),page.locator('.hero-visual img').evaluate(el=>el.decode())]);
const data=await page.evaluate(()=>{
const buttons=[...document.querySelectorAll('a[data-asset="windows"],a[data-asset="portable"],a[data-asset="firmware"]')];
const releaseLink=/^https:\/\/github\.com\/masarray\/arstack61850\/releases\/(latest|download\/[^/]+\/[^/]+)$/;
const releaseLink=/^https:\/\/github\.com\/masarray\/arstack61850\/releases\/(latest|tag\/[^/]+|download\/[^/]+\/[^/]+)$/;
return {title:document.title, width:document.documentElement.clientWidth,scroll:document.documentElement.scrollWidth,
latest:document.body.textContent.includes('M3.H.3') || document.body.textContent.includes('processbus-sim-m3h3-20261025'),benchmark:document.body.textContent.includes('4,705,090') && document.body.textContent.includes('M3.H.3') && document.body.textContent.includes('Three virtual Merging Units'), bodyPreview:document.body.textContent.slice(0,170),
buttons:buttons.length, linksValid:buttons.every(el=>releaseLink.test(el.href)), anyVisible:buttons.some(el=>{const r=el.getBoundingClientRect();return r.width>0&&r.height>0}),
linuxReady:!!document.querySelector('[data-asset="linux"]'),
heroDownloads:[...document.querySelectorAll('.hero-downloads a')].map(el=>({label:el.textContent.trim(),href:el.href,visible:el.getBoundingClientRect().width>0&&el.getBoundingClientRect().height>0})),
officialBrand:(()=>{const el=document.querySelector('.brand img');return el?.naturalWidth===192&&el.getAttribute('src')==='assets/studio_icon/android-chrome-192x192.png'})(),
nativeScreenshot:(()=>{const el=document.querySelector('.hero-visual img');return el?.naturalWidth===960&&el?.naturalHeight===680&&el.getAttribute('src')==='assets/screenshots/arstack-studio-windows.png'})(),
studioFavicons:[...document.querySelectorAll('link[rel="icon"],link[rel="apple-touch-icon"],link[rel="manifest"]')].every(el=>el.getAttribute('href').startsWith('assets/studio_icon/')),
studioSocialImage:document.querySelector('meta[property="og:image"]')?.content?.endsWith('/assets/studio_icon/android-chrome-512x512.png')===true,
noPaintedMock:!document.querySelector('.monitor,.wave'),
og:!!document.querySelector('meta[property="og:title"]')};
});
console.log(width,JSON.stringify(data));
await page.screenshot({path:'evidence/m3h-'+width+'.png',fullPage:true});
if(!data.latest||!data.benchmark||!data.og||data.buttons!==4||!data.anyVisible||!data.linksValid||!data.linuxReady)throw new Error('MISSING_LATEST_RELEASE_LINKS_'+width);
if(data.heroDownloads.length!==2||!data.heroDownloads.every(x=>x.visible)||data.heroDownloads[0].label!=='Download for Windows'||data.heroDownloads[1].label!=='Download for Linux'||!/ARStack-Studio-win-x64-setup\.zip$/.test(data.heroDownloads[0].href)||!/ARStack-Studio-linux-x86_64\.AppImage$/.test(data.heroDownloads[1].href))throw new Error('HERO_DIRECT_PLATFORM_DOWNLOADS_'+width);
if(!data.officialBrand||!data.nativeScreenshot||!data.noPaintedMock||!data.studioFavicons||!data.studioSocialImage)throw new Error('NONCANONICAL_STUDIO_ICON_OR_MOCK_SCREEN_'+width);
if(data.scroll>data.width+2)throw new Error('HORIZONTAL_OVERFLOW_'+width+':'+data.scroll+'>'+data.width);
await page.close();
}
Expand Down
18 changes: 16 additions & 2 deletions .github/workflows/m3h-project-pages-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on:
branches: [main]
paths:
- 'index.html'
- 'assets/screenshots/arstack-studio-windows.png'
- 'assets/studio_icon/**'
- 'scripts/check_site_visual_assets.py'
- '.github/workflows/m3h-project-pages-publish.yml'
workflow_dispatch:

Expand Down Expand Up @@ -47,10 +50,15 @@ jobs:
grep -Fq 'ARStack-Studio-win-x64-setup.zip' index.html
grep -Fq 'firmware-catalog.json' index.html
grep -Fq 'PROCESSBUS_AUTONOMOUS_M3H3_OFFICIAL_20261025.md' index.html
python3 scripts/check_site_visual_assets.py
mkdir -p _site
cp index.html _site/index.html
mkdir -p _site/assets/screenshots _site/assets/studio_icon
for asset in android-chrome-192x192.png android-chrome-512x512.png favicon.ico favicon-16x16.png favicon-32x32.png apple-touch-icon.png site.webmanifest; do
test -s "assets/studio_icon/$asset"
cp "assets/studio_icon/$asset" "_site/assets/studio_icon/$asset"
done
test -s assets/screenshots/arstack-studio-windows.png
mkdir -p _site/assets/screenshots
cp assets/screenshots/arstack-studio-windows.png _site/assets/screenshots/arstack-studio-windows.png
touch _site/.nojekyll
- uses: actions/configure-pages@v5
Expand All @@ -74,9 +82,15 @@ jobs:
grep -Fq 'data-asset="linux"' /tmp/arstack-live.html &&
grep -Fq 'Download for Windows' /tmp/arstack-live.html &&
grep -Fq 'Download for Linux' /tmp/arstack-live.html &&
grep -Fq 'assets/studio_icon/android-chrome-192x192.png' /tmp/arstack-live.html &&
grep -Fq '4,705,090' /tmp/arstack-live.html &&
grep -Fq 'processbus-sim-dual-stable-20261105' /tmp/arstack-live.html; then
echo 'PASS: latest-release links deployed on the public product URL'
for asset in assets/studio_icon/android-chrome-192x192.png assets/studio_icon/android-chrome-512x512.png assets/studio_icon/favicon.ico assets/studio_icon/favicon-16x16.png assets/studio_icon/favicon-32x32.png assets/studio_icon/apple-touch-icon.png assets/studio_icon/site.webmanifest assets/screenshots/arstack-studio-windows.png; do
published="/tmp/arstack-live-$(basename "$asset")"
curl --fail --location --silent --show-error "https://masarray.github.io/arstack61850/$asset?build=$GITHUB_SHA" -o "$published"
cmp --silent "$asset" "$published" || { echo "FAIL: published image differs from repository $asset" >&2; exit 1; }
done
echo 'PASS: latest release links, original Studio icon family, manifest, and native Qt screenshot live on project Pages'
exit 0
fi
fi
Expand Down
21 changes: 20 additions & 1 deletion assets/studio_icon/site.webmanifest
Original file line number Diff line number Diff line change
@@ -1 +1,20 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
{
"name": "ARStack61850 — ARStack Studio",
"short_name": "ARStack Studio",
"description": "IEC 61850 Process Bus Simulator",
"icons": [
{
"src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#0a131e",
"background_color": "#0a131e",
"display": "standalone"
}
Loading
Loading