Search in sources :

Example 1 with JenkinsLocationConfiguration

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);
    }
}
Also used : JenkinsLocationConfiguration(jenkins.model.JenkinsLocationConfiguration) JenkinsLocationConfiguration(jenkins.model.JenkinsLocationConfiguration) GiteaConnection(org.jenkinsci.plugin.gitea.client.api.GiteaConnection) GiteaHook(org.jenkinsci.plugin.gitea.client.api.GiteaHook) IOException(java.io.IOException) GiteaOrganization(org.jenkinsci.plugin.gitea.client.api.GiteaOrganization) GiteaServer(org.jenkinsci.plugin.gitea.servers.GiteaServer) GiteaUser(org.jenkinsci.plugin.gitea.client.api.GiteaUser) GiteaEventType(org.jenkinsci.plugin.gitea.client.api.GiteaEventType) StandardCredentials(com.cloudbees.plugins.credentials.common.StandardCredentials)

Example 2 with JenkinsLocationConfiguration

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;
            }
        }
    }
}
Also used : URIish(org.eclipse.jgit.transport.URIish) JenkinsLocationConfiguration(jenkins.model.JenkinsLocationConfiguration) JenkinsLocationConfiguration(jenkins.model.JenkinsLocationConfiguration) ArrayList(java.util.ArrayList) GiteaConnection(org.jenkinsci.plugin.gitea.client.api.GiteaConnection) GiteaHook(org.jenkinsci.plugin.gitea.client.api.GiteaHook) URISyntaxException(java.net.URISyntaxException) GiteaServer(org.jenkinsci.plugin.gitea.servers.GiteaServer) Iterator(java.util.Iterator) GiteaEventType(org.jenkinsci.plugin.gitea.client.api.GiteaEventType) IgnoreNotifyCommit(hudson.plugins.git.extensions.impl.IgnoreNotifyCommit) ArrayList(java.util.ArrayList) List(java.util.List) RemoteConfig(org.eclipse.jgit.transport.RemoteConfig) HashSet(java.util.HashSet) GiteaRepository(org.jenkinsci.plugin.gitea.client.api.GiteaRepository)

Example 3 with JenkinsLocationConfiguration

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);
    }
}
Also used : JenkinsLocationConfiguration(jenkins.model.JenkinsLocationConfiguration) JenkinsLocationConfiguration(jenkins.model.JenkinsLocationConfiguration) GiteaConnection(org.jenkinsci.plugin.gitea.client.api.GiteaConnection) GiteaHook(org.jenkinsci.plugin.gitea.client.api.GiteaHook) IOException(java.io.IOException) GiteaServer(org.jenkinsci.plugin.gitea.servers.GiteaServer) GiteaEventType(org.jenkinsci.plugin.gitea.client.api.GiteaEventType) StandardCredentials(com.cloudbees.plugins.credentials.common.StandardCredentials) GiteaRepository(org.jenkinsci.plugin.gitea.client.api.GiteaRepository)

Example 4 with JenkinsLocationConfiguration

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;
}
Also used : OriginPullRequestDiscoveryTrait(com.cloudbees.jenkins.plugins.bitbucket.OriginPullRequestDiscoveryTrait) JenkinsLocationConfiguration(jenkins.model.JenkinsLocationConfiguration) CleanBeforeCheckoutTrait(jenkins.plugins.git.traits.CleanBeforeCheckoutTrait) BitbucketSCMSourceBuilder(com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSourceBuilder) ChangeRequestCheckoutStrategy(jenkins.scm.api.mixin.ChangeRequestCheckoutStrategy) ForkPullRequestDiscoveryTrait(com.cloudbees.jenkins.plugins.bitbucket.ForkPullRequestDiscoveryTrait) CleanAfterCheckoutTrait(jenkins.plugins.git.traits.CleanAfterCheckoutTrait) LocalBranchTrait(jenkins.plugins.git.traits.LocalBranchTrait) BranchDiscoveryTrait(com.cloudbees.jenkins.plugins.bitbucket.BranchDiscoveryTrait) HashSet(java.util.HashSet) BitbucketSCMSource(com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSource) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Aggregations

JenkinsLocationConfiguration (jenkins.model.JenkinsLocationConfiguration)4 GiteaConnection (org.jenkinsci.plugin.gitea.client.api.GiteaConnection)3 GiteaEventType (org.jenkinsci.plugin.gitea.client.api.GiteaEventType)3 GiteaHook (org.jenkinsci.plugin.gitea.client.api.GiteaHook)3 GiteaServer (org.jenkinsci.plugin.gitea.servers.GiteaServer)3 StandardCredentials (com.cloudbees.plugins.credentials.common.StandardCredentials)2 IOException (java.io.IOException)2 HashSet (java.util.HashSet)2 GiteaRepository (org.jenkinsci.plugin.gitea.client.api.GiteaRepository)2 BitbucketSCMSource (com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSource)1 BitbucketSCMSourceBuilder (com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSourceBuilder)1 BranchDiscoveryTrait (com.cloudbees.jenkins.plugins.bitbucket.BranchDiscoveryTrait)1 ForkPullRequestDiscoveryTrait (com.cloudbees.jenkins.plugins.bitbucket.ForkPullRequestDiscoveryTrait)1 OriginPullRequestDiscoveryTrait (com.cloudbees.jenkins.plugins.bitbucket.OriginPullRequestDiscoveryTrait)1 SuppressFBWarnings (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)1 IgnoreNotifyCommit (hudson.plugins.git.extensions.impl.IgnoreNotifyCommit)1 URISyntaxException (java.net.URISyntaxException)1 ArrayList (java.util.ArrayList)1 Iterator (java.util.Iterator)1 List (java.util.List)1