Skip to content
Merged
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
195 changes: 195 additions & 0 deletions .github/workflows/ecosystem-ci-from-pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
# integration tests for vite ecosystem - run from pr comments
name: vite-ecosystem-ci-from-pr

env:
# 7 GiB by default on GitHub, setting to 6 GiB
# https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources
NODE_OPTIONS: --max-old-space-size=6144

on:
workflow_dispatch:
inputs:
prNumber:
description: "PR number (e.g. 9887)"
required: true
type: string
branchName:
description: "vite branch to use"
required: true
type: string
default: "main"
repo:
description: "vite repository to use"
required: true
type: string
default: "vitejs/vite"
suite:
description: "testsuite to run. runs all testsuits when `-`."
required: false
type: choice
options:
- "-"
- astro
- iles
- ladle
- laravel
- marko
- nuxt-framework
- rakkas
- storybook
- svelte
- vite-plugin-ssr
- vite-setup-catalogue
- vitepress
- vitest
- windicss
jobs:
init:
runs-on: ubuntu-latest
outputs:
comment-id: ${{ steps.create-comment.outputs.result }}
steps:
- id: generate-token
uses: tibdex/github-app-token@v1
with:
app_id: ${{ secrets.PR_GITHUB_APP_ID }}
private_key: ${{ secrets.PR_GITHUB_APP_PRIVATE_KEY }}
repository: "${{ github.repository_owner }}/vite"
- id: create-comment
uses: actions/github-script@v6
with:
github-token: ${{ steps.generate-token.outputs.token }}
result-encoding: string
script: |
const url = `${context.serverUrl}//${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`
const urlLink = `[Open](${url})`

const { data: comment } = await github.rest.issues.createComment({
issue_number: context.payload.inputs.prNumber,
owner: context.repo.owner,
repo: 'vite',
body: `⏳ Triggered ecosystem CI: ${urlLink}`
})
return comment.id

execute-selected-suite:
timeout-minutes: 20
runs-on: ubuntu-latest
needs: init
if: "inputs.suite != '-'"
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- uses: denoland/setup-deno@v1
with:
deno-version: v1.x
continue-on-error: true
- run: corepack enable
- run: pnpm i --frozen-lockfile
- run: >-
pnpm tsx ecosystem-ci.ts
--branch ${{ inputs.branchName }}
--repo ${{ inputs.repo }}
${{ inputs.suite }}

execute-all:
timeout-minutes: 20
runs-on: ubuntu-latest
needs: init
if: "inputs.suite == '-'"
strategy:
matrix:
suite:
- astro
- iles
- ladle
- laravel
- marko
- nuxt-framework
- rakkas
- storybook
- svelte
- vite-plugin-ssr
- vite-setup-catalogue
- vitepress
- vitest
- windicss
fail-fast: false
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- uses: denoland/setup-deno@v1
with:
deno-version: v1.x
continue-on-error: true
- run: corepack enable
- run: pnpm i --frozen-lockfile
- run: >-
pnpm tsx ecosystem-ci.ts
--branch ${{ inputs.branchName }}
--repo ${{ inputs.repo }}
${{ matrix.suite }}

update-comment:
runs-on: ubuntu-latest
needs: [init, execute-selected-suite, execute-all]
if: always()
steps:
- id: generate-token
uses: tibdex/github-app-token@v1
with:
app_id: ${{ secrets.PR_GITHUB_APP_ID }}
private_key: ${{ secrets.PR_GITHUB_APP_PRIVATE_KEY }}
repository: "${{ github.repository_owner }}/vite"
- uses: actions/github-script@v6
with:
github-token: ${{ steps.generate-token.outputs.token }}
script: |
const { data: { jobs } } = await github.rest.actions.listJobsForWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.runId,
per_page: 100
});

const selectedSuite = context.payload.inputs.suite
let result
if (selectedSuite !== "-") {
const { conclusion, html_url } = jobs.find(job => job.name === "execute-selected-suite")
result = [{ suite: selectedSuite, conclusion, link: html_url }]
} else {
result = jobs
.filter(job => job.name.startsWith('execute-all '))
.map(job => {
const suite = job.name.replace(/^execute-all \(([^)]+)\)$/, "$1")
return { suite, conclusion: job.conclusion, link: job.html_url }
})
}

const url = `${context.serverUrl}//${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`
const urlLink = `[Open](${url})`

const conclusionEmoji = {
success: ":white_check_mark:",
failure: ":x:",
cancelled: ":stop_button:"
}

const body = `
📝 Ran ecosystem CI: ${urlLink}

| suite | result |
|-------|--------|
${result.map(r => `| [${r.suite}](${r.link}) | ${conclusionEmoji[r.conclusion]} ${r.conclusion} |`).join("\n")}
`

await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: 'vite',
comment_id: ${{ needs.init.outputs.comment-id }},
body
})