1
0
Fork 0
toolkit/packages/artifact
Rob Herley 49ef8b93a8
fix typo
2023-12-06 15:38:59 +00:00
..
__tests__ consistent promise behavior for download artifact 2023-12-05 18:35:26 +00:00
docs Update packages/artifact/docs/faq.md 2023-12-06 09:31:55 -05:00
src initalize artifact client as default export 2023-12-06 04:00:07 +00:00
CONTRIBUTIONS.md update contributing docs 2023-12-05 21:10:48 +00:00
LICENSE.md Add License.md to all npm packages (#548) 2020-08-25 16:26:50 -04:00
README.md fix typo 2023-12-06 15:38:59 +00:00
RELEASES.md releases.md: link to breaking v2 changes 2023-12-06 14:52:49 +00:00
package-lock.json Update dependencies 2023-09-08 14:29:27 +00:00
package.json some test updates 2023-12-01 00:31:27 +00:00
tsconfig.json use require 2023-08-22 11:33:00 -07:00

README.md

@actions/artifact

Interact programmatically with Actions Artifacts.

This is the core library that powers the @actions/upload-artifact and @actions/download-artifact actions.

v2 - What's New

[!IMPORTANT] @actions/artifact v2+, upload-artifact@v4+ download-artifact@v4+ are not currently supported on GHES yet. The previous version of this package can be found at this tag and on npm.

The release of @actions/artifact@v2 (including upload-artifact@v4 and download-artifact@v4) are major changes to the backend architecture of Artifacts. They have numerous performance and behavioral improvements.

Improvements

  1. All upload and download operations are much quicker, up to 80% faster download times and 96% faster upload times in worst case scenarios.
  2. Once uploaded, Artifacts are immediately available in the UI and REST API. Previously, you would have to wait for the run to be completed.
  3. Artifacts are immutable once they are uploaded. They cannot be altered by subsequent jobs. (Digest/integrity hash coming soon in the API!)
  4. This library (and actions/download-artifact) now support downloading Artifacts from other repositories and runs if a GITHUB_TOKEN with sufficient actions:read permissions are provided.

Breaking changes

  1. Firewall rules required for self-hosted runners.

    If you are using self-hosted runners behind a firewall, you must have flows open to Actions endpoints. If you cannot use wildcard rules for your firewall, see the GitHub meta endpoint for specific endpoints.

    e.g.

    curl https://api.github.com/meta | jq .domains.actions
    
  2. Uploading to the same named Artifact multiple times.

    Due to how Artifacts are created in this new version, it is no longer possible to upload to the same named Artifact multiple times. You must either split the uploads into multiple Artifacts with different names, or only upload once.

Quick Start

Install the package:

npm i @actions/artifact

Import the module:

// ES6 module
import artifact from '@actions/artifact'

// CommonJS
const {default: artifact} = require('@actions/artifact')

For a comprehensive list of classes, interfaces, functions and more, see the generated documentation.

Examples

Upload and Download

The most basic scenario is uploading one or more files to an Artifact, then downloading that Artifact. Downloads are based on the Artifact ID, which can be obtained in the response of uploadArtifact, getArtifact, listArtifacts or via the REST API.

const {id, size} = await artifact.uploadArtifact(
  // name of the artifact
  'my-artifact',
  // files to include (supports absolute and relative paths)
  ['/absolute/path/file1.txt', './relative/file2.txt'],
  {
    // optional: how long to retain the artifact
    // if unspecified, defaults to repository/org retention settings (the limit of this value)
    retentionDays: 10
  }
)

console.log(`Created artifact with id: ${id} (bytes: ${size}`)

const {downloadPath} = await artifact.downloadArtifact(id, {
  // optional: download destination path. otherwise defaults to $GITHUB_WORKSPACE
  path: '/tmp/dst/path',
})

console.log(`Downloaded artifact ${id} to: ${downloadPath}`)

Downloading from other workflow runs or repos

It may be useful to download Artifacts from other workflow runs, or even other repositories. By default, the permissions are scoped so they can only download Artifacts within the current workflow run. To elevate permissions for this scenario, you must specify options.findBy to downloadArtifact.

const findBy = {
  // must have actions:read permission on target repository
  token: process.env['GITHUB_TOKEN'],
  workflowRunId: 123,
  repositoryOwner: 'actions',
  repositoryName: 'toolkit'
}

await artifact.downloadArtifact(1337, {
  findBy
})

// can also be used in other methods

await artifact.getArtifact('my-artifact', {
  findBy
})

await artifact.listArtifacts({
  findBy
})

Speeding up large uploads

If you have large files that need to be uploaded (or file types that don't compress well), you may benefit from changing the compression level of the Artifact archive. NOTE: This is a tradeoff between artifact upload time and stored data size.

await artifact.uploadArtifact('my-massive-artifact', ['big_file.bin'], {
  // The level of compression for Zlib to be applied to the artifact archive.
  // - 0: No compression
  // - 1: Best speed
  // - 6: Default compression (same as GNU Gzip)
  // - 9: Best compression
  compressionLevel: 0
})

Additional Resources