name: Deploy Preview on: [pull_request] jobs: vercel-deployment: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs uses: styfle/cancel-workflow-action@0.5.0 with: access_token: ${{ github.token }} - uses: actions/checkout@v2 - uses: aulneau/vercel-action@v20.0.0 id: vercel_deployment_preview if: github.event_name == 'pull_request' with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} scope: ${{ secrets.VERCEL_SCOPE }} alias-domains: pr-{{ PR_NUMBER }}.docs.stacks.engineering - id: file_changes name: Check diff of PR uses: trilom/file-changes-action@v1.2.4 with: prNumber: ${{ github.event.pull_request.number }} - name: Comment on PR uses: actions/github-script@v2 id: comment if: github.event_name == 'pull_request' with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const getPageUrl = (changed) => { const pageUrl = changed.replace('src/pages/', '/').replace('.md', '') if(pageUrl === '/index') return '/' return pageUrl } const makeUrl = (path, url) => `${url}${path}` const getScreenshotUrl = (path, url) => `https://api.microlink.io/?url=${makeUrl(path, url)}&meta=false&screenshot=&overlay.browser=dark&screenshot&embed=screenshot.url` const getChangedPages = (changed, url) => { let changedPages = [] changed.forEach(file => { if(file.includes('src/pages')){ const path = getPageUrl(file) changedPages.push({ url: makeUrl(path, url), screenshot: getScreenshotUrl(path, url) }) } }) // group by screenshots by 3 const grouped = changedPages.reduce((pv, cv, i) => { const j = Math.floor(i / 2) ;(pv[j] || (pv[j] = [])).push(cv) return pv }, []) return grouped } const ellipsis = (txt, l = 25) => { return txt.length > l ? `…${txt.slice(-22)}` : txt; }; const escapeLinkTitle = txt => { // escape [ and ] with \ return txt.replace(/\[/g, '\\[').replace(/\]/g, '\\]'); }; const createChangedPagesMarkdown = (changed, url) => { if(changed.length === 0) return '' const grouped = getChangedPages(changed, url) if(grouped.length === 0) return '' let md = ` #### 📝 Changed routes:` md += grouped .map( group => ` |${group .map(({ url: routeUrl }) => ` [**${escapeLinkTitle(ellipsis(routeUrl.replace(url, '')))}**](${routeUrl}) |`) .join('')} |${':-:|'.repeat(group.length)} |${group .map( ({ url: routeUrl, screenshot }) => `Screenshot of ${routeUrl.replace(url, '')}` + '
' + `(view full size)` + ' |' ) .join('')} `).join(''); return md } const firstLine = `Blockstack docs have been deployed with Vercel using the code from this PR!`; const {data} = await github.issues.listComments({ ...context.repo, issue_number: context.issue.number, }); const vercelPreviewURLComment = data.find((comment) => comment.body.includes(firstLine) ); const commentId = vercelPreviewURLComment && vercelPreviewURLComment.id || undefined; const prUrl = '${{steps.vercel_deployment_preview.outputs.preview-url}}' const changed = ${{steps.file_changes.outputs.files_modified}} const added = ${{steps.file_changes.outputs.files_added}} const removed = ${{steps.file_changes.outputs.files_removed}} const all_files = ${{steps.file_changes.outputs.files}} const commentBody = ` #### Blockstack Documentation ${ firstLine } - [Blockstack Docs](${prUrl}) ${createChangedPagesMarkdown([...changed, ...added], prUrl)} Built with commit ${context.sha}. `; if (context.issue.number) { if (commentId) { await github.issues.updateComment({ ...context.repo, comment_id: commentId, body: commentBody, }); } else { await github.issues.createComment({ ...context.repo, issue_number: context.issue.number, body: commentBody, }); } }