From 99810eda030855bd737c7a7a21c8f2d3108bf9d9 Mon Sep 17 00:00:00 2001 From: Michal Kovarik Date: Nov 06 2019 14:30:53 +0000 Subject: [PATCH 1/2] Add sendResultToMessageBus function Method for sending results of tested images. Used in factory2-segment-tests, moving to allow use it by multiple projects. --- diff --git a/vars/c3i.groovy b/vars/c3i.groovy index 7ffb750..664c1ed 100644 --- a/vars/c3i.groovy +++ b/vars/c3i.groovy @@ -209,3 +209,79 @@ def clone(Map args) { ]) } } + +/** + * Send message with container testing results. + * @param args.imageRepo Name of the image. + * @param args.imageDigest Digest of the image. + * @param args.imageVerRel Version of the image. E.g. 1.2.3-1 + * @param args.imageIsScratchBuild Boolean value. + * @param args.provider UMB provider name defined in Jenkins. + * @return Result from sendCIMessage. + */ + +def sendResultToMessageBus( + String imageRepo, // e.g. 'waiverdb' + String imageDigest, // e.g. 'sha256:79bd800433a1965d970dfa17b518c3b58e1e1c1528df77900d57c0fbc7dd5949' + String imageVerRel, // e.g. '1.2.3-1' + boolean imageIsScratchBuild = true, + String provider = 'Red Hat UMB' + ) { + // currentBuild.result == null || currentBuild.result == 'SUCCESS' indicates a successful build, + // because it's possible that the pipeline engine hasn't set the value nor seen an error when reaching to this line. + // See example code in https://jenkins.io/doc/book/pipeline/jenkinsfile/#deploy + def sendResult = sendCIMessage \ + providerName: provider, \ + overrides: [topic: 'VirtualTopic.eng.ci.container-image.test.complete'], \ + messageType: 'Custom', \ + messageProperties: '', \ + messageContent: """ + { + "version": "0.1.0", + "ci": { + "name": "C3I Jenkins", + "team": "DevOps", + "url": "${env.JENKINS_URL}", + "docs": "https://gitlab.cee.redhat.com/devops/factory2-segment-tests/tree/master/integration-test", + "irc": "#pnt-devops-dev", + "email": "pnt-factory2-devel@redhat.com", + "environment": "stage" + }, + "run": { + "url": "${env.BUILD_URL}", + "log": "${env.BUILD_URL}/console", + "debug": "", + "rebuild": "${env.BUILD_URL}/rebuild/parametrized" + }, + "artifact": { + "type": "container-image", + "repository": "${imageRepo}", + "digest": "${imageDigest}", + "nvr": "${imageRepo}:${imageVerRel}", + "issuer": "c3i-jenkins", + "scratch": ${imageIsScratchBuild}, + "id": "${imageRepo}@${imageDigest}" + }, + "system": + [{ + "os": "${env.JENKINS_AGENT_IMAGE}", + "provider": "openshift", + "architecture": "x86_64" + }], + "type": "integration", + "category": "${env.TESTCASE_CATEGORY}", + "status": "${currentBuild.result == null || currentBuild.result == 'SUCCESS' ? 'passed':'failed'}", + "generated_at": "${new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone('UTC'))}", + "namespace": "c3i", + "version": "0.1.0" + } + """ + if (sendResult.getMessageId()) { + // echo sent message id and content + echo 'Successfully sent the test result to ResultsDB.' + echo "Message ID: ${sendResult.getMessageId()}" + echo "Message content: ${sendResult.getMessageContent()}" + } else { + echo 'Failed to sent the test result to ResultsDB.' + } +} From aabf3c4b9ad8a0976305ee80142d923bf656dc83 Mon Sep 17 00:00:00 2001 From: Michal Kovarik Date: Nov 07 2019 13:34:01 +0000 Subject: [PATCH 2/2] Add test for c3i.sendResultToMessageBus --- diff --git a/test/SendResultToMessageBusTest.groovy b/test/SendResultToMessageBusTest.groovy new file mode 100644 index 0000000..637cfd7 --- /dev/null +++ b/test/SendResultToMessageBusTest.groovy @@ -0,0 +1,70 @@ +import org.junit.* +import com.lesfurets.jenkins.unit.cps.BasePipelineTestCPS +import static groovy.test.GroovyAssert.* + +class SendCIMessageMock { + def successState + def getMessageContentCallCount = 0 + SendCIMessageMock(boolean success = true) { + successState = success + } + def getMessageId(){ + if (successState){ + return 'messageid.123' + } + return null + } + def getMessageContent(){ + getMessageContentCallCount++ + return '{"message": "sent"}' + } +} + +class SendResultToMessageBusTest extends BasePipelineTestCPS { + def c3i + def messagemock + + @Before + void setUp() { + super.setUp() + c3i = loadScript('vars/c3i.groovy') + binding.setVariable('env', ['BUILD_URL': "test"]) + messagemock = new SendCIMessageMock() + helper.registerAllowedMethod('sendCIMessage', [Map.class], {return messagemock}) + } + + @Test + void testSendResultToMessageBusDefaults() { + c3i.sendResultToMessageBus('abc', 'sha256:79bd8004', "1.2.3-1") + printCallStack() + assertEquals(1, helper.methodCallCount('sendCIMessage')) + assertEquals(1, messagemock.getMessageContentCallCount) + def args = helper.callStack.find { call -> call.methodName == 'sendCIMessage' }.args + assertEquals(["Red Hat UMB"], args.providerName) + assertEquals(['VirtualTopic.eng.ci.container-image.test.complete'], args.overrides.topic) + def parser = new groovy.json.JsonSlurper() + def messageContent = parser.parseText(args.messageContent[0]) + assertEquals(true, messageContent.artifact.scratch) + } + + @Test + void testSendResultToMessageBusProvider() { + c3i.sendResultToMessageBus('abc', 'sha256:79bd8004', "1.2.3-1", false, 'My Provider') + printCallStack() + assertEquals(1, helper.methodCallCount('sendCIMessage')) + def args = helper.callStack.find { call -> call.methodName == 'sendCIMessage' }.args + assertEquals(["My Provider"], args.providerName) + assertEquals(['VirtualTopic.eng.ci.container-image.test.complete'], args.overrides.topic) + def parser = new groovy.json.JsonSlurper() + def messageContent = parser.parseText(args.messageContent[0]) + assertEquals(false, messageContent.artifact.scratch) + } + + @Test + void testSendResultToMessageBusFail() { + messagemock = new SendCIMessageMock(false) + helper.registerAllowedMethod('sendCIMessage', [Map.class], {return messagemock}) + c3i.sendResultToMessageBus('abc', 'sha256:79bd8004', "1.2.3-1") + assertEquals(0, messagemock.getMessageContentCallCount) + } +}