Compare commits

...

11 commits

Author SHA1 Message Date
VencaVeny92
28f75e2ae1
Merge 6e116cfb77 into de96f4613b 2025-08-06 10:01:39 -04:00
Yang Cao
de96f4613b
Merge pull request #417 from actions/yacaovsnc/update_readme
Some checks failed
Check dist/ / check-dist (push) Failing after 23s
Code scanning - action / CodeQL-Build (push) Failing after 7s
Licensed / Check licenses (push) Failing after 3s
Update README for download-artifact v5 changes
2025-08-06 09:03:16 -04:00
Yang Cao
7993cb44e9
Remove migration guide for artifact download changes
Readme probably should be less verbose since it's not a changelog.
2025-08-05 18:06:12 -04:00
Yang Cao
2653c123b8
Update README.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-05 18:02:37 -04:00
Yang Cao
7d782037f3
Update README for download-artifact v5 changes
Updated documentation for download-artifact action to reflect changes in version 5.
2025-08-05 18:01:53 -04:00
Yang Cao
634f93cb29
Merge pull request #416 from actions/single-artifact-id-download-path
Some checks failed
Check dist/ / check-dist (push) Failing after 7s
Code scanning - action / CodeQL-Build (push) Failing after 4s
Licensed / Check licenses (push) Failing after 3s
Test / Build (push) Failing after 6s
fix: inconsistent path behavior for single artifact downloads by ID
2025-08-05 16:50:54 -04:00
GrantBirki
b19ff43027
refactor: resolve download path correctly in artifact download tests (mainly for windows unit tests) 2025-08-05 11:26:03 -07:00
GrantBirki
e262cbee4a
bundle dist 2025-08-05 11:00:44 -07:00
GrantBirki
bff23f9308
update docs 2025-08-05 10:59:33 -07:00
GrantBirki
fff8c148a8
fix download path logic when downloading a single artifact by id 2025-08-05 10:56:18 -07:00
VencaVeny92
6e116cfb77
Create npm-grunt.yml 2025-04-05 11:13:49 +02:00
5 changed files with 111 additions and 14 deletions

28
.github/workflows/npm-grunt.yml vendored Normal file
View file

@ -0,0 +1,28 @@
name: NodeJS with Grunt
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x, 22.x]
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Build
run: |
npm install
grunt

View file

