diff --git a/github/github-download-previous-artifacts/action.yaml b/github/github-download-previous-artifacts/action.yaml new file mode 100644 index 0000000..ae615ce --- /dev/null +++ b/github/github-download-previous-artifacts/action.yaml @@ -0,0 +1,38 @@ +name: github-download-previous-artifacts +description: "Download artifacts from a previous Workflow run." +inputs: + workflowPattern: + description: "Pattern of the workflow name to match." + required: true + filePattern: + description: "Pattern of the artifacts to match." + required: true + default: "*" + artifactName: + description: "Name of the artifact when it is downloaded. If not specified, the artifact will be named what the artifact is named." + required: false + default: "" + unzipDir: + description: "Directory to unzip the artifacts into. If not specified, the artifacts will not be unzipped." + required: false + default: "" +outputs: + query: + description: "The query result." + value: ${{ steps.query.outputs.console }} +runs: + using: "composite" + steps: + - name: "Download artifacts." + uses: https://github.com/actions/github-script@v6 + continue-on-error: true + env: + WORKFLOW_FILENAME: ${{ inputs.workflowPattern }} + ARTIFACT_NAME: ${{ inputs.filePattern }} + ARTIFACT_FILENAME: ${{ inputs.artifactName }} + UNZIP_DIR: ${{ inputs.unzipDir }} + with: + script: | + const script = require('${{ github.action_path }}/download-previous-artifact.js') + await script({github, context, core}) + shell: node diff --git a/github/github-download-previous-artifacts/download-previous-artifacts.js b/github/github-download-previous-artifacts/download-previous-artifacts.js new file mode 100644 index 0000000..a8645ec --- /dev/null +++ b/github/github-download-previous-artifacts/download-previous-artifacts.js @@ -0,0 +1,67 @@ +module.exports = async ({ + github, + context, + core +}) => { + const owner = context.repo.owner; + const repo = context.repo.repo; + + // See: https://docs.github.com/en/rest/actions/workflows?apiVersion=2022-11-28#list-repository-workflows + const workflows = await github.rest.actions.listRepoWorkflows({ + owner, + repo + }) + + const workflow = workflows.data.workflows.find(w => w.path.includes(process.env.WORKFLOW_FILENAME)); + + if (!workflow) { + core.setFailed("No matching workflow found."); + return; + } + + // See: https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#list-workflow-runs-for-a-repository + const runs = await github.rest.actions.listWorkflowRuns({ + owner, + repo, + workflow_id: workflow.id, + status: "success", + per_page: 1 + }) + + if (runs.data.total_count === 0) { + core.setFailed("No workflow runs found."); + return; + } + + // See: https://docs.github.com/en/rest/actions/artifacts?apiVersion=2022-11-28#list-workflow-run-artifacts + const artifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner, + repo, + run_id: runs.data.workflow_runs[0].id + }); + + // Other formats are not supported by the GitHub API for downloading artifacts. + const extension = "zip" + const artifact = artifacts.data.artifacts.find(artifact => artifact.name === process.env.ARTIFACT_NAME); + if (artifact) { + // See: https://docs.github.com/en/rest/actions/artifacts?apiVersion=2022-11-28#download-an-artifact + const response = await github.rest.actions.downloadArtifact({ + owner, + repo, + artifact_id: artifact.id, + archive_format: extension + }); + + const artifactFilename = process.env.ARTIFACT_FILENAME || `${artifact.name}.${extension}`; + require('fs').writeFileSync(artifactFilename, Buffer.from(response.data)); + console.log("Artifact downloaded successfully."); + const unzip_dir = process.env.UNZIP_DIR; + if (unzip_dir) { + console.log("Unzipping artifact to directory: %s", unzip_dir); + require('child_process').execSync(`unzip -o ${artifactFilename} -d ${process.env.UNZIP_DIR}`); + } + + } else { + core.setFailed("No artifact found."); + } +}