package org.jenkinsci.plugins.github.migration;
import com.cloudbees.jenkins.Credential;
import com.cloudbees.jenkins.GitHubPushTrigger;
import com.cloudbees.plugins.credentials.common.StandardCredentials;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import jenkins.model.Jenkins;
import org.jenkinsci.plugins.github.GitHubPlugin;
import org.jenkinsci.plugins.github.config.GitHubPluginConfig;
import org.jenkinsci.plugins.github.config.GitHubServerConfig;
import org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
import static org.jenkinsci.plugins.github.util.FluentIterableWrapper.from;
/**
* Helper class incapsulates migration process from old configs to new ones
* After 1.12.0 this plugin uses {@link GitHubPlugin} to store all global configuration instead of
* push trigger descriptor
*
* @author lanwen (Merkushev Kirill)
* @since 1.13.0
*/
public class Migrator {
private static final Logger LOGGER = LoggerFactory.getLogger(Migrator.class);
/**
* Loads {@link GitHubPushTrigger.DescriptorImpl} and migrate all values
* to {@link org.jenkinsci.plugins.github.config.GitHubPluginConfig}
*
* @throws IOException if any read-save problems as it critical to work process of this plugin
*/
public void migrate() throws IOException {
LOGGER.debug("Check if GitHub Plugin needs config migration");
GitHubPushTrigger.DescriptorImpl descriptor = GitHubPushTrigger.DescriptorImpl.get();
descriptor.load();
if (isNotEmpty(descriptor.getCredentials())) {
LOGGER.warn("Migration for old GitHub Plugin credentials started");
GitHubPlugin.configuration().getConfigs().addAll(
from(descriptor.getCredentials()).transform(toGHServerConfig()).toList()
);
descriptor.clearCredentials();
descriptor.save();
GitHubPlugin.configuration().save();
}
if (descriptor.getDeprecatedHookUrl() != null) {
LOGGER.warn("Migration for old GitHub Plugin hook url started");
GitHubPlugin.configuration().setOverrideHookUrl(true);
GitHubPlugin.configuration().setHookUrl(descriptor.getDeprecatedHookUrl());
descriptor.clearDeprecatedHookUrl();
descriptor.save();
GitHubPlugin.configuration().save();
}
}
/**
* Creates new string credentials from token
*
* @return converter to get all useful info from old plain creds and crete new server config
*/
@VisibleForTesting
protected Function<Credential, GitHubServerConfig> toGHServerConfig() {
return new Function<Credential, GitHubServerConfig>() {
@Override
public GitHubServerConfig apply(Credential input) {
LOGGER.info("Migrate GitHub Plugin creds for {} {}", input.getUsername(), input.getApiUrl());
GitHubTokenCredentialsCreator creator =
Jenkins.getInstance().getDescriptorByType(GitHubTokenCredentialsCreator.class);
StandardCredentials credentials = creator.createCredentials(
input.getApiUrl(),
input.getOauthAccessToken(),
input.getUsername()
);
GitHubServerConfig gitHubServerConfig = new GitHubServerConfig(credentials.getId());
gitHubServerConfig.setApiUrl(input.getApiUrl());
return gitHubServerConfig;
}
};
}
/**
* Enable xml migration from deprecated nodes to new
*
* Can be used for example as
* Jenkins.XSTREAM2.addCompatibilityAlias("com.cloudbees.jenkins.Credential", Credential.class);
*/
public static void enableCompatibilityAliases() {
// not used at this moment
}
/**
* Simplifies long node names in config files
*/
public static void enableAliases() {
Jenkins.XSTREAM2.alias(GitHubPluginConfig.GITHUB_PLUGIN_CONFIGURATION_ID, GitHubPluginConfig.class);
}
}