Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/non gxp validation #1006

Open
wants to merge 95 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
8e40cf7
first draft
FlavioCampanaBIExt Apr 14, 2023
329585c
EDPC-1603 Add logs.
Apr 27, 2023
8f53deb
EDPC-1603 Fix logs.
Apr 27, 2023
3a080e4
EDPC-1603 Fix logs.
Apr 27, 2023
ddd8be9
EDPC-1603 Fix logs.
Apr 27, 2023
fbc0852
EDPC-1603 Fix logs.
Apr 27, 2023
a420c40
EDPC-1603 Fix logs.
Apr 27, 2023
bfb4e8f
EDPC-1603 Fix logs.
Apr 27, 2023
d7eee17
EDPC-1603 Debug.
Apr 27, 2023
4acace3
EDPC-1603 Debug.
Apr 27, 2023
fa3f38e
EDPC-1603 Debug.
Apr 27, 2023
6180d7e
EDPC-1603 Debug.
Apr 27, 2023
4d1b5b1
EDPC-1603 Debug.
Apr 27, 2023
846e4de
EDPC-1603 Debug.
Apr 27, 2023
1e6718e
EDPC-1603 Debug.
Apr 27, 2023
5db0147
EDPC-1603 Debug.
Apr 27, 2023
32c72fe
EDPC-1603 Debug.
Apr 27, 2023
7047be6
EDPC-1603 Debug.
Apr 27, 2023
f21f912
EDPC-1603 Debug.
Apr 27, 2023
5e462b7
EDPC-1603 Debug.
Apr 27, 2023
83b47d6
EDPC-1603 Debug.
Apr 27, 2023
e76ce46
EDPC-1603 Debug.
Apr 27, 2023
0745340
EDPC-1603 Debug.
Apr 27, 2023
55e8365
EDPC-1603 Debug.
Apr 27, 2023
b0b3e17
EDPC-1603 Debug.
Apr 27, 2023
bb004d4
EDPC-1603 Debug.
Apr 28, 2023
1840a63
EDPC-1603 Debug.
Apr 28, 2023
0ac62eb
EDPC-1603 Fix some tests.
May 3, 2023
961dcb8
changed to status check for mandatory nongxp doc issues
FlavioCampanaBIExt May 3, 2023
f54a931
EDPC-1603 Remove unused method.
May 4, 2023
bc2bada
EDPC-1608 Fixed tests.
May 4, 2023
997cf18
EDPC-1608 Fixed tests.
May 5, 2023
7f43b09
EDPC-1608 Add tests.
May 8, 2023
0b5e418
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
FlavioCampanaBIExt May 9, 2023
37de708
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
FlavioCampanaBIExt May 9, 2023
45f1648
added som other doc tests
FlavioCampanaBIExt May 9, 2023
eb887b0
content for WIP non-man
May 9, 2023
a876ac7
containsKey
May 9, 2023
eff6749
more debug
May 9, 2023
dd9f0b0
EDPC-1672 Update [dev preview/deploy to D] message.
May 9, 2023
14763de
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
May 10, 2023
fc4a5f1
EDPC-1603 Refactor computeWipDocChapterPerDocument and update tests.
May 10, 2023
82ba860
EDPC-1603 Debug.
May 11, 2023
e5fdac9
EDPC-1603 Debug.
May 11, 2023
cf7fffc
EDPC-1603 Debug.
May 11, 2023
6622c5f
EDPC-1603 Debug.
May 11, 2023
7ab3715
EDPC-1603 Debug.
May 11, 2023
3aa5aff
EDPC-1603 Debug.
May 11, 2023
8ec8ea4
EDPC-1603 Debug.
May 11, 2023
f368009
EDPC-1603 Debug.
May 11, 2023
1849550
EDPC-1603 Debug.
May 11, 2023
aeb3a8e
EDPC-1603 Debug.
May 12, 2023
4938884
EDPC-1603 Debug.
May 12, 2023
7ab7e47
EDPC-1603 Debug.
May 12, 2023
1c431a0
EDPC-1603 Debug.
May 12, 2023
36644ae
EDPC-1603 Debug.
May 12, 2023
bdfe0ad
EDPC-1603 Debug.
May 12, 2023
29ba0ac
EDPC-1603 Debug.
May 12, 2023
34a5594
EDPC-1603 Debug.
May 12, 2023
2deb448
EDPC-1603 Debug.
May 15, 2023
ec4bb59
EDPC-1603 Debug.
May 15, 2023
a3cbe42
EDPC-1603 Debug.
May 15, 2023
7e2a78a
added more loggin
FlavioCampanaBIExt May 15, 2023
e041372
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
FlavioCampanaBIExt May 15, 2023
28dff1d
possible fix and more logging
FlavioCampanaBIExt May 15, 2023
bdf974d
EDPC-1603 Debug.
May 16, 2023
4052433
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
May 16, 2023
916eb24
EDPC-1603 Debug.
May 16, 2023
6936ce2
EDPC-1603 Add missing call to values().
May 16, 2023
4eefd64
EDPC-1603 Debug.
May 16, 2023
9df89aa
EDPC-1603 Debug.
May 16, 2023
08a279b
EDPC-1603 Debug.
May 16, 2023
7600840
EDPC-1603 Debug.
May 16, 2023
19e0cfe
EDPC-1603 Debug.
May 17, 2023
3dfab74
EDPC-1603 Debug.
May 17, 2023
99a30f3
EDPC-1603 Fix tests.
May 17, 2023
85d4e11
Style fixes, restoring some NonCPS annotations
FlavioCampanaBIExt May 17, 2023
e160799
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
FlavioCampanaBIExt May 17, 2023
ac656fc
Some fixes
FlavioCampanaBIExt May 18, 2023
1504134
EDPC-1603 Remove debug code.
May 18, 2023
a06bf2f
Fixed NonCPS
FlavioCampanaBIExt May 18, 2023
8993201
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
FlavioCampanaBIExt May 18, 2023
5ee7054
Merge branch 'master' into feature/non-gxp-validation
valituguran May 18, 2023
5b16779
EDPC-1603 Add changelog entry.
May 18, 2023
b7b877a
Merge branch 'temp' into feature/non-gxp-validation
May 18, 2023
f6a7189
EDPC-1603 Fix codenarc reported errors.
May 18, 2023
bb76558
Style fixes for codenarc
FlavioCampanaBIExt May 18, 2023
34e630d
EDPC-1603 Fix gxp metadata variable.
May 18, 2023
6f5ab99
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
FlavioCampanaBIExt May 18, 2023
c897fe7
Merge branch 'feature/non-gxp-validation' of https://bitbucket-tcvedp…
May 18, 2023
e683020
EDPC-1603 Remove comma.
May 18, 2023
6864bd6
Test for not mandatory content resolution
fbeba-bi May 24, 2023
33b078f
Tests extended
fbeba-bi May 24, 2023
e9d7d8d
Tests extended
fbeba-bi May 24, 2023
eb68999
Dummy push
fbeba-bi May 26, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Changelog

