feat: buildless ecosystem ci #20568
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: ecosystem-ci trigger | |
# on: | |
# issue_comment: | |
# types: [created] | |
on: | |
pull_request: | |
jobs: | |
trigger: | |
runs-on: ubuntu-latest | |
# if: github.repository == 'vitejs/vite' && github.event.issue.pull_request && startsWith(github.event.comment.body, '/ecosystem-ci run') | |
steps: | |
- name: Get PR Data | |
uses: actions/github-script@v7 | |
id: get-pr-data | |
with: | |
script: | | |
console.log(`Get PR info: ${context.repo.owner}/${context.repo.repo}#${context.issue.number}`) | |
const { data: pr } = await github.rest.pulls.get({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: context.issue.number | |
}) | |
return { | |
num: context.issue.number, | |
branchName: pr.head.ref, | |
commit: pr.head.sha, | |
repo: pr.head.repo.full_name | |
} | |
# - name: Check Package Existence | |
# uses: actions/github-script@v7 | |
# id: check-package | |
# with: | |
# script: | | |
# const prData = ${{ steps.get-pr-data.outputs.result }} | |
# const url = `https://pkg.pr.new/vite@${prData.commit}` | |
# const response = await fetch(url) | |
# console.log(`Package check URL: ${url}, Status: ${response.status}`) | |
# // Add 'rocket' reaction to the issue comment | |
# if (response.status === 404) { | |
# const reaction = await github.rest.reactions.createForIssueComment({ | |
# owner: context.repo.owner, | |
# repo: context.repo.repo, | |
# comment_id: context.payload.comment.id, | |
# content: 'rocket', | |
# }) | |
# return { exists: false, reaction: reaction.id } | |
# } | |
# return { exists: true, reaction: null } | |
# - name: Check User Permissions | |
# uses: actions/github-script@v7 | |
# id: check-permissions | |
# with: | |
# script: | | |
# const user = context.payload.sender.login | |
# console.log(`Validate user: ${user}`) | |
# let hasTriagePermission = false | |
# try { | |
# const { data } = await github.rest.repos.getCollaboratorPermissionLevel({ | |
# owner: context.repo.owner, | |
# repo: context.repo.repo, | |
# username: user, | |
# }); | |
# hasTriagePermission = ['triage', 'write', 'admin'].some(p => data.user.permissions[p]); | |
# } catch (e) { | |
# console.warn(e) | |
# } | |
# if (allowed) { | |
# console.log('User is allowed. Adding +1 reaction.') | |
# await github.rest.reactions.createForIssueComment({ | |
# owner: context.repo.owner, | |
# repo: context.repo.repo, | |
# comment_id: context.payload.comment.id, | |
# content: '+1', | |
# }) | |
# } else { | |
# console.log('User is not allowed. Adding -1 reaction.') | |
# await github.rest.reactions.createForIssueComment({ | |
# owner: context.repo.owner, | |
# repo: context.repo.repo, | |
# comment_id: context.payload.comment.id, | |
# content: '-1', | |
# }) | |
# throw new Error('User does not have the necessary permissions.') | |
# } | |
# - name: Generate Token | |
# id: generate-token | |
# uses: tibdex/github-app-token@v2 | |
# with: | |
# app_id: ${{ secrets.ECOSYSTEM_CI_GITHUB_APP_ID }} | |
# installation_retrieval_payload: "${{ github.repository_owner }}/vite-ecosystem-ci" | |
# private_key: ${{ secrets.ECOSYSTEM_CI_GITHUB_APP_PRIVATE_KEY }} | |
# - name: Trigger Preview Release (if Package Not Found) | |
# if: steps.check-package.outputs.exists == false | |
# uses: actions/github-script@v7 | |
# id: trigger-preview-release | |
# with: | |
# github-token: ${{ steps.generate-token.outputs.token }} | |
# script: | | |
# const prData = ${{ steps.get-pr-data.outputs.result }} | |
# console.log('Package not found, triggering preview release...') | |
# // Add label "trigger: preview" to the PR | |
# await github.rest.issues.addLabels({ | |
# owner: context.repo.owner, | |
# repo: context.repo.repo, | |
# issue_number: prData.num, | |
# labels: ['trigger: preview'] | |
# }) | |
# console.log('Added "trigger: preview" label.') | |
# - name: Wait for Preview Release Completion (if Package Not Found) | |
# if: steps.check-package.outputs.exists == false | |
# uses: actions/github-script@v7 | |
# id: wait-preview-release | |
# with: | |
# script: | | |
# const prData = ${{ steps.get-pr-data.outputs.result }} | |
# const reaction = ${{ steps.check-package.outputs.reaction }} | |
# const workflowFileName = 'preview-release.yml' | |
# const workflow = await github.rest.actions.getWorkflow({ | |
# owner: context.repo.owner, | |
# repo: context.repo.repo, | |
# workflow_id: workflowFileName, | |
# }) | |
# const workflowId = workflow.data.id | |
# console.log(`Waiting for workflow ID ${workflowId} to complete...`) | |
# const maxRetries = 60 // Wait up to 10 minutes | |
# const delay = 10000 // 10 seconds | |
# let completed = false | |
# for (let i = 0; i < maxRetries; i++) { | |
# const runsData = await github.rest.actions.listWorkflowRuns({ | |
# owner: context.repo.owner, | |
# repo: context.repo.repo, | |
# workflow_id: workflowId, | |
# head_sha: prData.commit, | |
# per_page: 100, | |
# page: 1, | |
# }) | |
# const runs = runsData.data.workflow_runs | |
# if (runs.length > 0) { | |
# const latestRun = runs[0] | |
# console.log(`Latest run status: ${latestRun.status}, conclusion: ${latestRun.conclusion}`) | |
# if (latestRun.status === 'completed') { | |
# if (latestRun.conclusion === 'success') { | |
# console.log('Preview release workflow completed successfully.') | |
# completed = true | |
# break | |
# } else { | |
# throw new Error('Preview Release workflow failed.') | |
# } | |
# } | |
# } | |
# console.log(`Retrying... (${i + 1}/${maxRetries})`) | |
# await new Promise(resolve => setTimeout(resolve, delay)) | |
# } | |
# if (!completed) { | |
# throw new Error('Preview Release workflow did not complete in time.') | |
# } | |
# // Remove the 'rocket' reaction | |
# if (reaction) { | |
# await github.rest.reactions.deleteForIssueComment({ | |
# owner: context.repo.owner, | |
# repo: context.repo.repo, | |
# comment_id: context.payload.comment.id, | |
# reaction_id: reaction, | |
# }) | |
# console.log('Removed "rocket" reaction.') | |
# } | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Check Commit Hash Ambiguity | |
id: check_ambiguity | |
run: | | |
COMMIT_HASH=${{ steps.get-pr-data.outputs.commit }} | |
COMMIT_SHORT=${COMMIT_HASH:0:7} | |
if git show "$COMMIT_SHORT"; then | |
echo "COMMIT=$COMMIT_HASH" >> $GITHUB_ENV | |
else | |
echo "COMMIT=" >> $GITHUB_ENV | |
fi | |
- name: Trigger Downstream Workflow | |
uses: actions/github-script@v7 | |
id: trigger | |
env: | |
COMMENT: ${{ github.event.comment.body }} | |
COMMIT: ${{ env.COMMIT }} | |
with: | |
github-token: ${{ steps.generate-token.outputs.token }} | |
script: | | |
const comment = process.env.COMMENT.trim() | |
const prData = ${{ steps.get-pr-data.outputs.result }} | |
const suite = comment.split('\n')[0].replace(/^\/ecosystem-ci run/, '').trim() | |
await github.rest.actions.createWorkflowDispatch({ | |
owner: context.repo.owner, | |
repo: 'vite-ecosystem-ci', | |
workflow_id: 'ecosystem-ci-from-pr.yml', | |
ref: 'main', | |
inputs: { | |
prNumber: '' + prData.num, | |
branchName: prData.branchName, | |
repo: prData.repo, | |
commit: process.env.COMMIT, | |
suite: suite === '' ? '-' : suite | |
} | |
}) |