mirror of
https://github.com/gradle/actions.git
synced 2025-12-08 17:15:46 +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
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
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"
|
id "com.gradle.common-custom-user-data-gradle-plugin" version "2.0.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ repositories {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api("org.apache.commons:commons-math3:3.6.1")
|
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 {
|
tasks.test {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
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"
|
id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id "com.gradle.develocity" version "3.18"
|
id "com.gradle.develocity" version "3.18.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
develocity {
|
develocity {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id "com.gradle.develocity" version "3.18"
|
id "com.gradle.develocity" version "3.18.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
develocity {
|
develocity {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id "com.gradle.develocity" version "3.18"
|
id "com.gradle.develocity" version "3.18.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
develocity {
|
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
|
node-version: 20
|
||||||
cache: npm
|
cache: npm
|
||||||
cache-dependency-path: sources/package-lock.json
|
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
|
- name: Check formatting and compile
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Get changed files
|
- name: Get changed files
|
||||||
id: changed-files
|
id: changed-files
|
||||||
uses: tj-actions/changed-files@v44
|
uses: tj-actions/changed-files@v45
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
dist/**
|
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
|
- name: Run build
|
||||||
working-directory: .github/workflow-samples/groovy-dsl
|
working-directory: .github/workflow-samples/groovy-dsl
|
||||||
run: ./gradlew assemble
|
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:
|
matrix:
|
||||||
gradle: [current, 7.6.2, 6.9.4, 5.6.4]
|
gradle: [current, 7.6.2, 6.9.4, 5.6.4]
|
||||||
os: ${{fromJSON(inputs.runner-os)}}
|
os: ${{fromJSON(inputs.runner-os)}}
|
||||||
plugin-version: [3.16.2, 3.18]
|
plugin-version: [3.16.2, 3.18.1]
|
||||||
include:
|
include:
|
||||||
- plugin-version: 3.16.2
|
- plugin-version: 3.16.2
|
||||||
accessKeyEnv: GRADLE_ENTERPRISE_ACCESS_KEY
|
accessKeyEnv: GRADLE_ENTERPRISE_ACCESS_KEY
|
||||||
- plugin-version: 3.18
|
- plugin-version: 3.18.1
|
||||||
accessKeyEnv: DEVELOCITY_ACCESS_KEY
|
accessKeyEnv: DEVELOCITY_ACCESS_KEY
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
@@ -84,7 +84,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
gradle: [current, 7.6.2, 6.9.4, 5.6.4]
|
gradle: [current, 7.6.2, 6.9.4, 5.6.4]
|
||||||
os: ${{fromJSON(inputs.runner-os)}}
|
os: ${{fromJSON(inputs.runner-os)}}
|
||||||
plugin-version: [3.16.2, 3.18]
|
plugin-version: [3.16.2, 3.18.1]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
@@ -133,7 +133,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
gradle: [ current, 7.6.2, 6.9.4, 5.6.4 ]
|
gradle: [ current, 7.6.2, 6.9.4, 5.6.4 ]
|
||||||
os: ${{fromJSON(inputs.runner-os)}}
|
os: ${{fromJSON(inputs.runner-os)}}
|
||||||
plugin-version: [ 3.16.2, 3.18 ]
|
plugin-version: [ 3.16.2, 3.18.1 ]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
@@ -169,7 +169,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
gradle: [ current, 7.6.2, 6.9.4, 5.6.4 ]
|
gradle: [ current, 7.6.2, 6.9.4, 5.6.4 ]
|
||||||
os: ${{fromJSON(inputs.runner-os)}}
|
os: ${{fromJSON(inputs.runner-os)}}
|
||||||
plugin-version: [ 3.16.2, 3.18 ]
|
plugin-version: [ 3.16.2, 3.18.1 ]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- 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
|
# If there are no changes, this action will not create a pull request
|
||||||
- name: Create or update pull request
|
- name: Create or update pull request
|
||||||
uses: peter-evans/create-pull-request@v6
|
uses: peter-evans/create-pull-request@v7
|
||||||
with:
|
with:
|
||||||
branch: bot/wrapper-checksums-update
|
branch: bot/wrapper-checksums-update
|
||||||
commit-message: Update known wrapper checksums
|
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()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: build-reports
|
name: build-reports
|
||||||
path: build/reports/
|
path: **/build/reports/
|
||||||
```
|
```
|
||||||
|
|
||||||
### Use of custom init-scripts in Gradle User Home
|
### 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
|
## Managing Develocity access keys
|
||||||
|
|
||||||
Develocity access keys are long-lived, creating risks if they are leaked. To mitigate this risk this,
|
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.
|
The short-lived access token will then be used wherever a Develocity access key is required.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
@@ -767,6 +768,21 @@ The short-lived access token will then be used wherever a Develocity access key
|
|||||||
run: ./gradlew build
|
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
|
### Develocity access key supplied as environment variable
|
||||||
|
|
||||||
The preferred mechanism is to supply the long-lived Develocity access key directly to `setup-gradle` via
|
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
|
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.
|
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:
|
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_INJECTION_ENABLED: true
|
||||||
DEVELOCITY_URL: https://develocity.your-server.com
|
DEVELOCITY_URL: https://develocity.your-server.com
|
||||||
DEVELOCITY_ENFORCE_URL: true
|
DEVELOCITY_ENFORCE_URL: true
|
||||||
DEVELOCITY_PLUGIN_VERSION: "3.18"
|
DEVELOCITY_PLUGIN_VERSION: "3.18.1"
|
||||||
DEVELOCITY_CCUD_PLUGIN_VERSION: "2.0.2"
|
DEVELOCITY_CCUD_PLUGIN_VERSION: "2.0.2"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
# Configuration file for asdf version manager
|
# Configuration file for asdf version manager
|
||||||
nodejs 20.10.0
|
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",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/artifact": "2.1.9",
|
"@actions/artifact": "2.1.11",
|
||||||
"@actions/cache": "3.2.4",
|
"@actions/cache": "3.3.0",
|
||||||
"@actions/core": "1.10.1",
|
"@actions/core": "1.11.1",
|
||||||
"@actions/exec": "1.1.1",
|
"@actions/exec": "1.1.1",
|
||||||
"@actions/github": "6.0.0",
|
"@actions/github": "6.0.0",
|
||||||
"@actions/glob": "0.5.0",
|
"@actions/glob": "0.5.0",
|
||||||
"@actions/http-client": "2.2.2",
|
"@actions/http-client": "2.2.3",
|
||||||
"@actions/tool-cache": "2.0.1",
|
"@actions/tool-cache": "2.0.1",
|
||||||
"@octokit/rest": "21.0.2",
|
"@octokit/rest": "21.0.2",
|
||||||
"@octokit/webhooks-types": "7.5.1",
|
"@octokit/webhooks-types": "7.6.1",
|
||||||
"cheerio": "^1.0.0",
|
"cheerio": "^1.0.0",
|
||||||
"semver": "7.6.3",
|
"semver": "7.6.3",
|
||||||
"string-argv": "0.3.2",
|
"string-argv": "0.3.2",
|
||||||
"typed-rest-client": "2.0.2",
|
"typed-rest-client": "2.1.0",
|
||||||
"unhomoglyph": "1.0.6",
|
"unhomoglyph": "1.0.6",
|
||||||
"which": "4.0.0"
|
"which": "5.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "29.5.12",
|
"@types/jest": "29.5.14",
|
||||||
"@types/node": "20.16.1",
|
"@types/node": "20.17.6",
|
||||||
"@types/unzipper": "0.10.10",
|
"@types/unzipper": "0.10.10",
|
||||||
"@types/which": "3.0.4",
|
"@types/which": "3.0.4",
|
||||||
"@typescript-eslint/parser": "7.18.0",
|
"@typescript-eslint/parser": "7.18.0",
|
||||||
"@vercel/ncc": "0.38.1",
|
"@vercel/ncc": "0.38.2",
|
||||||
"eslint": "8.57.0",
|
"eslint": "8.57.1",
|
||||||
"eslint-plugin-github": "5.0.1",
|
"eslint-plugin-github": "5.0.2",
|
||||||
"eslint-plugin-jest": "28.8.0",
|
"eslint-plugin-jest": "28.9.0",
|
||||||
"jest": "29.7.0",
|
"jest": "29.7.0",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"nock": "13.5.4",
|
"nock": "13.5.6",
|
||||||
"npm-run-all": "4.1.5",
|
"npm-run-all": "4.1.5",
|
||||||
"patch-package": "8.0.0",
|
"patch-package": "8.0.0",
|
||||||
"prettier": "3.3.3",
|
"prettier": "3.3.3",
|
||||||
"ts-jest": "29.2.4",
|
"ts-jest": "29.2.5",
|
||||||
"typescript": "5.5.4"
|
"typescript": "5.6.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,22 +44,24 @@ export class CacheCleaner {
|
|||||||
settings.caches {
|
settings.caches {
|
||||||
cleanup = Cleanup.ALWAYS
|
cleanup = Cleanup.ALWAYS
|
||||||
|
|
||||||
releasedWrappers.removeUnusedEntriesOlderThan.set(cleanupTime)
|
releasedWrappers.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||||
snapshotWrappers.removeUnusedEntriesOlderThan.set(cleanupTime)
|
snapshotWrappers.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||||
downloadedResources.removeUnusedEntriesOlderThan.set(cleanupTime)
|
downloadedResources.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||||
createdResources.removeUnusedEntriesOlderThan.set(cleanupTime)
|
createdResources.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||||
buildCache.removeUnusedEntriesOlderThan.set(cleanupTime)
|
buildCache.setRemoveUnusedEntriesOlderThan(cleanupTime)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
)
|
)
|
||||||
fs.writeFileSync(path.resolve(cleanupProjectDir, 'build.gradle'), 'task("noop") {}')
|
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 () => {
|
await core.group('Executing Gradle to clean up caches', async () => {
|
||||||
core.info(`Cleaning up caches last used before ${cleanTimestamp}`)
|
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'
|
'noop'
|
||||||
]
|
]
|
||||||
|
|
||||||
const result = await exec.getExecOutput(executable, args, {
|
await exec.exec(executable, args, {
|
||||||
cwd: cleanupProjectDir,
|
cwd: cleanupProjectDir
|
||||||
silent: true
|
|
||||||
})
|
})
|
||||||
|
|
||||||
core.info(result.stdout)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,10 +110,12 @@ export class CacheEntryListener {
|
|||||||
requestedRestoreKeys: string[] | undefined
|
requestedRestoreKeys: string[] | undefined
|
||||||
restoredKey: string | undefined
|
restoredKey: string | undefined
|
||||||
restoredSize: number | undefined
|
restoredSize: number | undefined
|
||||||
|
restoredTime: number | undefined
|
||||||
notRestored: string | undefined
|
notRestored: string | undefined
|
||||||
|
|
||||||
savedKey: string | undefined
|
savedKey: string | undefined
|
||||||
savedSize: number | undefined
|
savedSize: number | undefined
|
||||||
|
savedTime: number | undefined
|
||||||
notSaved: string | undefined
|
notSaved: string | undefined
|
||||||
|
|
||||||
constructor(entryName: string) {
|
constructor(entryName: string) {
|
||||||
@@ -130,9 +132,10 @@ export class CacheEntryListener {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
markRestored(key: string, size: number | undefined): CacheEntryListener {
|
markRestored(key: string, size: number | undefined, time: number): CacheEntryListener {
|
||||||
this.restoredKey = key
|
this.restoredKey = key
|
||||||
this.restoredSize = size
|
this.restoredSize = size
|
||||||
|
this.restoredTime = time
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,9 +144,10 @@ export class CacheEntryListener {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
markSaved(key: string, size: number | undefined): CacheEntryListener {
|
markSaved(key: string, size: number | undefined, time: number): CacheEntryListener {
|
||||||
this.savedKey = key
|
this.savedKey = key
|
||||||
this.savedSize = size
|
this.savedSize = size
|
||||||
|
this.savedTime = time
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,14 +186,16 @@ ${renderEntryTable(entries)}
|
|||||||
function renderEntryTable(entries: CacheEntryListener[]): string {
|
function renderEntryTable(entries: CacheEntryListener[]): string {
|
||||||
return `
|
return `
|
||||||
<table>
|
<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>
|
<tr><td>Entries Restored</td>
|
||||||
<td>${getCount(entries, e => e.restoredSize)}</td>
|
<td>${getCount(entries, e => e.restoredSize)}</td>
|
||||||
<td>${getSize(entries, e => e.restoredSize)}</td>
|
<td>${getSize(entries, e => e.restoredSize)}</td>
|
||||||
|
<td>${getTime(entries, e => e.restoredTime)}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td>Entries Saved</td>
|
<tr><td>Entries Saved</td>
|
||||||
<td>${getCount(entries, e => e.savedSize)}</td>
|
<td>${getCount(entries, e => e.savedSize)}</td>
|
||||||
<td>${getSize(entries, e => e.savedSize)}</td>
|
<td>${getSize(entries, e => e.savedSize)}</td>
|
||||||
|
<td>${getTime(entries, e => e.savedTime)}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
`
|
`
|
||||||
@@ -202,9 +208,11 @@ function renderEntryDetails(listener: CacheListener): string {
|
|||||||
Requested Key : ${entry.requestedKey ?? ''}
|
Requested Key : ${entry.requestedKey ?? ''}
|
||||||
Restored Key : ${entry.restoredKey ?? ''}
|
Restored Key : ${entry.restoredKey ?? ''}
|
||||||
Size: ${formatSize(entry.restoredSize)}
|
Size: ${formatSize(entry.restoredSize)}
|
||||||
|
Time: ${formatTime(entry.restoredTime)}
|
||||||
${getRestoredMessage(entry, listener.cacheWriteOnly)}
|
${getRestoredMessage(entry, listener.cacheWriteOnly)}
|
||||||
Saved Key : ${entry.savedKey ?? ''}
|
Saved Key : ${entry.savedKey ?? ''}
|
||||||
Size: ${formatSize(entry.savedSize)}
|
Size: ${formatSize(entry.savedSize)}
|
||||||
|
Time: ${formatTime(entry.savedTime)}
|
||||||
${getSavedMessage(entry, listener.cacheReadOnly)}
|
${getSavedMessage(entry, listener.cacheReadOnly)}
|
||||||
`
|
`
|
||||||
)
|
)
|
||||||
@@ -264,9 +272,23 @@ function getSize(
|
|||||||
return Math.round(bytes / (1024 * 1024))
|
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 {
|
function formatSize(bytes: number | undefined): string {
|
||||||
if (bytes === undefined || bytes === 0) {
|
if (bytes === undefined || bytes === 0) {
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
return `${Math.round(bytes / (1024 * 1024))} MB (${bytes} B)`
|
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> {
|
): Promise<cache.CacheEntry | undefined> {
|
||||||
listener.markRequested(cacheKey, cacheRestoreKeys)
|
listener.markRequested(cacheKey, cacheRestoreKeys)
|
||||||
try {
|
try {
|
||||||
|
const startTime = Date.now()
|
||||||
// Only override the read timeout if the SEGMENT_DOWNLOAD_TIMEOUT_MINS env var has NOT been set
|
// 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]
|
const cacheRestoreOptions = process.env[SEGMENT_DOWNLOAD_TIMEOUT_VAR]
|
||||||
? {}
|
? {}
|
||||||
: {segmentTimeoutInMs: SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT}
|
: {segmentTimeoutInMs: SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT}
|
||||||
const restoredEntry = await cache.restoreCache(cachePath, cacheKey, cacheRestoreKeys, cacheRestoreOptions)
|
const restoredEntry = await cache.restoreCache(cachePath, cacheKey, cacheRestoreKeys, cacheRestoreOptions)
|
||||||
if (restoredEntry !== undefined) {
|
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
|
return restoredEntry
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -56,8 +59,11 @@ export async function restoreCache(
|
|||||||
|
|
||||||
export async function saveCache(cachePath: string[], cacheKey: string, listener: CacheEntryListener): Promise<void> {
|
export async function saveCache(cachePath: string[], cacheKey: string, listener: CacheEntryListener): Promise<void> {
|
||||||
try {
|
try {
|
||||||
|
const startTime = Date.now()
|
||||||
const savedEntry = await cache.saveCache(cachePath, cacheKey)
|
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) {
|
} catch (error) {
|
||||||
if (error instanceof cache.ReserveCacheError) {
|
if (error instanceof cache.ReserveCacheError) {
|
||||||
listener.markAlreadyExists(cacheKey)
|
listener.markAlreadyExists(cacheKey)
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import path from 'path'
|
|||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as glob from '@actions/glob'
|
import * as glob from '@actions/glob'
|
||||||
import * as semver from 'semver'
|
|
||||||
|
|
||||||
import {CacheEntryListener, CacheListener} from './cache-reporting'
|
import {CacheEntryListener, CacheListener} from './cache-reporting'
|
||||||
import {cacheDebug, hashFileNames, isCacheDebuggingEnabled, restoreCache, saveCache, tryDelete} from './cache-utils'
|
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 {BuildResult, loadBuildResults} from '../build-results'
|
||||||
import {CacheConfig, ACTION_METADATA_DIR} from '../configuration'
|
import {CacheConfig, ACTION_METADATA_DIR} from '../configuration'
|
||||||
import {getCacheKeyBase} from './cache-key'
|
import {getCacheKeyBase} from './cache-key'
|
||||||
|
import {versionIsAtLeast} from '../execution/gradle'
|
||||||
|
|
||||||
const SKIP_RESTORE_VAR = 'GRADLE_BUILD_ACTION_SKIP_RESTORE'
|
const SKIP_RESTORE_VAR = 'GRADLE_BUILD_ACTION_SKIP_RESTORE'
|
||||||
const CACHE_PROTOCOL_VERSION = 'v1'
|
const CACHE_PROTOCOL_VERSION = 'v1'
|
||||||
@@ -132,9 +132,8 @@ abstract class AbstractEntryExtractor {
|
|||||||
pattern: string,
|
pattern: string,
|
||||||
listener: CacheEntryListener
|
listener: CacheEntryListener
|
||||||
): Promise<ExtractedCacheEntry> {
|
): Promise<ExtractedCacheEntry> {
|
||||||
const restoredEntry = await restoreCache([pattern], cacheKey, [], listener)
|
const restoredEntry = await restoreCache(pattern.split('\n'), cacheKey, [], listener)
|
||||||
if (restoredEntry) {
|
if (restoredEntry) {
|
||||||
core.info(`Restored ${artifactType} with key ${cacheKey} to ${pattern}`)
|
|
||||||
return new ExtractedCacheEntry(artifactType, pattern, cacheKey)
|
return new ExtractedCacheEntry(artifactType, pattern, cacheKey)
|
||||||
} else {
|
} else {
|
||||||
core.info(`Did not restore ${artifactType} with key ${cacheKey} to ${pattern}`)
|
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.`)
|
cacheDebug(`No change to previously restored ${artifactType}. Not saving.`)
|
||||||
entryListener.markNotSaved('contents unchanged')
|
entryListener.markNotSaved('contents unchanged')
|
||||||
} else {
|
} else {
|
||||||
core.info(`Caching ${artifactType} with path '${pattern}' and cache key: ${cacheKey}`)
|
await saveCache(pattern.split('\n'), cacheKey, entryListener)
|
||||||
await saveCache([pattern], cacheKey, entryListener)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const file of matchingFiles) {
|
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 any associated build result used Gradle < 8.6, then mark it as not cacheable
|
||||||
if (
|
if (
|
||||||
pathResults.find(result => {
|
pathResults.find(result => {
|
||||||
const gradleVersion = semver.coerce(result.gradleVersion)
|
return !versionIsAtLeast(result.gradleVersion, '8.6.0')
|
||||||
return gradleVersion && semver.lt(gradleVersion, '8.6.0')
|
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
core.info(
|
core.info(
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ export class GradleUserHomeCache {
|
|||||||
restoreKeys:[${cacheKey.restoreKeys}]`
|
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) {
|
if (!cacheResult) {
|
||||||
core.info(`${this.cacheDescription} cache not found. Will initialize empty.`)
|
core.info(`${this.cacheDescription} cache not found. Will initialize empty.`)
|
||||||
return
|
return
|
||||||
@@ -68,8 +69,6 @@ export class GradleUserHomeCache {
|
|||||||
|
|
||||||
core.saveState(RESTORED_CACHE_KEY_KEY, cacheResult.key)
|
core.saveState(RESTORED_CACHE_KEY_KEY, cacheResult.key)
|
||||||
|
|
||||||
core.info(`Restored ${this.cacheDescription} from cache key: ${cacheResult.key}`)
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await this.afterRestore(listener)
|
await this.afterRestore(listener)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -120,10 +119,8 @@ export class GradleUserHomeCache {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
core.info(`Caching ${this.cacheDescription} with cache key: ${cacheKey}`)
|
|
||||||
const cachePath = this.getCachePath()
|
const cachePath = this.getCachePath()
|
||||||
await saveCache(cachePath, cacheKey, gradleHomeEntryListener)
|
await saveCache(cachePath, cacheKey, gradleHomeEntryListener)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ export async function setup(config: BuildScanConfig): Promise<void> {
|
|||||||
maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions')
|
maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions')
|
||||||
if (config.getBuildScanPublishEnabled()) {
|
if (config.getBuildScanPublishEnabled()) {
|
||||||
maybeExportVariable('DEVELOCITY_INJECTION_ENABLED', 'true')
|
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_CCUD_PLUGIN_VERSION', '2.0')
|
||||||
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', config.getBuildScanTermsOfUseUrl())
|
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', config.getBuildScanTermsOfUseUrl())
|
||||||
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', config.getBuildScanTermsOfUseAgree())
|
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', config.getBuildScanTermsOfUseAgree())
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class ShortLivedTokenClient {
|
|||||||
retryInterval = 1000
|
retryInterval = 1000
|
||||||
|
|
||||||
async fetchToken(serverUrl: string, accessKey: HostnameAccessKey, expiry: string): Promise<HostnameAccessKey> {
|
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 sanitizedServerUrl = !serverUrl.endsWith('/') ? `${serverUrl}/` : serverUrl
|
||||||
const headers = {
|
const headers = {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as exec from '@actions/exec'
|
import * as exec from '@actions/exec'
|
||||||
|
|
||||||
|
import which from 'which'
|
||||||
|
import * as semver from 'semver'
|
||||||
import * as provisioner from './provision'
|
import * as provisioner from './provision'
|
||||||
import * as gradlew from './gradlew'
|
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`)
|
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 fs from 'fs'
|
||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import which from 'which'
|
|
||||||
import * as httpm from '@actions/http-client'
|
import * as httpm from '@actions/http-client'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as cache from '@actions/cache'
|
import * as cache from '@actions/cache'
|
||||||
import * as exec from '@actions/exec'
|
|
||||||
import * as toolCache from '@actions/tool-cache'
|
import * as toolCache from '@actions/tool-cache'
|
||||||
|
|
||||||
|
import {findGradleVersionOnPath, versionIsAtLeast} from './gradle'
|
||||||
import * as gradlew from './gradlew'
|
import * as gradlew from './gradlew'
|
||||||
import {handleCacheFailure} from '../caching/cache-utils'
|
import {handleCacheFailure} from '../caching/cache-utils'
|
||||||
import {CacheConfig} from '../configuration'
|
import {CacheConfig} from '../configuration'
|
||||||
@@ -26,6 +25,16 @@ export async function provisionGradle(gradleVersion: string): Promise<string | u
|
|||||||
return undefined
|
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> {
|
async function addToPath(executable: string): Promise<string> {
|
||||||
core.addPath(path.dirname(executable))
|
core.addPath(path.dirname(executable))
|
||||||
return executable
|
return executable
|
||||||
@@ -51,7 +60,7 @@ async function resolveGradleVersion(version: string): Promise<GradleVersionInfo>
|
|||||||
case 'release-nightly':
|
case 'release-nightly':
|
||||||
return gradleReleaseNightly()
|
return gradleReleaseNightly()
|
||||||
default:
|
default:
|
||||||
return gradle(version)
|
return gradleRelease(version)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,7 +85,7 @@ async function gradleReleaseNightly(): Promise<GradleVersionInfo> {
|
|||||||
return await gradleVersionDeclaration(`${gradleVersionsBaseUrl}/release-nightly`)
|
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)
|
const versionInfo = await findGradleVersionDeclaration(version)
|
||||||
if (!versionInfo) {
|
if (!versionInfo) {
|
||||||
throw new Error(`Gradle version ${version} does not exists`)
|
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> {
|
async function installGradleVersion(versionInfo: GradleVersionInfo): Promise<string> {
|
||||||
return core.group(`Provision Gradle ${versionInfo.version}`, async () => {
|
return core.group(`Provision Gradle ${versionInfo.version}`, async () => {
|
||||||
const preInstalledGradle = await findGradleVersionOnPath(versionInfo)
|
const gradleOnPath = await findGradleVersionOnPath()
|
||||||
if (preInstalledGradle !== undefined) {
|
if (gradleOnPath?.version === versionInfo.version) {
|
||||||
core.info(`Gradle version ${versionInfo.version} is already available on PATH. Not installing.`)
|
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)
|
return locateGradleAndDownloadIfRequired(versionInfo)
|
||||||
@@ -192,15 +215,3 @@ interface GradleVersionInfo {
|
|||||||
version: string
|
version: string
|
||||||
downloadUrl: 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",
|
"version": "8.10",
|
||||||
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
"checksum": "2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046"
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ dependencies {
|
|||||||
testImplementation ('io.ratpack:ratpack-groovy-test:1.9.0') {
|
testImplementation ('io.ratpack:ratpack-groovy-test:1.9.0') {
|
||||||
exclude group: 'org.codehaus.groovy', module: 'groovy-all'
|
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 {
|
test {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a
|
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
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"
|
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
|
import java.util.zip.GZIPOutputStream
|
||||||
|
|
||||||
class BaseInitScriptTest extends Specification {
|
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 String CCUD_PLUGIN_VERSION = '2.0.1'
|
||||||
|
|
||||||
static final TestGradleVersion GRADLE_3_X = new TestGradleVersion(GradleVersion.version('3.5.1'), 7, 9)
|
static final TestGradleVersion GRADLE_3_X = new TestGradleVersion(GradleVersion.version('3.5.1'), 7, 9)
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ class TestBuildResultRecorder extends BaseInitScriptTest {
|
|||||||
when:
|
when:
|
||||||
settingsFile.text = """
|
settingsFile.text = """
|
||||||
plugins {
|
plugins {
|
||||||
id 'com.gradle.develocity' version '3.18' apply(false)
|
id 'com.gradle.develocity' version '3.18.1' apply(false)
|
||||||
}
|
}
|
||||||
gradle.settingsEvaluated {
|
gradle.settingsEvaluated {
|
||||||
apply plugin: 'com.gradle.develocity'
|
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 transforms3 = path.resolve(gradleUserHome, "caches/transforms-3")
|
||||||
const metadata100 = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.100")
|
const metadata100 = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.100")
|
||||||
const wrapper802 = path.resolve(gradleUserHome, "wrapper/dists/gradle-8.0.2-bin")
|
const wrapper802 = path.resolve(gradleUserHome, "wrapper/dists/gradle-8.0.2-bin")
|
||||||
const gradleCurrent = path.resolve(gradleUserHome, "caches/8.10")
|
const gradleCurrent = path.resolve(gradleUserHome, "caches/8.11")
|
||||||
const metadataCurrent = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.106")
|
const metadataCurrent = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.107")
|
||||||
|
|
||||||
expect(fs.existsSync(gradle802)).toBe(true)
|
expect(fs.existsSync(gradle802)).toBe(true)
|
||||||
expect(fs.existsSync(transforms3)).toBe(true)
|
expect(fs.existsSync(transforms3)).toBe(true)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import exp from 'constants'
|
||||||
import {CacheEntryListener, CacheListener} from '../../src/caching/cache-reporting'
|
import {CacheEntryListener, CacheListener} from '../../src/caching/cache-reporting'
|
||||||
|
|
||||||
describe('caching report', () => {
|
describe('caching report', () => {
|
||||||
@@ -5,7 +6,7 @@ describe('caching report', () => {
|
|||||||
it('with one requested entry report', async () => {
|
it('with one requested entry report', async () => {
|
||||||
const report = new CacheListener()
|
const report = new CacheListener()
|
||||||
report.entry('foo').markRequested('1', ['2'])
|
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)
|
expect(report.fullyRestored).toBe(false)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -22,13 +23,13 @@ describe('caching report', () => {
|
|||||||
})
|
})
|
||||||
it('with restored entry report', async () => {
|
it('with restored entry report', async () => {
|
||||||
const report = new CacheListener()
|
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)
|
expect(report.fullyRestored).toBe(true)
|
||||||
})
|
})
|
||||||
it('with multiple restored entry reportss', async () => {
|
it('with multiple restored entry reportss', async () => {
|
||||||
const report = new CacheListener()
|
const report = new CacheListener()
|
||||||
report.entry('foo').markRestored('4', 3300)
|
report.entry('foo').markRestored('4', 3300, 111)
|
||||||
report.entry('bar').markRequested('3').markRestored('4', 333)
|
report.entry('bar').markRequested('3').markRestored('4', 333, 1000)
|
||||||
expect(report.fullyRestored).toBe(true)
|
expect(report.fullyRestored).toBe(true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -64,7 +65,7 @@ describe('caching report', () => {
|
|||||||
const report = new CacheListener()
|
const report = new CacheListener()
|
||||||
const entryReport = report.entry('foo')
|
const entryReport = report.entry('foo')
|
||||||
entryReport.markRequested('1', ['2', '3'])
|
entryReport.markRequested('1', ['2', '3'])
|
||||||
entryReport.markSaved('4', 100)
|
entryReport.markSaved('4', 100, 1000)
|
||||||
|
|
||||||
const stringRep = report.stringify()
|
const stringRep = report.stringify()
|
||||||
const reportClone: CacheListener = CacheListener.rehydrate(stringRep)
|
const reportClone: CacheListener = CacheListener.rehydrate(stringRep)
|
||||||
@@ -73,6 +74,8 @@ describe('caching report', () => {
|
|||||||
expect(entryClone.requestedKey).toBe('1')
|
expect(entryClone.requestedKey).toBe('1')
|
||||||
expect(entryClone.requestedRestoreKeys).toEqual(['2', '3'])
|
expect(entryClone.requestedRestoreKeys).toEqual(['2', '3'])
|
||||||
expect(entryClone.savedKey).toBe('4')
|
expect(entryClone.savedKey).toBe('4')
|
||||||
|
expect(entryClone.savedSize).toBe(100)
|
||||||
|
expect(entryClone.savedTime).toBe(1000)
|
||||||
})
|
})
|
||||||
it('with live entry report', async () => {
|
it('with live entry report', async () => {
|
||||||
const report = new CacheListener()
|
const report = new CacheListener()
|
||||||
@@ -85,7 +88,7 @@ describe('caching report', () => {
|
|||||||
|
|
||||||
// Check type and call method on rehydrated entry report
|
// Check type and call method on rehydrated entry report
|
||||||
expect(entryClone).toBeInstanceOf(CacheEntryListener)
|
expect(entryClone).toBeInstanceOf(CacheEntryListener)
|
||||||
entryClone.markSaved('4', 100)
|
entryClone.markSaved('4', 100, 1000)
|
||||||
|
|
||||||
expect(entryClone.requestedKey).toBe('1')
|
expect(entryClone.requestedKey).toBe('1')
|
||||||
expect(entryClone.requestedRestoreKeys).toEqual(['2', '3'])
|
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
|
.resolves
|
||||||
.toBeNull()
|
.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)
|
const validChecksums = await checksums.fetchUnknownChecksums(true, new checksums.WrapperChecksums)
|
||||||
|
|
||||||
// Expect that at least one snapshot checksum is different from the non-snapshot checksums
|
// 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 () => {
|
test('fetches all wrapper checksum URLS for snapshots', async () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user