Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9140050fd5 | ||
|
|
896d1bb258 | ||
|
|
57685c7c71 | ||
|
|
8c323b340c | ||
|
|
727cfbe442 | ||
|
|
24b1443a07 | ||
|
|
e9ef242655 | ||
|
|
adf9559c4f | ||
|
|
9bc31d5ccc | ||
|
|
d2278a10ef | ||
|
|
c1a6d8f06a | ||
|
|
9782bd6a98 | ||
|
|
076f0f7dd0 | ||
|
|
7151be3221 | ||
|
|
51cbdc41c1 | ||
|
|
e89a529079 |
@@ -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"
|
||||||
|
}
|
||||||
@@ -22,12 +22,13 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Set Node.js 12.x
|
- name: Setup Node 16
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 12.x
|
node-version: 16.x
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
@@ -45,7 +46,7 @@ jobs:
|
|||||||
id: diff
|
id: diff
|
||||||
|
|
||||||
# If index.js was different than expected, upload the expected version as an artifact
|
# 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' }}
|
if: ${{ failure() && steps.diff.conclusion == 'failure' }}
|
||||||
with:
|
with:
|
||||||
name: dist
|
name: dist
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- 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
|
# Override language selection by uncommenting this and choosing your languages
|
||||||
# with:
|
# with:
|
||||||
# languages: go, javascript, csharp, python, cpp, java
|
# languages: go, javascript, csharp, python, cpp, java
|
||||||
@@ -32,7 +32,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# 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)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v1
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
@@ -46,4 +46,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v1
|
uses: github/codeql-action/analyze@v2
|
||||||
@@ -13,7 +13,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Check licenses
|
name: Check licenses
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- name: Install licensed
|
- name: Install licensed
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Update the ${{ env.TAG_NAME }} tag
|
- name: Update the ${{ env.TAG_NAME }} tag
|
||||||
uses: actions/publish-action@v0.1.0
|
uses: actions/publish-action@v0.2.1
|
||||||
with:
|
with:
|
||||||
source-tag: ${{ env.TAG_NAME }}
|
source-tag: ${{ env.TAG_NAME }}
|
||||||
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
|
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
|
||||||
@@ -21,12 +21,14 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Set Node.js 12.x
|
# using node 16 since that is what the latest version of the runner ships with
|
||||||
uses: actions/setup-node@v1
|
- name: Setup Node 16
|
||||||
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 12.x
|
node-version: 16.x
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
- name: npm install
|
- name: npm install
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|||||||
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
Generated
BIN
Binary file not shown.
@@ -21,7 +21,7 @@ See [action.yml](action.yml)
|
|||||||
Basic (download to the current working directory):
|
Basic (download to the current working directory):
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
@@ -34,7 +34,7 @@ steps:
|
|||||||
Download to a specific directory:
|
Download to a specific directory:
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
with:
|
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
|
Download all artifacts to a specific directory
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
@@ -107,7 +107,7 @@ steps:
|
|||||||
Download all artifacts to the current working directory
|
Download all artifacts to the current working directory
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ The `download-path` step output contains information regarding where the artifac
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v3
|
||||||
id: download
|
id: download
|
||||||
|
|||||||
+16
@@ -8,6 +8,22 @@ inputs:
|
|||||||
path:
|
path:
|
||||||
description: 'Destination path'
|
description: 'Destination path'
|
||||||
required: false
|
required: false
|
||||||
|
github-token:
|
||||||
|
description: The GitHub token used to download the artifact
|
||||||
|
default: ${{ github.token }}
|
||||||
|
required: false
|
||||||
|
repository:
|
||||||
|
description: 'The repository owner and the repository name joined together by "/".
|
||||||
|
This specifies the repository that artifacts will be downloaded from. If downloading artifacts from external workflow runs or repositories then the above download-token must be permissions to this repository.'
|
||||||
|
required: false
|
||||||
|
default: ${{ github.repository }}
|
||||||
|
run-id:
|
||||||
|
description: 'The id of the workflow run where the desired download artifact was uploaded from. If downloading artifacts from anything other than the current workflow run then this needs to be overwritten.'
|
||||||
|
required: false
|
||||||
|
default: ${{ github.run_id }}
|
||||||
|
outputs:
|
||||||
|
download-path:
|
||||||
|
description: 'Path of artifact download'
|
||||||
runs:
|
runs:
|
||||||
using: 'node16'
|
using: 'node16'
|
||||||
main: 'dist/index.js'
|
main: 'dist/index.js'
|
||||||
Vendored
+117595
-6540
File diff suppressed because one or more lines are too long
Generated
+865
-631
File diff suppressed because it is too large
Load Diff
+5
-4
@@ -28,13 +28,14 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/actions/download-artifact#readme",
|
"homepage": "https://github.com/actions/download-artifact#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/artifact": "^1.0.0",
|
"@actions/artifact": "^2.0.0",
|
||||||
"@actions/core": "^1.2.6"
|
"@actions/core": "^1.10.0",
|
||||||
|
"@actions/github": "^5.1.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^12.12.6",
|
"@types/node": "^12.12.6",
|
||||||
"@typescript-eslint/parser": "^2.30.0",
|
"@typescript-eslint/eslint-plugin": "^5.40.1",
|
||||||
"@zeit/ncc": "^0.22.1",
|
"@vercel/ncc": "^0.33.4",
|
||||||
"concurrently": "^5.2.0",
|
"concurrently": "^5.2.0",
|
||||||
"eslint": "^7.4.0",
|
"eslint": "^7.4.0",
|
||||||
"eslint-plugin-github": "^4.1.1",
|
"eslint-plugin-github": "^4.1.1",
|
||||||
|
|||||||
+5
-1
@@ -1,7 +1,11 @@
|
|||||||
export enum Inputs {
|
export enum Inputs {
|
||||||
Name = 'name',
|
Name = 'name',
|
||||||
Path = 'path'
|
Path = 'path',
|
||||||
|
GitHubToken = 'github-token',
|
||||||
|
Repository = 'repository',
|
||||||
|
RunID = 'run-id'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum Outputs {
|
export enum Outputs {
|
||||||
DownloadPath = 'download-path'
|
DownloadPath = 'download-path'
|
||||||
}
|
}
|
||||||
+82
-43
@@ -1,61 +1,100 @@
|
|||||||
|
import * as os from 'os'
|
||||||
|
import * as path from 'path'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as artifact from '@actions/artifact'
|
import * as artifact from '@actions/artifact'
|
||||||
import * as os from 'os'
|
|
||||||
import {resolve} from 'path'
|
|
||||||
import {Inputs, Outputs} from './constants'
|
import {Inputs, Outputs} from './constants'
|
||||||
|
|
||||||
async function run(): Promise<void> {
|
const PARALLEL_DOWNLOADS = 5
|
||||||
try {
|
|
||||||
const name = core.getInput(Inputs.Name, {required: false})
|
|
||||||
const path = core.getInput(Inputs.Path, {required: false})
|
|
||||||
|
|
||||||
let resolvedPath
|
export const chunk = <T>(arr: T[], n: number): T[][] =>
|
||||||
// resolve tilde expansions, path.replace only replaces the first occurrence of a pattern
|
arr.reduce((acc, cur, i) => {
|
||||||
if (path.startsWith(`~`)) {
|
const index = Math.floor(i / n)
|
||||||
resolvedPath = resolve(path.replace('~', os.homedir()))
|
acc[index] = [...(acc[index] || []), cur]
|
||||||
} else {
|
return acc
|
||||||
resolvedPath = resolve(path)
|
}, [] as T[][])
|
||||||
|
|
||||||
|
async function run(): Promise<void> {
|
||||||
|
const inputs = {
|
||||||
|
name: core.getInput(Inputs.Name, {required: false}),
|
||||||
|
path: core.getInput(Inputs.Path, {required: false}),
|
||||||
|
token: core.getInput(Inputs.GitHubToken, {required: true}),
|
||||||
|
repository: core.getInput(Inputs.Repository, {required: true}),
|
||||||
|
runID: parseInt(core.getInput(Inputs.RunID, {required: true}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!inputs.path) {
|
||||||
|
inputs.path = process.env['GITHUB_WORKSPACE'] || process.cwd()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inputs.path.startsWith(`~`)) {
|
||||||
|
inputs.path = inputs.path.replace('~', os.homedir())
|
||||||
|
}
|
||||||
|
|
||||||
|
const resolvedPath = path.resolve(inputs.path)
|
||||||
core.debug(`Resolved path is ${resolvedPath}`)
|
core.debug(`Resolved path is ${resolvedPath}`)
|
||||||
|
|
||||||
|
const [owner, repo] = inputs.repository.split('/')
|
||||||
|
if (!owner || !repo) {
|
||||||
|
throw new Error(
|
||||||
|
`Invalid repository: '${inputs.repository}'. Must be in format owner/repo`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const artifactClient = artifact.create()
|
const artifactClient = artifact.create()
|
||||||
if (!name) {
|
let artifacts: artifact.Artifact[] = []
|
||||||
// download all artifacts
|
|
||||||
core.info('No artifact name specified, downloading all artifacts')
|
if (inputs.name) {
|
||||||
core.info(
|
const {artifact: targetArtifact} = await artifactClient.getArtifact(
|
||||||
'Creating an extra directory for each artifact that is being downloaded'
|
inputs.name,
|
||||||
)
|
inputs.runID,
|
||||||
const downloadResponse = await artifactClient.downloadAllArtifacts(
|
owner,
|
||||||
resolvedPath
|
repo,
|
||||||
)
|
inputs.token
|
||||||
core.info(`There were ${downloadResponse.length} artifacts downloaded`)
|
|
||||||
for (const artifact of downloadResponse) {
|
|
||||||
core.info(
|
|
||||||
`Artifact ${artifact.artifactName} was downloaded to ${artifact.downloadPath}`
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
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 {
|
} else {
|
||||||
// download a single artifact
|
const listArtifactResponse = await artifactClient.listArtifacts(
|
||||||
core.info(`Starting download for ${name}`)
|
inputs.runID,
|
||||||
const downloadOptions = {
|
owner,
|
||||||
createArtifactFolder: false
|
repo,
|
||||||
}
|
inputs.token
|
||||||
const downloadResponse = await artifactClient.downloadArtifact(
|
|
||||||
name,
|
|
||||||
resolvedPath,
|
|
||||||
downloadOptions
|
|
||||||
)
|
)
|
||||||
core.info(
|
|
||||||
`Artifact ${downloadResponse.artifactName} was downloaded to ${downloadResponse.downloadPath}`
|
if (listArtifactResponse.artifacts.length === 0) {
|
||||||
|
throw new Error(
|
||||||
|
`No artifacts found for run '${inputs.runID}' in '${inputs.repository}'`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
// 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.debug(`Found ${listArtifactResponse.artifacts.length} artifacts`)
|
||||||
|
artifacts = listArtifactResponse.artifacts
|
||||||
|
}
|
||||||
|
|
||||||
|
const downloadPromises = artifacts.map(artifact =>
|
||||||
|
artifactClient.downloadArtifact(artifact.id, owner, repo, inputs.token, {
|
||||||
|
path: 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.setOutput(Outputs.DownloadPath, resolvedPath)
|
||||||
core.info('Artifact download has finished successfully')
|
core.info('Download artifact has finished successfully')
|
||||||
} catch (err) {
|
|
||||||
core.setFailed(err.message)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
run()
|
run().catch(err =>
|
||||||
|
core.setFailed(`Unable to download artifact(s): ${err.message}`)
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user