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.
This commit is contained in:
daz 2024-04-06 19:03:51 -06:00
parent ebf4d13461
commit ed4d086d37
No known key found for this signature in database
7 changed files with 33 additions and 26 deletions

View File

@ -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

View File

@ -23,6 +23,7 @@ const DEPENDENCY_GRAPH_PREFIX = 'dependency-graph_'
export async function setup(option: DependencyGraphOption): Promise<void> {
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<void> {
}
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)

View File

@ -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<void> {
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

View File

@ -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<void> {
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))

View File

@ -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<void> {
export async function setup(): Promise<boolean> {
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<void> {
core.saveState(CACHE_LISTENER, cacheListener.stringify())
await dependencyGraph.setup(params.getDependencyGraphOption())
buildScan.setup()
return true
}
export async function complete(): Promise<void> {
export async function complete(): Promise<boolean> {
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<void> {
await jobSummary.generateJobSummary(buildResults, cacheListener)
await dependencyGraph.complete(params.getDependencyGraphOption())
core.info('Completed post-action step')
return true
}
async function determineGradleUserHome(): Promise<string> {

View File

@ -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<void> {
// 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()

View File

@ -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<void> {
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))