use of jenkins.model.JenkinsLocationConfiguration in project gitea-plugin by jenkinsci.
the class GiteaWebhookListener method register.
public static void register(SCMNavigatorOwner owner, GiteaSCMNavigator navigator, WebhookRegistration mode, String credentialsId) {
StandardCredentials credentials;
String serverUrl = navigator.getServerUrl();
switch(mode) {
case DISABLE:
return;
case SYSTEM:
GiteaServer server = GiteaServers.get().findServer(serverUrl);
if (server == null || !server.isManageHooks()) {
return;
}
credentials = server.credentials();
break;
case ITEM:
credentials = navigator.credentials(owner);
break;
default:
return;
}
if (credentials == null) {
return;
}
JenkinsLocationConfiguration locationConfiguration = JenkinsLocationConfiguration.get();
if (locationConfiguration == null) {
return;
}
String rootUrl = locationConfiguration.getUrl();
if (StringUtils.isBlank(rootUrl) || rootUrl.startsWith("http://localhost:")) {
return;
}
String hookUrl = UriTemplate.buildFromTemplate(rootUrl).literal("gitea-webhook").literal("/post").build().expand();
try (GiteaConnection c = connect(serverUrl, credentials)) {
GiteaUser user = c.fetchUser(navigator.getRepoOwner());
if (StringUtils.isNotBlank(user.getEmail())) {
// it's a user not an org
return;
}
GiteaOrganization org = c.fetchOrganization(navigator.getRepoOwner());
if (org == null) {
return;
}
List<GiteaHook> hooks = c.fetchHooks(org);
GiteaHook hook = null;
for (GiteaHook h : hooks) {
if (hookUrl.equals(h.getConfig().getUrl())) {
if (hook == null && h.getType() == GiteaHookType.GITEA && h.getConfig().getContentType() == GiteaPayloadType.JSON && h.isActive() && EnumSet.allOf(GiteaEventType.class).equals(h.getEvents())) {
hook = h;
} else {
c.deleteHook(org, h);
}
}
}
if (hook == null) {
hook = new GiteaHook();
GiteaHook.Configuration configuration = new GiteaHook.Configuration();
configuration.setContentType(GiteaPayloadType.JSON);
configuration.setUrl(hookUrl);
hook.setType(GiteaHookType.GITEA);
hook.setConfig(configuration);
hook.setEvents(EnumSet.allOf(GiteaEventType.class));
hook.setActive(true);
c.createHook(org, hook);
}
} catch (IOException | InterruptedException e) {
LOGGER.log(Level.WARNING, "Could not manage organization hooks for " + navigator.getRepoOwner() + " on " + serverUrl, e);
}
}
use of jenkins.model.JenkinsLocationConfiguration in project gitea-plugin by jenkinsci.
the class GiteaWebhookListener method register.
public static void register(SCMTriggerItem item, GitSCM scm) {
JenkinsLocationConfiguration locationConfiguration = JenkinsLocationConfiguration.get();
if (locationConfiguration == null) {
// Jenkins URL not configured, can't register hooks
return;
}
String rootUrl = locationConfiguration.getUrl();
if (StringUtils.isBlank(rootUrl) || rootUrl.startsWith("http://localhost:")) {
// Jenkins URL not configured, can't register hooks
return;
}
if (scm.getExtensions().get(IgnoreNotifyCommit.class) != null) {
// GitSCM special case to ignore commits, so no point registering hooks
return;
}
List<GiteaServer> serverList = new ArrayList<>(GiteaServers.get().getServers());
if (serverList.isEmpty()) {
// Not configured to register hooks, so no point registering.
return;
}
// track attempts to register in case there are multiple remotes for the same repo
Set<String> registered = new HashSet<>();
String hookUrl = UriTemplate.buildFromTemplate(rootUrl).literal("gitea-webhook").literal("/post").build().expand();
for (RemoteConfig repository : scm.getRepositories()) {
REMOTES: for (URIish remoteURL : repository.getURIs()) {
for (Iterator<GiteaServer> iterator = serverList.iterator(); iterator.hasNext(); ) {
GiteaServer server = iterator.next();
if (!server.isManageHooks()) {
// not allowed to manage hooks for this server, don't check it against any other remotes
iterator.remove();
continue;
}
URIish serverURL;
try {
serverURL = new URIish(server.getServerUrl());
} catch (URISyntaxException e) {
continue;
}
if (!StringUtils.equals(serverURL.getHost(), remoteURL.getHost())) {
// different hosts, so none of our business
continue;
}
if (serverURL.getPort() != -1 && remoteURL.getPort() != -1 && serverURL.getPort() != remoteURL.getPort()) {
// different explicit ports, so none of our business
continue;
}
String serverPath = serverURL.getPath();
if (!serverPath.startsWith("/")) {
serverPath = "/" + serverPath;
}
if (!serverPath.endsWith("/")) {
serverPath = serverPath + "/";
}
String remotePath = remoteURL.getPath();
if (!remotePath.startsWith("/")) {
remotePath = "/" + remotePath;
}
if (!remotePath.startsWith(serverPath)) {
// different context path, so none of our business
continue;
}
remotePath = remotePath.substring(serverPath.length());
int index = remotePath.indexOf('/');
if (index == -1) {
// not matching expected structure of repoOwner/repository[.git]
continue REMOTES;
}
String repoOwner = remotePath.substring(0, index);
String repoName = StringUtils.removeEnd(remotePath.substring(index + 1), ".git");
String registeredKey = server.getServerUrl() + "::" + repoOwner + "::" + repoName;
if (registered.contains(registeredKey)) {
// have already tried to register this repo during this method, so don't repeat
continue REMOTES;
}
registered.add(registeredKey);
try (GiteaConnection c = connect(server.getServerUrl(), server.credentials())) {
GiteaRepository repo = c.fetchRepository(repoOwner, repoName);
if (repo == null) {
continue REMOTES;
}
List<GiteaHook> hooks = c.fetchHooks(repo);
GiteaHook hook = null;
for (GiteaHook h : hooks) {
if (hookUrl.equals(h.getConfig().getUrl())) {
if (hook == null && h.getType() == GiteaHookType.GITEA && h.getConfig().getContentType() == GiteaPayloadType.JSON && h.isActive() && EnumSet.allOf(GiteaEventType.class).equals(h.getEvents())) {
hook = h;
} else {
c.deleteHook(repo, h);
}
}
}
if (hook == null) {
hook = new GiteaHook();
GiteaHook.Configuration configuration = new GiteaHook.Configuration();
configuration.setContentType(GiteaPayloadType.JSON);
configuration.setUrl(hookUrl);
hook.setType(GiteaHookType.GITEA);
hook.setConfig(configuration);
hook.setEvents(EnumSet.allOf(GiteaEventType.class));
hook.setActive(true);
c.createHook(repo, hook);
}
} catch (IOException | InterruptedException e) {
LOGGER.log(Level.WARNING, "Could not manage repository hooks for " + repoOwner + "/" + repoName + " on " + server.getServerUrl(), e);
}
}
if (serverList.isEmpty()) {
// none of the servers are allowed manage hooks, no point checking the remaining remotes
return;
}
}
}
}
use of jenkins.model.JenkinsLocationConfiguration in project gitea-plugin by jenkinsci.
the class GiteaWebhookListener method register.
public static void register(SCMSourceOwner owner, GiteaSCMSource source, WebhookRegistration mode, String credentialsId) {
StandardCredentials credentials;
String serverUrl = source.getServerUrl();
switch(mode) {
case DISABLE:
return;
case SYSTEM:
GiteaServer server = GiteaServers.get().findServer(serverUrl);
if (server == null || !server.isManageHooks()) {
return;
}
credentials = server.credentials();
break;
case ITEM:
credentials = source.credentials();
break;
default:
return;
}
if (credentials == null) {
return;
}
JenkinsLocationConfiguration locationConfiguration = JenkinsLocationConfiguration.get();
if (locationConfiguration == null) {
return;
}
String rootUrl = locationConfiguration.getUrl();
if (StringUtils.isBlank(rootUrl) || rootUrl.startsWith("http://localhost:")) {
return;
}
String hookUrl = UriTemplate.buildFromTemplate(rootUrl).literal("gitea-webhook").literal("/post").build().expand();
try (GiteaConnection c = connect(serverUrl, credentials)) {
GiteaRepository repo = c.fetchRepository(source.getRepoOwner(), source.getRepository());
if (repo == null) {
return;
}
List<GiteaHook> hooks = c.fetchHooks(repo);
GiteaHook hook = null;
for (GiteaHook h : hooks) {
if (hookUrl.equals(h.getConfig().getUrl())) {
if (hook == null && h.getType() == GiteaHookType.GITEA && h.getConfig().getContentType() == GiteaPayloadType.JSON && h.isActive() && EnumSet.allOf(GiteaEventType.class).equals(h.getEvents())) {
hook = h;
} else {
c.deleteHook(repo, h);
}
}
}
if (hook == null) {
hook = new GiteaHook();
GiteaHook.Configuration configuration = new GiteaHook.Configuration();
configuration.setContentType(GiteaPayloadType.JSON);
configuration.setUrl(hookUrl);
hook.setType(GiteaHookType.GITEA);
hook.setConfig(configuration);
hook.setEvents(EnumSet.allOf(GiteaEventType.class));
hook.setActive(true);
c.createHook(repo, hook);
}
} catch (IOException | InterruptedException e) {
LOGGER.log(Level.WARNING, "Could not manage repository hooks for " + source.getRepoOwner() + "/" + source.getRepository() + " on " + serverUrl, e);
}
}
use of jenkins.model.JenkinsLocationConfiguration in project blueocean-plugin by jenkinsci.
the class BitbucketPipelineCreateRequest method createSource.
@SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")
@Override
protected SCMSource createSource(@Nonnull MultiBranchProject project, @Nonnull BlueScmConfig scmConfig) {
/* scmConfig.uri presence is already validated in {@link #validate} but lets check just in case */
if (StringUtils.isBlank(scmConfig.getUri())) {
throw new ServiceException.BadRequestException("scmConfig.uri must be present");
}
Set<ChangeRequestCheckoutStrategy> strategies = new HashSet<>();
strategies.add(ChangeRequestCheckoutStrategy.MERGE);
BitbucketSCMSource bitbucketSCMSource = new BitbucketSCMSourceBuilder(null, scmConfig.getUri(), computeCredentialId(scmConfig), (String) scmConfig.getConfig().get("repoOwner"), (String) scmConfig.getConfig().get("repository")).withTrait(// take all branches
new BranchDiscoveryTrait(true, true)).withTrait(new ForkPullRequestDiscoveryTrait(strategies, new ForkPullRequestDiscoveryTrait.TrustTeamForks())).withTrait(new OriginPullRequestDiscoveryTrait(strategies)).withTrait(new CleanBeforeCheckoutTrait()).withTrait(new CleanAfterCheckoutTrait()).withTrait(new LocalBranchTrait()).build();
// Setup Jenkins root url, if not set bitbucket cloud notification will fail
JenkinsLocationConfiguration jenkinsLocationConfiguration = JenkinsLocationConfiguration.get();
if (jenkinsLocationConfiguration != null) {
String url = jenkinsLocationConfiguration.getUrl();
if (url == null) {
url = Jenkins.get().getRootUrl();
if (url != null) {
jenkinsLocationConfiguration.setUrl(url);
}
}
}
return bitbucketSCMSource;
}
Aggregations