From b135290c4094a960b8fc34d3078e6267ccf29307 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 22 Apr 2022 02:39:47 +0000 Subject: [PATCH 1/2] Add output rpm validation and descriptions for every build in Jenkins Signed-off-by: Peter Zhu --- jenkins/docker/Jenkinsfile | 1 + .../bwc-test.jenkinsfile | 1 + .../distribution-build.jenkinsfile | 58 +++++++++++++----- .../integ-test.jenkinsfile | 1 + .../.distribution-build.jenkinsfile.swp | Bin 0 -> 40960 bytes jenkins/opensearch/bwc-test.jenkinsfile | 1 + .../opensearch/distribution-build.jenkinsfile | 46 +++++++++++--- jenkins/opensearch/integ-test.jenkinsfile | 1 + .../rpm-validation/rpm-validation.jenkinsfile | 1 + 9 files changed, 85 insertions(+), 25 deletions(-) create mode 100644 jenkins/opensearch/.distribution-build.jenkinsfile.swp diff --git a/jenkins/docker/Jenkinsfile b/jenkins/docker/Jenkinsfile index bb1ca2936f..39f110ec19 100644 --- a/jenkins/docker/Jenkinsfile +++ b/jenkins/docker/Jenkinsfile @@ -40,6 +40,7 @@ pipeline { } steps { script { + currentBuild.description = DOCKER_BUILD_SCRIPT_WITH_COMMANDS git url: "$DOCKER_BUILD_GIT_REPOSITORY", branch: "$DOCKER_BUILD_GIT_REPOSITORY_REFERENCE" def CREDENTIAL_ID = "jenkins-staging-docker-staging-credential" if (env.IS_STAGING == "false") { diff --git a/jenkins/opensearch-dashboards/bwc-test.jenkinsfile b/jenkins/opensearch-dashboards/bwc-test.jenkinsfile index 2879a35aec..dc407267c2 100644 --- a/jenkins/opensearch-dashboards/bwc-test.jenkinsfile +++ b/jenkins/opensearch-dashboards/bwc-test.jenkinsfile @@ -35,6 +35,7 @@ pipeline { } steps { script { + currentBuild.description = TEST_MANIFEST if (AGENT_LABEL == '') { currentBuild.result = 'ABORTED' error("BWC Tests failed to start. Missing parameter: AGENT_LABEL.") diff --git a/jenkins/opensearch-dashboards/distribution-build.jenkinsfile b/jenkins/opensearch-dashboards/distribution-build.jenkinsfile index 4d4f709e9a..95411737e1 100644 --- a/jenkins/opensearch-dashboards/distribution-build.jenkinsfile +++ b/jenkins/opensearch-dashboards/distribution-build.jenkinsfile @@ -176,17 +176,30 @@ pipeline { String bundleManifestUrl = buildManifestObj.getBundleManifestUrl(JOB_NAME, BUILD_NUMBER) echo "Trigger rpm validation for x64 rpm ${bundleManifestUrl}" - build job: 'rpm-validation', - propagate: false, - wait: true, - parameters: [ - string(name: 'BUNDLE_MANIFEST_URL', value: bundleManifestUrl), - string(name: 'AGENT_LABEL', value: AGENT_X64) - ] + def rpmValidationResults = + build job: 'rpm-validation', + propagate: false, + wait: true, + parameters: [ + string(name: 'BUNDLE_MANIFEST_URL', value: bundleManifestUrl), + string(name: 'AGENT_LABEL', value: AGENT_X64) + ] + + env.RPM_VALIDATION_X64_RPM_TEST_RESULT = createTestResultsMessage( + testType: "RPM Validation (x64, rpm)", + status: rpmValidationResults.getResult(), + absoluteUrl: rpmValidationResults.getAbsoluteUrl() + ) } } post { - always { + script { + lib.jenkins.Messages.new(this).add( + "${STAGE_NAME}", + lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) + + "\n${env.RPM_VALIDATION_X64_RPM_TEST_RESULT}" + ) + postCleanup() } } @@ -360,17 +373,30 @@ pipeline { String bundleManifestUrl = buildManifestObj.getBundleManifestUrl(JOB_NAME, BUILD_NUMBER) echo "Trigger rpm validation for arm64 rpm ${bundleManifestUrl}" - build job: 'rpm-validation', - propagate: false, - wait: true, - parameters: [ - string(name: 'BUNDLE_MANIFEST_URL', value: bundleManifestUrl), - string(name: 'AGENT_LABEL', value: AGENT_ARM64) - ] + def rpmValidationResults = + build job: 'rpm-validation', + propagate: false, + wait: true, + parameters: [ + string(name: 'BUNDLE_MANIFEST_URL', value: bundleManifestUrl), + string(name: 'AGENT_LABEL', value: AGENT_ARM64) + ] + + env.RPM_VALIDATION_ARM64_RPM_TEST_RESULT = createTestResultsMessage( + testType: "RPM Validation (arm64, rpm)", + status: rpmValidationResults.getResult(), + absoluteUrl: rpmValidationResults.getAbsoluteUrl() + ) } } post { - always { + script { + lib.jenkins.Messages.new(this).add( + "${STAGE_NAME}", + lib.jenkins.Messages.new(this).get(["${STAGE_NAME}"]) + + "\n${env.RPM_VALIDATION_ARM64_RPM_TEST_RESULT}" + ) + postCleanup() } } diff --git a/jenkins/opensearch-dashboards/integ-test.jenkinsfile b/jenkins/opensearch-dashboards/integ-test.jenkinsfile index c997f4e724..e248130028 100644 --- a/jenkins/opensearch-dashboards/integ-test.jenkinsfile +++ b/jenkins/opensearch-dashboards/integ-test.jenkinsfile @@ -35,6 +35,7 @@ pipeline { } steps { script { + currentBuild.description = TEST_MANIFEST if (AGENT_LABEL == '') { currentBuild.result = 'ABORTED' error("Integration Tests failed to start. Missing parameter: AGENT_LABEL.") diff --git a/jenkins/opensearch/.distribution-build.jenkinsfile.swp b/jenkins/opensearch/.distribution-build.jenkinsfile.swp new file mode 100644 index 0000000000000000000000000000000000000000..ba7e60dfa7c007b33c3e84043396c09dcf5c47b7 GIT binary patch literal 40960 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 Date: Fri, 22 Apr 2022 02:44:19 +0000 Subject: [PATCH 2/2] Add more spacing Signed-off-by: Peter Zhu --- .../.distribution-build.jenkinsfile.swp | Bin 40960 -> 0 bytes .../opensearch/distribution-build.jenkinsfile | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 jenkins/opensearch/.distribution-build.jenkinsfile.swp diff --git a/jenkins/opensearch/.distribution-build.jenkinsfile.swp b/jenkins/opensearch/.distribution-build.jenkinsfile.swp deleted file mode 100644 index ba7e60dfa7c007b33c3e84043396c09dcf5c47b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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