Search in sources :

Example 6 with GiteaHook

use of org.jenkinsci.plugin.gitea.client.api.GiteaHook 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 7 with GiteaHook

use of org.jenkinsci.plugin.gitea.client.api.GiteaHook 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 8 with GiteaHook

use of org.jenkinsci.plugin.gitea.client.api.GiteaHook 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 9 with GiteaHook

use of org.jenkinsci.plugin.gitea.client.api.GiteaHook in project gitea-plugin by jenkinsci.

the class MockGiteaConnection method createHook.

@Override
public GiteaHook createHook(GiteaRepository repository, GiteaHook hook) throws IOException, InterruptedException {
    List<GiteaHook> list = notFoundIfNull(repoHooks.get(keyOf(repository)));
    hook = hook.clone();
    hook.setId(nextId.incrementAndGet());
    hook.setCreatedAt(new Date());
    hook.setUpdatedAt(hook.getCreatedAt());
    list.add(hook);
    return hook.clone();
}
Also used : GiteaHook(org.jenkinsci.plugin.gitea.client.api.GiteaHook) Date(java.util.Date)

Example 10 with GiteaHook

use of org.jenkinsci.plugin.gitea.client.api.GiteaHook in project gitea-plugin by jenkinsci.

the class MockGiteaConnection method updateHook.

@Override
public void updateHook(GiteaRepository repository, GiteaHook hook) throws IOException, InterruptedException {
    GiteaHook target = null;
    for (Iterator<GiteaHook> iterator = notFoundIfNull(repoHooks.get(keyOf(repository))).iterator(); iterator.hasNext(); ) {
        GiteaHook h = iterator.next();
        if (h.getId() == hook.getId()) {
            target = h;
            break;
        }
    }
    notFoundIfNull(target);
    target.setUpdatedAt(new Date());
    target.setEvents(hook.getEvents());
    target.setActive(hook.isActive());
    target.setConfig(hook.getConfig());
}
Also used : GiteaHook(org.jenkinsci.plugin.gitea.client.api.GiteaHook) Date(java.util.Date)

Aggregations

GiteaHook (org.jenkinsci.plugin.gitea.client.api.GiteaHook)13 Date (java.util.Date)5 JenkinsLocationConfiguration (jenkins.model.JenkinsLocationConfiguration)3 GiteaConnection (org.jenkinsci.plugin.gitea.client.api.GiteaConnection)3 GiteaEventType (org.jenkinsci.plugin.gitea.client.api.GiteaEventType)3 GiteaRepository (org.jenkinsci.plugin.gitea.client.api.GiteaRepository)3 GiteaServer (org.jenkinsci.plugin.gitea.servers.GiteaServer)3 StandardCredentials (com.cloudbees.plugins.credentials.common.StandardCredentials)2 IOException (java.io.IOException)2 GiteaOrganization (org.jenkinsci.plugin.gitea.client.api.GiteaOrganization)2 IgnoreNotifyCommit (hudson.plugins.git.extensions.impl.IgnoreNotifyCommit)1 URISyntaxException (java.net.URISyntaxException)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Map (java.util.Map)1 TreeMap (java.util.TreeMap)1 AtomicLong (java.util.concurrent.atomic.AtomicLong)1