name: Demo Video
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
jobs:
record-demo:
name: Record Demo Video
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
# Wait for Vercel to finish deploying the preview
- name: Wait for Vercel Preview
id: vercel
uses: patrickedqvist/wait-for-vercel-preview@v1.3.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
max_timeout: 300
check_interval: 10
- name: Setup Node 20
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Playwright + FFmpeg
run: |
npm install -D @playwright/test
npx playwright install chromium --with-deps
sudo apt-get install -y ffmpeg
- name: Create output dir
run: mkdir -p /tmp/demo-frames
- name: Record demo
run: node .github/scripts/record-demo.js
env:
PREVIEW_URL: ${{ steps.vercel.outputs.url }}
OUTPUT_DIR: /tmp/demo-frames
- name: Encode to GIF
run: |
ffmpeg -framerate 2 \
-pattern_type glob -i '/tmp/demo-frames/*.png' \
-vf "fps=2,scale=1280:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
-loop 0 /tmp/demo.gif
echo "GIF size: $(du -sh /tmp/demo.gif | cut -f1)"
- name: Upload GIF artifact
uses: actions/upload-artifact@v4
id: artifact
with:
name: demo-gif-pr-${{ github.event.pull_request.number }}
path: /tmp/demo.gif
retention-days: 30
- name: Post PR comment
uses: actions/github-script@v7
with:
script: |
const previewUrl = process.env.PREVIEW_URL;
const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: [
'## π¬ Demo Video',
'',
`Recorded against: ${previewUrl}`,
'',
`[π₯ Download demo.gif](${runUrl}) _(expires in 30 days β download from the Artifacts section)_`,
'',
'_Auto-recorded by Alexander π¦_',
].join('\n'),
});
env:
PREVIEW_URL: ${{ steps.vercel.outputs.url }}
- name: Send GIF to Telegram
if: success()
run: |
curl -s -F "chat_id=1656378684" \
-F "caption=π¬ Demo recorded for PR #${{ github.event.pull_request.number }} β ${{ steps.vercel.outputs.url }}" \
-F "document=@/tmp/demo.gif" \
"https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendDocument"
- name: Send GIF to Discord
if: success()
run: |
curl -s -X POST "https://discord.com/api/v10/channels/1474028159233163358/messages" \
-H "Authorization: Bot ${{ secrets.DISCORD_BOT_TOKEN }}" \
-F "content=π¬ **Demo β PR #${{ github.event.pull_request.number }}**
Preview: ${{ steps.vercel.outputs.url }}" \
-F "files[0]=@/tmp/demo.gif;type=image/gif;filename=demo.gif"