diff --git a/build.gradle b/build.gradle index 4d4f319f..fb6f8fb8 100644 --- a/build.gradle +++ b/build.gradle @@ -128,7 +128,7 @@ jacocoTestReport { } } -String version = '8.1.0' +String version = '8.1.1' task updateVersion { doLast { diff --git a/tests/jenkins/TestRunSmokeTestScript.groovy b/tests/jenkins/TestRunSmokeTestScript.groovy index 9ed57bce..956db177 100644 --- a/tests/jenkins/TestRunSmokeTestScript.groovy +++ b/tests/jenkins/TestRunSmokeTestScript.groovy @@ -19,16 +19,33 @@ class TestRunSmokeTestScript extends BuildPipelineTest { @Test public void TestRunSmokeTestScript() { this.registerLibTester(new RunSmokeTestScriptLibTester( - 'dummy_job', - 'tests/data/opensearch-2.18.0-build.yml', - 'tests/data/opensearch-2.18.0-test.yml', - '1234' + 'dummy_job', + 'tests/data/opensearch-2.18.0-build.yml', + 'tests/data/opensearch-2.18.0-test.yml', + '1234', + 'false' ) ) binding.setVariable('env', ['BUILD_NUMBER': '9876']) super.testPipeline("tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile") - assertThat(getShellCommands('sh', './test.sh'), hasItems('./test.sh smoke-test tests/data/opensearch-2.18.0-test.yml --test-run-id 9876 --paths opensearch=https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/1234/linux/x64/tar')) + assertThat(getShellCommands('sh', './test.sh'), hasItems(' ./test.sh smoke-test tests/data/opensearch-2.18.0-test.yml --test-run-id 9876 --paths opensearch=https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/1234/linux/x64/tar ')) + } + + @Test + public void TestRunSmokeTestScript_Switch_Non_Root() { + this.registerLibTester(new RunSmokeTestScriptLibTester( + 'dummy_job', + 'tests/data/opensearch-2.18.0-build.yml', + 'tests/data/opensearch-2.18.0-test.yml', + '2345', + 'true' + ) + ) + + binding.setVariable('env', ['BUILD_NUMBER': '8765']) + super.testPipeline("tests/jenkins/jobs/RunSmokeTestScript_Switch_Non_Root_Jenkinsfile") + assertThat(getShellCommands('sh', './test.sh'), hasItems('su `id -un 1000` -c \" ./test.sh smoke-test tests/data/opensearch-2.18.0-test.yml --test-run-id 8765 --paths opensearch=https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/2345/linux/x64/tar \"')) } def getShellCommands(methodName, searchString) { diff --git a/tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile b/tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile index 3704d1a2..d048c831 100644 --- a/tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile +++ b/tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile @@ -17,7 +17,8 @@ pipeline { jobName: 'dummy_job', buildManifest: 'tests/data/opensearch-2.18.0-build.yml', testManifest: 'tests/data/opensearch-2.18.0-test.yml', - buildId: '1234' + buildId: '1234', + switchUserNonRoot: 'false' ) } } diff --git a/tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile.txt b/tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile.txt index 5b88e690..c454a070 100644 --- a/tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile.txt +++ b/tests/jenkins/jobs/RunSmokeTestScript_Jenkinsfile.txt @@ -3,12 +3,13 @@ RunSmokeTestScript_Jenkinsfile.echo(Executing on agent [label:none]) RunSmokeTestScript_Jenkinsfile.stage(smoke-test, groovy.lang.Closure) RunSmokeTestScript_Jenkinsfile.script(groovy.lang.Closure) - RunSmokeTestScript_Jenkinsfile.runSmokeTestScript({jobName=dummy_job, buildManifest=tests/data/opensearch-2.18.0-build.yml, testManifest=tests/data/opensearch-2.18.0-test.yml, buildId=1234}) + RunSmokeTestScript_Jenkinsfile.runSmokeTestScript({jobName=dummy_job, buildManifest=tests/data/opensearch-2.18.0-build.yml, testManifest=tests/data/opensearch-2.18.0-test.yml, buildId=1234, switchUserNonRoot=false}) runSmokeTestScript.legacySCM(groovy.lang.Closure) runSmokeTestScript.library({identifier=jenkins@main, retriever=null}) runSmokeTestScript.readYaml({file=tests/data/opensearch-2.18.0-build.yml}) BuildManifest.asBoolean() BuildManifest.getArtifactRootUrl(dummy_job, 1234) runSmokeTestScript.echo(Artifact root URL: https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/1234/linux/x64/tar) + runSmokeTestScript.echo(Switch User to Non-Root (uid=1000): false) runSmokeTestScript.echo(Paths: opensearch=https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/1234/linux/x64/tar) - runSmokeTestScript.sh(./test.sh smoke-test tests/data/opensearch-2.18.0-test.yml --test-run-id 9876 --paths opensearch=https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/1234/linux/x64/tar) + runSmokeTestScript.sh( ./test.sh smoke-test tests/data/opensearch-2.18.0-test.yml --test-run-id 9876 --paths opensearch=https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/1234/linux/x64/tar ) diff --git a/tests/jenkins/jobs/RunSmokeTestScript_Switch_Non_Root_Jenkinsfile b/tests/jenkins/jobs/RunSmokeTestScript_Switch_Non_Root_Jenkinsfile new file mode 100644 index 00000000..051ed32a --- /dev/null +++ b/tests/jenkins/jobs/RunSmokeTestScript_Switch_Non_Root_Jenkinsfile @@ -0,0 +1,27 @@ +/* + * Copyright OpenSearch Contributors + * 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. + */ + +pipeline { + agent none + stages { + stage('smoke-test') { + steps { + script { + runSmokeTestScript( + jobName: 'dummy_job', + buildManifest: 'tests/data/opensearch-2.18.0-build.yml', + testManifest: 'tests/data/opensearch-2.18.0-test.yml', + buildId: '2345', + switchUserNonRoot: 'true' + ) + } + } + } + } +} diff --git a/tests/jenkins/jobs/RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.txt b/tests/jenkins/jobs/RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.txt new file mode 100644 index 00000000..fe9d4f58 --- /dev/null +++ b/tests/jenkins/jobs/RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.txt @@ -0,0 +1,15 @@ + RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.run() + RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.pipeline(groovy.lang.Closure) + RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.echo(Executing on agent [label:none]) + RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.stage(smoke-test, groovy.lang.Closure) + RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.script(groovy.lang.Closure) + RunSmokeTestScript_Switch_Non_Root_Jenkinsfile.runSmokeTestScript({jobName=dummy_job, buildManifest=tests/data/opensearch-2.18.0-build.yml, testManifest=tests/data/opensearch-2.18.0-test.yml, buildId=2345, switchUserNonRoot=true}) + runSmokeTestScript.legacySCM(groovy.lang.Closure) + runSmokeTestScript.library({identifier=jenkins@main, retriever=null}) + runSmokeTestScript.readYaml({file=tests/data/opensearch-2.18.0-build.yml}) + BuildManifest.asBoolean() + BuildManifest.getArtifactRootUrl(dummy_job, 2345) + runSmokeTestScript.echo(Artifact root URL: https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/2345/linux/x64/tar) + runSmokeTestScript.echo(Switch User to Non-Root (uid=1000): true) + runSmokeTestScript.echo(Paths: opensearch=https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/2345/linux/x64/tar) + runSmokeTestScript.sh(su `id -un 1000` -c " ./test.sh smoke-test tests/data/opensearch-2.18.0-test.yml --test-run-id 8765 --paths opensearch=https://ci.opensearch.org/ci/dbc/dummy_job/2.18.0/2345/linux/x64/tar ") diff --git a/tests/jenkins/lib-testers/RunSmokeTestScriptLibTester.groovy b/tests/jenkins/lib-testers/RunSmokeTestScriptLibTester.groovy index 0116eb2b..533bc8ef 100644 --- a/tests/jenkins/lib-testers/RunSmokeTestScriptLibTester.groovy +++ b/tests/jenkins/lib-testers/RunSmokeTestScriptLibTester.groovy @@ -16,12 +16,14 @@ class RunSmokeTestScriptLibTester extends LibFunctionTester { private String buildManifest private String testManifest private String buildId + private String switchUserNonRoot - public RunSmokeTestScriptLibTester(jobName, buildManifest, testManifest, buildId){ + public RunSmokeTestScriptLibTester(jobName, buildManifest, testManifest, buildId, switchUserNonRoot){ this.jobName = jobName this.buildManifest = buildManifest this.testManifest = testManifest this.buildId = buildId + this.switchUserNonRoot = switchUserNonRoot } void configure(helper, binding) { @@ -39,6 +41,7 @@ class RunSmokeTestScriptLibTester extends LibFunctionTester { && call.args.buildManifest.first().toString().equals(this.buildManifest) && call.args.testManifest.first().toString().equals(this.testManifest) && call.args.buildId.first().toString().equals(this.buildId) + && call.args.switchUserNonRoot.first().toString().equals(this.switchUserNonRoot) } String libFunctionName() { diff --git a/vars/runSmokeTestScript.groovy b/vars/runSmokeTestScript.groovy index 54fb9570..2e925c1d 100644 --- a/vars/runSmokeTestScript.groovy +++ b/vars/runSmokeTestScript.groovy @@ -13,6 +13,7 @@ * @param args.testManifest Test manifest file location * @param args.buildManifest Build manifest file location * @param args.buildId Build ID of the distribution artifacts + * @param args.switchUserNonRoot Switch to non root user if true. * @param args.jobName Job name that triggered the workflow. 'distribution-build-opensearh' by default. */ void call(Map args = [:]) { @@ -22,14 +23,26 @@ void call(Map args = [:]) { String artifactRootUrl = buildManifest.getArtifactRootUrl(jobName, args.buildId) echo "Artifact root URL: ${artifactRootUrl}" + String switchUser = args.switchUserNonRoot ?: 'false' + if (! (switchUser == 'true' || switchUser == 'false')) { + echo "args.switchUserNonRoot is not valid. Exit the program." + System.exit(1) + } + echo "Switch User to Non-Root (uid=1000): ${switchUser}" + + String switchCommandStart = switchUser == 'true' ? "su `id -un 1000` -c \"" : "" + String switchCommandEnd = switchUser == 'true' ? '"' : '' + String paths = "opensearch=${artifactRootUrl}" echo "Paths: ${paths}" sh([ - './test.sh', - 'smoke-test', - "${args.testManifest}", - "--test-run-id ${env.BUILD_NUMBER}", - "--paths ${paths}", + switchCommandStart, + './test.sh', + 'smoke-test', + "${args.testManifest}", + "--test-run-id ${env.BUILD_NUMBER}", + "--paths ${paths}", + switchCommandEnd, ].join(' ')) }