diff --git a/build.gradle.kts b/build.gradle.kts index 02c4186..8a2f255 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -64,5 +64,7 @@ dependency("org.jenkinsci.plugins", "pipeline-model-extensions", "1.2.5") dependency("org.jenkins-ci.plugins", "http_request", "1.8.21") dependency("org.jenkins-ci.plugins", "pipeline-utility-steps", "2.2.0") + dependency("org.jenkins-ci.plugins", "config-file-provider", "3.4.1") + dependency("org.jenkins-ci.plugins", "credentials-binding", "1.17") } } diff --git a/test/integration/groovy/uk/org/floop/jenkins_pmd/DrafterTests.groovy b/test/integration/groovy/uk/org/floop/jenkins_pmd/DrafterTests.groovy index d45330e..b30c0fd 100644 --- a/test/integration/groovy/uk/org/floop/jenkins_pmd/DrafterTests.groovy +++ b/test/integration/groovy/uk/org/floop/jenkins_pmd/DrafterTests.groovy @@ -1,6 +1,15 @@ package uk.org.floop.jenkins_pmd +import com.cloudbees.plugins.credentials.CredentialsScope +import com.cloudbees.plugins.credentials.SystemCredentialsProvider +import com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials +import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl import com.github.tomakehurst.wiremock.junit.WireMockRule +import org.jenkinsci.lib.configprovider.ConfigProvider +import org.jenkinsci.plugins.configfiles.ConfigFileStore +import org.jenkinsci.plugins.configfiles.GlobalConfigFiles +import org.jenkinsci.plugins.configfiles.custom.CustomConfig + import static com.github.tomakehurst.wiremock.client.WireMock.* import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig @@ -25,6 +34,57 @@ RuleBootstrapper.setup(rule) } + @Before + void setupConfigFile() { + GlobalConfigFiles globalConfigFiles = rule.jenkins + .getExtensionList(ConfigFileStore.class) + .get(GlobalConfigFiles.class) + CustomConfig.CustomConfigProvider configProvider = rule.jenkins + .getExtensionList(ConfigProvider.class) + .get(CustomConfig.CustomConfigProvider.class) + globalConfigFiles.save( + new CustomConfig("pmd", "config.json", "Details of endpoint URLs and credentials", '''{ + "pmd_api": "https://production-drafter-ons-alpha.publishmydata.com", + "credentials": "onspmd", + "pipeline_api": "http://production-grafter-ons-alpha.publishmydata.com/v1/pipelines", + "default_mapping": "https://github.com/ONS-OpenData/ref_trade/raw/master/columns.csv", + "base_uri": "http://gss-data.org.uk" +}''', configProvider.getProviderId())) + } + + @Before + void setupCredentials() { + StandardUsernamePasswordCredentials key = new UsernamePasswordCredentialsImpl( + CredentialsScope.GLOBAL, + "onspmd", "Access to PMD APIs", "admin", "admin") + SystemCredentialsProvider.getInstance().getCredentials().add(key) + SystemCredentialsProvider.getInstance().save() + } + + @Test + void "credentials and endpoint URLs stored outside library"() { + final CpsFlowDefinition flow = new CpsFlowDefinition(''' + node { + configFileProvider([configFile(fileId: 'pmd', variable: 'configfile')]) { + def config = readJSON(text: readFile(file: configfile)) + String PMD = config['pmd_api'] + String credentials = config['credentials'] + echo "API URL = <$PMD>" + withCredentials([usernamePassword(credentialsId: credentials, usernameVariable: 'USER', passwordVariable: 'PASS')]) { + echo "User = <$USER>" + echo "Pass = <$PASS>" + } + } + }'''.stripIndent(), true) + final WorkflowJob workflowJob = rule.createProject(WorkflowJob, 'project') + workflowJob.definition = flow + + final WorkflowRun firstResult = rule.buildAndAssertSuccess(workflowJob) + rule.assertLogContains('API URL =