Compare commits

..

1 commit

Author SHA1 Message Date
Petteri Räty
b7ab51ecd1
Merge ef3d263efa into 448e3f862a 2025-07-09 17:57:17 +02:00
4 changed files with 14 additions and 83 deletions

View file

@ -5,11 +5,9 @@ Download [Actions Artifacts](https://docs.github.com/en/actions/using-workflows/
See also [upload-artifact](https://github.com/actions/upload-artifact). See also [upload-artifact](https://github.com/actions/upload-artifact).
- [`@actions/download-artifact`](#actionsdownload-artifact) - [`@actions/download-artifact`](#actionsdownload-artifact)
- [v5 - What's new](#v5---whats-new)
- [v4 - What's new](#v4---whats-new) - [v4 - What's new](#v4---whats-new)
- [Improvements](#improvements) - [Improvements](#improvements)
- [Breaking Changes](#breaking-changes) - [Breaking Changes](#breaking-changes)
- [Note](#note)
- [Usage](#usage) - [Usage](#usage)
- [Inputs](#inputs) - [Inputs](#inputs)
- [Outputs](#outputs) - [Outputs](#outputs)
@ -22,17 +20,6 @@ See also [upload-artifact](https://github.com/actions/upload-artifact).
- [Limitations](#limitations) - [Limitations](#limitations)
- [Permission Loss](#permission-loss) - [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 ## v4 - What's new
@ -78,7 +65,7 @@ You are welcome to still raise bugs in this repo.
### Inputs ### Inputs
```yaml ```yaml
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
with: with:
# Name of the artifact to download. # Name of the artifact to download.
# If unspecified, all artifacts for the run are downloaded. # If unspecified, all artifacts for the run are downloaded.
@ -103,7 +90,6 @@ You are welcome to still raise bugs in this repo.
# If true, the downloaded artifacts will be in the same directory specified by path. There is no check for file name # If true, the downloaded artifacts will be in the same directory specified by path. There is no check for file name
# collisions. If multiple artifacts have files with the same name, only one will end up in path. # collisions. If multiple artifacts have files with the same name, only one will end up in path.
# If false, the downloaded artifacts will be extracted into individual named directories within the specified 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' # Optional. Default is 'false'
merge-multiple: merge-multiple:
@ -137,7 +123,7 @@ Download to current working directory (`$GITHUB_WORKSPACE`):
```yaml ```yaml
steps: steps:
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
with: with:
name: my-artifact name: my-artifact
- name: Display structure of downloaded files - name: Display structure of downloaded files
@ -148,7 +134,7 @@ Download to a specific directory (also supports `~` expansion):
```yaml ```yaml
steps: steps:
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
with: with:
name: my-artifact name: my-artifact
path: your/destination/dir path: your/destination/dir
@ -160,36 +146,20 @@ 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. 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 ```yaml
steps: steps:
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
with: with:
artifact-ids: 12345 artifact-ids: 12345
- name: Display structure of downloaded files - name: Display structure of downloaded files
run: ls -R 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: Multiple artifacts can be downloaded by providing a comma-separated list of IDs:
```yaml ```yaml
steps: steps:
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
with: with:
artifact-ids: 12345,67890 artifact-ids: 12345,67890
path: path/to/artifacts path: path/to/artifacts
@ -197,7 +167,7 @@ steps:
run: ls -R path/to/artifacts run: ls -R path/to/artifacts
``` ```
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). This will download multiple artifacts to separate directories (similar to downloading multiple artifacts by name).
### Download All Artifacts ### Download All Artifacts
@ -217,7 +187,7 @@ Download all artifacts to the current working directory:
```yaml ```yaml
steps: steps:
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
- name: Display structure of downloaded files - name: Display structure of downloaded files
run: ls -R run: ls -R
``` ```
@ -226,7 +196,7 @@ Download all artifacts to a specific directory:
```yaml ```yaml
steps: steps:
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
with: with:
path: path/to/artifacts path: path/to/artifacts
- name: Display structure of downloaded files - name: Display structure of downloaded files
@ -237,7 +207,7 @@ To download them to the _same_ directory:
```yaml ```yaml
steps: steps:
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
with: with:
path: path/to/artifacts path: path/to/artifacts
merge-multiple: true merge-multiple: true
@ -277,7 +247,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Download All Artifacts - name: Download All Artifacts
uses: actions/download-artifact@v5 uses: actions/download-artifact@v4
with: with:
path: my-artifact path: my-artifact
pattern: my-artifact-* pattern: my-artifact-*
@ -300,7 +270,7 @@ It may be useful to download Artifacts from other workflow runs, or even other r
```yaml ```yaml
steps: steps:
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v4
with: with:
name: my-other-artifact name: my-other-artifact
github-token: ${{ secrets.GH_PAT }} # token with actions:read permissions on target repo github-token: ${{ secrets.GH_PAT }} # token with actions:read permissions on target repo

View file

@ -1,5 +1,4 @@
import * as core from '@actions/core' import * as core from '@actions/core'
import * as path from 'path'
import artifact, {ArtifactNotFoundError} from '@actions/artifact' import artifact, {ArtifactNotFoundError} from '@actions/artifact'
import {run} from '../src/download-artifact' import {run} from '../src/download-artifact'
import {Inputs} from '../src/constants' import {Inputs} from '../src/constants'
@ -372,38 +371,4 @@ describe('download', () => {
"Inputs 'name' and 'artifact-ids' cannot be used together. Please specify only one." "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,9 +118883,7 @@ function run() {
} }
const downloadPromises = artifacts.map(artifact => ({ const downloadPromises = artifacts.map(artifact => ({
name: artifact.name, name: artifact.name,
promise: artifact_1.default.downloadArtifact(artifact.id, Object.assign(Object.assign({}, options), { path: isSingleArtifactDownload || promise: artifact_1.default.downloadArtifact(artifact.id, Object.assign(Object.assign({}, options), { path: isSingleArtifactDownload || inputs.mergeMultiple
inputs.mergeMultiple ||
artifacts.length === 1
? resolvedPath ? resolvedPath
: path.join(resolvedPath, artifact.name), expectedHash: artifact.digest })) : path.join(resolvedPath, artifact.name), expectedHash: artifact.digest }))
})); }));
@ -128960,4 +128958,4 @@ module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"]
/******/ module.exports = __webpack_exports__; /******/ module.exports = __webpack_exports__;
/******/ /******/
/******/ })() /******/ })()
; ;

View file

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