Custom GH Status from Workflow Artifacts #5253
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: Custom GH Status from Workflow Artifacts | |
on: | |
workflow_run: | |
workflows: ["pr"] | |
types: | |
- completed | |
jobs: | |
process_artifacts: | |
if: ${{ github.event.workflow_run.conclusion == 'success' }} | |
runs-on: ubuntu-latest | |
outputs: | |
artifact_downloaded: ${{ steps.download_artifact.outputs.artifact_downloaded }} | |
permissions: | |
actions: read | |
checks: read | |
contents: read | |
deployments: read | |
id-token: write | |
issues: read | |
discussions: read | |
packages: read | |
pages: read | |
pull-requests: read | |
repository-projects: read | |
security-events: read | |
statuses: write | |
steps: | |
- name: Download artifact | |
id: download_artifact | |
uses: actions/github-script@v7 | |
with: | |
retries: 3 | |
script: | | |
const fs = require('fs'); | |
const path = require('path'); | |
const artifactName = 'gh-status'; | |
const allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
run_id: context.payload.workflow_run.id, | |
}); | |
// Find the specific artifact | |
const artifact = allArtifacts.data.artifacts.find(artifact => artifact.name === artifactName); | |
if (!artifact) { | |
core.info(`Artifact "${artifactName}" not found. Exiting safely.`); | |
core.setOutput('artifact_downloaded', 'false'); | |
return; | |
} | |
core.setOutput('artifact_downloaded', 'true'); | |
// Download the artifact | |
const download = await github.rest.actions.downloadArtifact({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
artifact_id: artifact.id, | |
archive_format: 'zip', | |
}); | |
// Write the artifact to a file | |
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/${artifactName}.zip`, Buffer.from(download.data)); | |
- name: 'Unzip artifact' | |
if: ${{ steps.download_artifact.outputs.artifact_downloaded == 'true' }} | |
run: unzip 'gh-status.zip' | |
- name: Create status | |
if: ${{ steps.download_artifact.outputs.artifact_downloaded == 'true' }} | |
uses: actions/github-script@v7 | |
env: | |
WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }} | |
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }} | |
ATTEMPTS: ${{ github.event.workflow_run.run_attempt }} | |
with: | |
retries: 3 | |
script: | | |
// Load the JSON content | |
const contentJSON = require('./gh-status.json'); | |
const { | |
job_name: JOB_NAME, | |
context: CUSTOM_CONTEXT = 'Custom CI Status Check', | |
description: CUSTOM_DESCRIPTION = 'Custom CI Status description', | |
target_url: CUSTOM_TARGET_URL, | |
state: CUSTOM_STATE = 'success' | |
} = contentJSON; | |
// Fetch all jobs using pagination | |
const jobs = await github.paginate( | |
github.rest.actions.listJobsForWorkflowRun, | |
{ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
run_id: process.env.WORKFLOW_RUN_ID, | |
} | |
); | |
// Fetch the first job ID from the workflow run | |
const job = jobs.find(job => job.name === JOB_NAME); | |
const JOB_ID = job ? job.id : null; | |
// Set default target URL if not defined | |
const targetUrl = CUSTOM_TARGET_URL || `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${process.env.WORKFLOW_RUN_ID}/attempts/${process.env.ATTEMPTS}#summary-${JOB_ID}`; | |
console.log("job id: ", JOB_ID); | |
console.log("state: ", CUSTOM_STATE); | |
console.log("target url: ", targetUrl); | |
console.log("description: ", CUSTOM_DESCRIPTION); | |
console.log("context: ", CUSTOM_CONTEXT); | |
// Create status | |
await github.rest.repos.createCommitStatus({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
sha: process.env.COMMIT_SHA, | |
state: CUSTOM_STATE, | |
target_url: targetUrl, | |
description: CUSTOM_DESCRIPTION, | |
context: CUSTOM_CONTEXT, | |
}); |