From ed4d086d37d76ed309eb6325fbe785243cdc584f Mon Sep 17 00:00:00 2001 From: daz Date: Sat, 6 Apr 2024 19:03:51 -0600 Subject: [PATCH] Make dependency-submission and setup-gradle play nicely Now, a `dependency-submission` step will trigger a dependency-graph generation, even if it follows a `setup-gradle` step in the workflow. Similarly, a `setup-gradle` step with `dependency-graph` configured will function as expected even if it follows a `setup-gradle` step. --- .github/workflows/dependency-submission.yml | 6 ------ sources/src/dependency-graph.ts | 3 ++- sources/src/dependency-submission/main.ts | 12 +++++------- sources/src/dependency-submission/post.ts | 8 +++++++- sources/src/setup-gradle.ts | 18 ++++++++---------- sources/src/setup-gradle/main.ts | 4 ++++ sources/src/setup-gradle/post.ts | 8 +++++++- 7 files changed, 33 insertions(+), 26 deletions(-) diff --git a/.github/workflows/dependency-submission.yml b/.github/workflows/dependency-submission.yml index c099ef9..f2aa6b0 100644 --- a/.github/workflows/dependency-submission.yml +++ b/.github/workflows/dependency-submission.yml @@ -60,11 +60,5 @@ jobs: - name: Generate and submit dependencies id: dependency-submission uses: ./dependency-submission - continue-on-error: true with: 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 diff --git a/sources/src/dependency-graph.ts b/sources/src/dependency-graph.ts index 44277ae..a832bd1 100644 --- a/sources/src/dependency-graph.ts +++ b/sources/src/dependency-graph.ts @@ -23,6 +23,7 @@ const DEPENDENCY_GRAPH_PREFIX = 'dependency-graph_' export async function setup(option: DependencyGraphOption): Promise { if (option === DependencyGraphOption.Disabled) { + core.exportVariable('GITHUB_DEPENDENCY_GRAPH_ENABLED', 'false') return } // Download and submit early, for compatability with dependency review. @@ -32,7 +33,7 @@ export async function setup(option: DependencyGraphOption): Promise { } 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_JOB_CORRELATOR', getJobCorrelator()) maybeExportVariable('GITHUB_DEPENDENCY_GRAPH_JOB_ID', github.context.runId) diff --git a/sources/src/dependency-submission/main.ts b/sources/src/dependency-submission/main.ts index fae38bf..cfbb688 100644 --- a/sources/src/dependency-submission/main.ts +++ b/sources/src/dependency-submission/main.ts @@ -4,6 +4,8 @@ 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 {DependencyGraphOption, getDependencyGraphOption} from '../input-params' @@ -12,16 +14,12 @@ import {DependencyGraphOption, getDependencyGraphOption} from '../input-params' */ export async function run(): Promise { try { - if (process.env['GRADLE_BUILD_ACTION_SETUP_COMPLETED']) { - core.setFailed( - 'The dependency-submission action cannot be used in the same Job as the setup-gradle action. Please use a separate Job for dependency submission.' - ) - return - } - // Configure Gradle environment (Gradle User Home) await setupGradle.setup() + // Configure the dependency graph submission + await dependencyGraph.setup(getDependencyGraphOption()) + if (getDependencyGraphOption() === DependencyGraphOption.DownloadAndSubmit) { // No execution to perform return diff --git a/sources/src/dependency-submission/post.ts b/sources/src/dependency-submission/post.ts index b57c600..83efab1 100644 --- a/sources/src/dependency-submission/post.ts +++ b/sources/src/dependency-submission/post.ts @@ -1,5 +1,8 @@ import * as core from '@actions/core' import * as setupGradle from '../setup-gradle' +import * as dependencyGraph from '../dependency-graph' + +import {getDependencyGraphOption} from '../input-params' import {PostActionJobFailure} from '../errors' // 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 { try { - await setupGradle.complete() + if (await setupGradle.complete()) { + // Only submit the dependency graphs once per job + await dependencyGraph.complete(getDependencyGraphOption()) + } } catch (error) { if (error instanceof PostActionJobFailure) { core.setFailed(String(error)) diff --git a/sources/src/setup-gradle.ts b/sources/src/setup-gradle.ts index 57c1aa6..5c35766 100644 --- a/sources/src/setup-gradle.ts +++ b/sources/src/setup-gradle.ts @@ -4,8 +4,6 @@ import * as path from 'path' import * as os from 'os' import * as caches from './caches' 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 buildScan from './build-scan' @@ -18,14 +16,14 @@ const USER_HOME = 'USER_HOME' const GRADLE_USER_HOME = 'GRADLE_USER_HOME' const CACHE_LISTENER = 'CACHE_LISTENER' -export async function setup(): Promise { +export async function setup(): Promise { const userHome = await determineUserHome() const gradleUserHome = await determineGradleUserHome() // Bypass setup on all but first action step in workflow. if (process.env[GRADLE_SETUP_VAR]) { 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 core.exportVariable(GRADLE_SETUP_VAR, true) @@ -41,15 +39,15 @@ export async function setup(): Promise { core.saveState(CACHE_LISTENER, cacheListener.stringify()) - await dependencyGraph.setup(params.getDependencyGraphOption()) - buildScan.setup() + + return true } -export async function complete(): Promise { +export async function complete(): Promise { if (!core.getState(GRADLE_SETUP_VAR)) { core.info('Gradle setup post-action only performed for first gradle/actions step in workflow.') - return + return false } core.info('In post-action step') @@ -64,9 +62,9 @@ export async function complete(): Promise { await jobSummary.generateJobSummary(buildResults, cacheListener) - await dependencyGraph.complete(params.getDependencyGraphOption()) - core.info('Completed post-action step') + + return true } async function determineGradleUserHome(): Promise { diff --git a/sources/src/setup-gradle/main.ts b/sources/src/setup-gradle/main.ts index 995c3f2..f4aafe8 100644 --- a/sources/src/setup-gradle/main.ts +++ b/sources/src/setup-gradle/main.ts @@ -5,6 +5,7 @@ import * as execution from '../execution' import * as provisioner from '../provision' import * as layout from '../repository-layout' import * as params from '../input-params' +import * as dependencyGraph from '../dependency-graph' /** * The main entry point for the action, called by Github Actions for the step. @@ -14,6 +15,9 @@ export async function run(): Promise { // Configure Gradle environment (Gradle User Home) await setupGradle.setup() + // Configure the dependency graph submission + await dependencyGraph.setup(params.getDependencyGraphOption()) + // Download and install Gradle if required const executable = await provisioner.provisionGradle() diff --git a/sources/src/setup-gradle/post.ts b/sources/src/setup-gradle/post.ts index b57c600..83efab1 100644 --- a/sources/src/setup-gradle/post.ts +++ b/sources/src/setup-gradle/post.ts @@ -1,5 +1,8 @@ import * as core from '@actions/core' import * as setupGradle from '../setup-gradle' +import * as dependencyGraph from '../dependency-graph' + +import {getDependencyGraphOption} from '../input-params' import {PostActionJobFailure} from '../errors' // 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 { try { - await setupGradle.complete() + if (await setupGradle.complete()) { + // Only submit the dependency graphs once per job + await dependencyGraph.complete(getDependencyGraphOption()) + } } catch (error) { if (error instanceof PostActionJobFailure) { core.setFailed(String(error))