public void writeCredentials(CredentialContainer creds) throws IOException { Map<Domain, List<Credentials>> domainCredentialsMap = new CopyOnWriteMap.Hash<Domain, List<Credentials>>(); List<Credentials> globalCredentials = new CopyOnWriteArrayList<Credentials>(); domainCredentialsMap.put(Domain.global(), globalCredentials); for (UsernamePassword up : creds.getUsernamePasswordCredentials()) { addUsernamePasswordCredential(globalCredentials, up); } for (SecretCredential secret : creds.getSecretCredentials()) { addSecretCredential(globalCredentials, secret); } for (GitHubCredential gitHubCredential : creds.getGitHubCredentials()) { addGitHubCredentialFromToken(domainCredentialsMap, gitHubCredential); } SystemCredentialsProvider systemCredentialProvider = new SystemCredentialsProvider(); File credentialsFile = new File(rootDir, CREDENTIALS); XmlFile xml = new XmlFile(credentialsFile); // Add the field with reflection to avoid triggering more Jenkins internal machinery try { Field domainCredentialsMapField = systemCredentialProvider.getClass().getDeclaredField("domainCredentialsMap"); //NoSuchFieldException domainCredentialsMapField.setAccessible(true); domainCredentialsMapField.set(systemCredentialProvider, domainCredentialsMap); //IllegalAccessException } catch(IllegalAccessException | NoSuchFieldException e) { throw new IOException("Error accessing field " + systemCredentialProvider.getClass() + ".domainCredentialsMap", e); } xml.write(systemCredentialProvider); }