Convert dependency-submission action to TypeScript (#122)

The original implementation was a thin `composite` wrapper that delegated to `setup-gradle`.
It is now a full-fledged action sharing implementation details.
This commit is contained in:
Daz DeBoer 2024-04-07 11:12:45 -06:00 committed by GitHub
commit 19d422aa4b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 283992 additions and 959 deletions

View File

@ -43,6 +43,13 @@ jobs:
with: with:
cache-key-prefix: ${{github.run_number}}- cache-key-prefix: ${{github.run_number}}-
dependency-submission:
uses: ./.github/workflows/integ-test-dependency-submission.yml
permissions:
contents: write
with:
cache-key-prefix: ${{github.run_number}}-
execution-with-caching: execution-with-caching:
uses: ./.github/workflows/integ-test-execution-with-caching.yml uses: ./.github/workflows/integ-test-execution-with-caching.yml
with: with:

View File

@ -69,6 +69,15 @@ jobs:
runner-os: '["ubuntu-latest"]' runner-os: '["ubuntu-latest"]'
download-dist: true download-dist: true
dependency-submission:
needs: build-distribution
uses: ./.github/workflows/integ-test-dependency-submission.yml
permissions:
contents: write
with:
runner-os: '["ubuntu-latest"]'
download-dist: true
execution-with-caching: execution-with-caching:
needs: build-distribution needs: build-distribution
uses: ./.github/workflows/integ-test-execution-with-caching.yml uses: ./.github/workflows/integ-test-execution-with-caching.yml

View File

@ -60,11 +60,5 @@ jobs:
- name: Generate and submit dependencies - name: Generate and submit dependencies
id: dependency-submission id: dependency-submission
uses: ./dependency-submission uses: ./dependency-submission
continue-on-error: true
with: with:
build-root-directory: .github/workflow-samples/groovy-dsl build-root-directory: .github/workflow-samples/groovy-dsl
- name: Assert step failure
if: steps.dependency-submission.outcome != 'failure'
run: |
echo "Dependency submission step should fail after setup-gradle"
exit 1

View File

@ -39,7 +39,21 @@ jobs:
run: ./gradlew build run: ./gradlew build
working-directory: .github/workflow-samples/groovy-dsl working-directory: .github/workflow-samples/groovy-dsl
kotlin-generate: groovy-submit:
needs: [groovy-generate]
runs-on: "ubuntu-latest"
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Initialize integ-test
uses: ./.github/actions/init-integ-test
- name: Submit dependency graphs
uses: ./setup-gradle
with:
dependency-graph: download-and-submit
kotlin-generate-and-submit:
strategy: strategy:
matrix: matrix:
os: ${{fromJSON(inputs.runner-os)}} os: ${{fromJSON(inputs.runner-os)}}
@ -57,20 +71,6 @@ jobs:
- name: Run gradle build - name: Run gradle build
run: ./gradlew build run: ./gradlew build
working-directory: .github/workflow-samples/kotlin-dsl working-directory: .github/workflow-samples/kotlin-dsl
submit:
needs: [groovy-generate]
runs-on: "ubuntu-latest"
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Initialize integ-test
uses: ./.github/actions/init-integ-test
- name: Submit dependency graphs
uses: ./setup-gradle
with:
dependency-graph: download-and-submit
multiple-builds: multiple-builds:
strategy: strategy:

View File

@ -0,0 +1,148 @@
name: Test dependency graph
on:
workflow_call:
inputs:
cache-key-prefix:
type: string
runner-os:
type: string
default: '["ubuntu-latest", "windows-latest", "macos-latest"]'
download-dist:
type: boolean
default: false
permissions:
contents: write
env:
DOWNLOAD_DIST: ${{ inputs.download-dist }}
GRADLE_BUILD_ACTION_CACHE_KEY_PREFIX: dependency-graph-${{ inputs.cache-key-prefix }}
jobs:
groovy-generate-and-upload:
strategy:
matrix:
os: ${{fromJSON(inputs.runner-os)}}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Initialize integ-test
uses: ./.github/actions/init-integ-test
- name: Generate dependency graph
uses: ./dependency-submission
with:
dependency-graph: generate-and-upload
build-root-directory: .github/workflow-samples/groovy-dsl
groovy-download-and-submit:
needs: [groovy-generate-and-upload]
runs-on: "ubuntu-latest"
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Initialize integ-test
uses: ./.github/actions/init-integ-test
- name: Submit dependency graph
uses: ./dependency-submission
with:
dependency-graph: download-and-submit
kotlin-generate-and-submit:
strategy:
matrix:
os: ${{fromJSON(inputs.runner-os)}}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Initialize integ-test
uses: ./.github/actions/init-integ-test
- name: Generate and submit dependency graph
uses: ./dependency-submission
with:
build-root-directory: .github/workflow-samples/kotlin-dsl
# TODO - Test this scenario (and make it work)
# multiple-builds:
# strategy:
# matrix:
# os: ${{fromJSON(inputs.runner-os)}}
# runs-on: ${{ matrix.os }}
# steps:
# - name: Checkout sources
# uses: actions/checkout@v4
# - name: Initialize integ-test
# uses: ./.github/actions/init-integ-test
# - name: Setup Gradle for dependency-graph generate
# uses: ./setup-gradle
# with:
# dependency-graph: generate-and-submit
# - id: gradle-assemble
# run: ./gradlew assemble
# working-directory: .github/workflow-samples/groovy-dsl
# - id: gradle-build
# run: ./gradlew build
# working-directory: .github/workflow-samples/groovy-dsl
# - id: gradle-build-again
# run: ./gradlew build
# working-directory: .github/workflow-samples/groovy-dsl
# - name: Check generated dependency graphs
# shell: bash
# run: |
# echo "gradle-assemble report file: ${{ steps.gradle-assemble.outputs.dependency-graph-file }}"
# echo "gradle-build report file: ${{ steps.gradle-build.outputs.dependency-graph-file }}"
# echo "gradle-build-again report file: ${{ steps.gradle-build-again.outputs.dependency-graph-file }}"
# ls -l dependency-graph-reports
# if [ ! -e "${{ steps.gradle-assemble.outputs.dependency-graph-file }}" ]; then
# echo "Did not find gradle-assemble dependency graph file"
# exit 1
# fi
# if [ ! -e "${{ steps.gradle-build.outputs.dependency-graph-file }}" ]; then
# echo "Did not find gradle-build dependency graph files"
# exit 1
# fi
# if [ ! -e "${{ steps.gradle-build-again.outputs.dependency-graph-file }}" ]; then
# echo "Did not find gradle-build-again dependency graph files"
# exit 1
# fi
config-cache:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Initialize integ-test
uses: ./.github/actions/init-integ-test
- id: config-cache-store
uses: ./dependency-submission
with:
build-root-directory: .github/workflow-samples/groovy-dsl
additional-arguments: --configuration-cache
- name: Check and delete generated dependency graph
shell: bash
run: |
if [ ! -e "${{ steps.config-cache-store.outputs.dependency-graph-file }}" ]; then
echo "Did not find config-cache-store dependency graph files"
exit 1
fi
rm ${{ steps.config-cache-store.outputs.dependency-graph-file }}
- id: config-cache-reuse
uses: ./dependency-submission
with:
build-root-directory: .github/workflow-samples/groovy-dsl
additional-arguments: --configuration-cache
- name: Check no dependency graph is generated
shell: bash
run: |
if [ ! -z "$(ls -A dependency-graph-reports)" ]; then
echo "Expected no dependency graph files to be generated"
ls -l dependency-graph-reports
exit 1
fi

View File

@ -30,6 +30,9 @@ Example running a single job:
Known issues: Known issues:
- `integ-test-cache-cleanup.yml` fails because `gradle` is not installed on the runner. Should be fixed by #33. - `integ-test-cache-cleanup.yml` fails because `gradle` is not installed on the runner. Should be fixed by #33.
- `integ-test-detect-java-toolchains.yml` fails when running on a `linux/amd64` container, since the expected pre-installed JDKs are not present. Should be fixed by #89. - `integ-test-detect-java-toolchains.yml` fails when running on a `linux/amd64` container, since the expected pre-installed JDKs are not present. Should be fixed by #89.
- `act` is not yet compatible with `actions/upload-artifact@v4` (or related toolkit functions)
- See https://github.com/nektos/act/pull/2224
- Workflows run by `act` cannot submit to the dependency-submission API, as no `GITHUB_TOKEN` is available by default.
Tips: Tips:
- Add the following lines to `~/.actrc`: - Add the following lines to `~/.actrc`:

View File

@ -34,6 +34,15 @@ inputs:
Additional arguments to pass to Gradle. For example, `--no-configuration-cache --stacktrace`. Additional arguments to pass to Gradle. For example, `--no-configuration-cache --stacktrace`.
required: false required: false
add-job-summary:
description: Specifies when a Job Summary should be inluded in the action results. Valid values are 'never', 'always' (default), and 'on-failure'.
required: false
default: 'always'
add-job-summary-as-pr-comment:
description: Specifies when each Job Summary should be added as a PR comment. Valid values are 'never' (default), 'always', and 'on-failure'. No action will be taken if the workflow was not triggered from a pull request.
required: false
default: 'never'
build-scan-publish: build-scan-publish:
description: | description: |
Set to 'true' to automatically publish build results as a Build Scan on scans.gradle.com. Set to 'true' to automatically publish build results as a Build Scan on scans.gradle.com.
@ -58,39 +67,16 @@ inputs:
required: false required: false
deprecation-message: The input has been renamed to align with the Develocity API. Use 'build-scan-terms-of-use-agree' instead. deprecation-message: The input has been renamed to align with the Develocity API. Use 'build-scan-terms-of-use-agree' instead.
# INTERNAL ACTION INPUTS
# These inputs should not be configured directly, and are only used to pass environmental information to the action
workflow-job-context:
required: false
default: ${{ toJSON(matrix) }}
github-token:
default: ${{ github.token }}
required: false
runs: runs:
using: "composite" using: 'node20'
steps: main: '../dist/dependency-submission/main/index.js'
- name: Check no setup-gradle post: '../dist/dependency-submission/post/index.js'
shell: bash
run: |
if [ -n "${GRADLE_BUILD_ACTION_SETUP_COMPLETED}" ]; then
echo "The dependency-submission action cannot be used in the same Job as the setup-gradle action. Please use a separate Job for dependency submission."
exit 1
fi
- name: Generate dependency graph
if: ${{ inputs.dependency-graph == 'generate-and-submit' || inputs.dependency-graph == 'generate-and-upload' }}
uses: gradle/actions/setup-gradle@v3.2.0
with:
dependency-graph: ${{ inputs.dependency-graph }}
dependency-graph-continue-on-failure: false
gradle-version: ${{ inputs.gradle-version }}
build-root-directory: ${{ inputs.build-root-directory }}
cache-encryption-key: ${{ inputs.cache-encryption-key }}
build-scan-publish: ${{ inputs.build-scan-publish }}
build-scan-terms-of-use-url: ${{ inputs.build-scan-terms-of-use-url || inputs.build-scan-terms-of-service-url }}
build-scan-terms-of-use-agree: ${{ inputs.build-scan-terms-of-use-agree || inputs.build-scan-terms-of-service-agree }}
artifact-retention-days: 1
arguments: |
-Dorg.gradle.configureondemand=false
-Dorg.gradle.dependency.verification=off
-Dorg.gradle.unsafe.isolated-projects=false
:ForceDependencyResolutionPlugin_resolveAllDependencies
${{ inputs.additional-arguments }}
- name: Download and submit dependency graph
if: ${{ inputs.dependency-graph == 'download-and-submit' }}
uses: gradle/actions/setup-gradle@v3.2.0
with:
dependency-graph: download-and-submit
dependency-graph-continue-on-failure: false
cache-disabled: true

142837
dist/dependency-submission/main/index.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

139919
dist/dependency-submission/post/index.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -139727,28 +139727,18 @@ var __importStar = (this && this.__importStar) || function (mod) {
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.setup = void 0; exports.setup = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const input_params_1 = __nccwpck_require__(23885); function setup(config) {
function setup() {
maybeExportVariable('DEVELOCITY_INJECTION_INIT_SCRIPT_NAME', 'gradle-actions.inject-develocity.init.gradle'); maybeExportVariable('DEVELOCITY_INJECTION_INIT_SCRIPT_NAME', 'gradle-actions.inject-develocity.init.gradle');
maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions'); maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions');
if ((0, input_params_1.getBuildScanPublishEnabled)() && verifyTermsOfUseAgreement()) { if (config.getBuildScanPublishEnabled()) {
maybeExportVariable('DEVELOCITY_INJECTION_ENABLED', 'true'); maybeExportVariable('DEVELOCITY_INJECTION_ENABLED', 'true');
maybeExportVariable('DEVELOCITY_PLUGIN_VERSION', '3.17'); maybeExportVariable('DEVELOCITY_PLUGIN_VERSION', '3.17');
maybeExportVariable('DEVELOCITY_CCUD_PLUGIN_VERSION', '1.13'); maybeExportVariable('DEVELOCITY_CCUD_PLUGIN_VERSION', '1.13');
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', (0, input_params_1.getBuildScanTermsOfUseUrl)()); maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', config.getBuildScanTermsOfUseUrl());
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', (0, input_params_1.getBuildScanTermsOfUseAgree)()); maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', config.getBuildScanTermsOfUseAgree());
} }
} }
exports.setup = setup; exports.setup = setup;
function verifyTermsOfUseAgreement() {
if (((0, input_params_1.getBuildScanTermsOfUseUrl)() !== 'https://gradle.com/terms-of-service' &&
(0, input_params_1.getBuildScanTermsOfUseUrl)() !== 'https://gradle.com/help/legal-terms-of-use') ||
(0, input_params_1.getBuildScanTermsOfUseAgree)() !== 'yes') {
core.warning(`Terms of use must be agreed in order to publish build scans.`);
return false;
}
return true;
}
function maybeExportVariable(variableName, value) { function maybeExportVariable(variableName, value) {
if (!process.env[variableName]) { if (!process.env[variableName]) {
core.exportVariable(variableName, value); core.exportVariable(variableName, value);
@ -139805,21 +139795,21 @@ const exec = __importStar(__nccwpck_require__(71514));
const glob = __importStar(__nccwpck_require__(28090)); const glob = __importStar(__nccwpck_require__(28090));
const path_1 = __importDefault(__nccwpck_require__(71017)); const path_1 = __importDefault(__nccwpck_require__(71017));
const fs_1 = __importDefault(__nccwpck_require__(57147)); const fs_1 = __importDefault(__nccwpck_require__(57147));
const params = __importStar(__nccwpck_require__(23885));
const cache_utils_1 = __nccwpck_require__(41678); const cache_utils_1 = __nccwpck_require__(41678);
const cache_extract_entries_1 = __nccwpck_require__(76161); const cache_extract_entries_1 = __nccwpck_require__(76161);
const RESTORED_CACHE_KEY_KEY = 'restored-cache-key'; const RESTORED_CACHE_KEY_KEY = 'restored-cache-key';
exports.META_FILE_DIR = '.setup-gradle'; exports.META_FILE_DIR = '.setup-gradle';
class GradleStateCache { class GradleStateCache {
constructor(userHome, gradleUserHome) { constructor(userHome, gradleUserHome, cacheConfig) {
this.userHome = userHome; this.userHome = userHome;
this.gradleUserHome = gradleUserHome; this.gradleUserHome = gradleUserHome;
this.cacheConfig = cacheConfig;
this.cacheName = 'gradle'; this.cacheName = 'gradle';
this.cacheDescription = 'Gradle User Home'; this.cacheDescription = 'Gradle User Home';
} }
init() { init() {
this.initializeGradleUserHome(); this.initializeGradleUserHome();
const encryptionKey = params.getCacheEncryptionKey(); const encryptionKey = this.cacheConfig.getCacheEncryptionKey();
if (encryptionKey) { if (encryptionKey) {
core.exportVariable('GRADLE_ENCRYPTION_KEY', encryptionKey); core.exportVariable('GRADLE_ENCRYPTION_KEY', encryptionKey);
} }
@ -139835,7 +139825,7 @@ class GradleStateCache {
restore(listener) { restore(listener) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const entryListener = listener.entry(this.cacheDescription); const entryListener = listener.entry(this.cacheDescription);
const cacheKey = (0, cache_utils_1.generateCacheKey)(this.cacheName); const cacheKey = (0, cache_utils_1.generateCacheKey)(this.cacheName, this.cacheConfig);
(0, cache_utils_1.cacheDebug)(`Requesting ${this.cacheDescription} with (0, cache_utils_1.cacheDebug)(`Requesting ${this.cacheDescription} with
key:${cacheKey.key} key:${cacheKey.key}
restoreKeys:[${cacheKey.restoreKeys}]`); restoreKeys:[${cacheKey.restoreKeys}]`);
@ -139857,14 +139847,14 @@ class GradleStateCache {
afterRestore(listener) { afterRestore(listener) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
yield this.debugReportGradleUserHomeSize('as restored from cache'); yield this.debugReportGradleUserHomeSize('as restored from cache');
yield new cache_extract_entries_1.GradleHomeEntryExtractor(this.gradleUserHome).restore(listener); yield new cache_extract_entries_1.GradleHomeEntryExtractor(this.gradleUserHome, this.cacheConfig).restore(listener);
yield new cache_extract_entries_1.ConfigurationCacheEntryExtractor(this.gradleUserHome).restore(listener); yield new cache_extract_entries_1.ConfigurationCacheEntryExtractor(this.gradleUserHome, this.cacheConfig).restore(listener);
yield this.debugReportGradleUserHomeSize('after restoring common artifacts'); yield this.debugReportGradleUserHomeSize('after restoring common artifacts');
}); });
} }
save(listener) { save(listener) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const cacheKey = (0, cache_utils_1.generateCacheKey)(this.cacheName).key; const cacheKey = (0, cache_utils_1.generateCacheKey)(this.cacheName, this.cacheConfig).key;
const restoredCacheKey = core.getState(RESTORED_CACHE_KEY_KEY); const restoredCacheKey = core.getState(RESTORED_CACHE_KEY_KEY);
const gradleHomeEntryListener = listener.entry(this.cacheDescription); const gradleHomeEntryListener = listener.entry(this.cacheDescription);
if (restoredCacheKey && cacheKey === restoredCacheKey) { if (restoredCacheKey && cacheKey === restoredCacheKey) {
@ -139897,15 +139887,15 @@ class GradleStateCache {
yield this.debugReportGradleUserHomeSize('before saving common artifacts'); yield this.debugReportGradleUserHomeSize('before saving common artifacts');
yield this.deleteExcludedPaths(); yield this.deleteExcludedPaths();
yield Promise.all([ yield Promise.all([
new cache_extract_entries_1.GradleHomeEntryExtractor(this.gradleUserHome).extract(listener), new cache_extract_entries_1.GradleHomeEntryExtractor(this.gradleUserHome, this.cacheConfig).extract(listener),
new cache_extract_entries_1.ConfigurationCacheEntryExtractor(this.gradleUserHome).extract(listener) new cache_extract_entries_1.ConfigurationCacheEntryExtractor(this.gradleUserHome, this.cacheConfig).extract(listener)
]); ]);
yield this.debugReportGradleUserHomeSize("after extracting common artifacts (only 'caches' and 'notifications' will be stored)"); yield this.debugReportGradleUserHomeSize("after extracting common artifacts (only 'caches' and 'notifications' will be stored)");
}); });
} }
deleteExcludedPaths() { deleteExcludedPaths() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const rawPaths = params.getCacheExcludes(); const rawPaths = this.cacheConfig.getCacheExcludes();
rawPaths.push('caches/*/cc-keystore'); rawPaths.push('caches/*/cc-keystore');
const resolvedPaths = rawPaths.map(x => path_1.default.resolve(this.gradleUserHome, x)); const resolvedPaths = rawPaths.map(x => path_1.default.resolve(this.gradleUserHome, x));
for (const p of resolvedPaths) { for (const p of resolvedPaths) {
@ -139921,7 +139911,7 @@ class GradleStateCache {
}); });
} }
getCachePath() { getCachePath() {
const rawPaths = params.getCacheIncludes(); const rawPaths = this.cacheConfig.getCacheIncludes();
rawPaths.push(exports.META_FILE_DIR); rawPaths.push(exports.META_FILE_DIR);
const resolvedPaths = rawPaths.map(x => this.resolveCachePath(x)); const resolvedPaths = rawPaths.map(x => this.resolveCachePath(x));
(0, cache_utils_1.cacheDebug)(`Using cache paths: ${resolvedPaths}`); (0, cache_utils_1.cacheDebug)(`Using cache paths: ${resolvedPaths}`);
@ -140193,7 +140183,6 @@ const fs_1 = __importDefault(__nccwpck_require__(57147));
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const glob = __importStar(__nccwpck_require__(28090)); const glob = __importStar(__nccwpck_require__(28090));
const semver = __importStar(__nccwpck_require__(11383)); const semver = __importStar(__nccwpck_require__(11383));
const params = __importStar(__nccwpck_require__(23885));
const cache_base_1 = __nccwpck_require__(47591); const cache_base_1 = __nccwpck_require__(47591);
const cache_utils_1 = __nccwpck_require__(41678); const cache_utils_1 = __nccwpck_require__(41678);
const build_results_1 = __nccwpck_require__(82107); const build_results_1 = __nccwpck_require__(82107);
@ -140227,9 +140216,10 @@ class ExtractedCacheEntryDefinition {
} }
} }
class AbstractEntryExtractor { class AbstractEntryExtractor {
constructor(gradleUserHome, extractorName) { constructor(gradleUserHome, extractorName, cacheConfig) {
this.gradleUserHome = gradleUserHome; this.gradleUserHome = gradleUserHome;
this.extractorName = extractorName; this.extractorName = extractorName;
this.cacheConfig = cacheConfig;
} }
restore(listener) { restore(listener) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
@ -140334,7 +140324,7 @@ class AbstractEntryExtractor {
} }
awaitForDebugging(p) { awaitForDebugging(p) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (params.isCacheDebuggingEnabled()) { if ((0, cache_utils_1.isCacheDebuggingEnabled)()) {
yield p; yield p;
} }
return p; return p;
@ -140364,8 +140354,8 @@ class AbstractEntryExtractor {
} }
} }
class GradleHomeEntryExtractor extends AbstractEntryExtractor { class GradleHomeEntryExtractor extends AbstractEntryExtractor {
constructor(gradleUserHome) { constructor(gradleUserHome, cacheConfig) {
super(gradleUserHome, 'gradle-home'); super(gradleUserHome, 'gradle-home', cacheConfig);
} }
extract(listener) { extract(listener) {
const _super = Object.create(null, { const _super = Object.create(null, {
@ -140411,8 +140401,8 @@ class GradleHomeEntryExtractor extends AbstractEntryExtractor {
} }
exports.GradleHomeEntryExtractor = GradleHomeEntryExtractor; exports.GradleHomeEntryExtractor = GradleHomeEntryExtractor;
class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor { class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
constructor(gradleUserHome) { constructor(gradleUserHome, cacheConfig) {
super(gradleUserHome, 'configuration-cache'); super(gradleUserHome, 'configuration-cache', cacheConfig);
} }
restore(listener) { restore(listener) {
const _super = Object.create(null, { const _super = Object.create(null, {
@ -140423,7 +140413,7 @@ class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
this.markNotRestored(listener, 'Gradle User Home was not fully restored'); this.markNotRestored(listener, 'Gradle User Home was not fully restored');
return; return;
} }
if (!params.getCacheEncryptionKey()) { if (!this.cacheConfig.getCacheEncryptionKey()) {
this.markNotRestored(listener, 'Encryption Key was not provided'); this.markNotRestored(listener, 'Encryption Key was not provided');
return; return;
} }
@ -140445,7 +140435,7 @@ class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
extract: { get: () => super.extract } extract: { get: () => super.extract }
}); });
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (!params.getCacheEncryptionKey()) { if (!this.cacheConfig.getCacheEncryptionKey()) {
const cacheEntryDefinitions = this.getExtractedCacheEntryDefinitions(); const cacheEntryDefinitions = this.getExtractedCacheEntryDefinitions();
if (cacheEntryDefinitions.length > 0) { if (cacheEntryDefinitions.length > 0) {
core.info('Not saving configuration-cache state, as no encryption key was provided'); core.info('Not saving configuration-cache state, as no encryption key was provided');
@ -140745,7 +140735,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}); });
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.tryDelete = exports.handleCacheFailure = exports.cacheDebug = exports.saveCache = exports.restoreCache = exports.hashStrings = exports.hashFileNames = exports.getCacheKeyPrefix = exports.generateCacheKey = exports.CacheKey = exports.isCacheCleanupEnabled = exports.isCacheDebuggingEnabled = exports.isCacheOverwriteExisting = exports.isCacheWriteOnly = exports.isCacheReadOnly = exports.isCacheDisabled = void 0; exports.tryDelete = exports.handleCacheFailure = exports.cacheDebug = exports.saveCache = exports.restoreCache = exports.hashStrings = exports.hashFileNames = exports.getCacheKeyPrefix = exports.generateCacheKey = exports.CacheKey = exports.isCacheDebuggingEnabled = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const cache = __importStar(__nccwpck_require__(27799)); const cache = __importStar(__nccwpck_require__(27799));
const github = __importStar(__nccwpck_require__(95438)); const github = __importStar(__nccwpck_require__(95438));
@ -140753,7 +140743,7 @@ const exec = __importStar(__nccwpck_require__(71514));
const crypto = __importStar(__nccwpck_require__(6113)); const crypto = __importStar(__nccwpck_require__(6113));
const path = __importStar(__nccwpck_require__(71017)); const path = __importStar(__nccwpck_require__(71017));
const fs = __importStar(__nccwpck_require__(57147)); const fs = __importStar(__nccwpck_require__(57147));
const params = __importStar(__nccwpck_require__(23885)); const input_params_1 = __nccwpck_require__(23885);
const CACHE_PROTOCOL_VERSION = 'v9-'; const CACHE_PROTOCOL_VERSION = 'v9-';
const CACHE_KEY_PREFIX_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_PREFIX'; const CACHE_KEY_PREFIX_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_PREFIX';
const CACHE_KEY_OS_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_ENVIRONMENT'; const CACHE_KEY_OS_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_ENVIRONMENT';
@ -140762,33 +140752,13 @@ const CACHE_KEY_JOB_INSTANCE_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_JOB_INSTANCE';
const CACHE_KEY_JOB_EXECUTION_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_JOB_EXECUTION'; const CACHE_KEY_JOB_EXECUTION_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_JOB_EXECUTION';
const SEGMENT_DOWNLOAD_TIMEOUT_VAR = 'SEGMENT_DOWNLOAD_TIMEOUT_MINS'; const SEGMENT_DOWNLOAD_TIMEOUT_VAR = 'SEGMENT_DOWNLOAD_TIMEOUT_MINS';
const SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT = 10 * 60 * 1000; const SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT = 10 * 60 * 1000;
function isCacheDisabled() { function isCacheDebuggingEnabled() {
if (!cache.isFeatureAvailable()) { if (core.isDebug()) {
return true; return true;
} }
return params.isCacheDisabled(); return process.env['GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED'] ? true : false;
}
exports.isCacheDisabled = isCacheDisabled;
function isCacheReadOnly() {
return !isCacheWriteOnly() && params.isCacheReadOnly();
}
exports.isCacheReadOnly = isCacheReadOnly;
function isCacheWriteOnly() {
return params.isCacheWriteOnly();
}
exports.isCacheWriteOnly = isCacheWriteOnly;
function isCacheOverwriteExisting() {
return params.isCacheOverwriteExisting();
}
exports.isCacheOverwriteExisting = isCacheOverwriteExisting;
function isCacheDebuggingEnabled() {
return params.isCacheDebuggingEnabled();
} }
exports.isCacheDebuggingEnabled = isCacheDebuggingEnabled; exports.isCacheDebuggingEnabled = isCacheDebuggingEnabled;
function isCacheCleanupEnabled() {
return params.isCacheCleanupEnabled();
}
exports.isCacheCleanupEnabled = isCacheCleanupEnabled;
class CacheKey { class CacheKey {
constructor(key, restoreKeys) { constructor(key, restoreKeys) {
this.key = key; this.key = key;
@ -140796,13 +140766,13 @@ class CacheKey {
} }
} }
exports.CacheKey = CacheKey; exports.CacheKey = CacheKey;
function generateCacheKey(cacheName) { function generateCacheKey(cacheName, config) {
const cacheKeyBase = `${getCacheKeyPrefix()}${CACHE_PROTOCOL_VERSION}${cacheName}`; const cacheKeyBase = `${getCacheKeyPrefix()}${CACHE_PROTOCOL_VERSION}${cacheName}`;
const cacheKeyForEnvironment = `${cacheKeyBase}|${getCacheKeyEnvironment()}`; const cacheKeyForEnvironment = `${cacheKeyBase}|${getCacheKeyEnvironment()}`;
const cacheKeyForJob = `${cacheKeyForEnvironment}|${getCacheKeyJob()}`; const cacheKeyForJob = `${cacheKeyForEnvironment}|${getCacheKeyJob()}`;
const cacheKeyForJobContext = `${cacheKeyForJob}[${getCacheKeyJobInstance()}]`; const cacheKeyForJobContext = `${cacheKeyForJob}[${getCacheKeyJobInstance()}]`;
const cacheKey = `${cacheKeyForJobContext}-${getCacheKeyJobExecution()}`; const cacheKey = `${cacheKeyForJobContext}-${getCacheKeyJobExecution()}`;
if (params.isCacheStrictMatch()) { if (config.isCacheStrictMatch()) {
return new CacheKey(cacheKey, [cacheKeyForJobContext]); return new CacheKey(cacheKey, [cacheKeyForJobContext]);
} }
return new CacheKey(cacheKey, [cacheKeyForJobContext, cacheKeyForJob, cacheKeyForEnvironment]); return new CacheKey(cacheKey, [cacheKeyForJobContext, cacheKeyForJob, cacheKeyForEnvironment]);
@ -140825,7 +140795,7 @@ function getCacheKeyJobInstance() {
return override; return override;
} }
const workflowName = github.context.workflow; const workflowName = github.context.workflow;
const workflowJobContext = params.getJobMatrix(); const workflowJobContext = (0, input_params_1.getJobMatrix)();
return hashStrings([workflowName, workflowJobContext]); return hashStrings([workflowName, workflowJobContext]);
} }
function getCacheKeyJobExecution() { function getCacheKeyJobExecution() {
@ -140994,26 +140964,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.save = exports.restore = void 0; exports.save = exports.restore = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const cache_utils_1 = __nccwpck_require__(41678);
const cache_base_1 = __nccwpck_require__(47591); const cache_base_1 = __nccwpck_require__(47591);
const cache_cleaner_1 = __nccwpck_require__(57); const cache_cleaner_1 = __nccwpck_require__(57);
const CACHE_RESTORED_VAR = 'GRADLE_BUILD_ACTION_CACHE_RESTORED'; const CACHE_RESTORED_VAR = 'GRADLE_BUILD_ACTION_CACHE_RESTORED';
function restore(userHome, gradleUserHome, cacheListener) { function restore(userHome, gradleUserHome, cacheListener, cacheConfig) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (process.env[CACHE_RESTORED_VAR]) { if (process.env[CACHE_RESTORED_VAR]) {
core.info('Cache only restored on first action step.'); core.info('Cache only restored on first action step.');
return; return;
} }
core.exportVariable(CACHE_RESTORED_VAR, true); core.exportVariable(CACHE_RESTORED_VAR, true);
const gradleStateCache = new cache_base_1.GradleStateCache(userHome, gradleUserHome); const gradleStateCache = new cache_base_1.GradleStateCache(userHome, gradleUserHome, cacheConfig);
if ((0, cache_utils_1.isCacheDisabled)()) { if (cacheConfig.isCacheDisabled()) {
core.info('Cache is disabled: will not restore state from previous builds.'); core.info('Cache is disabled: will not restore state from previous builds.');
gradleStateCache.init(); gradleStateCache.init();
cacheListener.cacheDisabled = true; cacheListener.cacheDisabled = true;
return; return;
} }
if (gradleStateCache.cacheOutputExists()) { if (gradleStateCache.cacheOutputExists()) {
if (!(0, cache_utils_1.isCacheOverwriteExisting)()) { if (!cacheConfig.isCacheOverwriteExisting()) {
core.info('Gradle User Home already exists: will not restore from cache.'); core.info('Gradle User Home already exists: will not restore from cache.');
gradleStateCache.init(); gradleStateCache.init();
cacheListener.cacheDisabled = true; cacheListener.cacheDisabled = true;
@ -141024,7 +140993,7 @@ function restore(userHome, gradleUserHome, cacheListener) {
} }
gradleStateCache.init(); gradleStateCache.init();
core.saveState(CACHE_RESTORED_VAR, true); core.saveState(CACHE_RESTORED_VAR, true);
if ((0, cache_utils_1.isCacheWriteOnly)()) { if (cacheConfig.isCacheWriteOnly()) {
core.info('Cache is write-only: will not restore from cache.'); core.info('Cache is write-only: will not restore from cache.');
cacheListener.cacheWriteOnly = true; cacheListener.cacheWriteOnly = true;
return; return;
@ -141032,7 +141001,7 @@ function restore(userHome, gradleUserHome, cacheListener) {
yield core.group('Restore Gradle state from cache', () => __awaiter(this, void 0, void 0, function* () { yield core.group('Restore Gradle state from cache', () => __awaiter(this, void 0, void 0, function* () {
yield gradleStateCache.restore(cacheListener); yield gradleStateCache.restore(cacheListener);
})); }));
if ((0, cache_utils_1.isCacheCleanupEnabled)() && !(0, cache_utils_1.isCacheReadOnly)()) { if (cacheConfig.isCacheCleanupEnabled()) {
core.info('Preparing cache for cleanup.'); core.info('Preparing cache for cleanup.');
const cacheCleaner = new cache_cleaner_1.CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']); const cacheCleaner = new cache_cleaner_1.CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']);
yield cacheCleaner.prepare(); yield cacheCleaner.prepare();
@ -141040,9 +141009,9 @@ function restore(userHome, gradleUserHome, cacheListener) {
}); });
} }
exports.restore = restore; exports.restore = restore;
function save(userHome, gradleUserHome, cacheListener, daemonController) { function save(userHome, gradleUserHome, cacheListener, daemonController, cacheConfig) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if ((0, cache_utils_1.isCacheDisabled)()) { if (cacheConfig.isCacheDisabled()) {
core.info('Cache is disabled: will not save state for later builds.'); core.info('Cache is disabled: will not save state for later builds.');
return; return;
} }
@ -141050,13 +141019,13 @@ function save(userHome, gradleUserHome, cacheListener, daemonController) {
core.info('Cache will not be saved: not restored in main action step.'); core.info('Cache will not be saved: not restored in main action step.');
return; return;
} }
if ((0, cache_utils_1.isCacheReadOnly)()) { if (cacheConfig.isCacheReadOnly()) {
core.info('Cache is read-only: will not save state for use in subsequent builds.'); core.info('Cache is read-only: will not save state for use in subsequent builds.');
cacheListener.cacheReadOnly = true; cacheListener.cacheReadOnly = true;
return; return;
} }
yield daemonController.stopAllDaemons(); yield daemonController.stopAllDaemons();
if ((0, cache_utils_1.isCacheCleanupEnabled)()) { if (cacheConfig.isCacheCleanupEnabled()) {
core.info('Forcing cache cleanup.'); core.info('Forcing cache cleanup.');
const cacheCleaner = new cache_cleaner_1.CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']); const cacheCleaner = new cache_cleaner_1.CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']);
try { try {
@ -141067,7 +141036,7 @@ function save(userHome, gradleUserHome, cacheListener, daemonController) {
} }
} }
yield core.group('Caching Gradle state', () => __awaiter(this, void 0, void 0, function* () { yield core.group('Caching Gradle state', () => __awaiter(this, void 0, void 0, function* () {
return new cache_base_1.GradleStateCache(userHome, gradleUserHome).save(cacheListener); return new cache_base_1.GradleStateCache(userHome, gradleUserHome, cacheConfig).save(cacheListener);
})); }));
}); });
} }
@ -141190,7 +141159,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.constructJobCorrelator = exports.complete = exports.setup = void 0; exports.complete = exports.setup = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const github = __importStar(__nccwpck_require__(95438)); const github = __importStar(__nccwpck_require__(95438));
const glob = __importStar(__nccwpck_require__(28090)); const glob = __importStar(__nccwpck_require__(28090));
@ -141202,25 +141171,26 @@ const layout = __importStar(__nccwpck_require__(28182));
const errors_1 = __nccwpck_require__(36976); const errors_1 = __nccwpck_require__(36976);
const input_params_1 = __nccwpck_require__(23885); const input_params_1 = __nccwpck_require__(23885);
const DEPENDENCY_GRAPH_PREFIX = 'dependency-graph_'; const DEPENDENCY_GRAPH_PREFIX = 'dependency-graph_';
function setup(option) { function setup(config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (option === input_params_1.DependencyGraphOption.Disabled) { if (config.dependencyGraphOption === input_params_1.DependencyGraphOption.Disabled) {
core.exportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'false');
return; return;
} }
if (option === input_params_1.DependencyGraphOption.DownloadAndSubmit) { if (config.dependencyGraphOption === input_params_1.DependencyGraphOption.DownloadAndSubmit) {
yield downloadAndSubmitDependencyGraphs(); yield downloadAndSubmitDependencyGraphs(config);
return; return;
} }
core.info('Enabling dependency graph generation'); core.info('Enabling dependency graph generation');
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'true'); core.exportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'true');
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_CONTINUE_ON_FAILURE', (0, input_params_1.getDependencyGraphContinueOnFailure)()); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_CONTINUE_ON_FAILURE', config.continueOnFailure);
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_CORRELATOR', getJobCorrelator()); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_CORRELATOR', config.getJobCorrelator());
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_ID', github.context.runId); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_ID', github.context.runId);
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_REF', github.context.ref); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_REF', github.context.ref);
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_SHA', getShaFromContext()); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_SHA', getShaFromContext());
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_WORKSPACE', layout.workspaceDirectory()); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_WORKSPACE', layout.workspaceDirectory());
maybeExportVariable('DEPENDENCY_GRAPH_REPORT_DIR', path.resolve(layout.workspaceDirectory(), 'dependency-graph-reports')); maybeExportVariable('DEPENDENCY_GRAPH_REPORT_DIR', path.resolve(layout.workspaceDirectory(), 'dependency-graph-reports'));
if (option === input_params_1.DependencyGraphOption.Clear) { if (config.dependencyGraphOption === input_params_1.DependencyGraphOption.Clear) {
core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_PROJECTS', ''); core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_PROJECTS', '');
core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS', ''); core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS', '');
} }
@ -141232,10 +141202,14 @@ function maybeExportVariable(variableName, value) {
core.exportVariable(variableName, value); core.exportVariable(variableName, value);
} }
} }
function complete(option) { function complete(config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (isRunningInActEnvironment()) {
core.info('Dependency graph upload and submit not supported in the ACT environment.');
return;
}
try { try {
switch (option) { switch (config.dependencyGraphOption) {
case input_params_1.DependencyGraphOption.Disabled: case input_params_1.DependencyGraphOption.Disabled:
case input_params_1.DependencyGraphOption.Generate: case input_params_1.DependencyGraphOption.Generate:
case input_params_1.DependencyGraphOption.DownloadAndSubmit: case input_params_1.DependencyGraphOption.DownloadAndSubmit:
@ -141245,11 +141219,11 @@ function complete(option) {
yield submitDependencyGraphs(yield findGeneratedDependencyGraphFiles()); yield submitDependencyGraphs(yield findGeneratedDependencyGraphFiles());
return; return;
case input_params_1.DependencyGraphOption.GenerateAndUpload: case input_params_1.DependencyGraphOption.GenerateAndUpload:
yield uploadDependencyGraphs(yield findGeneratedDependencyGraphFiles()); yield uploadDependencyGraphs(yield findGeneratedDependencyGraphFiles(), config);
} }
} }
catch (e) { catch (e) {
warnOrFail(option, e); warnOrFail(config, e);
} }
}); });
} }
@ -141260,7 +141234,7 @@ function findGeneratedDependencyGraphFiles() {
return yield findDependencyGraphFiles(workspaceDirectory); return yield findDependencyGraphFiles(workspaceDirectory);
}); });
} }
function uploadDependencyGraphs(dependencyGraphFiles) { function uploadDependencyGraphs(dependencyGraphFiles, config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const workspaceDirectory = layout.workspaceDirectory(); const workspaceDirectory = layout.workspaceDirectory();
const artifactClient = new artifact_1.DefaultArtifactClient(); const artifactClient = new artifact_1.DefaultArtifactClient();
@ -141269,18 +141243,22 @@ function uploadDependencyGraphs(dependencyGraphFiles) {
core.info(`Uploading dependency graph file: ${relativePath}`); core.info(`Uploading dependency graph file: ${relativePath}`);
const artifactName = `${DEPENDENCY_GRAPH_PREFIX}${path.basename(dependencyGraphFile)}`; const artifactName = `${DEPENDENCY_GRAPH_PREFIX}${path.basename(dependencyGraphFile)}`;
yield artifactClient.uploadArtifact(artifactName, [dependencyGraphFile], workspaceDirectory, { yield artifactClient.uploadArtifact(artifactName, [dependencyGraphFile], workspaceDirectory, {
retentionDays: (0, input_params_1.getArtifactRetentionDays)() retentionDays: config.artifactRetentionDays
}); });
} }
}); });
} }
function downloadAndSubmitDependencyGraphs() { function downloadAndSubmitDependencyGraphs(config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (isRunningInActEnvironment()) {
core.info('Dependency graph download and submit not supported in the ACT environment.');
return;
}
try { try {
yield submitDependencyGraphs(yield downloadDependencyGraphs()); yield submitDependencyGraphs(yield downloadDependencyGraphs());
} }
catch (e) { catch (e) {
warnOrFail(input_params_1.DependencyGraphOption.DownloadAndSubmit, e); warnOrFail(config, e);
} }
}); });
} }
@ -141358,11 +141336,11 @@ function findDependencyGraphFiles(dir) {
return graphFiles; return graphFiles;
}); });
} }
function warnOrFail(option, error) { function warnOrFail(config, error) {
if (!(0, input_params_1.getDependencyGraphContinueOnFailure)()) { if (!config.continueOnFailure) {
throw new errors_1.PostActionJobFailure(error); throw new errors_1.PostActionJobFailure(error);
} }
core.warning(`Failed to ${option} dependency graph. Will continue.\n${String(error)}`); core.warning(`Failed to ${config.dependencyGraphOption} dependency graph. Will continue.\n${String(error)}`);
} }
function getOctokit() { function getOctokit() {
return github.getOctokit((0, input_params_1.getGithubToken)()); return github.getOctokit((0, input_params_1.getGithubToken)());
@ -141387,28 +141365,8 @@ function getShaFromContext() {
return context.sha; return context.sha;
} }
} }
function getJobCorrelator() { function isRunningInActEnvironment() {
return constructJobCorrelator(github.context.workflow, github.context.job, (0, input_params_1.getJobMatrix)()); return process.env.ACT !== undefined;
}
function constructJobCorrelator(workflow, jobId, matrixJson) {
const matrixString = describeMatrix(matrixJson);
const label = matrixString ? `${workflow}-${jobId}-${matrixString}` : `${workflow}-${jobId}`;
return sanitize(label);
}
exports.constructJobCorrelator = constructJobCorrelator;
function describeMatrix(matrixJson) {
core.debug(`Got matrix json: ${matrixJson}`);
const matrix = JSON.parse(matrixJson);
if (matrix) {
return Object.values(matrix).join('-');
}
return '';
}
function sanitize(value) {
return value
.replace(/[^a-zA-Z0-9_-\s]/g, '')
.replace(/\s+/g, '_')
.toLowerCase();
} }
@ -141601,57 +141559,200 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.JobSummaryOption = exports.DependencyGraphOption = exports.parseNumericInput = exports.getArtifactRetentionDays = exports.getDependencyGraphContinueOnFailure = exports.getDependencyGraphOption = exports.getBuildScanTermsOfUseAgree = exports.getBuildScanTermsOfUseUrl = exports.getBuildScanPublishEnabled = exports.getPRCommentOption = exports.getJobSummaryOption = exports.isJobSummaryEnabled = exports.getGithubToken = exports.getJobMatrix = exports.getArguments = exports.getGradleVersion = exports.getBuildRootDirectory = exports.getCacheExcludes = exports.getCacheIncludes = exports.getCacheEncryptionKey = exports.isCacheCleanupEnabled = exports.isCacheDebuggingEnabled = exports.isCacheStrictMatch = exports.isCacheOverwriteExisting = exports.isCacheWriteOnly = exports.isCacheReadOnly = exports.isCacheDisabled = void 0; exports.parseNumericInput = exports.getGithubToken = exports.getJobMatrix = exports.getArguments = exports.getBuildRootDirectory = exports.getGradleVersion = exports.BuildScanConfig = exports.JobSummaryOption = exports.SummaryConfig = exports.CacheConfig = exports.DependencyGraphOption = exports.DependencyGraphConfig = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const github = __importStar(__nccwpck_require__(95438));
const cache = __importStar(__nccwpck_require__(27799));
const summary_1 = __nccwpck_require__(81327);
const string_argv_1 = __nccwpck_require__(19663); const string_argv_1 = __nccwpck_require__(19663);
function isCacheDisabled() { class DependencyGraphConfig {
return getBooleanInput('cache-disabled'); constructor() {
this.dependencyGraphOption = this.getDependencyGraphOption();
this.continueOnFailure = this.getDependencyGraphContinueOnFailure();
this.artifactRetentionDays = this.getArtifactRetentionDays();
}
getDependencyGraphOption() {
const val = core.getInput('dependency-graph');
switch (val.toLowerCase().trim()) {
case 'disabled':
return DependencyGraphOption.Disabled;
case 'generate':
return DependencyGraphOption.Generate;
case 'generate-and-submit':
return DependencyGraphOption.GenerateAndSubmit;
case 'generate-and-upload':
return DependencyGraphOption.GenerateAndUpload;
case 'download-and-submit':
return DependencyGraphOption.DownloadAndSubmit;
case 'clear':
return DependencyGraphOption.Clear;
}
throw TypeError(`The value '${val}' is not valid for 'dependency-graph'. Valid values are: [disabled, generate, generate-and-submit, generate-and-upload, download-and-submit, clear]. The default value is 'disabled'.`);
}
getDependencyGraphContinueOnFailure() {
return getBooleanInput('dependency-graph-continue-on-failure', true);
}
getArtifactRetentionDays() {
const val = core.getInput('artifact-retention-days');
return parseNumericInput('artifact-retention-days', val, 0);
}
getJobCorrelator() {
return DependencyGraphConfig.constructJobCorrelator(github.context.workflow, github.context.job, getJobMatrix());
}
static constructJobCorrelator(workflow, jobId, matrixJson) {
const matrixString = this.describeMatrix(matrixJson);
const label = matrixString ? `${workflow}-${jobId}-${matrixString}` : `${workflow}-${jobId}`;
return this.sanitize(label);
}
static describeMatrix(matrixJson) {
core.debug(`Got matrix json: ${matrixJson}`);
const matrix = JSON.parse(matrixJson);
if (matrix) {
return Object.values(matrix).join('-');
}
return '';
}
static sanitize(value) {
return value
.replace(/[^a-zA-Z0-9_-\s]/g, '')
.replace(/\s+/g, '_')
.toLowerCase();
}
} }
exports.isCacheDisabled = isCacheDisabled; exports.DependencyGraphConfig = DependencyGraphConfig;
function isCacheReadOnly() { var DependencyGraphOption;
return getBooleanInput('cache-read-only'); (function (DependencyGraphOption) {
DependencyGraphOption["Disabled"] = "disabled";
DependencyGraphOption["Generate"] = "generate";
DependencyGraphOption["GenerateAndSubmit"] = "generate-and-submit";
DependencyGraphOption["GenerateAndUpload"] = "generate-and-upload";
DependencyGraphOption["DownloadAndSubmit"] = "download-and-submit";
DependencyGraphOption["Clear"] = "clear";
})(DependencyGraphOption || (exports.DependencyGraphOption = DependencyGraphOption = {}));
class CacheConfig {
isCacheDisabled() {
if (!cache.isFeatureAvailable()) {
return true;
}
return getBooleanInput('cache-disabled');
}
isCacheReadOnly() {
return !this.isCacheWriteOnly() && getBooleanInput('cache-read-only');
}
isCacheWriteOnly() {
return getBooleanInput('cache-write-only');
}
isCacheOverwriteExisting() {
return getBooleanInput('cache-overwrite-existing');
}
isCacheStrictMatch() {
return getBooleanInput('gradle-home-cache-strict-match');
}
isCacheCleanupEnabled() {
return getBooleanInput('gradle-home-cache-cleanup') && !this.isCacheReadOnly();
}
getCacheEncryptionKey() {
return core.getInput('cache-encryption-key');
}
getCacheIncludes() {
return core.getMultilineInput('gradle-home-cache-includes');
}
getCacheExcludes() {
return core.getMultilineInput('gradle-home-cache-excludes');
}
} }
exports.isCacheReadOnly = isCacheReadOnly; exports.CacheConfig = CacheConfig;
function isCacheWriteOnly() { class SummaryConfig {
return getBooleanInput('cache-write-only'); shouldGenerateJobSummary(hasFailure) {
if (!process.env[summary_1.SUMMARY_ENV_VAR]) {
return false;
}
if (!this.isJobSummaryEnabled()) {
return false;
}
return this.shouldAddJobSummary(this.getJobSummaryOption(), hasFailure);
}
shouldAddPRComment(hasFailure) {
return this.shouldAddJobSummary(this.getPRCommentOption(), hasFailure);
}
shouldAddJobSummary(option, hasFailure) {
switch (option) {
case JobSummaryOption.Always:
return true;
case JobSummaryOption.Never:
return false;
case JobSummaryOption.OnFailure:
return hasFailure;
}
}
isJobSummaryEnabled() {
return getBooleanInput('generate-job-summary', true);
}
getJobSummaryOption() {
return this.parseJobSummaryOption('add-job-summary');
}
getPRCommentOption() {
return this.parseJobSummaryOption('add-job-summary-as-pr-comment');
}
parseJobSummaryOption(paramName) {
const val = core.getInput(paramName);
switch (val.toLowerCase().trim()) {
case 'never':
return JobSummaryOption.Never;
case 'always':
return JobSummaryOption.Always;
case 'on-failure':
return JobSummaryOption.OnFailure;
}
throw TypeError(`The value '${val}' is not valid for ${paramName}. Valid values are: [never, always, on-failure].`);
}
} }
exports.isCacheWriteOnly = isCacheWriteOnly; exports.SummaryConfig = SummaryConfig;
function isCacheOverwriteExisting() { var JobSummaryOption;
return getBooleanInput('cache-overwrite-existing'); (function (JobSummaryOption) {
JobSummaryOption["Never"] = "never";
JobSummaryOption["Always"] = "always";
JobSummaryOption["OnFailure"] = "on-failure";
})(JobSummaryOption || (exports.JobSummaryOption = JobSummaryOption = {}));
class BuildScanConfig {
getBuildScanPublishEnabled() {
if (!this.verifyTermsOfUseAgreement()) {
return false;
}
return getBooleanInput('build-scan-publish') && this.verifyTermsOfUseAgreement();
}
getBuildScanTermsOfUseUrl() {
return this.getTermsOfUseProp('build-scan-terms-of-use-url', 'build-scan-terms-of-service-url');
}
getBuildScanTermsOfUseAgree() {
return this.getTermsOfUseProp('build-scan-terms-of-use-agree', 'build-scan-terms-of-service-agree');
}
verifyTermsOfUseAgreement() {
if ((this.getBuildScanTermsOfUseUrl() !== 'https://gradle.com/terms-of-service' &&
this.getBuildScanTermsOfUseUrl() !== 'https://gradle.com/help/legal-terms-of-use') ||
this.getBuildScanTermsOfUseAgree() !== 'yes') {
core.warning(`Terms of use at 'https://gradle.com/help/legal-terms-of-use' must be agreed in order to publish build scans.`);
return false;
}
return true;
}
getTermsOfUseProp(newPropName, oldPropName) {
const newProp = core.getInput(newPropName);
if (newProp !== '') {
return newProp;
}
return core.getInput(oldPropName);
}
} }
exports.isCacheOverwriteExisting = isCacheOverwriteExisting; exports.BuildScanConfig = BuildScanConfig;
function isCacheStrictMatch() {
return getBooleanInput('gradle-home-cache-strict-match');
}
exports.isCacheStrictMatch = isCacheStrictMatch;
function isCacheDebuggingEnabled() {
return process.env['GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED'] ? true : false;
}
exports.isCacheDebuggingEnabled = isCacheDebuggingEnabled;
function isCacheCleanupEnabled() {
return getBooleanInput('gradle-home-cache-cleanup');
}
exports.isCacheCleanupEnabled = isCacheCleanupEnabled;
function getCacheEncryptionKey() {
return core.getInput('cache-encryption-key');
}
exports.getCacheEncryptionKey = getCacheEncryptionKey;
function getCacheIncludes() {
return core.getMultilineInput('gradle-home-cache-includes');
}
exports.getCacheIncludes = getCacheIncludes;
function getCacheExcludes() {
return core.getMultilineInput('gradle-home-cache-excludes');
}
exports.getCacheExcludes = getCacheExcludes;
function getBuildRootDirectory() {
return core.getInput('build-root-directory');
}
exports.getBuildRootDirectory = getBuildRootDirectory;
function getGradleVersion() { function getGradleVersion() {
return core.getInput('gradle-version'); return core.getInput('gradle-version');
} }
exports.getGradleVersion = getGradleVersion; exports.getGradleVersion = getGradleVersion;
function getBuildRootDirectory() {
return core.getInput('build-root-directory');
}
exports.getBuildRootDirectory = getBuildRootDirectory;
function getArguments() { function getArguments() {
const input = core.getInput('arguments'); const input = core.getInput('arguments');
return (0, string_argv_1.parseArgsStringToArgv)(input); return (0, string_argv_1.parseArgsStringToArgv)(input);
@ -141665,77 +141766,6 @@ function getGithubToken() {
return core.getInput('github-token', { required: true }); return core.getInput('github-token', { required: true });
} }
exports.getGithubToken = getGithubToken; exports.getGithubToken = getGithubToken;
function isJobSummaryEnabled() {
return getBooleanInput('generate-job-summary', true);
}
exports.isJobSummaryEnabled = isJobSummaryEnabled;
function getJobSummaryOption() {
return parseJobSummaryOption('add-job-summary');
}
exports.getJobSummaryOption = getJobSummaryOption;
function getPRCommentOption() {
return parseJobSummaryOption('add-job-summary-as-pr-comment');
}
exports.getPRCommentOption = getPRCommentOption;
function getBuildScanPublishEnabled() {
return getBooleanInput('build-scan-publish');
}
exports.getBuildScanPublishEnabled = getBuildScanPublishEnabled;
function getBuildScanTermsOfUseUrl() {
return getTermsOfUseProp('build-scan-terms-of-use-url', 'build-scan-terms-of-service-url');
}
exports.getBuildScanTermsOfUseUrl = getBuildScanTermsOfUseUrl;
function getBuildScanTermsOfUseAgree() {
return getTermsOfUseProp('build-scan-terms-of-use-agree', 'build-scan-terms-of-service-agree');
}
exports.getBuildScanTermsOfUseAgree = getBuildScanTermsOfUseAgree;
function getTermsOfUseProp(newPropName, oldPropName) {
const newProp = core.getInput(newPropName);
if (newProp !== '') {
return newProp;
}
return core.getInput(oldPropName);
}
function parseJobSummaryOption(paramName) {
const val = core.getInput(paramName);
switch (val.toLowerCase().trim()) {
case 'never':
return JobSummaryOption.Never;
case 'always':
return JobSummaryOption.Always;
case 'on-failure':
return JobSummaryOption.OnFailure;
}
throw TypeError(`The value '${val}' is not valid for ${paramName}. Valid values are: [never, always, on-failure].`);
}
function getDependencyGraphOption() {
const val = core.getInput('dependency-graph');
switch (val.toLowerCase().trim()) {
case 'disabled':
return DependencyGraphOption.Disabled;
case 'generate':
return DependencyGraphOption.Generate;
case 'generate-and-submit':
return DependencyGraphOption.GenerateAndSubmit;
case 'generate-and-upload':
return DependencyGraphOption.GenerateAndUpload;
case 'download-and-submit':
return DependencyGraphOption.DownloadAndSubmit;
case 'clear':
return DependencyGraphOption.Clear;
}
throw TypeError(`The value '${val}' is not valid for 'dependency-graph'. Valid values are: [disabled, generate, generate-and-submit, generate-and-upload, download-and-submit, clear]. The default value is 'disabled'.`);
}
exports.getDependencyGraphOption = getDependencyGraphOption;
function getDependencyGraphContinueOnFailure() {
return getBooleanInput('dependency-graph-continue-on-failure', true);
}
exports.getDependencyGraphContinueOnFailure = getDependencyGraphContinueOnFailure;
function getArtifactRetentionDays() {
const val = core.getInput('artifact-retention-days');
return parseNumericInput('artifact-retention-days', val, 0);
}
exports.getArtifactRetentionDays = getArtifactRetentionDays;
function parseNumericInput(paramName, paramValue, paramDefault) { function parseNumericInput(paramName, paramValue, paramDefault) {
if (paramValue.length === 0) { if (paramValue.length === 0) {
return paramDefault; return paramDefault;
@ -141759,21 +141789,6 @@ function getBooleanInput(paramName, paramDefault = false) {
} }
throw TypeError(`The value '${paramValue} is not valid for '${paramName}. Valid values are: [true, false]`); throw TypeError(`The value '${paramValue} is not valid for '${paramName}. Valid values are: [true, false]`);
} }
var DependencyGraphOption;
(function (DependencyGraphOption) {
DependencyGraphOption["Disabled"] = "disabled";
DependencyGraphOption["Generate"] = "generate";
DependencyGraphOption["GenerateAndSubmit"] = "generate-and-submit";
DependencyGraphOption["GenerateAndUpload"] = "generate-and-upload";
DependencyGraphOption["DownloadAndSubmit"] = "download-and-submit";
DependencyGraphOption["Clear"] = "clear";
})(DependencyGraphOption || (exports.DependencyGraphOption = DependencyGraphOption = {}));
var JobSummaryOption;
(function (JobSummaryOption) {
JobSummaryOption["Never"] = "never";
JobSummaryOption["Always"] = "always";
JobSummaryOption["OnFailure"] = "on-failure";
})(JobSummaryOption || (exports.JobSummaryOption = JobSummaryOption = {}));
/***/ }), /***/ }),
@ -141819,15 +141834,15 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.generateJobSummary = void 0; exports.generateJobSummary = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const github = __importStar(__nccwpck_require__(95438)); const github = __importStar(__nccwpck_require__(95438));
const summary_1 = __nccwpck_require__(81327);
const request_error_1 = __nccwpck_require__(10537); const request_error_1 = __nccwpck_require__(10537);
const params = __importStar(__nccwpck_require__(23885));
const cache_reporting_1 = __nccwpck_require__(66674); const cache_reporting_1 = __nccwpck_require__(66674);
function generateJobSummary(buildResults, cacheListener) { const input_params_1 = __nccwpck_require__(23885);
function generateJobSummary(buildResults, cacheListener, config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const summaryTable = renderSummaryTable(buildResults); const summaryTable = renderSummaryTable(buildResults);
const cachingReport = (0, cache_reporting_1.generateCachingReport)(cacheListener); const cachingReport = (0, cache_reporting_1.generateCachingReport)(cacheListener);
if (shouldGenerateJobSummary(buildResults)) { const hasFailure = buildResults.some(result => result.buildFailed);
if (config.shouldGenerateJobSummary(hasFailure)) {
core.info('Generating Job Summary'); core.info('Generating Job Summary');
core.summary.addRaw(summaryTable); core.summary.addRaw(summaryTable);
core.summary.addRaw(cachingReport); core.summary.addRaw(cachingReport);
@ -141840,7 +141855,7 @@ function generateJobSummary(buildResults, cacheListener) {
core.info(cachingReport); core.info(cachingReport);
core.info('============================'); core.info('============================');
} }
if (shouldAddPRComment(buildResults)) { if (config.shouldAddPRComment(hasFailure)) {
yield addPRComment(summaryTable); yield addPRComment(summaryTable);
} }
}); });
@ -141861,7 +141876,7 @@ function addPRComment(jobSummary) {
</a> </a>
${jobSummary}`; ${jobSummary}`;
const github_token = params.getGithubToken(); const github_token = (0, input_params_1.getGithubToken)();
const octokit = github.getOctokit(github_token); const octokit = github.getOctokit(github_token);
try { try {
yield octokit.rest.issues.createComment(Object.assign(Object.assign({}, context.repo), { issue_number: pull_request_number, body: prComment })); yield octokit.rest.issues.createComment(Object.assign(Object.assign({}, context.repo), { issue_number: pull_request_number, body: prComment }));
@ -141929,29 +141944,6 @@ function renderBuildScanBadge(outcomeText, outcomeColor, targetUrl) {
const badgeHtml = `<img src="${badgeUrl}" alt="Build Scan ${outcomeText}" />`; const badgeHtml = `<img src="${badgeUrl}" alt="Build Scan ${outcomeText}" />`;
return `<a href="${targetUrl}" rel="nofollow" target="_blank">${badgeHtml}</a>`; return `<a href="${targetUrl}" rel="nofollow" target="_blank">${badgeHtml}</a>`;
} }
function shouldGenerateJobSummary(buildResults) {
if (!process.env[summary_1.SUMMARY_ENV_VAR]) {
return false;
}
if (!params.isJobSummaryEnabled()) {
return false;
}
return shouldAddJobSummary(params.getJobSummaryOption(), buildResults);
}
function shouldAddPRComment(buildResults) {
return shouldAddJobSummary(params.getPRCommentOption(), buildResults);
}
function shouldAddJobSummary(option, buildResults) {
switch (option) {
case params.JobSummaryOption.Always:
return true;
case params.JobSummaryOption.Never:
return false;
case params.JobSummaryOption.OnFailure:
core.info(`Got these build results: ${JSON.stringify(buildResults)}`);
return buildResults.some(result => result.buildFailed);
}
}
function truncateString(str, maxLength) { function truncateString(str, maxLength) {
if (str.length > maxLength) { if (str.length > maxLength) {
return `<div title='${str}'>${str.slice(0, maxLength - 1)}…</div>`; return `<div title='${str}'>${str.slice(0, maxLength - 1)}…</div>`;
@ -142013,6 +142005,7 @@ const toolCache = __importStar(__nccwpck_require__(27784));
const gradlew = __importStar(__nccwpck_require__(32335)); const gradlew = __importStar(__nccwpck_require__(32335));
const params = __importStar(__nccwpck_require__(23885)); const params = __importStar(__nccwpck_require__(23885));
const cache_utils_1 = __nccwpck_require__(41678); const cache_utils_1 = __nccwpck_require__(41678);
const input_params_1 = __nccwpck_require__(23885);
const gradleVersionsBaseUrl = 'https://services.gradle.org/versions'; const gradleVersionsBaseUrl = 'https://services.gradle.org/versions';
function provisionGradle() { function provisionGradle() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
@ -142130,7 +142123,8 @@ function locateGradleAndDownloadIfRequired(versionInfo) {
function downloadAndCacheGradleDistribution(versionInfo) { function downloadAndCacheGradleDistribution(versionInfo) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const downloadPath = path.join(os.homedir(), `gradle-installations/downloads/gradle-${versionInfo.version}-bin.zip`); const downloadPath = path.join(os.homedir(), `gradle-installations/downloads/gradle-${versionInfo.version}-bin.zip`);
if ((0, cache_utils_1.isCacheDisabled)()) { const cacheConfig = new input_params_1.CacheConfig();
if (cacheConfig.isCacheDisabled()) {
yield downloadGradleDistribution(versionInfo, downloadPath); yield downloadGradleDistribution(versionInfo, downloadPath);
return downloadPath; return downloadPath;
} }
@ -142147,7 +142141,7 @@ function downloadAndCacheGradleDistribution(versionInfo) {
} }
core.info(`Gradle distribution ${versionInfo.version} not found in cache. Will download.`); core.info(`Gradle distribution ${versionInfo.version} not found in cache. Will download.`);
yield downloadGradleDistribution(versionInfo, downloadPath); yield downloadGradleDistribution(versionInfo, downloadPath);
if (!(0, cache_utils_1.isCacheReadOnly)()) { if (!cacheConfig.isCacheReadOnly()) {
try { try {
yield cache.saveCache([downloadPath], cacheKey); yield cache.saveCache([downloadPath], cacheKey);
} }
@ -142282,8 +142276,6 @@ const path = __importStar(__nccwpck_require__(71017));
const os = __importStar(__nccwpck_require__(22037)); const os = __importStar(__nccwpck_require__(22037));
const caches = __importStar(__nccwpck_require__(23800)); const caches = __importStar(__nccwpck_require__(23800));
const layout = __importStar(__nccwpck_require__(28182)); const layout = __importStar(__nccwpck_require__(28182));
const params = __importStar(__nccwpck_require__(23885));
const dependencyGraph = __importStar(__nccwpck_require__(80));
const jobSummary = __importStar(__nccwpck_require__(87345)); const jobSummary = __importStar(__nccwpck_require__(87345));
const buildScan = __importStar(__nccwpck_require__(85772)); const buildScan = __importStar(__nccwpck_require__(85772));
const build_results_1 = __nccwpck_require__(82107); const build_results_1 = __nccwpck_require__(82107);
@ -142293,31 +142285,31 @@ const GRADLE_SETUP_VAR = 'GRADLE_BUILD_ACTION_SETUP_COMPLETED';
const USER_HOME = 'USER_HOME'; const USER_HOME = 'USER_HOME';
const GRADLE_USER_HOME = 'GRADLE_USER_HOME'; const GRADLE_USER_HOME = 'GRADLE_USER_HOME';
const CACHE_LISTENER = 'CACHE_LISTENER'; const CACHE_LISTENER = 'CACHE_LISTENER';
function setup() { function setup(cacheConfig, buildScanConfig) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const userHome = yield determineUserHome(); const userHome = yield determineUserHome();
const gradleUserHome = yield determineGradleUserHome(); const gradleUserHome = yield determineGradleUserHome();
if (process.env[GRADLE_SETUP_VAR]) { if (process.env[GRADLE_SETUP_VAR]) {
core.info('Gradle setup only performed on first gradle/actions step in workflow.'); core.info('Gradle setup only performed on first gradle/actions step in workflow.');
return; return false;
} }
core.exportVariable(GRADLE_SETUP_VAR, true); core.exportVariable(GRADLE_SETUP_VAR, true);
core.saveState(GRADLE_SETUP_VAR, true); core.saveState(GRADLE_SETUP_VAR, true);
core.saveState(USER_HOME, userHome); core.saveState(USER_HOME, userHome);
core.saveState(GRADLE_USER_HOME, gradleUserHome); core.saveState(GRADLE_USER_HOME, gradleUserHome);
const cacheListener = new cache_reporting_1.CacheListener(); const cacheListener = new cache_reporting_1.CacheListener();
yield caches.restore(userHome, gradleUserHome, cacheListener); yield caches.restore(userHome, gradleUserHome, cacheListener, cacheConfig);
core.saveState(CACHE_LISTENER, cacheListener.stringify()); core.saveState(CACHE_LISTENER, cacheListener.stringify());
yield dependencyGraph.setup(params.getDependencyGraphOption()); buildScan.setup(buildScanConfig);
buildScan.setup(); return true;
}); });
} }
exports.setup = setup; exports.setup = setup;
function complete() { function complete(cacheConfig, summaryConfig) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (!core.getState(GRADLE_SETUP_VAR)) { if (!core.getState(GRADLE_SETUP_VAR)) {
core.info('Gradle setup post-action only performed for first gradle/actions step in workflow.'); core.info('Gradle setup post-action only performed for first gradle/actions step in workflow.');
return; return false;
} }
core.info('In post-action step'); core.info('In post-action step');
const buildResults = (0, build_results_1.loadBuildResults)(); const buildResults = (0, build_results_1.loadBuildResults)();
@ -142325,10 +142317,10 @@ function complete() {
const gradleUserHome = core.getState(GRADLE_USER_HOME); const gradleUserHome = core.getState(GRADLE_USER_HOME);
const cacheListener = cache_reporting_1.CacheListener.rehydrate(core.getState(CACHE_LISTENER)); const cacheListener = cache_reporting_1.CacheListener.rehydrate(core.getState(CACHE_LISTENER));
const daemonController = new daemon_controller_1.DaemonController(buildResults); const daemonController = new daemon_controller_1.DaemonController(buildResults);
yield caches.save(userHome, gradleUserHome, cacheListener, daemonController); yield caches.save(userHome, gradleUserHome, cacheListener, daemonController, cacheConfig);
yield jobSummary.generateJobSummary(buildResults, cacheListener); yield jobSummary.generateJobSummary(buildResults, cacheListener, summaryConfig);
yield dependencyGraph.complete(params.getDependencyGraphOption());
core.info('Completed post-action step'); core.info('Completed post-action step');
return true;
}); });
} }
exports.complete = complete; exports.complete = complete;
@ -142404,13 +142396,15 @@ const setupGradle = __importStar(__nccwpck_require__(18652));
const execution = __importStar(__nccwpck_require__(23584)); const execution = __importStar(__nccwpck_require__(23584));
const provisioner = __importStar(__nccwpck_require__(32501)); const provisioner = __importStar(__nccwpck_require__(32501));
const layout = __importStar(__nccwpck_require__(28182)); const layout = __importStar(__nccwpck_require__(28182));
const params = __importStar(__nccwpck_require__(23885)); const dependencyGraph = __importStar(__nccwpck_require__(80));
const input_params_1 = __nccwpck_require__(23885);
function run() { function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
try { try {
yield setupGradle.setup(); yield setupGradle.setup(new input_params_1.CacheConfig(), new input_params_1.BuildScanConfig());
yield dependencyGraph.setup(new input_params_1.DependencyGraphConfig());
const executable = yield provisioner.provisionGradle(); const executable = yield provisioner.provisionGradle();
const args = params.getArguments(); const args = (0, input_params_1.getArguments)();
if (args.length > 0) { if (args.length > 0) {
const buildRootDirectory = layout.buildRootDirectory(); const buildRootDirectory = layout.buildRootDirectory();
yield execution.executeGradleBuild(executable, buildRootDirectory, args); yield execution.executeGradleBuild(executable, buildRootDirectory, args);

File diff suppressed because one or more lines are too long

View File

@ -137180,28 +137180,18 @@ var __importStar = (this && this.__importStar) || function (mod) {
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.setup = void 0; exports.setup = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const input_params_1 = __nccwpck_require__(23885); function setup(config) {
function setup() {
maybeExportVariable('DEVELOCITY_INJECTION_INIT_SCRIPT_NAME', 'gradle-actions.inject-develocity.init.gradle'); maybeExportVariable('DEVELOCITY_INJECTION_INIT_SCRIPT_NAME', 'gradle-actions.inject-develocity.init.gradle');
maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions'); maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions');
if ((0, input_params_1.getBuildScanPublishEnabled)() && verifyTermsOfUseAgreement()) { if (config.getBuildScanPublishEnabled()) {
maybeExportVariable('DEVELOCITY_INJECTION_ENABLED', 'true'); maybeExportVariable('DEVELOCITY_INJECTION_ENABLED', 'true');
maybeExportVariable('DEVELOCITY_PLUGIN_VERSION', '3.17'); maybeExportVariable('DEVELOCITY_PLUGIN_VERSION', '3.17');
maybeExportVariable('DEVELOCITY_CCUD_PLUGIN_VERSION', '1.13'); maybeExportVariable('DEVELOCITY_CCUD_PLUGIN_VERSION', '1.13');
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', (0, input_params_1.getBuildScanTermsOfUseUrl)()); maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', config.getBuildScanTermsOfUseUrl());
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', (0, input_params_1.getBuildScanTermsOfUseAgree)()); maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', config.getBuildScanTermsOfUseAgree());
} }
} }
exports.setup = setup; exports.setup = setup;
function verifyTermsOfUseAgreement() {
if (((0, input_params_1.getBuildScanTermsOfUseUrl)() !== 'https://gradle.com/terms-of-service' &&
(0, input_params_1.getBuildScanTermsOfUseUrl)() !== 'https://gradle.com/help/legal-terms-of-use') ||
(0, input_params_1.getBuildScanTermsOfUseAgree)() !== 'yes') {
core.warning(`Terms of use must be agreed in order to publish build scans.`);
return false;
}
return true;
}
function maybeExportVariable(variableName, value) { function maybeExportVariable(variableName, value) {
if (!process.env[variableName]) { if (!process.env[variableName]) {
core.exportVariable(variableName, value); core.exportVariable(variableName, value);
@ -137258,21 +137248,21 @@ const exec = __importStar(__nccwpck_require__(71514));
const glob = __importStar(__nccwpck_require__(28090)); const glob = __importStar(__nccwpck_require__(28090));
const path_1 = __importDefault(__nccwpck_require__(71017)); const path_1 = __importDefault(__nccwpck_require__(71017));
const fs_1 = __importDefault(__nccwpck_require__(57147)); const fs_1 = __importDefault(__nccwpck_require__(57147));
const params = __importStar(__nccwpck_require__(23885));
const cache_utils_1 = __nccwpck_require__(41678); const cache_utils_1 = __nccwpck_require__(41678);
const cache_extract_entries_1 = __nccwpck_require__(76161); const cache_extract_entries_1 = __nccwpck_require__(76161);
const RESTORED_CACHE_KEY_KEY = 'restored-cache-key'; const RESTORED_CACHE_KEY_KEY = 'restored-cache-key';
exports.META_FILE_DIR = '.setup-gradle'; exports.META_FILE_DIR = '.setup-gradle';
class GradleStateCache { class GradleStateCache {
constructor(userHome, gradleUserHome) { constructor(userHome, gradleUserHome, cacheConfig) {
this.userHome = userHome; this.userHome = userHome;
this.gradleUserHome = gradleUserHome; this.gradleUserHome = gradleUserHome;
this.cacheConfig = cacheConfig;
this.cacheName = 'gradle'; this.cacheName = 'gradle';
this.cacheDescription = 'Gradle User Home'; this.cacheDescription = 'Gradle User Home';
} }
init() { init() {
this.initializeGradleUserHome(); this.initializeGradleUserHome();
const encryptionKey = params.getCacheEncryptionKey(); const encryptionKey = this.cacheConfig.getCacheEncryptionKey();
if (encryptionKey) { if (encryptionKey) {
core.exportVariable('GRADLE_ENCRYPTION_KEY', encryptionKey); core.exportVariable('GRADLE_ENCRYPTION_KEY', encryptionKey);
} }
@ -137288,7 +137278,7 @@ class GradleStateCache {
restore(listener) { restore(listener) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const entryListener = listener.entry(this.cacheDescription); const entryListener = listener.entry(this.cacheDescription);
const cacheKey = (0, cache_utils_1.generateCacheKey)(this.cacheName); const cacheKey = (0, cache_utils_1.generateCacheKey)(this.cacheName, this.cacheConfig);
(0, cache_utils_1.cacheDebug)(`Requesting ${this.cacheDescription} with (0, cache_utils_1.cacheDebug)(`Requesting ${this.cacheDescription} with
key:${cacheKey.key} key:${cacheKey.key}
restoreKeys:[${cacheKey.restoreKeys}]`); restoreKeys:[${cacheKey.restoreKeys}]`);
@ -137310,14 +137300,14 @@ class GradleStateCache {
afterRestore(listener) { afterRestore(listener) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
yield this.debugReportGradleUserHomeSize('as restored from cache'); yield this.debugReportGradleUserHomeSize('as restored from cache');
yield new cache_extract_entries_1.GradleHomeEntryExtractor(this.gradleUserHome).restore(listener); yield new cache_extract_entries_1.GradleHomeEntryExtractor(this.gradleUserHome, this.cacheConfig).restore(listener);
yield new cache_extract_entries_1.ConfigurationCacheEntryExtractor(this.gradleUserHome).restore(listener); yield new cache_extract_entries_1.ConfigurationCacheEntryExtractor(this.gradleUserHome, this.cacheConfig).restore(listener);
yield this.debugReportGradleUserHomeSize('after restoring common artifacts'); yield this.debugReportGradleUserHomeSize('after restoring common artifacts');
}); });
} }
save(listener) { save(listener) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const cacheKey = (0, cache_utils_1.generateCacheKey)(this.cacheName).key; const cacheKey = (0, cache_utils_1.generateCacheKey)(this.cacheName, this.cacheConfig).key;
const restoredCacheKey = core.getState(RESTORED_CACHE_KEY_KEY); const restoredCacheKey = core.getState(RESTORED_CACHE_KEY_KEY);
const gradleHomeEntryListener = listener.entry(this.cacheDescription); const gradleHomeEntryListener = listener.entry(this.cacheDescription);
if (restoredCacheKey && cacheKey === restoredCacheKey) { if (restoredCacheKey && cacheKey === restoredCacheKey) {
@ -137350,15 +137340,15 @@ class GradleStateCache {
yield this.debugReportGradleUserHomeSize('before saving common artifacts'); yield this.debugReportGradleUserHomeSize('before saving common artifacts');
yield this.deleteExcludedPaths(); yield this.deleteExcludedPaths();
yield Promise.all([ yield Promise.all([
new cache_extract_entries_1.GradleHomeEntryExtractor(this.gradleUserHome).extract(listener), new cache_extract_entries_1.GradleHomeEntryExtractor(this.gradleUserHome, this.cacheConfig).extract(listener),
new cache_extract_entries_1.ConfigurationCacheEntryExtractor(this.gradleUserHome).extract(listener) new cache_extract_entries_1.ConfigurationCacheEntryExtractor(this.gradleUserHome, this.cacheConfig).extract(listener)
]); ]);
yield this.debugReportGradleUserHomeSize("after extracting common artifacts (only 'caches' and 'notifications' will be stored)"); yield this.debugReportGradleUserHomeSize("after extracting common artifacts (only 'caches' and 'notifications' will be stored)");
}); });
} }
deleteExcludedPaths() { deleteExcludedPaths() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const rawPaths = params.getCacheExcludes(); const rawPaths = this.cacheConfig.getCacheExcludes();
rawPaths.push('caches/*/cc-keystore'); rawPaths.push('caches/*/cc-keystore');
const resolvedPaths = rawPaths.map(x => path_1.default.resolve(this.gradleUserHome, x)); const resolvedPaths = rawPaths.map(x => path_1.default.resolve(this.gradleUserHome, x));
for (const p of resolvedPaths) { for (const p of resolvedPaths) {
@ -137374,7 +137364,7 @@ class GradleStateCache {
}); });
} }
getCachePath() { getCachePath() {
const rawPaths = params.getCacheIncludes(); const rawPaths = this.cacheConfig.getCacheIncludes();
rawPaths.push(exports.META_FILE_DIR); rawPaths.push(exports.META_FILE_DIR);
const resolvedPaths = rawPaths.map(x => this.resolveCachePath(x)); const resolvedPaths = rawPaths.map(x => this.resolveCachePath(x));
(0, cache_utils_1.cacheDebug)(`Using cache paths: ${resolvedPaths}`); (0, cache_utils_1.cacheDebug)(`Using cache paths: ${resolvedPaths}`);
@ -137646,7 +137636,6 @@ const fs_1 = __importDefault(__nccwpck_require__(57147));
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const glob = __importStar(__nccwpck_require__(28090)); const glob = __importStar(__nccwpck_require__(28090));
const semver = __importStar(__nccwpck_require__(11383)); const semver = __importStar(__nccwpck_require__(11383));
const params = __importStar(__nccwpck_require__(23885));
const cache_base_1 = __nccwpck_require__(47591); const cache_base_1 = __nccwpck_require__(47591);
const cache_utils_1 = __nccwpck_require__(41678); const cache_utils_1 = __nccwpck_require__(41678);
const build_results_1 = __nccwpck_require__(82107); const build_results_1 = __nccwpck_require__(82107);
@ -137680,9 +137669,10 @@ class ExtractedCacheEntryDefinition {
} }
} }
class AbstractEntryExtractor { class AbstractEntryExtractor {
constructor(gradleUserHome, extractorName) { constructor(gradleUserHome, extractorName, cacheConfig) {
this.gradleUserHome = gradleUserHome; this.gradleUserHome = gradleUserHome;
this.extractorName = extractorName; this.extractorName = extractorName;
this.cacheConfig = cacheConfig;
} }
restore(listener) { restore(listener) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
@ -137787,7 +137777,7 @@ class AbstractEntryExtractor {
} }
awaitForDebugging(p) { awaitForDebugging(p) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (params.isCacheDebuggingEnabled()) { if ((0, cache_utils_1.isCacheDebuggingEnabled)()) {
yield p; yield p;
} }
return p; return p;
@ -137817,8 +137807,8 @@ class AbstractEntryExtractor {
} }
} }
class GradleHomeEntryExtractor extends AbstractEntryExtractor { class GradleHomeEntryExtractor extends AbstractEntryExtractor {
constructor(gradleUserHome) { constructor(gradleUserHome, cacheConfig) {
super(gradleUserHome, 'gradle-home'); super(gradleUserHome, 'gradle-home', cacheConfig);
} }
extract(listener) { extract(listener) {
const _super = Object.create(null, { const _super = Object.create(null, {
@ -137864,8 +137854,8 @@ class GradleHomeEntryExtractor extends AbstractEntryExtractor {
} }
exports.GradleHomeEntryExtractor = GradleHomeEntryExtractor; exports.GradleHomeEntryExtractor = GradleHomeEntryExtractor;
class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor { class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
constructor(gradleUserHome) { constructor(gradleUserHome, cacheConfig) {
super(gradleUserHome, 'configuration-cache'); super(gradleUserHome, 'configuration-cache', cacheConfig);
} }
restore(listener) { restore(listener) {
const _super = Object.create(null, { const _super = Object.create(null, {
@ -137876,7 +137866,7 @@ class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
this.markNotRestored(listener, 'Gradle User Home was not fully restored'); this.markNotRestored(listener, 'Gradle User Home was not fully restored');
return; return;
} }
if (!params.getCacheEncryptionKey()) { if (!this.cacheConfig.getCacheEncryptionKey()) {
this.markNotRestored(listener, 'Encryption Key was not provided'); this.markNotRestored(listener, 'Encryption Key was not provided');
return; return;
} }
@ -137898,7 +137888,7 @@ class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
extract: { get: () => super.extract } extract: { get: () => super.extract }
}); });
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (!params.getCacheEncryptionKey()) { if (!this.cacheConfig.getCacheEncryptionKey()) {
const cacheEntryDefinitions = this.getExtractedCacheEntryDefinitions(); const cacheEntryDefinitions = this.getExtractedCacheEntryDefinitions();
if (cacheEntryDefinitions.length > 0) { if (cacheEntryDefinitions.length > 0) {
core.info('Not saving configuration-cache state, as no encryption key was provided'); core.info('Not saving configuration-cache state, as no encryption key was provided');
@ -138198,7 +138188,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}); });
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.tryDelete = exports.handleCacheFailure = exports.cacheDebug = exports.saveCache = exports.restoreCache = exports.hashStrings = exports.hashFileNames = exports.getCacheKeyPrefix = exports.generateCacheKey = exports.CacheKey = exports.isCacheCleanupEnabled = exports.isCacheDebuggingEnabled = exports.isCacheOverwriteExisting = exports.isCacheWriteOnly = exports.isCacheReadOnly = exports.isCacheDisabled = void 0; exports.tryDelete = exports.handleCacheFailure = exports.cacheDebug = exports.saveCache = exports.restoreCache = exports.hashStrings = exports.hashFileNames = exports.getCacheKeyPrefix = exports.generateCacheKey = exports.CacheKey = exports.isCacheDebuggingEnabled = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const cache = __importStar(__nccwpck_require__(27799)); const cache = __importStar(__nccwpck_require__(27799));
const github = __importStar(__nccwpck_require__(95438)); const github = __importStar(__nccwpck_require__(95438));
@ -138206,7 +138196,7 @@ const exec = __importStar(__nccwpck_require__(71514));
const crypto = __importStar(__nccwpck_require__(6113)); const crypto = __importStar(__nccwpck_require__(6113));
const path = __importStar(__nccwpck_require__(71017)); const path = __importStar(__nccwpck_require__(71017));
const fs = __importStar(__nccwpck_require__(57147)); const fs = __importStar(__nccwpck_require__(57147));
const params = __importStar(__nccwpck_require__(23885)); const input_params_1 = __nccwpck_require__(23885);
const CACHE_PROTOCOL_VERSION = 'v9-'; const CACHE_PROTOCOL_VERSION = 'v9-';
const CACHE_KEY_PREFIX_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_PREFIX'; const CACHE_KEY_PREFIX_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_PREFIX';
const CACHE_KEY_OS_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_ENVIRONMENT'; const CACHE_KEY_OS_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_ENVIRONMENT';
@ -138215,33 +138205,13 @@ const CACHE_KEY_JOB_INSTANCE_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_JOB_INSTANCE';
const CACHE_KEY_JOB_EXECUTION_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_JOB_EXECUTION'; const CACHE_KEY_JOB_EXECUTION_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_JOB_EXECUTION';
const SEGMENT_DOWNLOAD_TIMEOUT_VAR = 'SEGMENT_DOWNLOAD_TIMEOUT_MINS'; const SEGMENT_DOWNLOAD_TIMEOUT_VAR = 'SEGMENT_DOWNLOAD_TIMEOUT_MINS';
const SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT = 10 * 60 * 1000; const SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT = 10 * 60 * 1000;
function isCacheDisabled() { function isCacheDebuggingEnabled() {
if (!cache.isFeatureAvailable()) { if (core.isDebug()) {
return true; return true;
} }
return params.isCacheDisabled(); return process.env['GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED'] ? true : false;
}
exports.isCacheDisabled = isCacheDisabled;
function isCacheReadOnly() {
return !isCacheWriteOnly() && params.isCacheReadOnly();
}
exports.isCacheReadOnly = isCacheReadOnly;
function isCacheWriteOnly() {
return params.isCacheWriteOnly();
}
exports.isCacheWriteOnly = isCacheWriteOnly;
function isCacheOverwriteExisting() {
return params.isCacheOverwriteExisting();
}
exports.isCacheOverwriteExisting = isCacheOverwriteExisting;
function isCacheDebuggingEnabled() {
return params.isCacheDebuggingEnabled();
} }
exports.isCacheDebuggingEnabled = isCacheDebuggingEnabled; exports.isCacheDebuggingEnabled = isCacheDebuggingEnabled;
function isCacheCleanupEnabled() {
return params.isCacheCleanupEnabled();
}
exports.isCacheCleanupEnabled = isCacheCleanupEnabled;
class CacheKey { class CacheKey {
constructor(key, restoreKeys) { constructor(key, restoreKeys) {
this.key = key; this.key = key;
@ -138249,13 +138219,13 @@ class CacheKey {
} }
} }
exports.CacheKey = CacheKey; exports.CacheKey = CacheKey;
function generateCacheKey(cacheName) { function generateCacheKey(cacheName, config) {
const cacheKeyBase = `${getCacheKeyPrefix()}${CACHE_PROTOCOL_VERSION}${cacheName}`; const cacheKeyBase = `${getCacheKeyPrefix()}${CACHE_PROTOCOL_VERSION}${cacheName}`;
const cacheKeyForEnvironment = `${cacheKeyBase}|${getCacheKeyEnvironment()}`; const cacheKeyForEnvironment = `${cacheKeyBase}|${getCacheKeyEnvironment()}`;
const cacheKeyForJob = `${cacheKeyForEnvironment}|${getCacheKeyJob()}`; const cacheKeyForJob = `${cacheKeyForEnvironment}|${getCacheKeyJob()}`;
const cacheKeyForJobContext = `${cacheKeyForJob}[${getCacheKeyJobInstance()}]`; const cacheKeyForJobContext = `${cacheKeyForJob}[${getCacheKeyJobInstance()}]`;
const cacheKey = `${cacheKeyForJobContext}-${getCacheKeyJobExecution()}`; const cacheKey = `${cacheKeyForJobContext}-${getCacheKeyJobExecution()}`;
if (params.isCacheStrictMatch()) { if (config.isCacheStrictMatch()) {
return new CacheKey(cacheKey, [cacheKeyForJobContext]); return new CacheKey(cacheKey, [cacheKeyForJobContext]);
} }
return new CacheKey(cacheKey, [cacheKeyForJobContext, cacheKeyForJob, cacheKeyForEnvironment]); return new CacheKey(cacheKey, [cacheKeyForJobContext, cacheKeyForJob, cacheKeyForEnvironment]);
@ -138278,7 +138248,7 @@ function getCacheKeyJobInstance() {
return override; return override;
} }
const workflowName = github.context.workflow; const workflowName = github.context.workflow;
const workflowJobContext = params.getJobMatrix(); const workflowJobContext = (0, input_params_1.getJobMatrix)();
return hashStrings([workflowName, workflowJobContext]); return hashStrings([workflowName, workflowJobContext]);
} }
function getCacheKeyJobExecution() { function getCacheKeyJobExecution() {
@ -138447,26 +138417,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.save = exports.restore = void 0; exports.save = exports.restore = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const cache_utils_1 = __nccwpck_require__(41678);
const cache_base_1 = __nccwpck_require__(47591); const cache_base_1 = __nccwpck_require__(47591);
const cache_cleaner_1 = __nccwpck_require__(57); const cache_cleaner_1 = __nccwpck_require__(57);
const CACHE_RESTORED_VAR = 'GRADLE_BUILD_ACTION_CACHE_RESTORED'; const CACHE_RESTORED_VAR = 'GRADLE_BUILD_ACTION_CACHE_RESTORED';
function restore(userHome, gradleUserHome, cacheListener) { function restore(userHome, gradleUserHome, cacheListener, cacheConfig) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (process.env[CACHE_RESTORED_VAR]) { if (process.env[CACHE_RESTORED_VAR]) {
core.info('Cache only restored on first action step.'); core.info('Cache only restored on first action step.');
return; return;
} }
core.exportVariable(CACHE_RESTORED_VAR, true); core.exportVariable(CACHE_RESTORED_VAR, true);
const gradleStateCache = new cache_base_1.GradleStateCache(userHome, gradleUserHome); const gradleStateCache = new cache_base_1.GradleStateCache(userHome, gradleUserHome, cacheConfig);
if ((0, cache_utils_1.isCacheDisabled)()) { if (cacheConfig.isCacheDisabled()) {
core.info('Cache is disabled: will not restore state from previous builds.'); core.info('Cache is disabled: will not restore state from previous builds.');
gradleStateCache.init(); gradleStateCache.init();
cacheListener.cacheDisabled = true; cacheListener.cacheDisabled = true;
return; return;
} }
if (gradleStateCache.cacheOutputExists()) { if (gradleStateCache.cacheOutputExists()) {
if (!(0, cache_utils_1.isCacheOverwriteExisting)()) { if (!cacheConfig.isCacheOverwriteExisting()) {
core.info('Gradle User Home already exists: will not restore from cache.'); core.info('Gradle User Home already exists: will not restore from cache.');
gradleStateCache.init(); gradleStateCache.init();
cacheListener.cacheDisabled = true; cacheListener.cacheDisabled = true;
@ -138477,7 +138446,7 @@ function restore(userHome, gradleUserHome, cacheListener) {
} }
gradleStateCache.init(); gradleStateCache.init();
core.saveState(CACHE_RESTORED_VAR, true); core.saveState(CACHE_RESTORED_VAR, true);
if ((0, cache_utils_1.isCacheWriteOnly)()) { if (cacheConfig.isCacheWriteOnly()) {
core.info('Cache is write-only: will not restore from cache.'); core.info('Cache is write-only: will not restore from cache.');
cacheListener.cacheWriteOnly = true; cacheListener.cacheWriteOnly = true;
return; return;
@ -138485,7 +138454,7 @@ function restore(userHome, gradleUserHome, cacheListener) {
yield core.group('Restore Gradle state from cache', () => __awaiter(this, void 0, void 0, function* () { yield core.group('Restore Gradle state from cache', () => __awaiter(this, void 0, void 0, function* () {
yield gradleStateCache.restore(cacheListener); yield gradleStateCache.restore(cacheListener);
})); }));
if ((0, cache_utils_1.isCacheCleanupEnabled)() && !(0, cache_utils_1.isCacheReadOnly)()) { if (cacheConfig.isCacheCleanupEnabled()) {
core.info('Preparing cache for cleanup.'); core.info('Preparing cache for cleanup.');
const cacheCleaner = new cache_cleaner_1.CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']); const cacheCleaner = new cache_cleaner_1.CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']);
yield cacheCleaner.prepare(); yield cacheCleaner.prepare();
@ -138493,9 +138462,9 @@ function restore(userHome, gradleUserHome, cacheListener) {
}); });
} }
exports.restore = restore; exports.restore = restore;
function save(userHome, gradleUserHome, cacheListener, daemonController) { function save(userHome, gradleUserHome, cacheListener, daemonController, cacheConfig) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if ((0, cache_utils_1.isCacheDisabled)()) { if (cacheConfig.isCacheDisabled()) {
core.info('Cache is disabled: will not save state for later builds.'); core.info('Cache is disabled: will not save state for later builds.');
return; return;
} }
@ -138503,13 +138472,13 @@ function save(userHome, gradleUserHome, cacheListener, daemonController) {
core.info('Cache will not be saved: not restored in main action step.'); core.info('Cache will not be saved: not restored in main action step.');
return; return;
} }
if ((0, cache_utils_1.isCacheReadOnly)()) { if (cacheConfig.isCacheReadOnly()) {
core.info('Cache is read-only: will not save state for use in subsequent builds.'); core.info('Cache is read-only: will not save state for use in subsequent builds.');
cacheListener.cacheReadOnly = true; cacheListener.cacheReadOnly = true;
return; return;
} }
yield daemonController.stopAllDaemons(); yield daemonController.stopAllDaemons();
if ((0, cache_utils_1.isCacheCleanupEnabled)()) { if (cacheConfig.isCacheCleanupEnabled()) {
core.info('Forcing cache cleanup.'); core.info('Forcing cache cleanup.');
const cacheCleaner = new cache_cleaner_1.CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']); const cacheCleaner = new cache_cleaner_1.CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']);
try { try {
@ -138520,7 +138489,7 @@ function save(userHome, gradleUserHome, cacheListener, daemonController) {
} }
} }
yield core.group('Caching Gradle state', () => __awaiter(this, void 0, void 0, function* () { yield core.group('Caching Gradle state', () => __awaiter(this, void 0, void 0, function* () {
return new cache_base_1.GradleStateCache(userHome, gradleUserHome).save(cacheListener); return new cache_base_1.GradleStateCache(userHome, gradleUserHome, cacheConfig).save(cacheListener);
})); }));
}); });
} }
@ -138643,7 +138612,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.constructJobCorrelator = exports.complete = exports.setup = void 0; exports.complete = exports.setup = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const github = __importStar(__nccwpck_require__(95438)); const github = __importStar(__nccwpck_require__(95438));
const glob = __importStar(__nccwpck_require__(28090)); const glob = __importStar(__nccwpck_require__(28090));
@ -138655,25 +138624,26 @@ const layout = __importStar(__nccwpck_require__(28182));
const errors_1 = __nccwpck_require__(36976); const errors_1 = __nccwpck_require__(36976);
const input_params_1 = __nccwpck_require__(23885); const input_params_1 = __nccwpck_require__(23885);
const DEPENDENCY_GRAPH_PREFIX = 'dependency-graph_'; const DEPENDENCY_GRAPH_PREFIX = 'dependency-graph_';
function setup(option) { function setup(config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (option === input_params_1.DependencyGraphOption.Disabled) { if (config.dependencyGraphOption === input_params_1.DependencyGraphOption.Disabled) {
core.exportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'false');
return; return;
} }
if (option === input_params_1.DependencyGraphOption.DownloadAndSubmit) { if (config.dependencyGraphOption === input_params_1.DependencyGraphOption.DownloadAndSubmit) {
yield downloadAndSubmitDependencyGraphs(); yield downloadAndSubmitDependencyGraphs(config);
return; return;
} }
core.info('Enabling dependency graph generation'); core.info('Enabling dependency graph generation');
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'true'); core.exportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'true');
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_CONTINUE_ON_FAILURE', (0, input_params_1.getDependencyGraphContinueOnFailure)()); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_CONTINUE_ON_FAILURE', config.continueOnFailure);
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_CORRELATOR', getJobCorrelator()); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_CORRELATOR', config.getJobCorrelator());
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_ID', github.context.runId); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_ID', github.context.runId);
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_REF', github.context.ref); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_REF', github.context.ref);
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_SHA', getShaFromContext()); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_SHA', getShaFromContext());
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_WORKSPACE', layout.workspaceDirectory()); maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_WORKSPACE', layout.workspaceDirectory());
maybeExportVariable('DEPENDENCY_GRAPH_REPORT_DIR', path.resolve(layout.workspaceDirectory(), 'dependency-graph-reports')); maybeExportVariable('DEPENDENCY_GRAPH_REPORT_DIR', path.resolve(layout.workspaceDirectory(), 'dependency-graph-reports'));
if (option === input_params_1.DependencyGraphOption.Clear) { if (config.dependencyGraphOption === input_params_1.DependencyGraphOption.Clear) {
core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_PROJECTS', ''); core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_PROJECTS', '');
core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS', ''); core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS', '');
} }
@ -138685,10 +138655,14 @@ function maybeExportVariable(variableName, value) {
core.exportVariable(variableName, value); core.exportVariable(variableName, value);
} }
} }
function complete(option) { function complete(config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (isRunningInActEnvironment()) {
core.info('Dependency graph upload and submit not supported in the ACT environment.');
return;
}
try { try {
switch (option) { switch (config.dependencyGraphOption) {
case input_params_1.DependencyGraphOption.Disabled: case input_params_1.DependencyGraphOption.Disabled:
case input_params_1.DependencyGraphOption.Generate: case input_params_1.DependencyGraphOption.Generate:
case input_params_1.DependencyGraphOption.DownloadAndSubmit: case input_params_1.DependencyGraphOption.DownloadAndSubmit:
@ -138698,11 +138672,11 @@ function complete(option) {
yield submitDependencyGraphs(yield findGeneratedDependencyGraphFiles()); yield submitDependencyGraphs(yield findGeneratedDependencyGraphFiles());
return; return;
case input_params_1.DependencyGraphOption.GenerateAndUpload: case input_params_1.DependencyGraphOption.GenerateAndUpload:
yield uploadDependencyGraphs(yield findGeneratedDependencyGraphFiles()); yield uploadDependencyGraphs(yield findGeneratedDependencyGraphFiles(), config);
} }
} }
catch (e) { catch (e) {
warnOrFail(option, e); warnOrFail(config, e);
} }
}); });
} }
@ -138713,7 +138687,7 @@ function findGeneratedDependencyGraphFiles() {
return yield findDependencyGraphFiles(workspaceDirectory); return yield findDependencyGraphFiles(workspaceDirectory);
}); });
} }
function uploadDependencyGraphs(dependencyGraphFiles) { function uploadDependencyGraphs(dependencyGraphFiles, config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const workspaceDirectory = layout.workspaceDirectory(); const workspaceDirectory = layout.workspaceDirectory();
const artifactClient = new artifact_1.DefaultArtifactClient(); const artifactClient = new artifact_1.DefaultArtifactClient();
@ -138722,18 +138696,22 @@ function uploadDependencyGraphs(dependencyGraphFiles) {
core.info(`Uploading dependency graph file: ${relativePath}`); core.info(`Uploading dependency graph file: ${relativePath}`);
const artifactName = `${DEPENDENCY_GRAPH_PREFIX}${path.basename(dependencyGraphFile)}`; const artifactName = `${DEPENDENCY_GRAPH_PREFIX}${path.basename(dependencyGraphFile)}`;
yield artifactClient.uploadArtifact(artifactName, [dependencyGraphFile], workspaceDirectory, { yield artifactClient.uploadArtifact(artifactName, [dependencyGraphFile], workspaceDirectory, {
retentionDays: (0, input_params_1.getArtifactRetentionDays)() retentionDays: config.artifactRetentionDays
}); });
} }
}); });
} }
function downloadAndSubmitDependencyGraphs() { function downloadAndSubmitDependencyGraphs(config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (isRunningInActEnvironment()) {
core.info('Dependency graph download and submit not supported in the ACT environment.');
return;
}
try { try {
yield submitDependencyGraphs(yield downloadDependencyGraphs()); yield submitDependencyGraphs(yield downloadDependencyGraphs());
} }
catch (e) { catch (e) {
warnOrFail(input_params_1.DependencyGraphOption.DownloadAndSubmit, e); warnOrFail(config, e);
} }
}); });
} }
@ -138811,11 +138789,11 @@ function findDependencyGraphFiles(dir) {
return graphFiles; return graphFiles;
}); });
} }
function warnOrFail(option, error) { function warnOrFail(config, error) {
if (!(0, input_params_1.getDependencyGraphContinueOnFailure)()) { if (!config.continueOnFailure) {
throw new errors_1.PostActionJobFailure(error); throw new errors_1.PostActionJobFailure(error);
} }
core.warning(`Failed to ${option} dependency graph. Will continue.\n${String(error)}`); core.warning(`Failed to ${config.dependencyGraphOption} dependency graph. Will continue.\n${String(error)}`);
} }
function getOctokit() { function getOctokit() {
return github.getOctokit((0, input_params_1.getGithubToken)()); return github.getOctokit((0, input_params_1.getGithubToken)());
@ -138840,28 +138818,8 @@ function getShaFromContext() {
return context.sha; return context.sha;
} }
} }
function getJobCorrelator() { function isRunningInActEnvironment() {
return constructJobCorrelator(github.context.workflow, github.context.job, (0, input_params_1.getJobMatrix)()); return process.env.ACT !== undefined;
}
function constructJobCorrelator(workflow, jobId, matrixJson) {
const matrixString = describeMatrix(matrixJson);
const label = matrixString ? `${workflow}-${jobId}-${matrixString}` : `${workflow}-${jobId}`;
return sanitize(label);
}
exports.constructJobCorrelator = constructJobCorrelator;
function describeMatrix(matrixJson) {
core.debug(`Got matrix json: ${matrixJson}`);
const matrix = JSON.parse(matrixJson);
if (matrix) {
return Object.values(matrix).join('-');
}
return '';
}
function sanitize(value) {
return value
.replace(/[^a-zA-Z0-9_-\s]/g, '')
.replace(/\s+/g, '_')
.toLowerCase();
} }
@ -138920,57 +138878,200 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.JobSummaryOption = exports.DependencyGraphOption = exports.parseNumericInput = exports.getArtifactRetentionDays = exports.getDependencyGraphContinueOnFailure = exports.getDependencyGraphOption = exports.getBuildScanTermsOfUseAgree = exports.getBuildScanTermsOfUseUrl = exports.getBuildScanPublishEnabled = exports.getPRCommentOption = exports.getJobSummaryOption = exports.isJobSummaryEnabled = exports.getGithubToken = exports.getJobMatrix = exports.getArguments = exports.getGradleVersion = exports.getBuildRootDirectory = exports.getCacheExcludes = exports.getCacheIncludes = exports.getCacheEncryptionKey = exports.isCacheCleanupEnabled = exports.isCacheDebuggingEnabled = exports.isCacheStrictMatch = exports.isCacheOverwriteExisting = exports.isCacheWriteOnly = exports.isCacheReadOnly = exports.isCacheDisabled = void 0; exports.parseNumericInput = exports.getGithubToken = exports.getJobMatrix = exports.getArguments = exports.getBuildRootDirectory = exports.getGradleVersion = exports.BuildScanConfig = exports.JobSummaryOption = exports.SummaryConfig = exports.CacheConfig = exports.DependencyGraphOption = exports.DependencyGraphConfig = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const github = __importStar(__nccwpck_require__(95438));
const cache = __importStar(__nccwpck_require__(27799));
const summary_1 = __nccwpck_require__(81327);
const string_argv_1 = __nccwpck_require__(19663); const string_argv_1 = __nccwpck_require__(19663);
function isCacheDisabled() { class DependencyGraphConfig {
return getBooleanInput('cache-disabled'); constructor() {
this.dependencyGraphOption = this.getDependencyGraphOption();
this.continueOnFailure = this.getDependencyGraphContinueOnFailure();
this.artifactRetentionDays = this.getArtifactRetentionDays();
}
getDependencyGraphOption() {
const val = core.getInput('dependency-graph');
switch (val.toLowerCase().trim()) {
case 'disabled':
return DependencyGraphOption.Disabled;
case 'generate':
return DependencyGraphOption.Generate;
case 'generate-and-submit':
return DependencyGraphOption.GenerateAndSubmit;
case 'generate-and-upload':
return DependencyGraphOption.GenerateAndUpload;
case 'download-and-submit':
return DependencyGraphOption.DownloadAndSubmit;
case 'clear':
return DependencyGraphOption.Clear;
}
throw TypeError(`The value '${val}' is not valid for 'dependency-graph'. Valid values are: [disabled, generate, generate-and-submit, generate-and-upload, download-and-submit, clear]. The default value is 'disabled'.`);
}
getDependencyGraphContinueOnFailure() {
return getBooleanInput('dependency-graph-continue-on-failure', true);
}
getArtifactRetentionDays() {
const val = core.getInput('artifact-retention-days');
return parseNumericInput('artifact-retention-days', val, 0);
}
getJobCorrelator() {
return DependencyGraphConfig.constructJobCorrelator(github.context.workflow, github.context.job, getJobMatrix());
}
static constructJobCorrelator(workflow, jobId, matrixJson) {
const matrixString = this.describeMatrix(matrixJson);
const label = matrixString ? `${workflow}-${jobId}-${matrixString}` : `${workflow}-${jobId}`;
return this.sanitize(label);
}
static describeMatrix(matrixJson) {
core.debug(`Got matrix json: ${matrixJson}`);
const matrix = JSON.parse(matrixJson);
if (matrix) {
return Object.values(matrix).join('-');
}
return '';
}
static sanitize(value) {
return value
.replace(/[^a-zA-Z0-9_-\s]/g, '')
.replace(/\s+/g, '_')
.toLowerCase();
}
} }
exports.isCacheDisabled = isCacheDisabled; exports.DependencyGraphConfig = DependencyGraphConfig;
function isCacheReadOnly() { var DependencyGraphOption;
return getBooleanInput('cache-read-only'); (function (DependencyGraphOption) {
DependencyGraphOption["Disabled"] = "disabled";
DependencyGraphOption["Generate"] = "generate";
DependencyGraphOption["GenerateAndSubmit"] = "generate-and-submit";
DependencyGraphOption["GenerateAndUpload"] = "generate-and-upload";
DependencyGraphOption["DownloadAndSubmit"] = "download-and-submit";
DependencyGraphOption["Clear"] = "clear";
})(DependencyGraphOption || (exports.DependencyGraphOption = DependencyGraphOption = {}));
class CacheConfig {
isCacheDisabled() {
if (!cache.isFeatureAvailable()) {
return true;
}
return getBooleanInput('cache-disabled');
}
isCacheReadOnly() {
return !this.isCacheWriteOnly() && getBooleanInput('cache-read-only');
}
isCacheWriteOnly() {
return getBooleanInput('cache-write-only');
}
isCacheOverwriteExisting() {
return getBooleanInput('cache-overwrite-existing');
}
isCacheStrictMatch() {
return getBooleanInput('gradle-home-cache-strict-match');
}
isCacheCleanupEnabled() {
return getBooleanInput('gradle-home-cache-cleanup') && !this.isCacheReadOnly();
}
getCacheEncryptionKey() {
return core.getInput('cache-encryption-key');
}
getCacheIncludes() {
return core.getMultilineInput('gradle-home-cache-includes');
}
getCacheExcludes() {
return core.getMultilineInput('gradle-home-cache-excludes');
}
} }
exports.isCacheReadOnly = isCacheReadOnly; exports.CacheConfig = CacheConfig;
function isCacheWriteOnly() { class SummaryConfig {
return getBooleanInput('cache-write-only'); shouldGenerateJobSummary(hasFailure) {
if (!process.env[summary_1.SUMMARY_ENV_VAR]) {
return false;
}
if (!this.isJobSummaryEnabled()) {
return false;
}
return this.shouldAddJobSummary(this.getJobSummaryOption(), hasFailure);
}
shouldAddPRComment(hasFailure) {
return this.shouldAddJobSummary(this.getPRCommentOption(), hasFailure);
}
shouldAddJobSummary(option, hasFailure) {
switch (option) {
case JobSummaryOption.Always:
return true;
case JobSummaryOption.Never:
return false;
case JobSummaryOption.OnFailure:
return hasFailure;
}
}
isJobSummaryEnabled() {
return getBooleanInput('generate-job-summary', true);
}
getJobSummaryOption() {
return this.parseJobSummaryOption('add-job-summary');
}
getPRCommentOption() {
return this.parseJobSummaryOption('add-job-summary-as-pr-comment');
}
parseJobSummaryOption(paramName) {
const val = core.getInput(paramName);
switch (val.toLowerCase().trim()) {
case 'never':
return JobSummaryOption.Never;
case 'always':
return JobSummaryOption.Always;
case 'on-failure':
return JobSummaryOption.OnFailure;
}
throw TypeError(`The value '${val}' is not valid for ${paramName}. Valid values are: [never, always, on-failure].`);
}
} }
exports.isCacheWriteOnly = isCacheWriteOnly; exports.SummaryConfig = SummaryConfig;
function isCacheOverwriteExisting() { var JobSummaryOption;
return getBooleanInput('cache-overwrite-existing'); (function (JobSummaryOption) {
JobSummaryOption["Never"] = "never";
JobSummaryOption["Always"] = "always";
JobSummaryOption["OnFailure"] = "on-failure";
})(JobSummaryOption || (exports.JobSummaryOption = JobSummaryOption = {}));
class BuildScanConfig {
getBuildScanPublishEnabled() {
if (!this.verifyTermsOfUseAgreement()) {
return false;
}
return getBooleanInput('build-scan-publish') && this.verifyTermsOfUseAgreement();
}
getBuildScanTermsOfUseUrl() {
return this.getTermsOfUseProp('build-scan-terms-of-use-url', 'build-scan-terms-of-service-url');
}
getBuildScanTermsOfUseAgree() {
return this.getTermsOfUseProp('build-scan-terms-of-use-agree', 'build-scan-terms-of-service-agree');
}
verifyTermsOfUseAgreement() {
if ((this.getBuildScanTermsOfUseUrl() !== 'https://gradle.com/terms-of-service' &&
this.getBuildScanTermsOfUseUrl() !== 'https://gradle.com/help/legal-terms-of-use') ||
this.getBuildScanTermsOfUseAgree() !== 'yes') {
core.warning(`Terms of use at 'https://gradle.com/help/legal-terms-of-use' must be agreed in order to publish build scans.`);
return false;
}
return true;
}
getTermsOfUseProp(newPropName, oldPropName) {
const newProp = core.getInput(newPropName);
if (newProp !== '') {
return newProp;
}
return core.getInput(oldPropName);
}
} }
exports.isCacheOverwriteExisting = isCacheOverwriteExisting; exports.BuildScanConfig = BuildScanConfig;
function isCacheStrictMatch() {
return getBooleanInput('gradle-home-cache-strict-match');
}
exports.isCacheStrictMatch = isCacheStrictMatch;
function isCacheDebuggingEnabled() {
return process.env['GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED'] ? true : false;
}
exports.isCacheDebuggingEnabled = isCacheDebuggingEnabled;
function isCacheCleanupEnabled() {
return getBooleanInput('gradle-home-cache-cleanup');
}
exports.isCacheCleanupEnabled = isCacheCleanupEnabled;
function getCacheEncryptionKey() {
return core.getInput('cache-encryption-key');
}
exports.getCacheEncryptionKey = getCacheEncryptionKey;
function getCacheIncludes() {
return core.getMultilineInput('gradle-home-cache-includes');
}
exports.getCacheIncludes = getCacheIncludes;
function getCacheExcludes() {
return core.getMultilineInput('gradle-home-cache-excludes');
}
exports.getCacheExcludes = getCacheExcludes;
function getBuildRootDirectory() {
return core.getInput('build-root-directory');
}
exports.getBuildRootDirectory = getBuildRootDirectory;
function getGradleVersion() { function getGradleVersion() {
return core.getInput('gradle-version'); return core.getInput('gradle-version');
} }
exports.getGradleVersion = getGradleVersion; exports.getGradleVersion = getGradleVersion;
function getBuildRootDirectory() {
return core.getInput('build-root-directory');
}
exports.getBuildRootDirectory = getBuildRootDirectory;
function getArguments() { function getArguments() {
const input = core.getInput('arguments'); const input = core.getInput('arguments');
return (0, string_argv_1.parseArgsStringToArgv)(input); return (0, string_argv_1.parseArgsStringToArgv)(input);
@ -138984,77 +139085,6 @@ function getGithubToken() {
return core.getInput('github-token', { required: true }); return core.getInput('github-token', { required: true });
} }
exports.getGithubToken = getGithubToken; exports.getGithubToken = getGithubToken;
function isJobSummaryEnabled() {
return getBooleanInput('generate-job-summary', true);
}
exports.isJobSummaryEnabled = isJobSummaryEnabled;
function getJobSummaryOption() {
return parseJobSummaryOption('add-job-summary');
}
exports.getJobSummaryOption = getJobSummaryOption;
function getPRCommentOption() {
return parseJobSummaryOption('add-job-summary-as-pr-comment');
}
exports.getPRCommentOption = getPRCommentOption;
function getBuildScanPublishEnabled() {
return getBooleanInput('build-scan-publish');
}
exports.getBuildScanPublishEnabled = getBuildScanPublishEnabled;
function getBuildScanTermsOfUseUrl() {
return getTermsOfUseProp('build-scan-terms-of-use-url', 'build-scan-terms-of-service-url');
}
exports.getBuildScanTermsOfUseUrl = getBuildScanTermsOfUseUrl;
function getBuildScanTermsOfUseAgree() {
return getTermsOfUseProp('build-scan-terms-of-use-agree', 'build-scan-terms-of-service-agree');
}
exports.getBuildScanTermsOfUseAgree = getBuildScanTermsOfUseAgree;
function getTermsOfUseProp(newPropName, oldPropName) {
const newProp = core.getInput(newPropName);
if (newProp !== '') {
return newProp;
}
return core.getInput(oldPropName);
}
function parseJobSummaryOption(paramName) {
const val = core.getInput(paramName);
switch (val.toLowerCase().trim()) {
case 'never':
return JobSummaryOption.Never;
case 'always':
return JobSummaryOption.Always;
case 'on-failure':
return JobSummaryOption.OnFailure;
}
throw TypeError(`The value '${val}' is not valid for ${paramName}. Valid values are: [never, always, on-failure].`);
}
function getDependencyGraphOption() {
const val = core.getInput('dependency-graph');
switch (val.toLowerCase().trim()) {
case 'disabled':
return DependencyGraphOption.Disabled;
case 'generate':
return DependencyGraphOption.Generate;
case 'generate-and-submit':
return DependencyGraphOption.GenerateAndSubmit;
case 'generate-and-upload':
return DependencyGraphOption.GenerateAndUpload;
case 'download-and-submit':
return DependencyGraphOption.DownloadAndSubmit;
case 'clear':
return DependencyGraphOption.Clear;
}
throw TypeError(`The value '${val}' is not valid for 'dependency-graph'. Valid values are: [disabled, generate, generate-and-submit, generate-and-upload, download-and-submit, clear]. The default value is 'disabled'.`);
}
exports.getDependencyGraphOption = getDependencyGraphOption;
function getDependencyGraphContinueOnFailure() {
return getBooleanInput('dependency-graph-continue-on-failure', true);
}
exports.getDependencyGraphContinueOnFailure = getDependencyGraphContinueOnFailure;
function getArtifactRetentionDays() {
const val = core.getInput('artifact-retention-days');
return parseNumericInput('artifact-retention-days', val, 0);
}
exports.getArtifactRetentionDays = getArtifactRetentionDays;
function parseNumericInput(paramName, paramValue, paramDefault) { function parseNumericInput(paramName, paramValue, paramDefault) {
if (paramValue.length === 0) { if (paramValue.length === 0) {
return paramDefault; return paramDefault;
@ -139078,21 +139108,6 @@ function getBooleanInput(paramName, paramDefault = false) {
} }
throw TypeError(`The value '${paramValue} is not valid for '${paramName}. Valid values are: [true, false]`); throw TypeError(`The value '${paramValue} is not valid for '${paramName}. Valid values are: [true, false]`);
} }
var DependencyGraphOption;
(function (DependencyGraphOption) {
DependencyGraphOption["Disabled"] = "disabled";
DependencyGraphOption["Generate"] = "generate";
DependencyGraphOption["GenerateAndSubmit"] = "generate-and-submit";
DependencyGraphOption["GenerateAndUpload"] = "generate-and-upload";
DependencyGraphOption["DownloadAndSubmit"] = "download-and-submit";
DependencyGraphOption["Clear"] = "clear";
})(DependencyGraphOption || (exports.DependencyGraphOption = DependencyGraphOption = {}));
var JobSummaryOption;
(function (JobSummaryOption) {
JobSummaryOption["Never"] = "never";
JobSummaryOption["Always"] = "always";
JobSummaryOption["OnFailure"] = "on-failure";
})(JobSummaryOption || (exports.JobSummaryOption = JobSummaryOption = {}));
/***/ }), /***/ }),
@ -139138,15 +139153,15 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.generateJobSummary = void 0; exports.generateJobSummary = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const github = __importStar(__nccwpck_require__(95438)); const github = __importStar(__nccwpck_require__(95438));
const summary_1 = __nccwpck_require__(81327);
const request_error_1 = __nccwpck_require__(10537); const request_error_1 = __nccwpck_require__(10537);
const params = __importStar(__nccwpck_require__(23885));
const cache_reporting_1 = __nccwpck_require__(66674); const cache_reporting_1 = __nccwpck_require__(66674);
function generateJobSummary(buildResults, cacheListener) { const input_params_1 = __nccwpck_require__(23885);
function generateJobSummary(buildResults, cacheListener, config) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const summaryTable = renderSummaryTable(buildResults); const summaryTable = renderSummaryTable(buildResults);
const cachingReport = (0, cache_reporting_1.generateCachingReport)(cacheListener); const cachingReport = (0, cache_reporting_1.generateCachingReport)(cacheListener);
if (shouldGenerateJobSummary(buildResults)) { const hasFailure = buildResults.some(result => result.buildFailed);
if (config.shouldGenerateJobSummary(hasFailure)) {
core.info('Generating Job Summary'); core.info('Generating Job Summary');
core.summary.addRaw(summaryTable); core.summary.addRaw(summaryTable);
core.summary.addRaw(cachingReport); core.summary.addRaw(cachingReport);
@ -139159,7 +139174,7 @@ function generateJobSummary(buildResults, cacheListener) {
core.info(cachingReport); core.info(cachingReport);
core.info('============================'); core.info('============================');
} }
if (shouldAddPRComment(buildResults)) { if (config.shouldAddPRComment(hasFailure)) {
yield addPRComment(summaryTable); yield addPRComment(summaryTable);
} }
}); });
@ -139180,7 +139195,7 @@ function addPRComment(jobSummary) {
</a> </a>
${jobSummary}`; ${jobSummary}`;
const github_token = params.getGithubToken(); const github_token = (0, input_params_1.getGithubToken)();
const octokit = github.getOctokit(github_token); const octokit = github.getOctokit(github_token);
try { try {
yield octokit.rest.issues.createComment(Object.assign(Object.assign({}, context.repo), { issue_number: pull_request_number, body: prComment })); yield octokit.rest.issues.createComment(Object.assign(Object.assign({}, context.repo), { issue_number: pull_request_number, body: prComment }));
@ -139248,29 +139263,6 @@ function renderBuildScanBadge(outcomeText, outcomeColor, targetUrl) {
const badgeHtml = `<img src="${badgeUrl}" alt="Build Scan ${outcomeText}" />`; const badgeHtml = `<img src="${badgeUrl}" alt="Build Scan ${outcomeText}" />`;
return `<a href="${targetUrl}" rel="nofollow" target="_blank">${badgeHtml}</a>`; return `<a href="${targetUrl}" rel="nofollow" target="_blank">${badgeHtml}</a>`;
} }
function shouldGenerateJobSummary(buildResults) {
if (!process.env[summary_1.SUMMARY_ENV_VAR]) {
return false;
}
if (!params.isJobSummaryEnabled()) {
return false;
}
return shouldAddJobSummary(params.getJobSummaryOption(), buildResults);
}
function shouldAddPRComment(buildResults) {
return shouldAddJobSummary(params.getPRCommentOption(), buildResults);
}
function shouldAddJobSummary(option, buildResults) {
switch (option) {
case params.JobSummaryOption.Always:
return true;
case params.JobSummaryOption.Never:
return false;
case params.JobSummaryOption.OnFailure:
core.info(`Got these build results: ${JSON.stringify(buildResults)}`);
return buildResults.some(result => result.buildFailed);
}
}
function truncateString(str, maxLength) { function truncateString(str, maxLength) {
if (str.length > maxLength) { if (str.length > maxLength) {
return `<div title='${str}'>${str.slice(0, maxLength - 1)}…</div>`; return `<div title='${str}'>${str.slice(0, maxLength - 1)}…</div>`;
@ -139377,8 +139369,6 @@ const path = __importStar(__nccwpck_require__(71017));
const os = __importStar(__nccwpck_require__(22037)); const os = __importStar(__nccwpck_require__(22037));
const caches = __importStar(__nccwpck_require__(23800)); const caches = __importStar(__nccwpck_require__(23800));
const layout = __importStar(__nccwpck_require__(28182)); const layout = __importStar(__nccwpck_require__(28182));
const params = __importStar(__nccwpck_require__(23885));
const dependencyGraph = __importStar(__nccwpck_require__(80));
const jobSummary = __importStar(__nccwpck_require__(87345)); const jobSummary = __importStar(__nccwpck_require__(87345));
const buildScan = __importStar(__nccwpck_require__(85772)); const buildScan = __importStar(__nccwpck_require__(85772));
const build_results_1 = __nccwpck_require__(82107); const build_results_1 = __nccwpck_require__(82107);
@ -139388,31 +139378,31 @@ const GRADLE_SETUP_VAR = 'GRADLE_BUILD_ACTION_SETUP_COMPLETED';
const USER_HOME = 'USER_HOME'; const USER_HOME = 'USER_HOME';
const GRADLE_USER_HOME = 'GRADLE_USER_HOME'; const GRADLE_USER_HOME = 'GRADLE_USER_HOME';
const CACHE_LISTENER = 'CACHE_LISTENER'; const CACHE_LISTENER = 'CACHE_LISTENER';
function setup() { function setup(cacheConfig, buildScanConfig) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const userHome = yield determineUserHome(); const userHome = yield determineUserHome();
const gradleUserHome = yield determineGradleUserHome(); const gradleUserHome = yield determineGradleUserHome();
if (process.env[GRADLE_SETUP_VAR]) { if (process.env[GRADLE_SETUP_VAR]) {
core.info('Gradle setup only performed on first gradle/actions step in workflow.'); core.info('Gradle setup only performed on first gradle/actions step in workflow.');
return; return false;
} }
core.exportVariable(GRADLE_SETUP_VAR, true); core.exportVariable(GRADLE_SETUP_VAR, true);
core.saveState(GRADLE_SETUP_VAR, true); core.saveState(GRADLE_SETUP_VAR, true);
core.saveState(USER_HOME, userHome); core.saveState(USER_HOME, userHome);
core.saveState(GRADLE_USER_HOME, gradleUserHome); core.saveState(GRADLE_USER_HOME, gradleUserHome);
const cacheListener = new cache_reporting_1.CacheListener(); const cacheListener = new cache_reporting_1.CacheListener();
yield caches.restore(userHome, gradleUserHome, cacheListener); yield caches.restore(userHome, gradleUserHome, cacheListener, cacheConfig);
core.saveState(CACHE_LISTENER, cacheListener.stringify()); core.saveState(CACHE_LISTENER, cacheListener.stringify());
yield dependencyGraph.setup(params.getDependencyGraphOption()); buildScan.setup(buildScanConfig);
buildScan.setup(); return true;
}); });
} }
exports.setup = setup; exports.setup = setup;
function complete() { function complete(cacheConfig, summaryConfig) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (!core.getState(GRADLE_SETUP_VAR)) { if (!core.getState(GRADLE_SETUP_VAR)) {
core.info('Gradle setup post-action only performed for first gradle/actions step in workflow.'); core.info('Gradle setup post-action only performed for first gradle/actions step in workflow.');
return; return false;
} }
core.info('In post-action step'); core.info('In post-action step');
const buildResults = (0, build_results_1.loadBuildResults)(); const buildResults = (0, build_results_1.loadBuildResults)();
@ -139420,10 +139410,10 @@ function complete() {
const gradleUserHome = core.getState(GRADLE_USER_HOME); const gradleUserHome = core.getState(GRADLE_USER_HOME);
const cacheListener = cache_reporting_1.CacheListener.rehydrate(core.getState(CACHE_LISTENER)); const cacheListener = cache_reporting_1.CacheListener.rehydrate(core.getState(CACHE_LISTENER));
const daemonController = new daemon_controller_1.DaemonController(buildResults); const daemonController = new daemon_controller_1.DaemonController(buildResults);
yield caches.save(userHome, gradleUserHome, cacheListener, daemonController); yield caches.save(userHome, gradleUserHome, cacheListener, daemonController, cacheConfig);
yield jobSummary.generateJobSummary(buildResults, cacheListener); yield jobSummary.generateJobSummary(buildResults, cacheListener, summaryConfig);
yield dependencyGraph.complete(params.getDependencyGraphOption());
core.info('Completed post-action step'); core.info('Completed post-action step');
return true;
}); });
} }
exports.complete = complete; exports.complete = complete;
@ -139496,12 +139486,16 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.run = void 0; exports.run = void 0;
const core = __importStar(__nccwpck_require__(42186)); const core = __importStar(__nccwpck_require__(42186));
const setupGradle = __importStar(__nccwpck_require__(18652)); const setupGradle = __importStar(__nccwpck_require__(18652));
const dependencyGraph = __importStar(__nccwpck_require__(80));
const input_params_1 = __nccwpck_require__(23885);
const errors_1 = __nccwpck_require__(36976); const errors_1 = __nccwpck_require__(36976);
process.on('uncaughtException', e => handleFailure(e)); process.on('uncaughtException', e => handleFailure(e));
function run() { function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
try { try {
yield setupGradle.complete(); if (yield setupGradle.complete(new input_params_1.CacheConfig(), new input_params_1.SummaryConfig())) {
yield dependencyGraph.complete(new input_params_1.DependencyGraphConfig());
}
} }
catch (error) { catch (error) {
if (error instanceof errors_1.PostActionJobFailure) { if (error instanceof errors_1.PostActionJobFailure) {

File diff suppressed because one or more lines are too long

View File

@ -5,9 +5,11 @@
"description": "Execute Gradle Build", "description": "Execute Gradle Build",
"scripts": { "scripts": {
"postinstall": "patch-package", "postinstall": "patch-package",
"format": "prettier --write **/*.ts", "format": "prettier --write 'src/**/*.ts'",
"format-check": "prettier --check **/*.ts", "format-check": "prettier --check 'src/**/*.ts'",
"lint": "eslint src/**/*.ts", "lint": "eslint 'src/**/*.ts'",
"compile-dependency-submission-main": "ncc build src/dependency-submission/main.ts --out ../dist/dependency-submission/main --source-map --no-source-map-register",
"compile-dependency-submission-post": "ncc build src/dependency-submission/post.ts --out ../dist/dependency-submission/post --source-map --no-source-map-register",
"compile-setup-gradle-main": "ncc build src/setup-gradle/main.ts --out ../dist/setup-gradle/main --source-map --no-source-map-register", "compile-setup-gradle-main": "ncc build src/setup-gradle/main.ts --out ../dist/setup-gradle/main --source-map --no-source-map-register",
"compile-setup-gradle-post": "ncc build src/setup-gradle/post.ts --out ../dist/setup-gradle/post --source-map --no-source-map-register", "compile-setup-gradle-post": "ncc build src/setup-gradle/post.ts --out ../dist/setup-gradle/post --source-map --no-source-map-register",
"compile": "npm-run-all --parallel compile-*", "compile": "npm-run-all --parallel compile-*",

View File

@ -1,30 +1,18 @@
import * as core from '@actions/core' import * as core from '@actions/core'
import {getBuildScanPublishEnabled, getBuildScanTermsOfUseUrl, getBuildScanTermsOfUseAgree} from './input-params' import {BuildScanConfig} from './input-params'
export function setup(): void { export function setup(config: BuildScanConfig): void {
maybeExportVariable('DEVELOCITY_INJECTION_INIT_SCRIPT_NAME', 'gradle-actions.inject-develocity.init.gradle') maybeExportVariable('DEVELOCITY_INJECTION_INIT_SCRIPT_NAME', 'gradle-actions.inject-develocity.init.gradle')
maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions') maybeExportVariable('DEVELOCITY_AUTO_INJECTION_CUSTOM_VALUE', 'gradle-actions')
if (getBuildScanPublishEnabled() && verifyTermsOfUseAgreement()) { if (config.getBuildScanPublishEnabled()) {
maybeExportVariable('DEVELOCITY_INJECTION_ENABLED', 'true') maybeExportVariable('DEVELOCITY_INJECTION_ENABLED', 'true')
maybeExportVariable('DEVELOCITY_PLUGIN_VERSION', '3.17') maybeExportVariable('DEVELOCITY_PLUGIN_VERSION', '3.17')
maybeExportVariable('DEVELOCITY_CCUD_PLUGIN_VERSION', '1.13') maybeExportVariable('DEVELOCITY_CCUD_PLUGIN_VERSION', '1.13')
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', getBuildScanTermsOfUseUrl()) maybeExportVariable('DEVELOCITY_TERMS_OF_USE_URL', config.getBuildScanTermsOfUseUrl())
maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', getBuildScanTermsOfUseAgree()) maybeExportVariable('DEVELOCITY_TERMS_OF_USE_AGREE', config.getBuildScanTermsOfUseAgree())
} }
} }
function verifyTermsOfUseAgreement(): boolean {
if (
(getBuildScanTermsOfUseUrl() !== 'https://gradle.com/terms-of-service' &&
getBuildScanTermsOfUseUrl() !== 'https://gradle.com/help/legal-terms-of-use') ||
getBuildScanTermsOfUseAgree() !== 'yes'
) {
core.warning(`Terms of use must be agreed in order to publish build scans.`)
return false
}
return true
}
function maybeExportVariable(variableName: string, value: unknown): void { function maybeExportVariable(variableName: string, value: unknown): void {
if (!process.env[variableName]) { if (!process.env[variableName]) {
core.exportVariable(variableName, value) core.exportVariable(variableName, value)

View File

@ -4,7 +4,7 @@ import * as glob from '@actions/glob'
import path from 'path' import path from 'path'
import fs from 'fs' import fs from 'fs'
import * as params from './input-params' import {CacheConfig} from './input-params'
import {CacheListener} from './cache-reporting' import {CacheListener} from './cache-reporting'
import {saveCache, restoreCache, cacheDebug, isCacheDebuggingEnabled, tryDelete, generateCacheKey} from './cache-utils' import {saveCache, restoreCache, cacheDebug, isCacheDebuggingEnabled, tryDelete, generateCacheKey} from './cache-utils'
import {GradleHomeEntryExtractor, ConfigurationCacheEntryExtractor} from './cache-extract-entries' import {GradleHomeEntryExtractor, ConfigurationCacheEntryExtractor} from './cache-extract-entries'
@ -14,15 +14,17 @@ const RESTORED_CACHE_KEY_KEY = 'restored-cache-key'
export const META_FILE_DIR = '.setup-gradle' export const META_FILE_DIR = '.setup-gradle'
export class GradleStateCache { export class GradleStateCache {
private cacheConfig: CacheConfig
private cacheName: string private cacheName: string
private cacheDescription: string private cacheDescription: string
protected readonly userHome: string protected readonly userHome: string
protected readonly gradleUserHome: string protected readonly gradleUserHome: string
constructor(userHome: string, gradleUserHome: string) { constructor(userHome: string, gradleUserHome: string, cacheConfig: CacheConfig) {
this.userHome = userHome this.userHome = userHome
this.gradleUserHome = gradleUserHome this.gradleUserHome = gradleUserHome
this.cacheConfig = cacheConfig
this.cacheName = 'gradle' this.cacheName = 'gradle'
this.cacheDescription = 'Gradle User Home' this.cacheDescription = 'Gradle User Home'
} }
@ -31,7 +33,7 @@ export class GradleStateCache {
this.initializeGradleUserHome() this.initializeGradleUserHome()
// Export the GRADLE_ENCRYPTION_KEY variable if provided // Export the GRADLE_ENCRYPTION_KEY variable if provided
const encryptionKey = params.getCacheEncryptionKey() const encryptionKey = this.cacheConfig.getCacheEncryptionKey()
if (encryptionKey) { if (encryptionKey) {
core.exportVariable('GRADLE_ENCRYPTION_KEY', encryptionKey) core.exportVariable('GRADLE_ENCRYPTION_KEY', encryptionKey)
} }
@ -52,7 +54,7 @@ export class GradleStateCache {
async restore(listener: CacheListener): Promise<void> { async restore(listener: CacheListener): Promise<void> {
const entryListener = listener.entry(this.cacheDescription) const entryListener = listener.entry(this.cacheDescription)
const cacheKey = generateCacheKey(this.cacheName) const cacheKey = generateCacheKey(this.cacheName, this.cacheConfig)
cacheDebug( cacheDebug(
`Requesting ${this.cacheDescription} with `Requesting ${this.cacheDescription} with
@ -82,8 +84,8 @@ export class GradleStateCache {
*/ */
async afterRestore(listener: CacheListener): Promise<void> { async afterRestore(listener: CacheListener): Promise<void> {
await this.debugReportGradleUserHomeSize('as restored from cache') await this.debugReportGradleUserHomeSize('as restored from cache')
await new GradleHomeEntryExtractor(this.gradleUserHome).restore(listener) await new GradleHomeEntryExtractor(this.gradleUserHome, this.cacheConfig).restore(listener)
await new ConfigurationCacheEntryExtractor(this.gradleUserHome).restore(listener) await new ConfigurationCacheEntryExtractor(this.gradleUserHome, this.cacheConfig).restore(listener)
await this.debugReportGradleUserHomeSize('after restoring common artifacts') await this.debugReportGradleUserHomeSize('after restoring common artifacts')
} }
@ -95,7 +97,7 @@ export class GradleStateCache {
* it is saved with the exact key. * it is saved with the exact key.
*/ */
async save(listener: CacheListener): Promise<void> { async save(listener: CacheListener): Promise<void> {
const cacheKey = generateCacheKey(this.cacheName).key const cacheKey = generateCacheKey(this.cacheName, this.cacheConfig).key
const restoredCacheKey = core.getState(RESTORED_CACHE_KEY_KEY) const restoredCacheKey = core.getState(RESTORED_CACHE_KEY_KEY)
const gradleHomeEntryListener = listener.entry(this.cacheDescription) const gradleHomeEntryListener = listener.entry(this.cacheDescription)
@ -133,8 +135,8 @@ export class GradleStateCache {
await this.debugReportGradleUserHomeSize('before saving common artifacts') await this.debugReportGradleUserHomeSize('before saving common artifacts')
await this.deleteExcludedPaths() await this.deleteExcludedPaths()
await Promise.all([ await Promise.all([
new GradleHomeEntryExtractor(this.gradleUserHome).extract(listener), new GradleHomeEntryExtractor(this.gradleUserHome, this.cacheConfig).extract(listener),
new ConfigurationCacheEntryExtractor(this.gradleUserHome).extract(listener) new ConfigurationCacheEntryExtractor(this.gradleUserHome, this.cacheConfig).extract(listener)
]) ])
await this.debugReportGradleUserHomeSize( await this.debugReportGradleUserHomeSize(
"after extracting common artifacts (only 'caches' and 'notifications' will be stored)" "after extracting common artifacts (only 'caches' and 'notifications' will be stored)"
@ -145,7 +147,7 @@ export class GradleStateCache {
* Delete any file paths that are excluded by the `gradle-home-cache-excludes` parameter. * Delete any file paths that are excluded by the `gradle-home-cache-excludes` parameter.
*/ */
private async deleteExcludedPaths(): Promise<void> { private async deleteExcludedPaths(): Promise<void> {
const rawPaths: string[] = params.getCacheExcludes() const rawPaths: string[] = this.cacheConfig.getCacheExcludes()
rawPaths.push('caches/*/cc-keystore') rawPaths.push('caches/*/cc-keystore')
const resolvedPaths = rawPaths.map(x => path.resolve(this.gradleUserHome, x)) const resolvedPaths = rawPaths.map(x => path.resolve(this.gradleUserHome, x))
@ -168,7 +170,7 @@ export class GradleStateCache {
* but this can be overridden by the `gradle-home-cache-includes` parameter. * but this can be overridden by the `gradle-home-cache-includes` parameter.
*/ */
protected getCachePath(): string[] { protected getCachePath(): string[] {
const rawPaths: string[] = params.getCacheIncludes() const rawPaths: string[] = this.cacheConfig.getCacheIncludes()
rawPaths.push(META_FILE_DIR) rawPaths.push(META_FILE_DIR)
const resolvedPaths = rawPaths.map(x => this.resolveCachePath(x)) const resolvedPaths = rawPaths.map(x => this.resolveCachePath(x))
cacheDebug(`Using cache paths: ${resolvedPaths}`) cacheDebug(`Using cache paths: ${resolvedPaths}`)

View File

@ -4,12 +4,19 @@ import * as core from '@actions/core'
import * as glob from '@actions/glob' import * as glob from '@actions/glob'
import * as semver from 'semver' import * as semver from 'semver'
import * as params from './input-params'
import {META_FILE_DIR} from './cache-base' import {META_FILE_DIR} from './cache-base'
import {CacheEntryListener, CacheListener} from './cache-reporting' import {CacheEntryListener, CacheListener} from './cache-reporting'
import {cacheDebug, getCacheKeyPrefix, hashFileNames, restoreCache, saveCache, tryDelete} from './cache-utils' import {
cacheDebug,
getCacheKeyPrefix,
hashFileNames,
isCacheDebuggingEnabled,
restoreCache,
saveCache,
tryDelete
} from './cache-utils'
import {BuildResult, loadBuildResults} from './build-results' import {BuildResult, loadBuildResults} from './build-results'
import {CacheConfig} from './input-params'
const SKIP_RESTORE_VAR = 'GRADLE_BUILD_ACTION_SKIP_RESTORE' const SKIP_RESTORE_VAR = 'GRADLE_BUILD_ACTION_SKIP_RESTORE'
@ -80,12 +87,14 @@ class ExtractedCacheEntryDefinition {
* for more efficient storage. * for more efficient storage.
*/ */
abstract class AbstractEntryExtractor { abstract class AbstractEntryExtractor {
protected readonly cacheConfig: CacheConfig
protected readonly gradleUserHome: string protected readonly gradleUserHome: string
private extractorName: string private extractorName: string
constructor(gradleUserHome: string, extractorName: string) { constructor(gradleUserHome: string, extractorName: string, cacheConfig: CacheConfig) {
this.gradleUserHome = gradleUserHome this.gradleUserHome = gradleUserHome
this.extractorName = extractorName this.extractorName = extractorName
this.cacheConfig = cacheConfig
} }
/** /**
@ -261,7 +270,7 @@ abstract class AbstractEntryExtractor {
// Run actions sequentially if debugging is enabled // Run actions sequentially if debugging is enabled
private async awaitForDebugging(p: Promise<ExtractedCacheEntry>): Promise<ExtractedCacheEntry> { private async awaitForDebugging(p: Promise<ExtractedCacheEntry>): Promise<ExtractedCacheEntry> {
if (params.isCacheDebuggingEnabled()) { if (isCacheDebuggingEnabled()) {
await p await p
} }
return p return p
@ -306,8 +315,8 @@ abstract class AbstractEntryExtractor {
} }
export class GradleHomeEntryExtractor extends AbstractEntryExtractor { export class GradleHomeEntryExtractor extends AbstractEntryExtractor {
constructor(gradleUserHome: string) { constructor(gradleUserHome: string, cacheConfig: CacheConfig) {
super(gradleUserHome, 'gradle-home') super(gradleUserHome, 'gradle-home', cacheConfig)
} }
async extract(listener: CacheListener): Promise<void> { async extract(listener: CacheListener): Promise<void> {
@ -363,8 +372,8 @@ export class GradleHomeEntryExtractor extends AbstractEntryExtractor {
} }
export class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor { export class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
constructor(gradleUserHome: string) { constructor(gradleUserHome: string, cacheConfig: CacheConfig) {
super(gradleUserHome, 'configuration-cache') super(gradleUserHome, 'configuration-cache', cacheConfig)
} }
/** /**
@ -377,7 +386,7 @@ export class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
return return
} }
if (!params.getCacheEncryptionKey()) { if (!this.cacheConfig.getCacheEncryptionKey()) {
this.markNotRestored(listener, 'Encryption Key was not provided') this.markNotRestored(listener, 'Encryption Key was not provided')
return return
} }
@ -399,7 +408,7 @@ export class ConfigurationCacheEntryExtractor extends AbstractEntryExtractor {
} }
async extract(listener: CacheListener): Promise<void> { async extract(listener: CacheListener): Promise<void> {
if (!params.getCacheEncryptionKey()) { if (!this.cacheConfig.getCacheEncryptionKey()) {
const cacheEntryDefinitions = this.getExtractedCacheEntryDefinitions() const cacheEntryDefinitions = this.getExtractedCacheEntryDefinitions()
if (cacheEntryDefinitions.length > 0) { if (cacheEntryDefinitions.length > 0) {
core.info('Not saving configuration-cache state, as no encryption key was provided') core.info('Not saving configuration-cache state, as no encryption key was provided')

View File

@ -7,9 +7,8 @@ import * as crypto from 'crypto'
import * as path from 'path' import * as path from 'path'
import * as fs from 'fs' import * as fs from 'fs'
import * as params from './input-params'
import {CacheEntryListener} from './cache-reporting' import {CacheEntryListener} from './cache-reporting'
import {CacheConfig, getJobMatrix} from './input-params'
const CACHE_PROTOCOL_VERSION = 'v9-' const CACHE_PROTOCOL_VERSION = 'v9-'
@ -22,31 +21,11 @@ const CACHE_KEY_JOB_EXECUTION_VAR = 'GRADLE_BUILD_ACTION_CACHE_KEY_JOB_EXECUTION
const SEGMENT_DOWNLOAD_TIMEOUT_VAR = 'SEGMENT_DOWNLOAD_TIMEOUT_MINS' const SEGMENT_DOWNLOAD_TIMEOUT_VAR = 'SEGMENT_DOWNLOAD_TIMEOUT_MINS'
const SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT = 10 * 60 * 1000 // 10 minutes const SEGMENT_DOWNLOAD_TIMEOUT_DEFAULT = 10 * 60 * 1000 // 10 minutes
export function isCacheDisabled(): boolean { export function isCacheDebuggingEnabled(): boolean {
if (!cache.isFeatureAvailable()) { if (core.isDebug()) {
return true return true
} }
return params.isCacheDisabled() return process.env['GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED'] ? true : false
}
export function isCacheReadOnly(): boolean {
return !isCacheWriteOnly() && params.isCacheReadOnly()
}
export function isCacheWriteOnly(): boolean {
return params.isCacheWriteOnly()
}
export function isCacheOverwriteExisting(): boolean {
return params.isCacheOverwriteExisting()
}
export function isCacheDebuggingEnabled(): boolean {
return params.isCacheDebuggingEnabled()
}
export function isCacheCleanupEnabled(): boolean {
return params.isCacheCleanupEnabled()
} }
/** /**
@ -80,7 +59,7 @@ export class CacheKey {
* - Any previous key for this Job (any matrix) * - Any previous key for this Job (any matrix)
* - Any previous key for this cache on the current OS * - Any previous key for this cache on the current OS
*/ */
export function generateCacheKey(cacheName: string): CacheKey { export function generateCacheKey(cacheName: string, config: CacheConfig): CacheKey {
const cacheKeyBase = `${getCacheKeyPrefix()}${CACHE_PROTOCOL_VERSION}${cacheName}` const cacheKeyBase = `${getCacheKeyPrefix()}${CACHE_PROTOCOL_VERSION}${cacheName}`
// At the most general level, share caches for all executions on the same OS // At the most general level, share caches for all executions on the same OS
@ -95,7 +74,7 @@ export function generateCacheKey(cacheName: string): CacheKey {
// Exact match on Git SHA // Exact match on Git SHA
const cacheKey = `${cacheKeyForJobContext}-${getCacheKeyJobExecution()}` const cacheKey = `${cacheKeyForJobContext}-${getCacheKeyJobExecution()}`
if (params.isCacheStrictMatch()) { if (config.isCacheStrictMatch()) {
return new CacheKey(cacheKey, [cacheKeyForJobContext]) return new CacheKey(cacheKey, [cacheKeyForJobContext])
} }
@ -125,7 +104,7 @@ function getCacheKeyJobInstance(): string {
// By default, we hash the workflow name and the full `matrix` data for the run, to uniquely identify this job invocation // By default, we hash the workflow name and the full `matrix` data for the run, to uniquely identify this job invocation
// The only way we can obtain the `matrix` data is via the `workflow-job-context` parameter in action.yml. // The only way we can obtain the `matrix` data is via the `workflow-job-context` parameter in action.yml.
const workflowName = github.context.workflow const workflowName = github.context.workflow
const workflowJobContext = params.getJobMatrix() const workflowJobContext = getJobMatrix()
return hashStrings([workflowName, workflowJobContext]) return hashStrings([workflowName, workflowJobContext])
} }

View File

@ -1,19 +1,18 @@
import * as core from '@actions/core' import * as core from '@actions/core'
import {
isCacheCleanupEnabled,
isCacheDisabled,
isCacheReadOnly,
isCacheWriteOnly,
isCacheOverwriteExisting
} from './cache-utils'
import {CacheListener} from './cache-reporting' import {CacheListener} from './cache-reporting'
import {DaemonController} from './daemon-controller' import {DaemonController} from './daemon-controller'
import {GradleStateCache} from './cache-base' import {GradleStateCache} from './cache-base'
import {CacheCleaner} from './cache-cleaner' import {CacheCleaner} from './cache-cleaner'
import {CacheConfig} from './input-params'
const CACHE_RESTORED_VAR = 'GRADLE_BUILD_ACTION_CACHE_RESTORED' const CACHE_RESTORED_VAR = 'GRADLE_BUILD_ACTION_CACHE_RESTORED'
export async function restore(userHome: string, gradleUserHome: string, cacheListener: CacheListener): Promise<void> { export async function restore(
userHome: string,
gradleUserHome: string,
cacheListener: CacheListener,
cacheConfig: CacheConfig
): Promise<void> {
// Bypass restore cache on all but first action step in workflow. // Bypass restore cache on all but first action step in workflow.
if (process.env[CACHE_RESTORED_VAR]) { if (process.env[CACHE_RESTORED_VAR]) {
core.info('Cache only restored on first action step.') core.info('Cache only restored on first action step.')
@ -21,9 +20,9 @@ export async function restore(userHome: string, gradleUserHome: string, cacheLis
} }
core.exportVariable(CACHE_RESTORED_VAR, true) core.exportVariable(CACHE_RESTORED_VAR, true)
const gradleStateCache = new GradleStateCache(userHome, gradleUserHome) const gradleStateCache = new GradleStateCache(userHome, gradleUserHome, cacheConfig)
if (isCacheDisabled()) { if (cacheConfig.isCacheDisabled()) {
core.info('Cache is disabled: will not restore state from previous builds.') core.info('Cache is disabled: will not restore state from previous builds.')
// Initialize the Gradle User Home even when caching is disabled. // Initialize the Gradle User Home even when caching is disabled.
gradleStateCache.init() gradleStateCache.init()
@ -32,7 +31,7 @@ export async function restore(userHome: string, gradleUserHome: string, cacheLis
} }
if (gradleStateCache.cacheOutputExists()) { if (gradleStateCache.cacheOutputExists()) {
if (!isCacheOverwriteExisting()) { if (!cacheConfig.isCacheOverwriteExisting()) {
core.info('Gradle User Home already exists: will not restore from cache.') core.info('Gradle User Home already exists: will not restore from cache.')
// Initialize pre-existing Gradle User Home. // Initialize pre-existing Gradle User Home.
gradleStateCache.init() gradleStateCache.init()
@ -47,7 +46,7 @@ export async function restore(userHome: string, gradleUserHome: string, cacheLis
// Mark the state as restored so that post-action will perform save. // Mark the state as restored so that post-action will perform save.
core.saveState(CACHE_RESTORED_VAR, true) core.saveState(CACHE_RESTORED_VAR, true)
if (isCacheWriteOnly()) { if (cacheConfig.isCacheWriteOnly()) {
core.info('Cache is write-only: will not restore from cache.') core.info('Cache is write-only: will not restore from cache.')
cacheListener.cacheWriteOnly = true cacheListener.cacheWriteOnly = true
return return
@ -57,7 +56,7 @@ export async function restore(userHome: string, gradleUserHome: string, cacheLis
await gradleStateCache.restore(cacheListener) await gradleStateCache.restore(cacheListener)
}) })
if (isCacheCleanupEnabled() && !isCacheReadOnly()) { if (cacheConfig.isCacheCleanupEnabled()) {
core.info('Preparing cache for cleanup.') core.info('Preparing cache for cleanup.')
const cacheCleaner = new CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']!) const cacheCleaner = new CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']!)
await cacheCleaner.prepare() await cacheCleaner.prepare()
@ -68,9 +67,10 @@ export async function save(
userHome: string, userHome: string,
gradleUserHome: string, gradleUserHome: string,
cacheListener: CacheListener, cacheListener: CacheListener,
daemonController: DaemonController daemonController: DaemonController,
cacheConfig: CacheConfig
): Promise<void> { ): Promise<void> {
if (isCacheDisabled()) { if (cacheConfig.isCacheDisabled()) {
core.info('Cache is disabled: will not save state for later builds.') core.info('Cache is disabled: will not save state for later builds.')
return return
} }
@ -80,7 +80,7 @@ export async function save(
return return
} }
if (isCacheReadOnly()) { if (cacheConfig.isCacheReadOnly()) {
core.info('Cache is read-only: will not save state for use in subsequent builds.') core.info('Cache is read-only: will not save state for use in subsequent builds.')
cacheListener.cacheReadOnly = true cacheListener.cacheReadOnly = true
return return
@ -88,7 +88,7 @@ export async function save(
await daemonController.stopAllDaemons() await daemonController.stopAllDaemons()
if (isCacheCleanupEnabled()) { if (cacheConfig.isCacheCleanupEnabled()) {
core.info('Forcing cache cleanup.') core.info('Forcing cache cleanup.')
const cacheCleaner = new CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']!) const cacheCleaner = new CacheCleaner(gradleUserHome, process.env['RUNNER_TEMP']!)
try { try {
@ -99,6 +99,6 @@ export async function save(
} }
await core.group('Caching Gradle state', async () => { await core.group('Caching Gradle state', async () => {
return new GradleStateCache(userHome, gradleUserHome).save(cacheListener) return new GradleStateCache(userHome, gradleUserHome, cacheConfig).save(cacheListener)
}) })
} }

View File

@ -11,30 +11,25 @@ import fs from 'fs'
import * as layout from './repository-layout' import * as layout from './repository-layout'
import {PostActionJobFailure} from './errors' import {PostActionJobFailure} from './errors'
import { import {DependencyGraphConfig, DependencyGraphOption, getGithubToken} from './input-params'
DependencyGraphOption,
getDependencyGraphContinueOnFailure,
getGithubToken,
getJobMatrix,
getArtifactRetentionDays
} from './input-params'
const DEPENDENCY_GRAPH_PREFIX = 'dependency-graph_' const DEPENDENCY_GRAPH_PREFIX = 'dependency-graph_'
export async function setup(option: DependencyGraphOption): Promise<void> { export async function setup(config: DependencyGraphConfig): Promise<void> {
if (option === DependencyGraphOption.Disabled) { if (config.dependencyGraphOption === DependencyGraphOption.Disabled) {
core.exportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'false')
return return
} }
// Download and submit early, for compatability with dependency review. // Download and submit early, for compatability with dependency review.
if (option === DependencyGraphOption.DownloadAndSubmit) { if (config.dependencyGraphOption === DependencyGraphOption.DownloadAndSubmit) {
await downloadAndSubmitDependencyGraphs() await downloadAndSubmitDependencyGraphs(config)
return return
} }
core.info('Enabling dependency graph generation') core.info('Enabling dependency graph generation')
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'true') core.exportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'true')
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_CONTINUE_ON_FAILURE', getDependencyGraphContinueOnFailure()) maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_CONTINUE_ON_FAILURE', config.continueOnFailure)
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_CORRELATOR', getJobCorrelator()) maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_CORRELATOR', config.getJobCorrelator())
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_ID', github.context.runId) maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_ID', github.context.runId)
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_REF', github.context.ref) maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_REF', github.context.ref)
maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_SHA', getShaFromContext()) maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_SHA', getShaFromContext())
@ -45,7 +40,7 @@ export async function setup(option: DependencyGraphOption): Promise<void> {
) )
// To clear the dependency graph, we generate an empty graph by excluding all projects and configurations // To clear the dependency graph, we generate an empty graph by excluding all projects and configurations
if (option === DependencyGraphOption.Clear) { if (config.dependencyGraphOption === DependencyGraphOption.Clear) {
core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_PROJECTS', '') core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_PROJECTS', '')
core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS', '') core.exportVariable('DEPENDENCY_GRAPH_INCLUDE_CONFIGURATIONS', '')
} }
@ -57,9 +52,14 @@ function maybeExportVariable(variableName: string, value: unknown): void {
} }
} }
export async function complete(option: DependencyGraphOption): Promise<void> { export async function complete(config: DependencyGraphConfig): Promise<void> {
if (isRunningInActEnvironment()) {
core.info('Dependency graph upload and submit not supported in the ACT environment.')
return
}
try { try {
switch (option) { switch (config.dependencyGraphOption) {
case DependencyGraphOption.Disabled: case DependencyGraphOption.Disabled:
case DependencyGraphOption.Generate: // Performed via init-script: nothing to do here case DependencyGraphOption.Generate: // Performed via init-script: nothing to do here
case DependencyGraphOption.DownloadAndSubmit: // Performed in setup case DependencyGraphOption.DownloadAndSubmit: // Performed in setup
@ -69,10 +69,10 @@ export async function complete(option: DependencyGraphOption): Promise<void> {
await submitDependencyGraphs(await findGeneratedDependencyGraphFiles()) await submitDependencyGraphs(await findGeneratedDependencyGraphFiles())
return return
case DependencyGraphOption.GenerateAndUpload: case DependencyGraphOption.GenerateAndUpload:
await uploadDependencyGraphs(await findGeneratedDependencyGraphFiles()) await uploadDependencyGraphs(await findGeneratedDependencyGraphFiles(), config)
} }
} catch (e) { } catch (e) {
warnOrFail(option, e) warnOrFail(config, e)
} }
} }
@ -81,7 +81,7 @@ async function findGeneratedDependencyGraphFiles(): Promise<string[]> {
return await findDependencyGraphFiles(workspaceDirectory) return await findDependencyGraphFiles(workspaceDirectory)
} }
async function uploadDependencyGraphs(dependencyGraphFiles: string[]): Promise<void> { async function uploadDependencyGraphs(dependencyGraphFiles: string[], config: DependencyGraphConfig): Promise<void> {
const workspaceDirectory = layout.workspaceDirectory() const workspaceDirectory = layout.workspaceDirectory()
const artifactClient = new DefaultArtifactClient() const artifactClient = new DefaultArtifactClient()
@ -90,16 +90,21 @@ async function uploadDependencyGraphs(dependencyGraphFiles: string[]): Promise<v
core.info(`Uploading dependency graph file: ${relativePath}`) core.info(`Uploading dependency graph file: ${relativePath}`)
const artifactName = `${DEPENDENCY_GRAPH_PREFIX}${path.basename(dependencyGraphFile)}` const artifactName = `${DEPENDENCY_GRAPH_PREFIX}${path.basename(dependencyGraphFile)}`
await artifactClient.uploadArtifact(artifactName, [dependencyGraphFile], workspaceDirectory, { await artifactClient.uploadArtifact(artifactName, [dependencyGraphFile], workspaceDirectory, {
retentionDays: getArtifactRetentionDays() retentionDays: config.artifactRetentionDays
}) })
} }
} }
async function downloadAndSubmitDependencyGraphs(): Promise<void> { async function downloadAndSubmitDependencyGraphs(config: DependencyGraphConfig): Promise<void> {
if (isRunningInActEnvironment()) {
core.info('Dependency graph download and submit not supported in the ACT environment.')
return
}
try { try {
await submitDependencyGraphs(await downloadDependencyGraphs()) await submitDependencyGraphs(await downloadDependencyGraphs())
} catch (e) { } catch (e) {
warnOrFail(DependencyGraphOption.DownloadAndSubmit, e) warnOrFail(config, e)
} }
} }
@ -181,12 +186,12 @@ async function findDependencyGraphFiles(dir: string): Promise<string[]> {
return graphFiles return graphFiles
} }
function warnOrFail(option: String, error: unknown): void { function warnOrFail(config: DependencyGraphConfig, error: unknown): void {
if (!getDependencyGraphContinueOnFailure()) { if (!config.continueOnFailure) {
throw new PostActionJobFailure(error) throw new PostActionJobFailure(error)
} }
core.warning(`Failed to ${option} dependency graph. Will continue.\n${String(error)}`) core.warning(`Failed to ${config.dependencyGraphOption} dependency graph. Will continue.\n${String(error)}`)
} }
function getOctokit(): InstanceType<typeof GitHub> { function getOctokit(): InstanceType<typeof GitHub> {
@ -217,28 +222,6 @@ function getShaFromContext(): string {
} }
} }
function getJobCorrelator(): string { function isRunningInActEnvironment(): boolean {
return constructJobCorrelator(github.context.workflow, github.context.job, getJobMatrix()) return process.env.ACT !== undefined
}
export function constructJobCorrelator(workflow: string, jobId: string, matrixJson: string): string {
const matrixString = describeMatrix(matrixJson)
const label = matrixString ? `${workflow}-${jobId}-${matrixString}` : `${workflow}-${jobId}`
return sanitize(label)
}
function describeMatrix(matrixJson: string): string {
core.debug(`Got matrix json: ${matrixJson}`)
const matrix = JSON.parse(matrixJson)
if (matrix) {
return Object.values(matrix).join('-')
}
return ''
}
function sanitize(value: string): string {
return value
.replace(/[^a-zA-Z0-9_-\s]/g, '')
.replace(/\s+/g, '_')
.toLowerCase()
} }

View File

@ -0,0 +1,59 @@
import * as core from '@actions/core'
import * as setupGradle from '../setup-gradle'
import * as execution from '../execution'
import * as provisioner from '../provision'
import * as layout from '../repository-layout'
import * as dependencyGraph from '../dependency-graph'
import {parseArgsStringToArgv} from 'string-argv'
import {BuildScanConfig, CacheConfig, DependencyGraphConfig, DependencyGraphOption} from '../input-params'
/**
* The main entry point for the action, called by Github Actions for the step.
*/
export async function run(): Promise<void> {
try {
// Configure Gradle environment (Gradle User Home)
await setupGradle.setup(new CacheConfig(), new BuildScanConfig())
// Configure the dependency graph submission
const config = new DependencyGraphConfig()
config.artifactRetentionDays = 1
config.continueOnFailure = false
await dependencyGraph.setup(config)
if (config.dependencyGraphOption === DependencyGraphOption.DownloadAndSubmit) {
// No execution to perform
return
}
// Download and install Gradle if required
const executable = await provisioner.provisionGradle()
// Only execute if arguments have been provided
const additionalArgs = core.getInput('additional-arguments')
const executionArgs = `
-Dorg.gradle.configureondemand=false
-Dorg.gradle.dependency.verification=off
-Dorg.gradle.unsafe.isolated-projects=false
:ForceDependencyResolutionPlugin_resolveAllDependencies
${additionalArgs}
`
const args: string[] = parseArgsStringToArgv(executionArgs)
const buildRootDirectory = layout.buildRootDirectory()
await execution.executeGradleBuild(executable, buildRootDirectory, args)
} catch (error) {
core.setFailed(String(error))
if (error instanceof Error && error.stack) {
core.info(error.stack)
}
}
// Explicit process.exit() to prevent waiting for hanging promises.
process.exit()
}
run()

View File

@ -0,0 +1,41 @@
import * as core from '@actions/core'
import * as setupGradle from '../setup-gradle'
import * as dependencyGraph from '../dependency-graph'
import {CacheConfig, DependencyGraphConfig, SummaryConfig} from '../input-params'
import {PostActionJobFailure} from '../errors'
// Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
// throw an uncaught exception. Instead of failing this action, just warn.
process.on('uncaughtException', e => handleFailure(e))
/**
* The post-execution entry point for the action, called by Github Actions after completing all steps for the Job.
*/
export async function run(): Promise<void> {
try {
if (await setupGradle.complete(new CacheConfig(), new SummaryConfig())) {
// Only submit the dependency graphs once per job
await dependencyGraph.complete(new DependencyGraphConfig())
}
} catch (error) {
if (error instanceof PostActionJobFailure) {
core.setFailed(String(error))
} else {
handleFailure(error)
}
}
// Explicit process.exit() to prevent waiting for promises left hanging by `@actions/cache` on save.
process.exit()
}
function handleFailure(error: unknown): void {
core.warning(`Unhandled error in Gradle post-action - job will continue: ${error}`)
if (error instanceof Error && error.stack) {
core.info(error.stack)
}
}
run()

View File

@ -1,54 +1,238 @@
import * as core from '@actions/core' import * as core from '@actions/core'
import * as github from '@actions/github'
import * as cache from '@actions/cache'
import {SUMMARY_ENV_VAR} from '@actions/core/lib/summary'
import {parseArgsStringToArgv} from 'string-argv' import {parseArgsStringToArgv} from 'string-argv'
export function isCacheDisabled(): boolean { export class DependencyGraphConfig {
return getBooleanInput('cache-disabled') dependencyGraphOption = this.getDependencyGraphOption()
continueOnFailure = this.getDependencyGraphContinueOnFailure()
artifactRetentionDays = this.getArtifactRetentionDays()
private getDependencyGraphOption(): DependencyGraphOption {
const val = core.getInput('dependency-graph')
switch (val.toLowerCase().trim()) {
case 'disabled':
return DependencyGraphOption.Disabled
case 'generate':
return DependencyGraphOption.Generate
case 'generate-and-submit':
return DependencyGraphOption.GenerateAndSubmit
case 'generate-and-upload':
return DependencyGraphOption.GenerateAndUpload
case 'download-and-submit':
return DependencyGraphOption.DownloadAndSubmit
case 'clear':
return DependencyGraphOption.Clear
}
throw TypeError(
`The value '${val}' is not valid for 'dependency-graph'. Valid values are: [disabled, generate, generate-and-submit, generate-and-upload, download-and-submit, clear]. The default value is 'disabled'.`
)
}
private getDependencyGraphContinueOnFailure(): boolean {
return getBooleanInput('dependency-graph-continue-on-failure', true)
}
private getArtifactRetentionDays(): number {
const val = core.getInput('artifact-retention-days')
return parseNumericInput('artifact-retention-days', val, 0)
// Zero indicates that the default repository settings should be used
}
getJobCorrelator(): string {
return DependencyGraphConfig.constructJobCorrelator(github.context.workflow, github.context.job, getJobMatrix())
}
static constructJobCorrelator(workflow: string, jobId: string, matrixJson: string): string {
const matrixString = this.describeMatrix(matrixJson)
const label = matrixString ? `${workflow}-${jobId}-${matrixString}` : `${workflow}-${jobId}`
return this.sanitize(label)
}
private static describeMatrix(matrixJson: string): string {
core.debug(`Got matrix json: ${matrixJson}`)
const matrix = JSON.parse(matrixJson)
if (matrix) {
return Object.values(matrix).join('-')
}
return ''
}
private static sanitize(value: string): string {
return value
.replace(/[^a-zA-Z0-9_-\s]/g, '')
.replace(/\s+/g, '_')
.toLowerCase()
}
} }
export function isCacheReadOnly(): boolean { export enum DependencyGraphOption {
return getBooleanInput('cache-read-only') Disabled = 'disabled',
Generate = 'generate',
GenerateAndSubmit = 'generate-and-submit',
GenerateAndUpload = 'generate-and-upload',
DownloadAndSubmit = 'download-and-submit',
Clear = 'clear'
} }
export function isCacheWriteOnly(): boolean { export class CacheConfig {
return getBooleanInput('cache-write-only') isCacheDisabled(): boolean {
if (!cache.isFeatureAvailable()) {
return true
}
return getBooleanInput('cache-disabled')
}
isCacheReadOnly(): boolean {
return !this.isCacheWriteOnly() && getBooleanInput('cache-read-only')
}
isCacheWriteOnly(): boolean {
return getBooleanInput('cache-write-only')
}
isCacheOverwriteExisting(): boolean {
return getBooleanInput('cache-overwrite-existing')
}
isCacheStrictMatch(): boolean {
return getBooleanInput('gradle-home-cache-strict-match')
}
isCacheCleanupEnabled(): boolean {
return getBooleanInput('gradle-home-cache-cleanup') && !this.isCacheReadOnly()
}
getCacheEncryptionKey(): string {
return core.getInput('cache-encryption-key')
}
getCacheIncludes(): string[] {
return core.getMultilineInput('gradle-home-cache-includes')
}
getCacheExcludes(): string[] {
return core.getMultilineInput('gradle-home-cache-excludes')
}
} }
export function isCacheOverwriteExisting(): boolean { export class SummaryConfig {
return getBooleanInput('cache-overwrite-existing') shouldGenerateJobSummary(hasFailure: boolean): boolean {
// Check if Job Summary is supported on this platform
if (!process.env[SUMMARY_ENV_VAR]) {
return false
}
// Check if Job Summary is disabled using the deprecated input
if (!this.isJobSummaryEnabled()) {
return false
}
return this.shouldAddJobSummary(this.getJobSummaryOption(), hasFailure)
}
shouldAddPRComment(hasFailure: boolean): boolean {
return this.shouldAddJobSummary(this.getPRCommentOption(), hasFailure)
}
private shouldAddJobSummary(option: JobSummaryOption, hasFailure: boolean): boolean {
switch (option) {
case JobSummaryOption.Always:
return true
case JobSummaryOption.Never:
return false
case JobSummaryOption.OnFailure:
return hasFailure
}
}
private isJobSummaryEnabled(): boolean {
return getBooleanInput('generate-job-summary', true)
}
private getJobSummaryOption(): JobSummaryOption {
return this.parseJobSummaryOption('add-job-summary')
}
private getPRCommentOption(): JobSummaryOption {
return this.parseJobSummaryOption('add-job-summary-as-pr-comment')
}
private parseJobSummaryOption(paramName: string): JobSummaryOption {
const val = core.getInput(paramName)
switch (val.toLowerCase().trim()) {
case 'never':
return JobSummaryOption.Never
case 'always':
return JobSummaryOption.Always
case 'on-failure':
return JobSummaryOption.OnFailure
}
throw TypeError(
`The value '${val}' is not valid for ${paramName}. Valid values are: [never, always, on-failure].`
)
}
} }
export function isCacheStrictMatch(): boolean { export enum JobSummaryOption {
return getBooleanInput('gradle-home-cache-strict-match') Never = 'never',
Always = 'always',
OnFailure = 'on-failure'
} }
export function isCacheDebuggingEnabled(): boolean { export class BuildScanConfig {
return process.env['GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED'] ? true : false getBuildScanPublishEnabled(): boolean {
} if (!this.verifyTermsOfUseAgreement()) {
return false
}
return getBooleanInput('build-scan-publish') && this.verifyTermsOfUseAgreement()
}
export function isCacheCleanupEnabled(): boolean { getBuildScanTermsOfUseUrl(): string {
return getBooleanInput('gradle-home-cache-cleanup') return this.getTermsOfUseProp('build-scan-terms-of-use-url', 'build-scan-terms-of-service-url')
} }
export function getCacheEncryptionKey(): string { getBuildScanTermsOfUseAgree(): string {
return core.getInput('cache-encryption-key') return this.getTermsOfUseProp('build-scan-terms-of-use-agree', 'build-scan-terms-of-service-agree')
} }
export function getCacheIncludes(): string[] { private verifyTermsOfUseAgreement(): boolean {
return core.getMultilineInput('gradle-home-cache-includes') if (
} (this.getBuildScanTermsOfUseUrl() !== 'https://gradle.com/terms-of-service' &&
this.getBuildScanTermsOfUseUrl() !== 'https://gradle.com/help/legal-terms-of-use') ||
this.getBuildScanTermsOfUseAgree() !== 'yes'
) {
core.warning(
`Terms of use at 'https://gradle.com/help/legal-terms-of-use' must be agreed in order to publish build scans.`
)
return false
}
return true
}
export function getCacheExcludes(): string[] { /**
return core.getMultilineInput('gradle-home-cache-excludes') * TODO @bigdaz: remove support for the deprecated input property in the next major release of the action
} */
private getTermsOfUseProp(newPropName: string, oldPropName: string): string {
export function getBuildRootDirectory(): string { const newProp = core.getInput(newPropName)
return core.getInput('build-root-directory') if (newProp !== '') {
return newProp
}
return core.getInput(oldPropName)
}
} }
export function getGradleVersion(): string { export function getGradleVersion(): string {
return core.getInput('gradle-version') return core.getInput('gradle-version')
} }
export function getBuildRootDirectory(): string {
return core.getInput('build-root-directory')
}
export function getArguments(): string[] { export function getArguments(): string[] {
const input = core.getInput('arguments') const input = core.getInput('arguments')
return parseArgsStringToArgv(input) return parseArgsStringToArgv(input)
@ -63,85 +247,6 @@ export function getGithubToken(): string {
return core.getInput('github-token', {required: true}) return core.getInput('github-token', {required: true})
} }
export function isJobSummaryEnabled(): boolean {
return getBooleanInput('generate-job-summary', true)
}
export function getJobSummaryOption(): JobSummaryOption {
return parseJobSummaryOption('add-job-summary')
}
export function getPRCommentOption(): JobSummaryOption {
return parseJobSummaryOption('add-job-summary-as-pr-comment')
}
export function getBuildScanPublishEnabled(): boolean {
return getBooleanInput('build-scan-publish')
}
export function getBuildScanTermsOfUseUrl(): string {
return getTermsOfUseProp('build-scan-terms-of-use-url', 'build-scan-terms-of-service-url')
}
export function getBuildScanTermsOfUseAgree(): string {
return getTermsOfUseProp('build-scan-terms-of-use-agree', 'build-scan-terms-of-service-agree')
}
/**
* TODO @bigdaz: remove the deprecated input property in the next major release of the action
*/
function getTermsOfUseProp(newPropName: string, oldPropName: string): string {
const newProp = core.getInput(newPropName)
if (newProp !== '') {
return newProp
}
return core.getInput(oldPropName)
}
function parseJobSummaryOption(paramName: string): JobSummaryOption {
const val = core.getInput(paramName)
switch (val.toLowerCase().trim()) {
case 'never':
return JobSummaryOption.Never
case 'always':
return JobSummaryOption.Always
case 'on-failure':
return JobSummaryOption.OnFailure
}
throw TypeError(`The value '${val}' is not valid for ${paramName}. Valid values are: [never, always, on-failure].`)
}
export function getDependencyGraphOption(): DependencyGraphOption {
const val = core.getInput('dependency-graph')
switch (val.toLowerCase().trim()) {
case 'disabled':
return DependencyGraphOption.Disabled
case 'generate':
return DependencyGraphOption.Generate
case 'generate-and-submit':
return DependencyGraphOption.GenerateAndSubmit
case 'generate-and-upload':
return DependencyGraphOption.GenerateAndUpload
case 'download-and-submit':
return DependencyGraphOption.DownloadAndSubmit
case 'clear':
return DependencyGraphOption.Clear
}
throw TypeError(
`The value '${val}' is not valid for 'dependency-graph'. Valid values are: [disabled, generate, generate-and-submit, generate-and-upload, download-and-submit, clear]. The default value is 'disabled'.`
)
}
export function getDependencyGraphContinueOnFailure(): boolean {
return getBooleanInput('dependency-graph-continue-on-failure', true)
}
export function getArtifactRetentionDays(): number {
const val = core.getInput('artifact-retention-days')
return parseNumericInput('artifact-retention-days', val, 0)
// Zero indicates that the default repository settings should be used
}
export function parseNumericInput(paramName: string, paramValue: string, paramDefault: number): number { export function parseNumericInput(paramName: string, paramValue: string, paramDefault: number): number {
if (paramValue.length === 0) { if (paramValue.length === 0) {
return paramDefault return paramDefault
@ -165,18 +270,3 @@ function getBooleanInput(paramName: string, paramDefault = false): boolean {
} }
throw TypeError(`The value '${paramValue} is not valid for '${paramName}. Valid values are: [true, false]`) throw TypeError(`The value '${paramValue} is not valid for '${paramName}. Valid values are: [true, false]`)
} }
export enum DependencyGraphOption {
Disabled = 'disabled',
Generate = 'generate',
GenerateAndSubmit = 'generate-and-submit',
GenerateAndUpload = 'generate-and-upload',
DownloadAndSubmit = 'download-and-submit',
Clear = 'clear'
}
export enum JobSummaryOption {
Never = 'never',
Always = 'always',
OnFailure = 'on-failure'
}

View File

@ -1,17 +1,21 @@
import * as core from '@actions/core' import * as core from '@actions/core'
import * as github from '@actions/github' import * as github from '@actions/github'
import {SUMMARY_ENV_VAR} from '@actions/core/lib/summary'
import {RequestError} from '@octokit/request-error' import {RequestError} from '@octokit/request-error'
import * as params from './input-params'
import {BuildResult} from './build-results' import {BuildResult} from './build-results'
import {CacheListener, generateCachingReport} from './cache-reporting' import {CacheListener, generateCachingReport} from './cache-reporting'
import {SummaryConfig, getGithubToken} from './input-params'
export async function generateJobSummary(buildResults: BuildResult[], cacheListener: CacheListener): Promise<void> { export async function generateJobSummary(
buildResults: BuildResult[],
cacheListener: CacheListener,
config: SummaryConfig
): Promise<void> {
const summaryTable = renderSummaryTable(buildResults) const summaryTable = renderSummaryTable(buildResults)
const cachingReport = generateCachingReport(cacheListener) const cachingReport = generateCachingReport(cacheListener)
if (shouldGenerateJobSummary(buildResults)) { const hasFailure = buildResults.some(result => result.buildFailed)
if (config.shouldGenerateJobSummary(hasFailure)) {
core.info('Generating Job Summary') core.info('Generating Job Summary')
core.summary.addRaw(summaryTable) core.summary.addRaw(summaryTable)
@ -25,7 +29,7 @@ export async function generateJobSummary(buildResults: BuildResult[], cacheListe
core.info('============================') core.info('============================')
} }
if (shouldAddPRComment(buildResults)) { if (config.shouldAddPRComment(hasFailure)) {
await addPRComment(summaryTable) await addPRComment(summaryTable)
} }
} }
@ -47,7 +51,7 @@ async function addPRComment(jobSummary: string): Promise<void> {
${jobSummary}` ${jobSummary}`
const github_token = params.getGithubToken() const github_token = getGithubToken()
const octokit = github.getOctokit(github_token) const octokit = github.getOctokit(github_token)
try { try {
await octokit.rest.issues.createComment({ await octokit.rest.issues.createComment({
@ -128,36 +132,6 @@ function renderBuildScanBadge(outcomeText: string, outcomeColor: string, targetU
return `<a href="${targetUrl}" rel="nofollow" target="_blank">${badgeHtml}</a>` return `<a href="${targetUrl}" rel="nofollow" target="_blank">${badgeHtml}</a>`
} }
function shouldGenerateJobSummary(buildResults: BuildResult[]): boolean {
// Check if Job Summary is supported on this platform
if (!process.env[SUMMARY_ENV_VAR]) {
return false
}
// Check if Job Summary is disabled using the deprecated input
if (!params.isJobSummaryEnabled()) {
return false
}
return shouldAddJobSummary(params.getJobSummaryOption(), buildResults)
}
function shouldAddPRComment(buildResults: BuildResult[]): boolean {
return shouldAddJobSummary(params.getPRCommentOption(), buildResults)
}
function shouldAddJobSummary(option: params.JobSummaryOption, buildResults: BuildResult[]): boolean {
switch (option) {
case params.JobSummaryOption.Always:
return true
case params.JobSummaryOption.Never:
return false
case params.JobSummaryOption.OnFailure:
core.info(`Got these build results: ${JSON.stringify(buildResults)}`)
return buildResults.some(result => result.buildFailed)
}
}
function truncateString(str: string, maxLength: number): string { function truncateString(str: string, maxLength: number): string {
if (str.length > maxLength) { if (str.length > maxLength) {
return `<div title='${str}'>${str.slice(0, maxLength - 1)}…</div>` return `<div title='${str}'>${str.slice(0, maxLength - 1)}…</div>`

View File

@ -8,7 +8,8 @@ import * as toolCache from '@actions/tool-cache'
import * as gradlew from './gradlew' import * as gradlew from './gradlew'
import * as params from './input-params' import * as params from './input-params'
import {handleCacheFailure, isCacheDisabled, isCacheReadOnly} from './cache-utils' import {handleCacheFailure} from './cache-utils'
import {CacheConfig} from './input-params'
const gradleVersionsBaseUrl = 'https://services.gradle.org/versions' const gradleVersionsBaseUrl = 'https://services.gradle.org/versions'
@ -122,7 +123,9 @@ async function locateGradleAndDownloadIfRequired(versionInfo: GradleVersionInfo)
async function downloadAndCacheGradleDistribution(versionInfo: GradleVersionInfo): Promise<string> { async function downloadAndCacheGradleDistribution(versionInfo: GradleVersionInfo): Promise<string> {
const downloadPath = path.join(os.homedir(), `gradle-installations/downloads/gradle-${versionInfo.version}-bin.zip`) const downloadPath = path.join(os.homedir(), `gradle-installations/downloads/gradle-${versionInfo.version}-bin.zip`)
if (isCacheDisabled()) { // TODO: Convert this to a class and inject config
const cacheConfig = new CacheConfig()
if (cacheConfig.isCacheDisabled()) {
await downloadGradleDistribution(versionInfo, downloadPath) await downloadGradleDistribution(versionInfo, downloadPath)
return downloadPath return downloadPath
} }
@ -141,7 +144,7 @@ async function downloadAndCacheGradleDistribution(versionInfo: GradleVersionInfo
core.info(`Gradle distribution ${versionInfo.version} not found in cache. Will download.`) core.info(`Gradle distribution ${versionInfo.version} not found in cache. Will download.`)
await downloadGradleDistribution(versionInfo, downloadPath) await downloadGradleDistribution(versionInfo, downloadPath)
if (!isCacheReadOnly()) { if (!cacheConfig.isCacheReadOnly()) {
try { try {
await cache.saveCache([downloadPath], cacheKey) await cache.saveCache([downloadPath], cacheKey)
} catch (error) { } catch (error) {

View File

@ -4,28 +4,27 @@ import * as path from 'path'
import * as os from 'os' import * as os from 'os'
import * as caches from './caches' import * as caches from './caches'
import * as layout from './repository-layout' import * as layout from './repository-layout'
import * as params from './input-params'
import * as dependencyGraph from './dependency-graph'
import * as jobSummary from './job-summary' import * as jobSummary from './job-summary'
import * as buildScan from './build-scan' import * as buildScan from './build-scan'
import {loadBuildResults} from './build-results' import {loadBuildResults} from './build-results'
import {CacheListener} from './cache-reporting' import {CacheListener} from './cache-reporting'
import {DaemonController} from './daemon-controller' import {DaemonController} from './daemon-controller'
import {BuildScanConfig, CacheConfig, SummaryConfig} from './input-params'
const GRADLE_SETUP_VAR = 'GRADLE_BUILD_ACTION_SETUP_COMPLETED' const GRADLE_SETUP_VAR = 'GRADLE_BUILD_ACTION_SETUP_COMPLETED'
const USER_HOME = 'USER_HOME' const USER_HOME = 'USER_HOME'
const GRADLE_USER_HOME = 'GRADLE_USER_HOME' const GRADLE_USER_HOME = 'GRADLE_USER_HOME'
const CACHE_LISTENER = 'CACHE_LISTENER' const CACHE_LISTENER = 'CACHE_LISTENER'
export async function setup(): Promise<void> { export async function setup(cacheConfig: CacheConfig, buildScanConfig: BuildScanConfig): Promise<boolean> {
const userHome = await determineUserHome() const userHome = await determineUserHome()
const gradleUserHome = await determineGradleUserHome() const gradleUserHome = await determineGradleUserHome()
// Bypass setup on all but first action step in workflow. // Bypass setup on all but first action step in workflow.
if (process.env[GRADLE_SETUP_VAR]) { if (process.env[GRADLE_SETUP_VAR]) {
core.info('Gradle setup only performed on first gradle/actions step in workflow.') core.info('Gradle setup only performed on first gradle/actions step in workflow.')
return return false
} }
// Record setup complete: visible to all subsequent actions and prevents duplicate setup // Record setup complete: visible to all subsequent actions and prevents duplicate setup
core.exportVariable(GRADLE_SETUP_VAR, true) core.exportVariable(GRADLE_SETUP_VAR, true)
@ -37,19 +36,19 @@ export async function setup(): Promise<void> {
core.saveState(GRADLE_USER_HOME, gradleUserHome) core.saveState(GRADLE_USER_HOME, gradleUserHome)
const cacheListener = new CacheListener() const cacheListener = new CacheListener()
await caches.restore(userHome, gradleUserHome, cacheListener) await caches.restore(userHome, gradleUserHome, cacheListener, cacheConfig)
core.saveState(CACHE_LISTENER, cacheListener.stringify()) core.saveState(CACHE_LISTENER, cacheListener.stringify())
await dependencyGraph.setup(params.getDependencyGraphOption()) buildScan.setup(buildScanConfig)
buildScan.setup() return true
} }
export async function complete(): Promise<void> { export async function complete(cacheConfig: CacheConfig, summaryConfig: SummaryConfig): Promise<boolean> {
if (!core.getState(GRADLE_SETUP_VAR)) { if (!core.getState(GRADLE_SETUP_VAR)) {
core.info('Gradle setup post-action only performed for first gradle/actions step in workflow.') core.info('Gradle setup post-action only performed for first gradle/actions step in workflow.')
return return false
} }
core.info('In post-action step') core.info('In post-action step')
@ -60,13 +59,13 @@ export async function complete(): Promise<void> {
const cacheListener: CacheListener = CacheListener.rehydrate(core.getState(CACHE_LISTENER)) const cacheListener: CacheListener = CacheListener.rehydrate(core.getState(CACHE_LISTENER))
const daemonController = new DaemonController(buildResults) const daemonController = new DaemonController(buildResults)
await caches.save(userHome, gradleUserHome, cacheListener, daemonController) await caches.save(userHome, gradleUserHome, cacheListener, daemonController, cacheConfig)
await jobSummary.generateJobSummary(buildResults, cacheListener) await jobSummary.generateJobSummary(buildResults, cacheListener, summaryConfig)
await dependencyGraph.complete(params.getDependencyGraphOption())
core.info('Completed post-action step') core.info('Completed post-action step')
return true
} }
async function determineGradleUserHome(): Promise<string> { async function determineGradleUserHome(): Promise<string> {

View File

@ -4,7 +4,8 @@ import * as setupGradle from '../setup-gradle'
import * as execution from '../execution' import * as execution from '../execution'
import * as provisioner from '../provision' import * as provisioner from '../provision'
import * as layout from '../repository-layout' import * as layout from '../repository-layout'
import * as params from '../input-params' import * as dependencyGraph from '../dependency-graph'
import {BuildScanConfig, CacheConfig, DependencyGraphConfig, getArguments} from '../input-params'
/** /**
* The main entry point for the action, called by Github Actions for the step. * The main entry point for the action, called by Github Actions for the step.
@ -12,13 +13,16 @@ import * as params from '../input-params'
export async function run(): Promise<void> { export async function run(): Promise<void> {
try { try {
// Configure Gradle environment (Gradle User Home) // Configure Gradle environment (Gradle User Home)
await setupGradle.setup() await setupGradle.setup(new CacheConfig(), new BuildScanConfig())
// Configure the dependency graph submission
await dependencyGraph.setup(new DependencyGraphConfig())
// Download and install Gradle if required // Download and install Gradle if required
const executable = await provisioner.provisionGradle() const executable = await provisioner.provisionGradle()
// Only execute if arguments have been provided // Only execute if arguments have been provided
const args: string[] = params.getArguments() const args: string[] = getArguments()
if (args.length > 0) { if (args.length > 0) {
const buildRootDirectory = layout.buildRootDirectory() const buildRootDirectory = layout.buildRootDirectory()
await execution.executeGradleBuild(executable, buildRootDirectory, args) await execution.executeGradleBuild(executable, buildRootDirectory, args)

View File

@ -1,5 +1,8 @@
import * as core from '@actions/core' import * as core from '@actions/core'
import * as setupGradle from '../setup-gradle' import * as setupGradle from '../setup-gradle'
import * as dependencyGraph from '../dependency-graph'
import {CacheConfig, DependencyGraphConfig, SummaryConfig} from '../input-params'
import {PostActionJobFailure} from '../errors' import {PostActionJobFailure} from '../errors'
// Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in // Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in
@ -12,7 +15,10 @@ process.on('uncaughtException', e => handleFailure(e))
*/ */
export async function run(): Promise<void> { export async function run(): Promise<void> {
try { try {
await setupGradle.complete() if (await setupGradle.complete(new CacheConfig(), new SummaryConfig())) {
// Only submit the dependency graphs once per job
await dependencyGraph.complete(new DependencyGraphConfig())
}
} catch (error) { } catch (error) {
if (error instanceof PostActionJobFailure) { if (error instanceof PostActionJobFailure) {
core.setFailed(String(error)) core.setFailed(String(error))

View File

@ -1,6 +1,7 @@
import {GradleStateCache} from "../../src/cache-base"
import * as path from 'path' import * as path from 'path'
import * as fs from 'fs' import * as fs from 'fs'
import {GradleStateCache} from "../../src/cache-base"
import {CacheConfig} from "../../src/input-params"
const testTmp = 'test/jest/tmp' const testTmp = 'test/jest/tmp'
fs.rmSync(testTmp, {recursive: true, force: true}) fs.rmSync(testTmp, {recursive: true, force: true})
@ -11,7 +12,7 @@ describe("--info and --stacktrace", () => {
const emptyGradleHome = `${testTmp}/empty-gradle-home` const emptyGradleHome = `${testTmp}/empty-gradle-home`
fs.mkdirSync(emptyGradleHome, {recursive: true}) fs.mkdirSync(emptyGradleHome, {recursive: true})
const stateCache = new GradleStateCache("ignored", emptyGradleHome) const stateCache = new GradleStateCache("ignored", emptyGradleHome, new CacheConfig())
stateCache.configureInfoLogLevel() stateCache.configureInfoLogLevel()
expect(fs.readFileSync(path.resolve(emptyGradleHome, "gradle.properties"), 'utf-8')) expect(fs.readFileSync(path.resolve(emptyGradleHome, "gradle.properties"), 'utf-8'))
@ -24,7 +25,7 @@ describe("--info and --stacktrace", () => {
fs.mkdirSync(existingGradleHome, {recursive: true}) fs.mkdirSync(existingGradleHome, {recursive: true})
fs.writeFileSync(path.resolve(existingGradleHome, "gradle.properties"), "org.gradle.logging.level=debug\n") fs.writeFileSync(path.resolve(existingGradleHome, "gradle.properties"), "org.gradle.logging.level=debug\n")
const stateCache = new GradleStateCache("ignored", existingGradleHome) const stateCache = new GradleStateCache("ignored", existingGradleHome, new CacheConfig())
stateCache.configureInfoLogLevel() stateCache.configureInfoLogLevel()
expect(fs.readFileSync(path.resolve(existingGradleHome, "gradle.properties"), 'utf-8')) expect(fs.readFileSync(path.resolve(existingGradleHome, "gradle.properties"), 'utf-8'))

View File

@ -1,33 +1,33 @@
import * as dependencyGraph from '../../src/dependency-graph' import { DependencyGraphConfig } from "../../src/input-params"
describe('dependency-graph', () => { describe('dependency-graph', () => {
describe('constructs job correlator', () => { describe('constructs job correlator', () => {
it('removes commas from workflow name', () => { it('removes commas from workflow name', () => {
const id = dependencyGraph.constructJobCorrelator('Workflow, with,commas', 'jobid', '{}') const id = DependencyGraphConfig.constructJobCorrelator('Workflow, with,commas', 'jobid', '{}')
expect(id).toBe('workflow_withcommas-jobid') expect(id).toBe('workflow_withcommas-jobid')
}) })
it('removes non word characters', () => { it('removes non word characters', () => {
const id = dependencyGraph.constructJobCorrelator('Workflow!_with()characters', 'job-*id', '{"foo": "bar!@#$%^&*("}') const id = DependencyGraphConfig.constructJobCorrelator('Workflow!_with()characters', 'job-*id', '{"foo": "bar!@#$%^&*("}')
expect(id).toBe('workflow_withcharacters-job-id-bar') expect(id).toBe('workflow_withcharacters-job-id-bar')
}) })
it('replaces spaces', () => { it('replaces spaces', () => {
const id = dependencyGraph.constructJobCorrelator('Workflow !_ with () characters, and spaces', 'job-*id', '{"foo": "bar!@#$%^&*("}') const id = DependencyGraphConfig.constructJobCorrelator('Workflow !_ with () characters, and spaces', 'job-*id', '{"foo": "bar!@#$%^&*("}')
expect(id).toBe('workflow___with_characters_and_spaces-job-id-bar') expect(id).toBe('workflow___with_characters_and_spaces-job-id-bar')
}) })
it('without matrix', () => { it('without matrix', () => {
const id = dependencyGraph.constructJobCorrelator('workflow', 'jobid', 'null') const id = DependencyGraphConfig.constructJobCorrelator('workflow', 'jobid', 'null')
expect(id).toBe('workflow-jobid') expect(id).toBe('workflow-jobid')
}) })
it('with dashes in values', () => { it('with dashes in values', () => {
const id = dependencyGraph.constructJobCorrelator('workflow-name', 'job-id', '{"os": "ubuntu-latest"}') const id = DependencyGraphConfig.constructJobCorrelator('workflow-name', 'job-id', '{"os": "ubuntu-latest"}')
expect(id).toBe('workflow-name-job-id-ubuntu-latest') expect(id).toBe('workflow-name-job-id-ubuntu-latest')
}) })
it('with single matrix value', () => { it('with single matrix value', () => {
const id = dependencyGraph.constructJobCorrelator('workflow', 'jobid', '{"os": "windows"}') const id = DependencyGraphConfig.constructJobCorrelator('workflow', 'jobid', '{"os": "windows"}')
expect(id).toBe('workflow-jobid-windows') expect(id).toBe('workflow-jobid-windows')
}) })
it('with composite matrix value', () => { it('with composite matrix value', () => {
const id = dependencyGraph.constructJobCorrelator('workflow', 'jobid', '{"os": "windows", "java-version": "21.1", "other": "Value, with COMMA"}') const id = DependencyGraphConfig.constructJobCorrelator('workflow', 'jobid', '{"os": "windows", "java-version": "21.1", "other": "Value, with COMMA"}')
expect(id).toBe('workflow-jobid-windows-211-value_with_comma') expect(id).toBe('workflow-jobid-windows-211-value_with_comma')
}) })
}) })