mirror of
https://github.com/gradle/actions.git
synced 2025-11-26 17:09:10 +08:00
Compare commits
50 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
473878a77f | ||
|
|
f22ac61fd1 | ||
|
|
4ec844e551 | ||
|
|
24ca383271 | ||
|
|
4ca2d5d749 | ||
|
|
f31476bde2 | ||
|
|
c345cfbe93 | ||
|
|
b526f6673b | ||
|
|
93415e6645 | ||
|
|
6bc218d5d0 | ||
|
|
9d68e8b435 | ||
|
|
707359876a | ||
|
|
4103f31d4d | ||
|
|
15020cf347 | ||
|
|
ed43923279 | ||
|
|
6dafcf2d22 | ||
|
|
2ca30c9a83 | ||
|
|
bb0c460cbf | ||
|
|
0674891af5 | ||
|
|
1b7e89588d | ||
|
|
b0cc090202 | ||
|
|
872d6b954c | ||
|
|
61e4a25782 | ||
|
|
f4e0ea0cdd | ||
|
|
9f70748719 | ||
|
|
ff4a71656f | ||
|
|
b5e8e5f396 | ||
|
|
7605d180a5 | ||
|
|
d32c4bdc08 | ||
|
|
0d30c9111c | ||
|
|
cf8c435260 | ||
|
|
b4c01c399c | ||
|
|
340f8b64e0 | ||
|
|
36455cb5f4 | ||
|
|
e5c1381176 | ||
|
|
d156388eb1 | ||
|
|
2e93f415f7 | ||
|
|
ee8dc905e6 | ||
|
|
5fe9264c08 | ||
|
|
29d4d80ef6 | ||
|
|
478782dbb4 | ||
|
|
e6215edc51 | ||
|
|
765a73447c | ||
|
|
a122cf5aa7 | ||
|
|
5baa1ded34 | ||
|
|
7e0f050645 | ||
|
|
9291ac6ca5 | ||
|
|
6da85a08fb | ||
|
|
c3c8a18b22 | ||
|
|
9498413fd8 |
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id "com.gradle.develocity" version "3.18"
|
||||
id "com.gradle.develocity" version "3.18.1"
|
||||
id "com.gradle.common-custom-user-data-gradle-plugin" version "2.0.1"
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -8,9 +8,9 @@ repositories {
|
||||
|
||||
dependencies {
|
||||
api("org.apache.commons:commons-math3:3.6.1")
|
||||
implementation("com.google.guava:guava:33.3.0-jre")
|
||||
implementation("com.google.guava:guava:33.3.1-jre")
|
||||
|
||||
testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
|
||||
testImplementation("org.junit.jupiter:junit-jupiter:5.11.3")
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id("com.gradle.develocity") version "3.18"
|
||||
id("com.gradle.develocity") version "3.18.1"
|
||||
id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.1"
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id "com.gradle.develocity" version "3.18"
|
||||
id "com.gradle.develocity" version "3.18.1"
|
||||
}
|
||||
|
||||
develocity {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id "com.gradle.develocity" version "3.18"
|
||||
id "com.gradle.develocity" version "3.18.1"
|
||||
}
|
||||
|
||||
develocity {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id "com.gradle.develocity" version "3.18"
|
||||
id "com.gradle.develocity" version "3.18.1"
|
||||
}
|
||||
|
||||
develocity {
|
||||
|
||||
6
.github/workflows/ci-check-and-unit-test.yml
vendored
6
.github/workflows/ci-check-and-unit-test.yml
vendored
@@ -23,6 +23,12 @@ jobs:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: sources/package-lock.json
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v4 # Use a released version to avoid breakages
|
||||
env:
|
||||
ALLOWED_GRADLE_WRAPPER_CHECKSUMS: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 # Invalid wrapper jar used for testing
|
||||
with:
|
||||
gradle-version: "8.11"
|
||||
|
||||
- name: Check formatting and compile
|
||||
run: |
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v44
|
||||
uses: tj-actions/changed-files@v45
|
||||
with:
|
||||
files: |
|
||||
dist/**
|
||||
|
||||
17
.github/workflows/demo-job-summary.yml
vendored
17
.github/workflows/demo-job-summary.yml
vendored
@@ -94,3 +94,20 @@ jobs:
|
||||
- name: Run build
|
||||
working-directory: .github/workflow-samples/groovy-dsl
|
||||
run: ./gradlew assemble
|
||||
|
||||
cache-read-only:
|
||||
needs: build-distribution
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
- name: Initialize integ-test
|
||||
uses: ./.github/actions/init-integ-test
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: ./setup-gradle
|
||||
with:
|
||||
cache-read-only: true
|
||||
- name: Build kotlin-dsl project
|
||||
working-directory: .github/workflow-samples/kotlin-dsl
|
||||
run: ./gradlew assemble
|
||||
|
||||
@@ -33,11 +33,11 @@ jobs:
|
||||
matrix:
|
||||
gradle: [current, 7.6.2, 6.9.4, 5.6.4]
|
||||
os: ${{fromJSON(inputs.runner-os)}}
|
||||
plugin-version: [3.16.2, 3.18]
|
||||
plugin-version: [3.16.2, 3.18.1]
|
||||
include:
|
||||
- plugin-version: 3.16.2
|
||||
accessKeyEnv: GRADLE_ENTERPRISE_ACCESS_KEY
|
||||
- plugin-version: 3.18
|
||||
- plugin-version: 3.18.1
|
||||
accessKeyEnv: DEVELOCITY_ACCESS_KEY
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
@@ -84,7 +84,7 @@ jobs:
|
||||
matrix:
|
||||
gradle: [current, 7.6.2, 6.9.4, 5.6.4]
|
||||
os: ${{fromJSON(inputs.runner-os)}}
|
||||
plugin-version: [3.16.2, 3.18]
|
||||
plugin-version: [3.16.2, 3.18.1]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
@@ -133,7 +133,7 @@ jobs:
|
||||
matrix:
|
||||
gradle: [ current, 7.6.2, 6.9.4, 5.6.4 ]
|
||||
os: ${{fromJSON(inputs.runner-os)}}
|
||||
plugin-version: [ 3.16.2, 3.18 ]
|
||||
plugin-version: [ 3.16.2, 3.18.1 ]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
@@ -169,7 +169,7 @@ jobs:
|
||||
matrix:
|
||||
gradle: [ current, 7.6.2, 6.9.4, 5.6.4 ]
|
||||
os: ${{fromJSON(inputs.runner-os)}}
|
||||
plugin-version: [ 3.16.2, 3.18 ]
|
||||
plugin-version: [ 3.16.2, 3.18.1 ]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
|
||||
2
.github/workflows/update-checksums-file.yml
vendored
2
.github/workflows/update-checksums-file.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
||||
|
||||
# If there are no changes, this action will not create a pull request
|
||||
- name: Create or update pull request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
branch: bot/wrapper-checksums-update
|
||||
commit-message: Update known wrapper checksums
|
||||
|
||||
8606
dist/dependency-submission/main/index.js
vendored
8606
dist/dependency-submission/main/index.js
vendored
File diff suppressed because one or more lines are too long
2
dist/dependency-submission/main/index.js.map
vendored
2
dist/dependency-submission/main/index.js.map
vendored
File diff suppressed because one or more lines are too long
6345
dist/dependency-submission/post/index.js
vendored
6345
dist/dependency-submission/post/index.js
vendored
File diff suppressed because one or more lines are too long
2
dist/dependency-submission/post/index.js.map
vendored
2
dist/dependency-submission/post/index.js.map
vendored
File diff suppressed because one or more lines are too long
8644
dist/setup-gradle/main/index.js
vendored
8644
dist/setup-gradle/main/index.js
vendored
File diff suppressed because one or more lines are too long
2
dist/setup-gradle/main/index.js.map
vendored
2
dist/setup-gradle/main/index.js.map
vendored
File diff suppressed because one or more lines are too long
8642
dist/setup-gradle/post/index.js
vendored
8642
dist/setup-gradle/post/index.js
vendored
File diff suppressed because one or more lines are too long
2
dist/setup-gradle/post/index.js.map
vendored
2
dist/setup-gradle/post/index.js.map
vendored
File diff suppressed because one or more lines are too long
5518
dist/wrapper-validation/main/index.js
vendored
5518
dist/wrapper-validation/main/index.js
vendored
File diff suppressed because one or more lines are too long
2
dist/wrapper-validation/main/index.js.map
vendored
2
dist/wrapper-validation/main/index.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -502,7 +502,7 @@ jobs:
|
||||
if: always()
|
||||
with:
|
||||
name: build-reports
|
||||
path: build/reports/
|
||||
path: **/build/reports/
|
||||
```
|
||||
|
||||
### Use of custom init-scripts in Gradle User Home
|
||||
@@ -753,7 +753,8 @@ To publish to https://scans.gradle.com, you must specify in your workflow that y
|
||||
## Managing Develocity access keys
|
||||
|
||||
Develocity access keys are long-lived, creating risks if they are leaked. To mitigate this risk this,
|
||||
the `setup-gradle` action can automatically attempt to obtain a short-lived access token to authenticate with Develocity.
|
||||
the `setup-gradle` action can automatically attempt to obtain a [short-lived access token](https://docs.gradle.com/develocity/gradle-plugin/current/#short_lived_access_tokens)
|
||||
to use when authenticating with Develocity.
|
||||
The short-lived access token will then be used wherever a Develocity access key is required.
|
||||
|
||||
```yaml
|
||||
@@ -767,6 +768,21 @@ The short-lived access token will then be used wherever a Develocity access key
|
||||
run: ./gradlew build
|
||||
```
|
||||
|
||||
### Increasing the expiry time for Develocity access tokens
|
||||
|
||||
By default, a short-lived Develocity access token will be valid for 2 hours from the time it is generated. If your workflows take longer than
|
||||
2 hours to complete, you may see failure to publish Build Scans due to access token expiry.
|
||||
|
||||
To avoid this, use the `develocity-token-expiry` parameter to specify a different token expiry in hours.
|
||||
|
||||
```yaml
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v4
|
||||
with:
|
||||
develocity-access-key: ${{ secrets.MY_DEVELOCITY_ACCESS_KEY }}
|
||||
develocity-token-expiry: 8 # The number of hours that the access token should remain valid (max 24).
|
||||
```
|
||||
|
||||
### Develocity access key supplied as environment variable
|
||||
|
||||
The preferred mechanism is to supply the long-lived Develocity access key directly to `setup-gradle` via
|
||||
@@ -825,7 +841,7 @@ Here's a minimal example:
|
||||
run: ./gradlew build
|
||||
```
|
||||
|
||||
This configuration will automatically apply `v3.18` of the [Develocity Gradle plugin](https://docs.gradle.com/develocity/gradle-plugin/), and publish build scans to https://develocity.your-server.com.
|
||||
This configuration will automatically apply `v3.18.1` of the [Develocity Gradle plugin](https://docs.gradle.com/develocity/gradle-plugin/), and publish build scans to https://develocity.your-server.com.
|
||||
|
||||
This example assumes that the `develocity.your-server.com` server allows anonymous publishing of build scans.
|
||||
In the likely scenario that your Develocity server requires authentication, you will also need to pass a valid [Develocity access key](https://docs.gradle.com/develocity/gradle-plugin/#via_environment_variable) taken from a secret:
|
||||
@@ -891,7 +907,7 @@ Here's an example using the env vars:
|
||||
DEVELOCITY_INJECTION_ENABLED: true
|
||||
DEVELOCITY_URL: https://develocity.your-server.com
|
||||
DEVELOCITY_ENFORCE_URL: true
|
||||
DEVELOCITY_PLUGIN_VERSION: "3.18"
|
||||
DEVELOCITY_PLUGIN_VERSION: "3.18.1"
|
||||
DEVELOCITY_CCUD_PLUGIN_VERSION: "2.0.2"
|
||||
```
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# Configuration file for asdf version manager
|
||||
nodejs 20.10.0
|
||||
gradle 8.10
|
||||
gradle 8.11
|
||||
|
||||
727
sources/package-lock.json
generated
727
sources/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -32,40 +32,40 @@
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/artifact": "2.1.9",
|
||||
"@actions/cache": "3.2.4",
|
||||
"@actions/core": "1.10.1",
|
||||
"@actions/artifact": "2.1.11",
|
||||
"@actions/cache": "3.3.0",
|
||||
"@actions/core": "1.11.1",
|
||||
"@actions/exec": "1.1.1",
|
||||
"@actions/github": "6.0.0",
|
||||
"@actions/glob": "0.5.0",
|
||||
"@actions/http-client": "2.2.2",
|
||||
"@actions/http-client": "2.2.3",
|
||||
"@actions/tool-cache": "2.0.1",
|
||||
"@octokit/rest": "21.0.2",
|
||||
"@octokit/webhooks-types": "7.5.1",
|
||||
"@octokit/webhooks-types": "7.6.1",
|
||||
"cheerio": "^1.0.0",
|
||||
"semver": "7.6.3",
|
||||
"string-argv": "0.3.2",
|
||||
"typed-rest-client": "2.0.2",
|
||||
"typed-rest-client": "2.1.0",
|
||||
"unhomoglyph": "1.0.6",
|
||||
"which": "4.0.0"
|
||||
"which": "5.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "29.5.12",
|
||||
"@types/node": "20.16.1",
|
||||
"@types/jest": "29.5.14",
|
||||
"@types/node": "20.17.6",
|
||||
"@types/unzipper": "0.10.10",
|
||||
"@types/which": "3.0.4",
|
||||
"@typescript-eslint/parser": "7.18.0",
|
||||
"@vercel/ncc": "0.38.1",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-plugin-github": "5.0.1",
|
||||
"eslint-plugin-jest": "28.8.0",
|
||||
"@vercel/ncc": "0.38.2",
|
||||
"eslint": "8.57.1",
|
||||
"eslint-plugin-github": "5.0.2",
|
||||
"eslint-plugin-jest": "28.9.0",
|
||||
"jest": "29.7.0",
|
||||
"js-yaml": "4.1.0",
|
||||
"nock": "13.5.4",
|
||||
"nock": "13.5.6",
|
||||
"npm-run-all": "4.1.5",
|
||||
"patch-package": "8.0.0",
|
||||
"prettier": "3.3.3",
|
||||
"ts-jest": "29.2.4",
|
||||
"typescript": "5.5.4"
|
||||
"ts-jest": "29.2.5",
|
||||
"typescript": "5.6.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,22 +44,24 @@ export class CacheCleaner {
|
||||
settings.caches {
|
||||
cleanup = Cleanup.ALWAYS
|
||||
|
||||
releasedWrappers.removeUnusedEntriesOlderThan.set(cleanupTime)
|
||||
snapshotWrappers.removeUnusedEntriesOlderThan.set(cleanupTime)
|
||||
downloadedResources.removeUnusedEntriesOlderThan.set(cleanupTime)
|
||||
createdResources.removeUnusedEntriesOlderThan.set(cleanupTime)
|
||||
buildCache.removeUnusedEntriesOlderThan.set(cleanupTime)
|
||||
releasedWrappers.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||
snapshotWrappers.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||
downloadedResources.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||
createdResources.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||
buildCache.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||
}
|
||||
}
|
||||
`
|
||||
)
|
||||
fs.writeFileSync(path.resolve(cleanupProjectDir, 'build.gradle'), 'task("noop") {}')
|
||||
|
||||
const executable = await provisioner.provisionGradle('current')
|
||||
// Gradle >= 8.11 required for cache cleanup
|
||||
// TODO: This is ineffective: we should be using the newest version of Gradle that ran a build, or a newer version if it's available on PATH.
|
||||
const executable = await provisioner.provisionGradleAtLeast('8.11')
|
||||
|
||||
await core.group('Executing Gradle to clean up caches', async () => {
|
||||
core.info(`Cleaning up caches last used before ${cleanTimestamp}`)
|
||||
await this.executeCleanupBuild(executable!, cleanupProjectDir)
|
||||
await this.executeCleanupBuild(executable, cleanupProjectDir)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -77,11 +79,8 @@ export class CacheCleaner {
|
||||
'noop'
|
||||
]
|
||||
|
||||
const result = await exec.getExecOutput(executable, args, {
|
||||
cwd: cleanupProjectDir,
|
||||
silent: true
|
||||
await exec.exec(executable, args, {
|
||||
cwd: cleanupProjectDir
|
||||
})
|
||||
|
||||
core.info(result.stdout)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,10 +110,12 @@ export class CacheEntryListener {
|
||||
requestedRestoreKeys: string[] | undefined
|
||||
restoredKey: string | undefined
|
||||
restoredSize: number | undefined
|
||||
restoredTime: number | undefined
|
||||
notRestored: string | undefined
|
||||
|
||||
savedKey: string | undefined
|
||||
savedSize: number | undefined
|
||||
savedTime: number | undefined
|
||||
notSaved: string | undefined
|
||||
|
||||
constructor(entryName: string) {
|
||||
@@ -130,9 +132,10 @@ export class CacheEntryListener {
|
||||
return this
|
||||
}
|
||||
|
||||
markRestored(key: string, size: number | undefined): CacheEntryListener {
|
||||
markRestored(key: string, size: number | undefined, time: number): CacheEntryListener {
|
||||
this.restoredKey = key
|
||||
this.restoredSize = size
|
||||
this.restoredTime = time
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -141,9 +144,10 @@ export class CacheEntryListener {
|
||||
return this
|
||||
}
|
||||
|
||||
markSaved(key: string, size: number | undefined): CacheEntryListener {
|
||||
markSaved(key: string, size: number | undefined, time: number): CacheEntryListener {
|
||||
this.savedKey = key
|
||||
this.savedSize = size
|
||||
this.savedTime = time
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -182,14 +186,16 @@ ${renderEntryTable(entries)}
|
||||
function renderEntryTable(entries: CacheEntryListener[]): string {
|
||||
return `
|
||||
<table>
|
||||
<tr><td></td><th>Count</th><th>Total Size (Mb)</th></tr>
|
||||
<tr><td></td><th>Count</th><th>Total Size (Mb)</th><th>Total Time (ms)</tr>
|
||||
<tr><td>Entries Restored</td>
|
||||
<td>${getCount(entries, e => e.restoredSize)}</td>
|
||||
<td>${getSize(entries, e => e.restoredSize)}</td>
|
||||
<td>${getTime(entries, e => e.restoredTime)}</td>
|
||||
</tr>
|
||||
<tr><td>Entries Saved</td>
|
||||
<td>${getCount(entries, e => e.savedSize)}</td>
|
||||
<td>${getSize(entries, e => e.savedSize)}</td>
|
||||
<td>${getTime(entries, e => e.savedTime)}</td>
|
||||
</tr>
|
||||
</table>
|
||||
`
|
||||
@@ -202,9 +208,11 @@ function renderEntryDetails(listener: CacheListener): string {
|
||||
Requested Key : ${entry.requestedKey ?? ''}
|
||||
Restored Key : ${entry.restoredKey ?? ''}
|
||||
Size: ${formatSize(entry.restoredSize)}
|
||||
Time: ${formatTime(entry.restoredTime)}
|
||||
${getRestoredMessage(entry, listener.cacheWriteOnly)}
|
||||
Saved Key : ${entry.savedKey ?? ''}
|
||||
Size: ${formatSize(entry.savedSize)}
|
||||
Time: ${formatTime(entry.savedTime)}
|
||||
${getSavedMessage(entry, listener.cacheReadOnly)}
|
||||
`
|
||||
)
|
||||
@@ -264,9 +272,23 @@ function getSize(
|
||||
return Math.round(bytes / (1024 * 1024))
|
||||
}
|
||||
|
||||
function getTime(
|
||||
cacheEntries: CacheEntryListener[],
|
||||
predicate: (value: CacheEntryListener) => number | undefined
|
||||
): number {
|
||||
return cacheEntries.map(e => predicate(e) ?? 0).reduce((p, v) => p + v, 0)
|
||||
}
|
||||
|
||||
function formatSize(bytes: number | undefined): string {
|
||||
if (bytes === undefined || bytes === 0) {
|
||||
return ''
|
||||
}
|
||||
return `${Math.round(bytes / (1024 * 1024))} MB (${bytes} B)`
|
||||
}
|
||||
|
||||
function formatTime(ms: number | undefined): string {
|
||||
if (ms === undefined || ms === 0) {
|
||||
return ''
|
||||
}
|
||||
return `${ms} ms`
|
||||
}
|
||||
|
||||
@@ -38,13 +38,16 @@ export async function restoreCache(
|
||||
): Promise<cache.CacheEntry | undefined> {
|
||||
listener.markRequested(cacheKey, cacheRestoreKeys)
|
||||
try {
|
||||
const startTime = Date.now()
|
||||
// Only override the read timeout if the SEGMENT_DOWNLOAD_TIMEOUT_MINS env var has NOT been set
|
||||
const cacheRestoreOptions = process.env[SEGMENT_DOWNLOAD_TIMEOUT_VAR]
|
||||
? {}
|
||||
: {segmentTimeoutInMs: SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT}
|
||||
const restoredEntry = await cache.restoreCache(cachePath, cacheKey, cacheRestoreKeys, cacheRestoreOptions)
|
||||
if (restoredEntry !== undefined) {
|
||||
listener.markRestored(restoredEntry.key, restoredEntry.size)
|
||||
const restoreTime = Date.now() - startTime
|
||||
listener.markRestored(restoredEntry.key, restoredEntry.size, restoreTime)
|
||||
core.info(`Restored cache entry with key ${cacheKey} to ${cachePath.join()} in ${restoreTime}ms`)
|
||||
}
|
||||
return restoredEntry
|
||||
} catch (error) {
|
||||
@@ -56,8 +59,11 @@ export async function restoreCache(
|
||||
|
||||
export async function saveCache(cachePath: string[], cacheKey: string, listener: CacheEntryListener): Promise<void> {
|
||||
try {
|
||||
const startTime = Date.now()
|
||||
const savedEntry = await cache.saveCache(cachePath, cacheKey)
|
||||
listener.markSaved(savedEntry.key, savedEntry.size)
|
||||
const saveTime = Date.now() - startTime
|
||||
listener.markSaved(savedEntry.key, savedEntry.size, saveTime)
|
||||
core.info(`Saved cache entry with key ${cacheKey} from ${cachePath.join()} in ${saveTime}ms`)
|
||||
} catch (error) {
|
||||
if (error instanceof cache.ReserveCacheError) {
|
||||
listener.markAlreadyExists(cacheKey)
|
||||
|
||||
@@ -2,7 +2,6 @@ import path from 'path'
|
||||
import fs from 'fs'
|
||||
import * as core from '@actions/core'
|
||||
import * as glob from '@actions/glob'
|
||||
import * as semver from 'semver'
|
||||
|
||||
import {CacheEntryListener, CacheListener} from './cache-reporting'
|
||||
import {cacheDebug, hashFileNames, isCacheDebuggingEnabled, restoreCache, saveCache, tryDelete} from './cache-utils'
|
||||
@@ -10,6 +9,7 @@ import {cacheDebug, hashFileNames, isCacheDebuggingEnabled, restoreCache, saveCa
|
||||
import {BuildResult, loadBuildResults} from '../build-results'
|
||||
import {CacheConfig, ACTION_METADATA_DIR} from '../configuration'
|
||||
import {getCacheKeyBase} from './cache-key'
|
||||
import {versionIsAtLeast} from '../execution/gradle'
|
||||
|
||||
const SKIP_RESTORE_VAR = 'GRADLE_BUILD_ACTION_SKIP_RESTORE'
|
||||
const CACHE_PROTOCOL_VERSION = 'v1'
|
||||
@@ -132,9 +132,8 @@ abstract class AbstractEntryExtractor {
|
||||
pattern: string,
|
||||
listener: CacheEntryListener
|
||||
): Promise<ExtractedCacheEntry> {
|
||||
const restoredEntry = await restoreCache([pattern], cacheKey, [], listener)
|
||||
const restoredEntry = await restoreCache(pattern.split('\n'), cacheKey, [], listener)
|
||||
if (restoredEntry) {
|
||||
core.info(`Restored ${artifactType} with key ${cacheKey} to ${pattern}`)
|
||||
return new ExtractedCacheEntry(artifactType, pattern, cacheKey)
|
||||
} else {
|
||||
core.info(`Did not restore ${artifactType} with key ${cacheKey} to ${pattern}`)
|
||||
@@ -232,8 +231,7 @@ abstract class AbstractEntryExtractor {
|
||||
cacheDebug(`No change to previously restored ${artifactType}. Not saving.`)
|
||||
entryListener.markNotSaved('contents unchanged')
|
||||
} else {
|
||||
core.info(`Caching ${artifactType} with path '${pattern}' and cache key: ${cacheKey}`)
|
||||
await saveCache([pattern], cacheKey, entryListener)
|
||||
await saveCache(pattern.split('\n'), cacheKey, entryListener)
|
||||
}
|
||||
|
||||
for (const file of matchingFiles) {
|
||||
@@ -434,8 +432,7 @@ export class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
|
||||
// If any associated build result used Gradle < 8.6, then mark it as not cacheable
|
||||
if (
|
||||
pathResults.find(result => {
|
||||
const gradleVersion = semver.coerce(result.gradleVersion)
|
||||
return gradleVersion && semver.lt(gradleVersion, '8.6.0')
|
||||
return !versionIsAtLeast(result.gradleVersion, '8.6.0')
|
||||
})
|
||||
) {
|
||||
core.info(
|
||||
|
||||
@@ -60,7 +60,8 @@ export class GradleUserHomeCache {
|
||||
restoreKeys:[${cacheKey.restoreKeys}]`
|
||||
)
|
||||
|
||||
const cacheResult = await restoreCache(this.getCachePath(), cacheKey.key, cacheKey.restoreKeys, entryListener)
|
||||
const cachePath = this.getCachePath()
|
||||
const cacheResult = await restoreCache(cachePath, cacheKey.key, cacheKey.restoreKeys, entryListener)
|
||||
if (!cacheResult) {
|
||||
core.info(`${this.cacheDescription} cache not found. Will initialize empty.`)
|
||||
return
|
||||
@@ -68,8 +69,6 @@ export class GradleUserHomeCache {
|
||||
|
||||
core.saveState(RESTORED_CACHE_KEY_KEY, cacheResult.key)
|
||||
|
||||
core.info(`Restored ${this.cacheDescription} from cache key: ${cacheResult.key}`)
|
||||
|
||||
try {
|
||||
await this.afterRestore(listener)
|
||||
} catch (error) {
|
||||
@@ -120,10 +119,8 @@ export class GradleUserHomeCache {
|
||||
return
|
||||
}
|
||||
|
||||
core.info(`Caching ${this.cacheDescription} with cache key: ${cacheKey}`)
|
||||
const cachePath = this.getCachePath()
|
||||
await saveCache(cachePath, cacheKey, gradleHomeEntryListener)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ export async function setup(config: BuildScanConfig): Promise<void> {
|
||||
maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions')
|
||||
if (config.getBuildScanPublishEnabled()) {
|
||||
maybeExportVariable('DEVELOCITY_INJECTION_ENABLED', 'true')
|
||||
maybeExportVariable('DEVELOCITY_PLUGIN_VERSION', '3.18')
|
||||
maybeExportVariable('DEVELOCITY_PLUGIN_VERSION', '3.18.1')
|
||||
maybeExportVariable('DEVELOCITY_CCUD_PLUGIN_VERSION', '2.0')
|
||||
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', config.getBuildScanTermsOfUseUrl())
|
||||
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', config.getBuildScanTermsOfUseAgree())
|
||||
|
||||
@@ -72,7 +72,7 @@ class ShortLivedTokenClient {
|
||||
retryInterval = 1000
|
||||
|
||||
async fetchToken(serverUrl: string, accessKey: HostnameAccessKey, expiry: string): Promise<HostnameAccessKey> {
|
||||
const queryParams = expiry ? `?expiresInHours${expiry}` : ''
|
||||
const queryParams = expiry ? `?expiresInHours=${expiry}` : ''
|
||||
const sanitizedServerUrl = !serverUrl.endsWith('/') ? `${serverUrl}/` : serverUrl
|
||||
const headers = {
|
||||
'Content-Type': 'application/json',
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import * as core from '@actions/core'
|
||||
import * as exec from '@actions/exec'
|
||||
|
||||
import which from 'which'
|
||||
import * as semver from 'semver'
|
||||
import * as provisioner from './provision'
|
||||
import * as gradlew from './gradlew'
|
||||
|
||||
@@ -31,3 +33,42 @@ async function executeGradleBuild(executable: string | undefined, root: string,
|
||||
core.setFailed(`Gradle build failed: see console output for details`)
|
||||
}
|
||||
}
|
||||
|
||||
export function versionIsAtLeast(actualVersion: string, requiredVersion: string): boolean {
|
||||
const splitVersion = actualVersion.split('-')
|
||||
const coreVersion = splitVersion[0]
|
||||
const prerelease = splitVersion.length > 1
|
||||
|
||||
const actualSemver = semver.coerce(coreVersion)!
|
||||
const comparisonSemver = semver.coerce(requiredVersion)!
|
||||
|
||||
if (prerelease) {
|
||||
return semver.gt(actualSemver, comparisonSemver)
|
||||
} else {
|
||||
return semver.gte(actualSemver, comparisonSemver)
|
||||
}
|
||||
}
|
||||
|
||||
export async function findGradleVersionOnPath(): Promise<GradleExecutable | undefined> {
|
||||
const gradleExecutable = await which('gradle', {nothrow: true})
|
||||
if (gradleExecutable) {
|
||||
const output = await exec.getExecOutput(gradleExecutable, ['-v'], {silent: true})
|
||||
const version = parseGradleVersionFromOutput(output.stdout)
|
||||
return version ? new GradleExecutable(version, gradleExecutable) : undefined
|
||||
}
|
||||
|
||||
return undefined
|
||||
}
|
||||
|
||||
export function parseGradleVersionFromOutput(output: string): string | undefined {
|
||||
const regex = /Gradle (\d+\.\d+(\.\d+)?(-.*)?)/
|
||||
const versionString = output.match(regex)?.[1]
|
||||
return versionString
|
||||
}
|
||||
|
||||
class GradleExecutable {
|
||||
constructor(
|
||||
readonly version: string,
|
||||
readonly executable: string
|
||||
) {}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import * as fs from 'fs'
|
||||
import * as os from 'os'
|
||||
import * as path from 'path'
|
||||
import which from 'which'
|
||||
import * as httpm from '@actions/http-client'
|
||||
import * as core from '@actions/core'
|
||||
import * as cache from '@actions/cache'
|
||||
import * as exec from '@actions/exec'
|
||||
import * as toolCache from '@actions/tool-cache'
|
||||
|
||||
import {findGradleVersionOnPath, versionIsAtLeast} from './gradle'
|
||||
import * as gradlew from './gradlew'
|
||||
import {handleCacheFailure} from '../caching/cache-utils'
|
||||
import {CacheConfig} from '../configuration'
|
||||
@@ -26,6 +25,16 @@ export async function provisionGradle(gradleVersion: string): Promise<string | u
|
||||
return undefined
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that the Gradle version on PATH is no older than the specified version.
|
||||
* If the version on PATH is older, install the specified version and add it to the PATH.
|
||||
* @return Installed Gradle executable or undefined if no version configured.
|
||||
*/
|
||||
export async function provisionGradleAtLeast(gradleVersion: string): Promise<string> {
|
||||
const installedVersion = await installGradleVersionAtLeast(await gradleRelease(gradleVersion))
|
||||
return addToPath(installedVersion)
|
||||
}
|
||||
|
||||
async function addToPath(executable: string): Promise<string> {
|
||||
core.addPath(path.dirname(executable))
|
||||
return executable
|
||||
@@ -51,7 +60,7 @@ async function resolveGradleVersion(version: string): Promise<GradleVersionInfo>
|
||||
case 'release-nightly':
|
||||
return gradleReleaseNightly()
|
||||
default:
|
||||
return gradle(version)
|
||||
return gradleRelease(version)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +85,7 @@ async function gradleReleaseNightly(): Promise<GradleVersionInfo> {
|
||||
return await gradleVersionDeclaration(`${gradleVersionsBaseUrl}/release-nightly`)
|
||||
}
|
||||
|
||||
async function gradle(version: string): Promise<GradleVersionInfo> {
|
||||
async function gradleRelease(version: string): Promise<GradleVersionInfo> {
|
||||
const versionInfo = await findGradleVersionDeclaration(version)
|
||||
if (!versionInfo) {
|
||||
throw new Error(`Gradle version ${version} does not exists`)
|
||||
@@ -97,10 +106,24 @@ async function findGradleVersionDeclaration(version: string): Promise<GradleVers
|
||||
|
||||
async function installGradleVersion(versionInfo: GradleVersionInfo): Promise<string> {
|
||||
return core.group(`Provision Gradle ${versionInfo.version}`, async () => {
|
||||
const preInstalledGradle = await findGradleVersionOnPath(versionInfo)
|
||||
if (preInstalledGradle !== undefined) {
|
||||
const gradleOnPath = await findGradleVersionOnPath()
|
||||
if (gradleOnPath?.version === versionInfo.version) {
|
||||
core.info(`Gradle version ${versionInfo.version} is already available on PATH. Not installing.`)
|
||||
return preInstalledGradle
|
||||
return gradleOnPath.executable
|
||||
}
|
||||
|
||||
return locateGradleAndDownloadIfRequired(versionInfo)
|
||||
})
|
||||
}
|
||||
|
||||
async function installGradleVersionAtLeast(versionInfo: GradleVersionInfo): Promise<string> {
|
||||
return core.group(`Provision Gradle >= ${versionInfo.version}`, async () => {
|
||||
const gradleOnPath = await findGradleVersionOnPath()
|
||||
if (gradleOnPath && versionIsAtLeast(gradleOnPath.version, versionInfo.version)) {
|
||||
core.info(
|
||||
`Gradle version ${gradleOnPath.version} is available on PATH and >= ${versionInfo.version}. Not installing.`
|
||||
)
|
||||
return gradleOnPath.executable
|
||||
}
|
||||
|
||||
return locateGradleAndDownloadIfRequired(versionInfo)
|
||||
@@ -192,15 +215,3 @@ interface GradleVersionInfo {
|
||||
version: string
|
||||
downloadUrl: string
|
||||
}
|
||||
|
||||
async function findGradleVersionOnPath(versionInfo: GradleVersionInfo): Promise<string | undefined> {
|
||||
const gradleExecutable = await which('gradle', {nothrow: true})
|
||||
if (gradleExecutable) {
|
||||
const output = await exec.getExecOutput(gradleExecutable, ['-v'], {silent: true})
|
||||
if (output.stdout.includes(`\nGradle ${versionInfo.version}\n`)) {
|
||||
return gradleExecutable
|
||||
}
|
||||
}
|
||||
|
||||
return undefined
|
||||
}
|
||||
|
||||
@@ -1,4 +1,36 @@
|
||||
[
|
||||
{
|
||||
"version": "8.11",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
},
|
||||
{
|
||||
"version": "8.11-rc-3",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
},
|
||||
{
|
||||
"version": "8.11-rc-2",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
},
|
||||
{
|
||||
"version": "8.11-rc-1",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
},
|
||||
{
|
||||
"version": "8.11-milestone-1",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
},
|
||||
{
|
||||
"version": "8.10.2",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
},
|
||||
{
|
||||
"version": "8.10.2-milestone-1",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
},
|
||||
{
|
||||
"version": "8.10.1",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
},
|
||||
{
|
||||
"version": "8.10",
|
||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||
|
||||
@@ -20,7 +20,7 @@ dependencies {
|
||||
testImplementation ('io.ratpack:ratpack-groovy-test:1.9.0') {
|
||||
exclude group: 'org.codehaus.groovy', module: 'groovy-all'
|
||||
}
|
||||
testImplementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.17.2'
|
||||
testImplementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.18.1'
|
||||
}
|
||||
|
||||
test {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id "com.gradle.develocity" version "3.18"
|
||||
id "com.gradle.develocity" version "3.18.1"
|
||||
id "com.gradle.common-custom-user-data-gradle-plugin" version "2.0.1"
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import java.nio.file.Files
|
||||
import java.util.zip.GZIPOutputStream
|
||||
|
||||
class BaseInitScriptTest extends Specification {
|
||||
static final String DEVELOCITY_PLUGIN_VERSION = '3.18'
|
||||
static final String DEVELOCITY_PLUGIN_VERSION = '3.18.1'
|
||||
static final String CCUD_PLUGIN_VERSION = '2.0.1'
|
||||
|
||||
static final TestGradleVersion GRADLE_3_X = new TestGradleVersion(GradleVersion.version('3.5.1'), 7, 9)
|
||||
|
||||
@@ -196,7 +196,7 @@ class TestBuildResultRecorder extends BaseInitScriptTest {
|
||||
when:
|
||||
settingsFile.text = """
|
||||
plugins {
|
||||
id 'com.gradle.develocity' version '3.18' apply(false)
|
||||
id 'com.gradle.develocity' version '3.18.1' apply(false)
|
||||
}
|
||||
gradle.settingsEvaluated {
|
||||
apply plugin: 'com.gradle.develocity'
|
||||
|
||||
@@ -53,8 +53,8 @@ test('will cleanup unused gradle versions', async () => {
|
||||
const transforms3 = path.resolve(gradleUserHome, "caches/transforms-3")
|
||||
const metadata100 = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.100")
|
||||
const wrapper802 = path.resolve(gradleUserHome, "wrapper/dists/gradle-8.0.2-bin")
|
||||
const gradleCurrent = path.resolve(gradleUserHome, "caches/8.10")
|
||||
const metadataCurrent = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.106")
|
||||
const gradleCurrent = path.resolve(gradleUserHome, "caches/8.11")
|
||||
const metadataCurrent = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.107")
|
||||
|
||||
expect(fs.existsSync(gradle802)).toBe(true)
|
||||
expect(fs.existsSync(transforms3)).toBe(true)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import exp from 'constants'
|
||||
import {CacheEntryListener, CacheListener} from '../../src/caching/cache-reporting'
|
||||
|
||||
describe('caching report', () => {
|
||||
@@ -5,7 +6,7 @@ describe('caching report', () => {
|
||||
it('with one requested entry report', async () => {
|
||||
const report = new CacheListener()
|
||||
report.entry('foo').markRequested('1', ['2'])
|
||||
report.entry('bar').markRequested('3').markRestored('4', 500)
|
||||
report.entry('bar').markRequested('3').markRestored('4', 500, 1000)
|
||||
expect(report.fullyRestored).toBe(false)
|
||||
})
|
||||
})
|
||||
@@ -22,13 +23,13 @@ describe('caching report', () => {
|
||||
})
|
||||
it('with restored entry report', async () => {
|
||||
const report = new CacheListener()
|
||||
report.entry('bar').markRequested('3').markRestored('4', 300)
|
||||
report.entry('bar').markRequested('3').markRestored('4', 300, 1000)
|
||||
expect(report.fullyRestored).toBe(true)
|
||||
})
|
||||
it('with multiple restored entry reportss', async () => {
|
||||
const report = new CacheListener()
|
||||
report.entry('foo').markRestored('4', 3300)
|
||||
report.entry('bar').markRequested('3').markRestored('4', 333)
|
||||
report.entry('foo').markRestored('4', 3300, 111)
|
||||
report.entry('bar').markRequested('3').markRestored('4', 333, 1000)
|
||||
expect(report.fullyRestored).toBe(true)
|
||||
})
|
||||
})
|
||||
@@ -64,7 +65,7 @@ describe('caching report', () => {
|
||||
const report = new CacheListener()
|
||||
const entryReport = report.entry('foo')
|
||||
entryReport.markRequested('1', ['2', '3'])
|
||||
entryReport.markSaved('4', 100)
|
||||
entryReport.markSaved('4', 100, 1000)
|
||||
|
||||
const stringRep = report.stringify()
|
||||
const reportClone: CacheListener = CacheListener.rehydrate(stringRep)
|
||||
@@ -73,6 +74,8 @@ describe('caching report', () => {
|
||||
expect(entryClone.requestedKey).toBe('1')
|
||||
expect(entryClone.requestedRestoreKeys).toEqual(['2', '3'])
|
||||
expect(entryClone.savedKey).toBe('4')
|
||||
expect(entryClone.savedSize).toBe(100)
|
||||
expect(entryClone.savedTime).toBe(1000)
|
||||
})
|
||||
it('with live entry report', async () => {
|
||||
const report = new CacheListener()
|
||||
@@ -85,7 +88,7 @@ describe('caching report', () => {
|
||||
|
||||
// Check type and call method on rehydrated entry report
|
||||
expect(entryClone).toBeInstanceOf(CacheEntryListener)
|
||||
entryClone.markSaved('4', 100)
|
||||
entryClone.markSaved('4', 100, 1000)
|
||||
|
||||
expect(entryClone.requestedKey).toBe('1')
|
||||
expect(entryClone.requestedRestoreKeys).toEqual(['2', '3'])
|
||||
|
||||
104
sources/test/jest/gradle-version.test.ts
Normal file
104
sources/test/jest/gradle-version.test.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import { describe } from 'node:test'
|
||||
import { versionIsAtLeast, parseGradleVersionFromOutput } from '../../src/execution/gradle'
|
||||
|
||||
describe('gradle', () => {
|
||||
describe('can compare version with', () => {
|
||||
it('same version', async () => {
|
||||
expect(versionIsAtLeast('6.7.1', '6.7.1')).toBe(true)
|
||||
expect(versionIsAtLeast('7.0', '7.0')).toBe(true)
|
||||
expect(versionIsAtLeast('7.0', '7.0.0')).toBe(true)
|
||||
})
|
||||
it('newer version', async () => {
|
||||
expect(versionIsAtLeast('6.7.1', '6.7.2')).toBe(false)
|
||||
expect(versionIsAtLeast('7.0', '8.0')).toBe(false)
|
||||
expect(versionIsAtLeast('7.0', '7.0.1')).toBe(false)
|
||||
})
|
||||
it('older version', async () => {
|
||||
expect(versionIsAtLeast('6.7.2', '6.7.1')).toBe(true)
|
||||
expect(versionIsAtLeast('8.0', '7.0')).toBe(true)
|
||||
expect(versionIsAtLeast('7.0.1', '7.0')).toBe(true)
|
||||
})
|
||||
it('rc version', async () => {
|
||||
expect(versionIsAtLeast('8.0.2-rc-1', '8.0.1')).toBe(true)
|
||||
expect(versionIsAtLeast('8.0.2-rc-1', '8.0.2')).toBe(false)
|
||||
expect(versionIsAtLeast('8.1-rc-1', '8.0')).toBe(true)
|
||||
expect(versionIsAtLeast('8.0-rc-1', '8.0')).toBe(false)
|
||||
})
|
||||
it('snapshot version', async () => {
|
||||
expect(versionIsAtLeast('8.11-20240829002031+0000', '8.10')).toBe(true)
|
||||
expect(versionIsAtLeast('8.11-20240829002031+0000', '8.10.1')).toBe(true)
|
||||
expect(versionIsAtLeast('8.11-20240829002031+0000', '8.11')).toBe(false)
|
||||
|
||||
expect(versionIsAtLeast('8.10.2-20240828012138+0000', '8.10')).toBe(true)
|
||||
expect(versionIsAtLeast('8.10.2-20240828012138+0000', '8.10.1')).toBe(true)
|
||||
expect(versionIsAtLeast('8.10.2-20240828012138+0000', '8.10.2')).toBe(false)
|
||||
expect(versionIsAtLeast('8.10.2-20240828012138+0000', '8.11')).toBe(false)
|
||||
|
||||
expect(versionIsAtLeast('9.1-branch-provider_api_migration_public_api_changes-20240826121451+0000', '9.0')).toBe(true)
|
||||
expect(versionIsAtLeast('9.1-branch-provider_api_migration_public_api_changes-20240826121451+0000', '9.0.1')).toBe(true)
|
||||
expect(versionIsAtLeast('9.1-branch-provider_api_migration_public_api_changes-20240826121451+0000', '9.1')).toBe(false)
|
||||
})
|
||||
})
|
||||
describe('can parse version from output', () => {
|
||||
it('major version', async () => {
|
||||
const output = `
|
||||
------------------------------------------------------------
|
||||
Gradle 8.9
|
||||
------------------------------------------------------------
|
||||
`
|
||||
const version = await parseGradleVersionFromOutput(output)!
|
||||
expect(version).toBe('8.9')
|
||||
})
|
||||
|
||||
it('patch version', async () => {
|
||||
const output = `
|
||||
------------------------------------------------------------
|
||||
Gradle 8.9.1
|
||||
------------------------------------------------------------
|
||||
`
|
||||
const version = await parseGradleVersionFromOutput(output)!
|
||||
expect(version).toBe('8.9.1')
|
||||
})
|
||||
|
||||
it('rc version', async () => {
|
||||
const output = `
|
||||
------------------------------------------------------------
|
||||
Gradle 8.9-rc-1
|
||||
------------------------------------------------------------
|
||||
`
|
||||
const version = await parseGradleVersionFromOutput(output)!
|
||||
expect(version).toBe('8.9-rc-1')
|
||||
})
|
||||
|
||||
it('milestone version', async () => {
|
||||
const output = `
|
||||
------------------------------------------------------------
|
||||
Gradle 8.0-milestone-6
|
||||
------------------------------------------------------------
|
||||
`
|
||||
const version = await parseGradleVersionFromOutput(output)!
|
||||
expect(version).toBe('8.0-milestone-6')
|
||||
})
|
||||
|
||||
it('snapshot version', async () => {
|
||||
const output = `
|
||||
------------------------------------------------------------
|
||||
Gradle 8.10.2-20240828012138+0000
|
||||
------------------------------------------------------------
|
||||
`
|
||||
const version = await parseGradleVersionFromOutput(output)!
|
||||
expect(version).toBe('8.10.2-20240828012138+0000')
|
||||
})
|
||||
|
||||
it('branch version', async () => {
|
||||
const output = `
|
||||
------------------------------------------------------------
|
||||
Gradle 9.0-branch-provider_api_migration_public_api_changes-20240830060514+0000
|
||||
------------------------------------------------------------
|
||||
`
|
||||
const version = await parseGradleVersionFromOutput(output)!
|
||||
expect(version).toBe('9.0-branch-provider_api_migration_public_api_changes-20240830060514+0000')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -114,4 +114,14 @@ describe('short lived tokens', () => {
|
||||
.resolves
|
||||
.toBeNull()
|
||||
})
|
||||
|
||||
it('get short lived token with custom expiry', async () => {
|
||||
nock('https://dev')
|
||||
.post('/api/auth/token?expiresInHours=4')
|
||||
.reply(200, 'token')
|
||||
expect.assertions(1)
|
||||
await expect(getToken('dev=key1', '4'))
|
||||
.resolves
|
||||
.toEqual({"keys": [{"hostname": "dev", "key": "token"}]})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -37,7 +37,8 @@ test('fetches wrapper jar checksums for snapshots', async () => {
|
||||
const validChecksums = await checksums.fetchUnknownChecksums(true, new checksums.WrapperChecksums)
|
||||
|
||||
// Expect that at least one snapshot checksum is different from the non-snapshot checksums
|
||||
expect(validChecksums.size).toBeGreaterThan(nonSnapshotChecksums.size)
|
||||
expect(nonSnapshotChecksums.size).toBeGreaterThan(10)
|
||||
expect(validChecksums.size).toBeGreaterThanOrEqual(nonSnapshotChecksums.size)
|
||||
})
|
||||
|
||||
test('fetches all wrapper checksum URLS for snapshots', async () => {
|
||||
|
||||
Reference in New Issue
Block a user