Skip to content

Custom GH Status from Workflow Artifacts #7939

Custom GH Status from Workflow Artifacts

Custom GH Status from Workflow Artifacts #7939

Workflow file for this run

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,
});