@ -5,9 +5,11 @@ Download [Actions Artifacts](https://docs.github.com/en/actions/using-workflows/
See also [upload-artifact](https://github.com/actions/upload-artifact).
- [`@actions/download-artifact`](#actionsdownload-artifact)
- [v5 - What's new](#v5---whats-new)
- [v4 - What's new](#v4---whats-new)
- [Improvements](#improvements)
- [Breaking Changes](#breaking-changes)
- [Note](#note)
- [Usage](#usage)
- [Inputs](#inputs)
- [Outputs](#outputs)
@ -20,6 +22,17 @@ See also [upload-artifact](https://github.com/actions/upload-artifact).
- [Limitations](#limitations)
- [Permission Loss](#permission-loss)
## v5 - What's new
Previously, **single artifact downloads** behaved differently depending on how you specified the artifact:
- **By name**: `name: my-artifact` → extracted to `path/` (direct)
- **By ID**: `artifact-ids: 12345` → extracted to `path/my-artifact/` (nested)
Now both methods are consistent:
- **By name**: `name: my-artifact` → extracted to `path/` (unchanged)
- **By ID**: `artifact-ids: 12345` → extracted to `path/` (updated - now direct)
## v4 - What's new
@ -65,7 +78,7 @@ You are welcome to still raise bugs in this repo.
### Inputs
```yaml
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
with:
# Name of the artifact to download.
# If unspecified, all artifacts for the run are downloaded.
@ -89,6 +102,7 @@ You are welcome to still raise bugs in this repo.
# When multiple artifacts are matched, this changes the behavior of the destination directories.
# If true, the downloaded artifacts will be in the same directory specified by path.
# If false, the downloaded artifacts will be extracted into individual named directories within the specified path.
# Note: When downloading a single artifact (by name or ID), it will always be extracted directly to the specified path.
# Optional. Default is 'false'
merge-multiple:
@ -122,7 +136,7 @@ Download to current working directory (`$GITHUB_WORKSPACE`):
```yaml
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
with:
name: my-artifact
- name: Display structure of downloaded files
@ -133,7 +147,7 @@ Download to a specific directory (also supports `~` expansion):
```yaml
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
with:
name: my-artifact
path: your/destination/dir
@ -145,20 +159,36 @@ steps:
The `artifact-ids` input allows downloading artifacts using their unique ID rather than name. This is particularly useful when working with immutable artifacts from `actions/upload-artifact@v4` which assigns a unique ID to each artifact.
Download a single artifact by ID to the current working directory (`$GITHUB_WORKSPACE`):
```yaml
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
with:
artifact-ids: 12345
- name: Display structure of downloaded files
run: ls -R
```
Download a single artifact by ID to a specific directory:
```yaml
steps:
- uses: actions/download-artifact@v5
with:
artifact-ids: 12345
path: your/destination/dir
- name: Display structure of downloaded files
run: ls -R your/destination/dir
```
When downloading a single artifact by ID, the behavior is identical to downloading by name - the artifact contents are extracted directly to the specified path without creating a subdirectory.
Multiple artifacts can be downloaded by providing a comma-separated list of IDs:
```yaml
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
with:
artifact-ids: 12345,67890
path: path/to/artifacts
@ -166,7 +196,7 @@ steps:
run: ls -R path/to/artifacts
```
This will download multiple artifacts to separate directories (similar to downloading multiple artifacts by name).
When downloading multiple artifacts by ID, each artifact will be extracted into its own subdirectory named after the artifact (similar to downloading multiple artifacts by name).
### Download All Artifacts
@ -186,7 +216,7 @@ Download all artifacts to the current working directory:
```yaml
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
- name: Display structure of downloaded files
run: ls -R
```
@ -195,7 +225,7 @@ Download all artifacts to a specific directory:
```yaml
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
with:
path: path/to/artifacts
- name: Display structure of downloaded files
@ -206,7 +236,7 @@ To download them to the _same_ directory:
```yaml
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
with:
path: path/to/artifacts
merge-multiple: true
@ -246,7 +276,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download All Artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v5
with:
path: my-artifact
pattern: my-artifact-*
@ -269,7 +299,7 @@ It may be useful to download Artifacts from other workflow runs, or even other r
```yaml
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v5
with:
name: my-other-artifact
github-token: ${{ secrets.GH_PAT }} # token with actions:read permissions on target repo

View file

@ -1,4 +1,5 @@
import * as core from '@actions/core'
import * as path from 'path'
import artifact, {ArtifactNotFoundError} from '@actions/artifact'
import {run} from '../src/download-artifact'
import {Inputs} from '../src/constants'
@ -371,4 +372,38 @@ describe('download', () => {
"Inputs 'name' and 'artifact-ids' cannot be used together. Please specify only one."
)
})
test('downloads single artifact by ID to same path as by name', async () => {
const mockArtifact = {
id: 456,
name: 'test-artifact',
size: 1024,
digest: 'def456'
}
const testPath = '/test/path'
mockInputs({
[Inputs.Name]: '',
[Inputs.Pattern]: '',
[Inputs.ArtifactIds]: '456',
[Inputs.Path]: testPath
})
jest.spyOn(artifact, 'listArtifacts').mockImplementation(() =>
Promise.resolve({
artifacts: [mockArtifact]
})
)
await run()
// Verify it downloads directly to the specified path (not nested in artifact name subdirectory)
expect(artifact.downloadArtifact).toHaveBeenCalledWith(
456,
expect.objectContaining({
path: path.resolve(testPath), // Should be the resolved path directly, not nested
expectedHash: mockArtifact.digest
})
)
})
})

6
dist/index.js vendored
View file

@ -118883,7 +118883,9 @@ function run() {
}
const downloadPromises = artifacts.map(artifact => ({
name: artifact.name,
promise: artifact_1.default.downloadArtifact(artifact.id, Object.assign(Object.assign({}, options), { path: isSingleArtifactDownload || inputs.mergeMultiple
promise: artifact_1.default.downloadArtifact(artifact.id, Object.assign(Object.assign({}, options), { path: isSingleArtifactDownload ||
inputs.mergeMultiple ||
artifacts.length === 1
? resolvedPath
: path.join(resolvedPath, artifact.name), expectedHash: artifact.digest }))
}));
@ -128958,4 +128960,4 @@ module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"]
/******/ module.exports = __webpack_exports__;
/******/
/******/ })()
;
;

View file

@ -174,7 +174,9 @@ export async function run(): Promise<void> {
promise: artifactClient.downloadArtifact(artifact.id, {
...options,
path:
isSingleArtifactDownload || inputs.mergeMultiple
isSingleArtifactDownload ||
inputs.mergeMultiple ||
artifacts.length === 1
? resolvedPath
: path.join(resolvedPath, artifact.name),
expectedHash: artifact.digest