Compare commits

...
Author SHA1 Message Date
eggyhead 4efc4b9e06 formatting fixes 2024-01-31 01:58:42 +00:00
eggyhead b680ef8e68 using results URL to check ghes for artifact 2024-01-31 01:57:50 +00:00
eggyhead fe8c762d61 reverting updated ghes logic for cache 2024-01-31 01:57:26 +00:00
eggyhead 79886daf63 updating allowed hosts to include ghe.com 2024-01-30 22:22:49 +00:00
eggyhead 1a1d5e3792 allow proxima requests in isGhes check 2024-01-30 22:15:06 +00:00
eggyhead 1fe633e27c Merge pull request #1627 from actions/eggyhead/hyperlinks-faq
adding hyperlinks for new section of artifacts faq
2024-01-19 08:40:40 -08:00
eggyheadandBethany 74bca717aa Update packages/artifact/docs/faq.md
Consistent spacing in version table

Co-authored-by: Bethany <[email protected]>
2024-01-19 08:37:38 -08:00
eggyhead bb4505e078 yaml formatting 2024-01-18 17:36:26 +00:00
eggyhead dbfca0275d removing numbered list 2024-01-18 17:35:08 +00:00
eggyhead d01372220d bold text 2024-01-18 17:33:39 +00:00
eggyhead 8e13afa0db updating language and adding compatibility table 2024-01-18 17:32:19 +00:00
Rob Herley 4e3b068ce1 Merge pull request #1629 from actions/robherley/update-docs-2.1.0
v2.1.0 Generate docs + update release notes
2024-01-18 11:25:50 -05:00
eggyhead 5212cb5ed9 Merge pull request #1628 from actions/eggyhead/update-getartifact-errmessage
updating artifact not found error message
2024-01-18 08:02:52 -08:00
eggyhead cca96584eb removing newline and camelcasing GitHub 2024-01-18 15:57:21 +00:00
eggyhead 5016db01fe update message for internal method 2024-01-18 04:14:39 +00:00
eggyhead 30942cc4ae updating artifact not found error message to include more information and link to FAQ 2024-01-18 04:10:35 +00:00
eggyhead 98f72c3040 adding hyperlinks for new section of artifacts faq 2024-01-18 04:03:48 +00:00
6 changed files with 90 additions and 46 deletions
@@ -0,0 +1,22 @@
import * as config from '../src/internal/shared/config'
beforeEach(() => {
jest.resetModules()
})
describe('isGhes', () => {
it('should return false when the request domain is github.com', () => {
process.env.GITHUB_SERVER_URL = 'https://github.com'
expect(config.isGhes()).toBe(false)
})
it('should return false when the request has ACTIONS_RESULTS_URL set', () => {
process.env.ACTIONS_RESULTS_URL = 'my.results.url'
expect(config.isGhes()).toBe(false)
})
it('should return false when the request domain is specific to an enterprise', () => {
process.env.GITHUB_SERVER_URL = 'https://my-enterprise.github.com'
expect(config.isGhes()).toBe(true)
})
})
+20 -14
View File
@@ -3,6 +3,8 @@
- [Frequently Asked Questions](#frequently-asked-questions) - [Frequently Asked Questions](#frequently-asked-questions)
- [Supported Characters](#supported-characters) - [Supported Characters](#supported-characters)
- [Compression? ZIP? How is my artifact stored?](#compression-zip-how-is-my-artifact-stored) - [Compression? ZIP? How is my artifact stored?](#compression-zip-how-is-my-artifact-stored)
- [Which versions of the artifacts packages are compatible?](#which-versions-of-the-artifacts-packages-are-compatible)
- [How long will my artifact be available?](#how-long-will-my-artifact-be-available)
## Supported Characters ## Supported Characters
@@ -35,22 +37,26 @@ Higher levels will result in better compression, but will take longer to complet
For large files that are not easily compressed, a value of 0 is recommended for significantly faster uploads. For large files that are not easily compressed, a value of 0 is recommended for significantly faster uploads.
## Which versions of the artifacts packages are compatible? ## Which versions of the artifacts packages are compatible?
[actions/upload-artifact](https://github.com/actions/upload-artifact) and [actions/download-artifact](https://github.com/actions/download-artifact), are part of the [GitHub Actions toolkit](https://github.com/actions/toolkit) and are typically used together to upload and download artifacts in your workflows. [actions/upload-artifact](https://github.com/actions/upload-artifact) and [actions/download-artifact](https://github.com/actions/download-artifact), leverage [GitHub Actions toolkit](https://github.com/actions/toolkit) and are typically used together to upload and download artifacts in your workflows.
1. **Matching Versions:** | upload-artifact | download-artifact | toolkit |
- Use matching versions of `actions/upload-artifact` and `actions/download-artifact` to ensure compatibility. |---|---|---|
| v4 | v4 | v2 |
| < v3 | < v3 | < v1 |
2. **Workflow YAML File:** Use matching versions of `actions/upload-artifact` and `actions/download-artifact` to ensure compatibility.
- In your GitHub Actions workflow YAML file, you specify the version of the actions you want to use. For example:
```yaml
uses: actions/upload-artifact@v4
# ...
uses: actions/download-artifact@v4
# ...
```
3. **Release Notes:** In your GitHub Actions workflow YAML file, you specify the version of the actions you want to use. For example:
- Check the release notes for each repository to see if there are any specific notes about compatibility or changes in behavior.
```yaml
uses: actions/upload-artifact@v4
# ...
uses: actions/download-artifact@v4
# ...
```
**Release Notes:**
Check the release notes for each repository to see if there are any specific notes about compatibility or changes in behavior.
## How long will my artifact be available? ## How long will my artifact be available?
The default retention period is 90 days. For more information, visit: https://github.com/actions/upload-artifact?tab=readme-ov-file#retention-period The default retention period is **90 days**. For more information, visit: https://github.com/actions/upload-artifact?tab=readme-ov-file#retention-period
@@ -49,7 +49,9 @@ export async function getArtifactPublic(
if (getArtifactResp.data.artifacts.length === 0) { if (getArtifactResp.data.artifacts.length === 0) {
throw new ArtifactNotFoundError( throw new ArtifactNotFoundError(
`Artifact not found for name: ${artifactName}` `Artifact not found for name: ${artifactName}
Please ensure that your artifact is not expired and the artifact was uploaded using a compatible version of toolkit/upload-artifact.
For more information, visit the GitHub Artifacts FAQ: https://github.com/actions/toolkit/blob/main/packages/artifact/docs/faq.md`
) )
} }
@@ -89,7 +91,9 @@ export async function getArtifactInternal(
if (res.artifacts.length === 0) { if (res.artifacts.length === 0) {
throw new ArtifactNotFoundError( throw new ArtifactNotFoundError(
`Artifact not found for name: ${artifactName}` `Artifact not found for name: ${artifactName}
Please ensure that your artifact is not expired and the artifact was uploaded using a compatible version of toolkit/upload-artifact.
For more information, visit the GitHub Artifacts FAQ: https://github.com/actions/toolkit/blob/main/packages/artifact/docs/faq.md`
) )
} }
@@ -27,7 +27,12 @@ export function isGhes(): boolean {
const ghUrl = new URL( const ghUrl = new URL(
process.env['GITHUB_SERVER_URL'] || 'https://github.com' process.env['GITHUB_SERVER_URL'] || 'https://github.com'
) )
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'
const isGitHubHost = ghUrl.hostname.trimEnd().toUpperCase() === 'GITHUB.COM'
const isResultsServiceRequest =
process.env['ACTIONS_RESULTS_URL'] != undefined
return !isGitHubHost && !isResultsServiceRequest
} }
export function getGitHubWorkspaceDir(): string { export function getGitHubWorkspaceDir(): string {
+14
View File
@@ -2,6 +2,10 @@ import {promises as fs} from 'fs'
import * as path from 'path' import * as path from 'path'
import * as cacheUtils from '../src/internal/cacheUtils' import * as cacheUtils from '../src/internal/cacheUtils'
beforeEach(() => {
jest.resetModules()
})
test('getArchiveFileSizeInBytes returns file size', () => { test('getArchiveFileSizeInBytes returns file size', () => {
const filePath = path.join(__dirname, '__fixtures__', 'helloWorld.txt') const filePath = path.join(__dirname, '__fixtures__', 'helloWorld.txt')
@@ -38,3 +42,13 @@ test('resolvePaths works on github workspace directory', async () => {
const paths = await cacheUtils.resolvePaths([workspace]) const paths = await cacheUtils.resolvePaths([workspace])
expect(paths.length).toBeGreaterThan(0) expect(paths.length).toBeGreaterThan(0)
}) })
test('isGhes returns false for github.com', async () => {
process.env.GITHUB_SERVER_URL = 'https://github.com'
expect(cacheUtils.isGhes()).toBe(false)
})
test('isGhes returns true for enterprise URL', async () => {
process.env.GITHUB_SERVER_URL = 'https://my-enterprise.github.com'
expect(cacheUtils.isGhes()).toBe(true)
})
+22 -29
View File
@@ -7,11 +7,7 @@ import * as path from 'path'
import * as semver from 'semver' import * as semver from 'semver'
import * as util from 'util' import * as util from 'util'
import {v4 as uuidV4} from 'uuid' import {v4 as uuidV4} from 'uuid'
import { import {CacheFilename, CompressionMethod} from './constants'
CacheFilename,
CompressionMethod,
GnuTarPathOnWindows
} from './constants'
// From https://github.com/actions/toolkit/blob/main/packages/tool-cache/src/tool-cache.ts#L23 // From https://github.com/actions/toolkit/blob/main/packages/tool-cache/src/tool-cache.ts#L23
export async function createTempDirectory(): Promise<string> { export async function createTempDirectory(): Promise<string> {
@@ -56,12 +52,7 @@ export async function resolvePaths(patterns: string[]): Promise<string[]> {
.replace(new RegExp(`\\${path.sep}`, 'g'), '/') .replace(new RegExp(`\\${path.sep}`, 'g'), '/')
core.debug(`Matched: ${relativeFile}`) core.debug(`Matched: ${relativeFile}`)
// Paths are made relative so the tar entries are all relative to the root of the workspace. // Paths are made relative so the tar entries are all relative to the root of the workspace.
if (relativeFile === '') { paths.push(`${relativeFile}`)
// path.relative returns empty string if workspace and file are equal
paths.push('.')
} else {
paths.push(`${relativeFile}`)
}
} }
return paths return paths
@@ -71,15 +62,11 @@ export async function unlinkFile(filePath: fs.PathLike): Promise<void> {
return util.promisify(fs.unlink)(filePath) return util.promisify(fs.unlink)(filePath)
} }
async function getVersion( async function getVersion(app: string): Promise<string> {
app: string, core.debug(`Checking ${app} --version`)
additionalArgs: string[] = []
): Promise<string> {
let versionOutput = '' let versionOutput = ''
additionalArgs.push('--version')
core.debug(`Checking ${app} ${additionalArgs.join(' ')}`)
try { try {
await exec.exec(`${app}`, additionalArgs, { await exec.exec(`${app} --version`, [], {
ignoreReturnCode: true, ignoreReturnCode: true,
silent: true, silent: true,
listeners: { listeners: {
@@ -98,14 +85,23 @@ async function getVersion(
// Use zstandard if possible to maximize cache performance // Use zstandard if possible to maximize cache performance
export async function getCompressionMethod(): Promise<CompressionMethod> { export async function getCompressionMethod(): Promise<CompressionMethod> {
const versionOutput = await getVersion('zstd', ['--quiet']) if (process.platform === 'win32' && !(await isGnuTarInstalled())) {
const version = semver.clean(versionOutput) // Disable zstd due to bug https://github.com/actions/cache/issues/301
core.debug(`zstd version: ${version}`)
if (versionOutput === '') {
return CompressionMethod.Gzip return CompressionMethod.Gzip
} else { }
const versionOutput = await getVersion('zstd')
const version = semver.clean(versionOutput)
if (!versionOutput.toLowerCase().includes('zstd command line interface')) {
// zstd is not installed
return CompressionMethod.Gzip
} else if (!version || semver.lt(version, 'v1.3.2')) {
// zstd is installed but using a version earlier than v1.3.2
// v1.3.2 is required to use the `--long` options in zstd
return CompressionMethod.ZstdWithoutLong return CompressionMethod.ZstdWithoutLong
} else {
return CompressionMethod.Zstd
} }
} }
@@ -115,12 +111,9 @@ export function getCacheFileName(compressionMethod: CompressionMethod): string {
: CacheFilename.Zstd : CacheFilename.Zstd
} }
export async function getGnuTarPathOnWindows(): Promise<string> { export async function isGnuTarInstalled(): Promise<boolean> {
if (fs.existsSync(GnuTarPathOnWindows)) {
return GnuTarPathOnWindows
}
const versionOutput = await getVersion('tar') const versionOutput = await getVersion('tar')
return versionOutput.toLowerCase().includes('gnu tar') ? io.which('tar') : '' return versionOutput.toLowerCase().includes('gnu tar')
} }
export function assertDefined<T>(name: string, value?: T): T { export function assertDefined<T>(name: string, value?: T): T {