Skip to content

Commit

Permalink
Add a gradle task to check compability with child components (#7998)
Browse files Browse the repository at this point in the history
Add compatibility check gradle task ./gradlew checkCompatibility

Signed-off-by: Sayali Gaikawad <[email protected]>
(cherry picked from commit 619aeb5)
Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
github-actions[bot] committed Jun 22, 2023
1 parent 4b3b30d commit e623ada
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 0 deletions.
13 changes: 13 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import org.gradle.plugins.ide.eclipse.model.EclipseJdt
import org.gradle.plugins.ide.eclipse.model.SourceFolder
import org.gradle.api.Project;
import org.gradle.process.ExecResult;
import org.opensearch.gradle.CheckCompatibilityTask

import static org.opensearch.gradle.util.GradleUtils.maybeConfigure

Expand Down Expand Up @@ -634,3 +635,15 @@ tasks.withType(TestTaskReports).configureEach {
tasks.named(JavaBasePlugin.CHECK_TASK_NAME) {
dependsOn tasks.named('testAggregateTestReport', TestReport)
}

tasks.register('checkCompatibility', CheckCompatibilityTask) {
description('Checks the compatibility with child components')
}

allprojects { project ->
project.afterEvaluate {
if (project.tasks.findByName('publishToMavenLocal')) {
checkCompatibility.dependsOn(project.tasks.publishToMavenLocal)
}
}
}
1 change: 1 addition & 0 deletions buildSrc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ dependencies {
api 'org.jruby.jcodings:jcodings:1.0.58'
api 'org.jruby.joni:joni:2.1.48'
api "com.fasterxml.jackson.core:jackson-databind:${props.getProperty('jackson_databind')}"
api "org.ajoberstar.grgit:grgit-core:5.2.0"

testFixturesApi "junit:junit:${props.getProperty('junit')}"
testFixturesApi "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${props.getProperty('randomizedrunner')}"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.gradle

import groovy.json.JsonSlurper
import org.ajoberstar.grgit.Grgit
import org.ajoberstar.grgit.operation.BranchListOp
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.internal.os.OperatingSystem

import java.nio.file.Paths

class CheckCompatibilityTask extends DefaultTask {

static final String REPO_URL = 'https://raw.githubusercontent.com/opensearch-project/opensearch-plugins/main/plugins/.meta'

@Input
List repositoryUrls = project.hasProperty('repositoryUrls') ? project.property('repositoryUrls').split(',') : getRepoUrls()

@Input
String ref = project.hasProperty('ref') ? project.property('ref') : 'main'

@Internal
List failedComponents = []

@Internal
List gitFailedComponents = []

@Internal
List compatibleComponents = []

@TaskAction
void checkCompatibility() {
logger.info("Checking compatibility for: $repositoryUrls for $ref")
repositoryUrls.parallelStream().forEach { repositoryUrl ->
def tempDir = File.createTempDir()
try {
if (cloneAndCheckout(repositoryUrl, tempDir)) {
if (repositoryUrl.toString().endsWithAny('notifications', 'notifications.git')) {
tempDir = Paths.get(tempDir.getAbsolutePath(), 'notifications')
}
project.exec {
workingDir = tempDir
def stdout = new ByteArrayOutputStream()
executable = (OperatingSystem.current().isWindows()) ? 'gradlew.bat' : './gradlew'
args 'assemble'
standardOutput stdout
}
compatibleComponents.add(repositoryUrl)
} else {
logger.lifecycle("Skipping compatibility check for $repositoryUrl")
}
} catch (ex) {
failedComponents.add(repositoryUrl)
logger.info("Gradle assemble failed for $repositoryUrl", ex)
} finally {
tempDir.deleteDir()
}
}
if (!failedComponents.isEmpty()) {
logger.lifecycle("Incompatible components: $failedComponents")
logger.info("Compatible components: $compatibleComponents")
}
if (!gitFailedComponents.isEmpty()) {
logger.lifecycle("Components skipped due to git failures: $gitFailedComponents")
logger.info("Compatible components: $compatibleComponents")
}
if (!compatibleComponents.isEmpty()) {
logger.lifecycle("Compatible components: $compatibleComponents")
}
}

protected static List getRepoUrls() {
def json = new JsonSlurper().parse(REPO_URL.toURL())
def labels = json.projects.values()
return labels as List
}

protected boolean cloneAndCheckout(repoUrl, directory) {
try {
def grgit = Grgit.clone(dir: directory, uri: repoUrl)
def remoteBranches = grgit.branch.list(mode: BranchListOp.Mode.REMOTE)
String targetBranch = 'origin/' + ref
if (remoteBranches.find { it.name == targetBranch } == null) {
gitFailedComponents.add(repoUrl)
logger.info("$ref does not exist for $repoUrl. Skipping the compatibility check!!")
return false
} else {
logger.info("Checking out $targetBranch")
grgit.checkout(branch: targetBranch)
return true
}
} catch (ex) {
logger.error('Exception occurred during GitHub operations', ex)
gitFailedComponents.add(repoUrl)
return false
}
}
}

0 comments on commit e623ada

Please sign in to comment.