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
32 changed files with 283992 additions and 959 deletions
+7
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:
+9
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
@@ -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
@@ -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:
@@ -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
+3
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`:
+21 -35
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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+283 -289
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
+279 -285
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
+5 -3
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-*",
+5 -17
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)
+13 -11
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}`)
+20 -11
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')
+7 -28
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])
} }
+18 -18
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)
}) })
} }
+33 -50
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()
} }
+59
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()
+41
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()
+212 -122
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'
}
+10 -36
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>`
+6 -3
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) {
+12 -13
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> {
+7 -3
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)
+7 -1
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))
+4 -3
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'))
+8 -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')
}) })
}) })