Compare commits

..

25 Commits

Author SHA1 Message Date
Rob Herley
d2e17e8b67 more patches 2023-12-09 17:24:52 -05:00
Rob Herley
621be0be95 swap unzipper with unzip-stream 2023-12-09 17:18:03 -05:00
Jonathan Tamsut
5be1d38671 Merge pull request #243 from actions/robherley/v4-beta-updates
Consume latest @actions/toolkit
2023-12-07 11:52:45 -08:00
Rob Herley
465b526e63 consume latest @actions/toolkit 2023-12-06 19:43:53 -05:00
Rob Herley
8b83831f82 Merge pull request #242 from actions/v4-beta-internal-client
Use internal client when `github-token` is not specified
2023-12-04 13:20:07 -05:00
Rob Herley
0742efc19b set new 'latest' attribute for list operations 2023-12-04 13:08:24 -05:00
Rob Herley
5e4b342272 consume latest @actions/artifact 2023-12-01 13:20:09 -05:00
Rob Herley
98c6f16055 Merge pull request #239 from actions/robherley/bump-v4-beta-toolkit
Bump to latest artifact version from toolkit
2023-11-21 10:58:42 -05:00
Rob Herley
9140050fd5 consume latest @actions/artifact from toolkit 2023-11-20 20:57:50 -05:00
Konrad Pabjan
88dadfbcfc [v4 beta] Fixes to download directory structure (#233)
* Fix extra root extra root directory if downloading single artifact on v4-beta

* Fix for all downloads

* Bump to node20 runtime

* ncc

---------

Co-authored-by: Rob Herley <robherley@github.com>
2023-10-27 10:11:07 -04:00
Rob Herley
896d1bb258 Merge pull request #232 from robherley/v4-beta
[v4-beta] Bump linked artifact toolkit pkg
2023-10-16 14:56:31 -04:00
Rob Herley
57685c7c71 bump linked artifact toolkit pkg 2023-10-16 14:40:44 -04:00
Rob Herley
8c323b340c Merge pull request #226 from robherley/main
Create v4-beta
2023-08-24 12:15:14 -04:00
Rob Herley
727cfbe442 better fallback for path and append aritfact name for mutli-download 2023-08-24 12:05:05 -04:00
Rob Herley
24b1443a07 use new @actions/artifact version & update download logic 2023-08-24 11:57:52 -04:00
Brian Flad
e9ef242655 Add download-path output to action.yml (#194)
Reference: https://github.com/actions/download-artifact/issues/153
Reference: https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-docker-container-and-javascript-actions

Prevents false positives from tooling, such as `actionlint`, that depends on the metadata for static analysis.

Co-authored-by: Konrad Pabjan <konradpabjan@github.com>
2023-01-05 17:35:52 -05:00
dependabot[bot]
adf9559c4f Bump json5 from 1.0.1 to 1.0.2 (#198)
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: json5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-05 17:24:04 -05:00
Konrad Pabjan
9bc31d5ccc Update to latest actions/artifact NPM package (#195)
* Use latest actions/artifact NPM package + misc updates

* Use node 18 + caching in CI

* Run npm release

* Use node 16 for CI + devcontainer
2023-01-04 17:30:33 -05:00
Konrad Pabjan
d2278a10ef Update release-new-action-version.yml (#196) 2023-01-04 17:25:27 -05:00
Konrad Pabjan
c1a6d8f06a Update codeql-analysis.yml (#197) 2023-01-04 17:21:01 -05:00
Francesco Renzi
9782bd6a98 Update @actions/core to 1.10.0 (#178)
* Update @actions/core to 1.10.0

* Update licenses

* solve npm conflicts

* update licenses
2022-10-20 19:26:49 -04:00
Yang Cao
076f0f7dd0 Merge pull request #156 from actions/dependabot/npm_and_yarn/ansi-regex-4.1.1
Bump ansi-regex from 4.1.0 to 4.1.1
2022-04-25 10:12:25 -04:00
dependabot[bot]
7151be3221 Bump ansi-regex from 4.1.0 to 4.1.1
Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-25 14:08:54 +00:00
Yang Cao
51cbdc41c1 Merge pull request #152 from actions/dependabot/npm_and_yarn/minimist-1.2.6
Bump minimist from 1.2.5 to 1.2.6
2022-04-25 10:08:26 -04:00
dependabot[bot]
e89a529079 Bump minimist from 1.2.5 to 1.2.6
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-26 14:50:08 +00:00
23 changed files with 103587 additions and 7266 deletions

View File

@@ -0,0 +1,6 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node
{
"name": "@actions/download-artifact",
"image": "mcr.microsoft.com/devcontainers/typescript-node:0-16"
}

View File

@@ -22,12 +22,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set Node.js 12.x
uses: actions/setup-node@v1
- name: Setup Node 16
uses: actions/setup-node@v3
with:
node-version: 12.x
node-version: 16.x
cache: 'npm'
- name: Install dependencies
run: npm ci
@@ -45,7 +46,7 @@ jobs:
id: diff
# If index.js was different than expected, upload the expected version as an artifact
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v3
if: ${{ failure() && steps.diff.conclusion == 'failure' }}
with:
name: dist

View File

@@ -20,11 +20,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
uses: github/codeql-action/init@v2
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
@@ -32,7 +32,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -46,4 +46,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v2

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
name: Check licenses
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- run: npm ci
- name: Install licensed
run: |

View File

@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Update the ${{ env.TAG_NAME }} tag
uses: actions/publish-action@v0.1.0
uses: actions/publish-action@v0.2.1
with:
source-tag: ${{ env.TAG_NAME }}
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}

View File

@@ -21,12 +21,14 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Set Node.js 12.x
uses: actions/setup-node@v1
# using node 16 since that is what the latest version of the runner ships with
- name: Setup Node 16
uses: actions/setup-node@v3
with:
node-version: 12.x
node-version: 16.x
cache: 'npm'
- name: npm install
run: npm install

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.licenses/npm/uuid.dep.yml generated Normal file

Binary file not shown.

View File

@@ -21,7 +21,7 @@ See [action.yml](action.yml)
Basic (download to the current working directory):
```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
@@ -34,7 +34,7 @@ steps:
Download to a specific directory:
```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
@@ -93,7 +93,7 @@ Example, if there are two artifacts `Artifact-A` and `Artifact-B`, and the direc
Download all artifacts to a specific directory
```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
@@ -107,7 +107,7 @@ steps:
Download all artifacts to the current working directory
```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
@@ -121,7 +121,7 @@ The `download-path` step output contains information regarding where the artifac
```yaml
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
id: download

View File

@@ -1,13 +1,31 @@
name: 'Download a Build Artifact'
description: 'Download a build artifact that was previously uploaded in the workflow by the upload-artifact action'
author: 'GitHub'
inputs:
inputs:
name:
description: 'Artifact name'
required: false
path:
description: 'Destination path'
required: false
github-token:
description: 'The GitHub token used to authenticate with the GitHub API.
This is required when downloading artifacts from a different repository or from a different workflow run.
If this is not specified, the action will attempt to download artifacts from the current repository and the current workflow run.'
required: false
repository:
description: 'The repository owner and the repository name joined together by "/".
If github-token is specified, this is the repository that artifacts will be downloaded from.'
required: false
default: ${{ github.repository }}
run-id:
description: 'The id of the workflow run where the desired download artifact was uploaded from.
If github-token is specified, this is the run that artifacts will be downloaded from.'
required: false
default: ${{ github.run_id }}
outputs:
download-path:
description: 'Path of artifact download'
runs:
using: 'node16'
using: 'node20'
main: 'dist/index.js'

109045
dist/index.js vendored

File diff suppressed because one or more lines are too long

1560
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -28,13 +28,14 @@
},
"homepage": "https://github.com/actions/download-artifact#readme",
"dependencies": {
"@actions/artifact": "^1.0.0",
"@actions/core": "^1.2.6"
"@actions/artifact": "^2.0.0",
"@actions/core": "^1.10.0",
"@actions/github": "^5.1.1"
},
"devDependencies": {
"@types/node": "^12.12.6",
"@typescript-eslint/parser": "^2.30.0",
"@zeit/ncc": "^0.22.1",
"@typescript-eslint/eslint-plugin": "^5.40.1",
"@vercel/ncc": "^0.33.4",
"concurrently": "^5.2.0",
"eslint": "^7.4.0",
"eslint-plugin-github": "^4.1.1",

View File

@@ -1,7 +1,11 @@
export enum Inputs {
Name = 'name',
Path = 'path'
Path = 'path',
GitHubToken = 'github-token',
Repository = 'repository',
RunID = 'run-id'
}
export enum Outputs {
DownloadPath = 'download-path'
}

View File

@@ -1,61 +1,115 @@
import * as core from '@actions/core'
import * as artifact from '@actions/artifact'
import * as os from 'os'
import {resolve} from 'path'
import * as path from 'path'
import * as core from '@actions/core'
import artifactClient from '@actions/artifact'
import type {Artifact, FindOptions} from '@actions/artifact'
import {Inputs, Outputs} from './constants'
const PARALLEL_DOWNLOADS = 5
export const chunk = <T>(arr: T[], n: number): T[][] =>
arr.reduce((acc, cur, i) => {
const index = Math.floor(i / n)
acc[index] = [...(acc[index] || []), cur]
return acc
}, [] as T[][])
async function run(): Promise<void> {
try {
const name = core.getInput(Inputs.Name, {required: false})
const path = core.getInput(Inputs.Path, {required: false})
let resolvedPath
// resolve tilde expansions, path.replace only replaces the first occurrence of a pattern
if (path.startsWith(`~`)) {
resolvedPath = resolve(path.replace('~', os.homedir()))
} else {
resolvedPath = resolve(path)
}
core.debug(`Resolved path is ${resolvedPath}`)
const artifactClient = artifact.create()
if (!name) {
// download all artifacts
core.info('No artifact name specified, downloading all artifacts')
core.info(
'Creating an extra directory for each artifact that is being downloaded'
)
const downloadResponse = await artifactClient.downloadAllArtifacts(
resolvedPath
)
core.info(`There were ${downloadResponse.length} artifacts downloaded`)
for (const artifact of downloadResponse) {
core.info(
`Artifact ${artifact.artifactName} was downloaded to ${artifact.downloadPath}`
)
}
} else {
// download a single artifact
core.info(`Starting download for ${name}`)
const downloadOptions = {
createArtifactFolder: false
}
const downloadResponse = await artifactClient.downloadArtifact(
name,
resolvedPath,
downloadOptions
)
core.info(
`Artifact ${downloadResponse.artifactName} was downloaded to ${downloadResponse.downloadPath}`
)
}
// output the directory that the artifact(s) was/were downloaded to
// if no path is provided, an empty string resolves to the current working directory
core.setOutput(Outputs.DownloadPath, resolvedPath)
core.info('Artifact download has finished successfully')
} catch (err) {
core.setFailed(err.message)
const inputs = {
name: core.getInput(Inputs.Name, {required: false}),
path: core.getInput(Inputs.Path, {required: false}),
token: core.getInput(Inputs.GitHubToken, {required: false}),
repository: core.getInput(Inputs.Repository, {required: false}),
runID: parseInt(core.getInput(Inputs.RunID, {required: false}))
}
if (!inputs.path) {
inputs.path = process.env['GITHUB_WORKSPACE'] || process.cwd()
}
if (inputs.path.startsWith(`~`)) {
inputs.path = inputs.path.replace('~', os.homedir())
}
const isSingleArtifactDownload = !!inputs.name
const resolvedPath = path.resolve(inputs.path)
core.debug(`Resolved path is ${resolvedPath}`)
const options: FindOptions = {}
if (inputs.token) {
const [repositoryOwner, repositoryName] = inputs.repository.split('/')
if (!repositoryOwner || !repositoryName) {
throw new Error(
`Invalid repository: '${inputs.repository}'. Must be in format owner/repo`
)
}
options.findBy = {
token: inputs.token,
workflowRunId: inputs.runID,
repositoryName,
repositoryOwner
}
}
let artifacts: Artifact[] = []
if (isSingleArtifactDownload) {
core.info(`Downloading single artifact`)
const {artifact: targetArtifact} = await artifactClient.getArtifact(
inputs.name,
options
)
if (!targetArtifact) {
throw new Error(`Artifact '${inputs.name}' not found`)
}
core.debug(
`Found named artifact '${inputs.name}' (ID: ${targetArtifact.id}, Size: ${targetArtifact.size})`
)
artifacts = [targetArtifact]
} else {
core.info(
`No input name specified, downloading all artifacts. Extra directory with the artifact name will be created for each download`
)
const listArtifactResponse = await artifactClient.listArtifacts({
latest: true,
...options
})
if (listArtifactResponse.artifacts.length === 0) {
throw new Error(
`No artifacts found for run '${inputs.runID}' in '${inputs.repository}'`
)
}
core.debug(`Found ${listArtifactResponse.artifacts.length} artifacts`)
artifacts = listArtifactResponse.artifacts
}
const downloadPromises = artifacts.map(artifact =>
artifactClient.downloadArtifact(artifact.id, {
...options,
path: isSingleArtifactDownload
? resolvedPath
: path.join(resolvedPath, artifact.name)
})
)
const chunkedPromises = chunk(downloadPromises, PARALLEL_DOWNLOADS)
for (const chunk of chunkedPromises) {
await Promise.all(chunk)
}
core.info(`Total of ${artifacts.length} artifact(s) downloaded`)
core.setOutput(Outputs.DownloadPath, resolvedPath)
core.info('Download artifact has finished successfully')
}
run()
run().catch(err =>
core.setFailed(`Unable to download artifact(s): ${err.message}`)
)