## Unreleased
- Change initial project validation to take into account non GxP requirement([#1006](https://github.com/opendevstack/ods-jenkins-shared-library/pull/1006))
- Make IS_GXP property available for CFTP documents ([#996](https://github.com/opendevstack/ods-jenkins-shared-library/issues/996))
- Use a consistent notion of document version and remove header ([#987](https://github.com/opendevstack/ods-jenkins-shared-library/issues/987))
- Improve Document Generation Experience ([#991](https://github.com/opendevstack/ods-jenkins-shared-library/issues/991))
Expand Down
1 change: 1 addition & 0 deletions src/org/ods/orchestration/usecase/JiraUseCase.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,7 @@ class JiraUseCase {
def releaseStatusIssueKey = this.project.buildParams.releaseStatusJiraIssueKey
if (message) {
String commentToAdd = "${message}\n\nSee: ${this.steps.env.RUN_DISPLAY_URL}"
commentToAdd += "\n\nPlease note that for a successful Deploy to D, the above-mentioned issues need to be in status Done."
logger.debug("Adding comment to Jira issue with key ${releaseStatusIssueKey}: ${commentToAdd}")
this.jira.appendCommentToIssue(releaseStatusIssueKey, commentToAdd)
logger.info("Comment was added to Jira issue with key ${releaseStatusIssueKey}: ${commentToAdd}")
Expand Down
22 changes: 10 additions & 12 deletions src/org/ods/orchestration/usecase/LeVADocumentUseCase.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ import java.time.LocalDateTime
'PublicMethodsBeforeNonPublicMethods'])
class LeVADocumentUseCase extends DocGenUseCase {

protected static final boolean IS_GXP_PROJECT_DEFAULT = true
private static final String NOT_MANDATORY_CONTENT = 'Not mandatory.'

protected static Map DOCUMENT_TYPE_NAMES = [
(DocumentType.CSD as String) : 'Combined Specification Document',
Expand Down Expand Up @@ -1000,20 +1000,14 @@ class LeVADocumentUseCase extends DocGenUseCase {
sections: sections,
documentHistory: docHistory?.getDocGenFormat() ?: [],
documentHistoryLatestVersionId: docHistory?.latestVersionId ?: 1,
isGxpProject: isGxpProject(this.project.getProjectProperties()),
isGxpProject: this.project.isGxpProject(),
]
]

def uri = this.createDocument(documentType, null, data_, [:], null, getDocumentTemplateName(documentType), watermarkText)
this.updateJiraDocumentationTrackingIssue(documentType, uri, docHistory?.getVersion() as String)
return uri
}

protected boolean isGxpProject(Map projectProperties) {
String isGxp = projectProperties."PROJECT.IS_GXP"
return isGxp != null ? isGxp.toBoolean() : IS_GXP_PROJECT_DEFAULT
}

@NonCPS
private def computeKeysInDocForTIP(def data) {
return data.collect { it.key }
Expand Down Expand Up @@ -1528,7 +1522,7 @@ class LeVADocumentUseCase extends DocGenUseCase {
date_created : LocalDateTime.now().toString(),
buildParameter: this.project.buildParams,
git : repo ? repo.data.git : this.project.gitData,
gxp : isGxpProject(this.project.getProjectProperties()),
gxp : project.isGxpProject(),
openShift : [apiUrl: this.project.getOpenShiftApiUrl()],
jenkins : [
buildNumber: this.steps.env.BUILD_NUMBER,
Expand Down Expand Up @@ -1693,10 +1687,14 @@ class LeVADocumentUseCase extends DocGenUseCase {
throw new RuntimeException("Error: unable to create ${documentType}. " +
'Could not obtain document chapter data from Jira.')
}
// Extract-out the section, as needed for the DocGen interface
return sections.collectEntries { sec ->
[(sec.section): sec + [content: this.convertImages(sec.content)]]

def sectionCollection = sections.collectEntries { sec ->
[(sec.section): sec + [content: this.project.replaceIssueContentWithNonMandatoryText(sec) ?
'<p><em>' + this.NOT_MANDATORY_CONTENT + '</em></p>' : this.convertImages(sec.content)]]
}

// Extract-out the section, as needed for the DocGen interface
return sectionCollection
}

protected Map getDocumentSectionsFileOptional(String documentType) {
Expand Down
220 changes: 113 additions & 107 deletions src/org/ods/orchestration/util/MROPipelineUtil.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import org.ods.orchestration.dependency.DependencyGraph
import org.ods.orchestration.dependency.Node
import org.ods.services.OpenShiftService
import org.ods.services.ServiceRegistry
import org.ods.orchestration.util.DeploymentDescriptor
import org.ods.orchestration.phases.DeployOdsComponent
import org.ods.orchestration.phases.FinalizeOdsComponent
import org.ods.orchestration.phases.FinalizeNonOdsComponent
Expand All @@ -21,6 +20,7 @@ import org.yaml.snakeyaml.Yaml
class MROPipelineUtil extends PipelineUtil {

class PipelineConfig {

// TODO: deprecate .pipeline-config.yml in favor of release-manager.yml
static final List FILE_NAMES = ["release-manager.yml", ".pipeline-config.yml"]

Expand All @@ -36,23 +36,27 @@ class MROPipelineUtil extends PipelineUtil {

static final List PHASE_EXECUTOR_TYPES = [
PHASE_EXECUTOR_TYPE_MAKEFILE,
PHASE_EXECUTOR_TYPE_SHELLSCRIPT
PHASE_EXECUTOR_TYPE_SHELLSCRIPT,
]

static final List<String> INSTALLABLE_REPO_TYPES = [
REPO_TYPE_ODS_CODE as String,
REPO_TYPE_ODS_SERVICE as String,
REPO_TYPE_ODS_INFRA as String
REPO_TYPE_ODS_INFRA as String,
]

}

class PipelineEnvs {

static final String DEV = "dev"
static final String QA = "qa"
static final String PROD = "prod"

}

class PipelinePhases {

static final String BUILD = "Build"
static final String DEPLOY = "Deploy"
static final String FINALIZE = "Finalize"
Expand All @@ -61,6 +65,7 @@ class MROPipelineUtil extends PipelineUtil {
static final String TEST = "Test"

static final List ALWAYS_PARALLEL = []

}

static final String COMPONENT_METADATA_FILE_NAME = 'metadata.yml'
Expand Down Expand Up @@ -88,46 +93,6 @@ class MROPipelineUtil extends PipelineUtil {
}
}

private void executeODSComponent(Map repo, String baseDir, boolean failfast = true,
String jenkinsFile = 'Jenkinsfile') {
this.steps.dir(baseDir) {
if (repo.data.openshift.resurrectedBuild) {
logger.info("Repository '${repo.id}' is in sync with OpenShift, no need to rebuild")
return
}
def job
def env = []
env.addAll(this.project.getMainReleaseManagerEnv())
this.project.buildParams.each { key, value ->
env << "BUILD_PARAM_${key.toUpperCase()}=${value}"
}
env << "NOTIFY_BB_BUILD=${!project.isWorkInProgress}"
this.steps.withEnv (env) {
job = this.loadGroovySourceFile("${baseDir}/${jenkinsFile}")
}
// Collect ODS build artifacts for repo.
// We get a map with at least two keys ("build" and "deployments").
def buildArtifacts = job.getBuildArtifactURIs()
buildArtifacts.each { k, v ->
if (k != 'failedStage') {
repo.data.openshift[k] = v
}
}
def versionAndBuild = "${this.project.buildParams.version}/${this.steps.env.BUILD_NUMBER}"
repo.data.openshift[DeploymentDescriptor.CREATED_BY_BUILD_STR] = versionAndBuild
this.logger.debug("Collected ODS build artifacts for repo '${repo.id}': ${repo.data.openshift}")

if (buildArtifacts.failedStage) {
repo.data << ['failedStage': buildArtifacts.failedStage]
if (failfast) {
throw new RuntimeException("Error: aborting due to previous errors in repo '${repo.id}'.")
} else {
this.logger.warn("Got errors in repo '${repo.id}', will fail delayed.")
}
}
}
}

Map loadPipelineConfig(String path, Map repo) {
if (!path?.trim()) {
throw new IllegalArgumentException("Error: unable to parse pipeline config. 'path' is undefined.")
Expand Down Expand Up @@ -226,7 +191,7 @@ class MROPipelineUtil extends PipelineUtil {
repo.id,
{
checkoutNotReleaseManagerRepo(repo, recheckout)
}
},
]
}

Expand Down Expand Up @@ -265,7 +230,7 @@ class MROPipelineUtil extends PipelineUtil {
previousSucessfulCommit: lastSuccessCommit,
url: scm.GIT_URL,
baseTag: this.project.baseTag,
targetTag: this.project.targetTag
targetTag: this.project.targetTag,
]
def repoPath = "${this.steps.env.WORKSPACE}/${REPOS_BASE_DIR}/${repo.id}"
loadPipelineConfig(repoPath, repo)
Expand All @@ -283,66 +248,6 @@ class MROPipelineUtil extends PipelineUtil {
}
}

private Map checkOutNotReleaseManagerRepoInNotPromotionMode(Map repo, boolean isWorkInProgress) {
Map scmResult = [ : ]
String gitReleaseBranch = this.project.gitReleaseBranch
if ("master" == gitReleaseBranch) {
gitReleaseBranch = repo.branch
}

// check if release manager repo already has a release branch
if (git.remoteBranchExists(gitReleaseBranch)) {
try {
scmResult.scm = checkoutBranchInRepoDir(repo, gitReleaseBranch)
scmResult.scmBranch = gitReleaseBranch
} catch (ex) {
if (! isWorkInProgress) {
this.logger.warn """
Checkout of '${gitReleaseBranch}' for repo '${repo.id}' failed.
Attempting to checkout '${repo.branch}' and create the release branch from it.
"""
// Possible reasons why this might happen:
// * Release branch manually created in RM repo
// * Repo is added to metadata.yml file on a release branch
// * Release branch has been deleted in repo

scmResult.scm = createBranchFromDefaultBranch(repo, gitReleaseBranch)
scmResult.scmBranch = gitReleaseBranch
} else {
this.logger.warn """
Checkout of '${gitReleaseBranch}' for repo '${repo.id}' failed.
Attempting to checkout branch '${repo.branch}'.
"""
scmResult.scm = checkoutBranchInRepoDir(repo, repo.branch)
scmResult.scmBranch = repo.branch
}
}
} else {
if (! isWorkInProgress) {
scmResult.scm = createBranchFromDefaultBranch(repo, gitReleaseBranch)
scmResult.scmBranch = gitReleaseBranch
} else {
this.logger.info("Since in WIP and no release branch exists (${this.project.gitReleaseBranch}), checking out branch ${repo.branch} for repo ${repo.id}")
scmResult.scm = checkoutBranchInRepoDir(repo, repo.branch)
scmResult.scmBranch = repo.branch
}
}
return scmResult
}

private def createBranchFromDefaultBranch(Map repo, String branchName) {
this.logger.info("Creating branch ${branchName} from branch ${repo.branch} for repo ${repo.id} ")
def scm = checkoutBranchInRepoDir(repo, repo.branch)
if (repo.branch != branchName) {
steps.dir("${REPOS_BASE_DIR}/${repo.id}") {
git.checkoutNewLocalBranch(branchName)
}
} else {
this.logger.info("No need to create branch ${branchName} for repo ${repo.id} ")
}
return scm
}

def checkoutTagInRepoDir(Map repo, String tag) {
this.logger.info("Checkout tag ${repo.id}@${tag}")
def credentialsId = this.project.services.bitbucket.credentials.id
Expand Down Expand Up @@ -460,7 +365,7 @@ class MROPipelineUtil extends PipelineUtil {
postExecute(this.steps, repo)
}
}
}
},
]
}

Expand Down Expand Up @@ -497,6 +402,106 @@ class MROPipelineUtil extends PipelineUtil {
}
}

private void executeODSComponent(Map repo, String baseDir, boolean failfast = true,
String jenkinsFile = 'Jenkinsfile') {
this.steps.dir(baseDir) {
if (repo.data.openshift.resurrectedBuild) {
logger.info("Repository '${repo.id}' is in sync with OpenShift, no need to rebuild")
return
}
def job
def env = []
env.addAll(this.project.getMainReleaseManagerEnv())
this.project.buildParams.each { key, value ->
env << "BUILD_PARAM_${key.toUpperCase()}=${value}"
}
env << "NOTIFY_BB_BUILD=${!project.isWorkInProgress}"
this.steps.withEnv (env) {
job = this.loadGroovySourceFile("${baseDir}/${jenkinsFile}")
}
// Collect ODS build artifacts for repo.
// We get a map with at least two keys ("build" and "deployments").
def buildArtifacts = job.getBuildArtifactURIs()
buildArtifacts.each { k, v ->
if (k != 'failedStage') {
repo.data.openshift[k] = v
}
}
def versionAndBuild = "${this.project.buildParams.version}/${this.steps.env.BUILD_NUMBER}"
repo.data.openshift[DeploymentDescriptor.CREATED_BY_BUILD_STR] = versionAndBuild
this.logger.debug("Collected ODS build artifacts for repo '${repo.id}': ${repo.data.openshift}")

if (buildArtifacts.failedStage) {
repo.data << ['failedStage': buildArtifacts.failedStage]
if (failfast) {
throw new RuntimeException("Error: aborting due to previous errors in repo '${repo.id}'.")
} else {
this.logger.warn("Got errors in repo '${repo.id}', will fail delayed.")
}
}
}
}

private Map checkOutNotReleaseManagerRepoInNotPromotionMode(Map repo, boolean isWorkInProgress) {
Map scmResult = [ : ]
String gitReleaseBranch = this.project.gitReleaseBranch
if ("master" == gitReleaseBranch) {
gitReleaseBranch = repo.branch
}

// check if release manager repo already has a release branch
if (git.remoteBranchExists(gitReleaseBranch)) {
try {
scmResult.scm = checkoutBranchInRepoDir(repo, gitReleaseBranch)
scmResult.scmBranch = gitReleaseBranch
} catch (ex) {
if (! isWorkInProgress) {
this.logger.warn """
Checkout of '${gitReleaseBranch}' for repo '${repo.id}' failed.
Attempting to checkout '${repo.branch}' and create the release branch from it.
"""
// Possible reasons why this might happen:
// * Release branch manually created in RM repo
// * Repo is added to metadata.yml file on a release branch
// * Release branch has been deleted in repo

scmResult.scm = createBranchFromDefaultBranch(repo, gitReleaseBranch)
scmResult.scmBranch = gitReleaseBranch
} else {
this.logger.warn """
Checkout of '${gitReleaseBranch}' for repo '${repo.id}' failed.
Attempting to checkout branch '${repo.branch}'.
"""
scmResult.scm = checkoutBranchInRepoDir(repo, repo.branch)
scmResult.scmBranch = repo.branch
}
}
} else {
if (! isWorkInProgress) {
scmResult.scm = createBranchFromDefaultBranch(repo, gitReleaseBranch)
scmResult.scmBranch = gitReleaseBranch
} else {
this.logger.info("Since in WIP and no release branch exists (${this.project.gitReleaseBranch}), checking out branch ${repo.branch} for repo ${repo.id}")
scmResult.scm = checkoutBranchInRepoDir(repo, repo.branch)
scmResult.scmBranch = repo.branch
}
}
return scmResult
}

private createBranchFromDefaultBranch(Map repo, String branchName) {
this.logger.info("Creating branch ${branchName} from branch ${repo.branch} for repo ${repo.id} ")
def scm = checkoutBranchInRepoDir(repo, repo.branch)
if (repo.branch != branchName) {
steps.dir("${REPOS_BASE_DIR}/${repo.id}") {
git.checkoutNewLocalBranch(branchName)
}
} else {
this.logger.info("No need to create branch ${branchName} for repo ${repo.id} ")
}
return scm
}

private boolean isRepoModified(Map repo) {
if (!repo.data.envStateCommit) {
logger.debug("Last recorded commit of '${repo.id}' cannot be retrieved.")
Expand Down Expand Up @@ -583,7 +588,7 @@ class MROPipelineUtil extends PipelineUtil {
OpenShiftService.DEPLOYMENTCONFIG_KIND,
deploymentDescriptor.deploymentNames
)
} catch(ex) {
} catch (ex) {
logger.info(
"Resurrection of previous build for '${repo.id}' not possible as " +
"not all deployments could be retrieved: ${ex.message}"
Expand Down Expand Up @@ -613,4 +618,5 @@ class MROPipelineUtil extends PipelineUtil {
repo.data.openshift.deployments = deployments
logger.debug("Data from previous Jenkins build:\r${repo.data.openshift}")
}

}
Loading