use of org.jenkinsci.plugin.gitea.servers.GiteaServer in project gitea-plugin by jenkinsci.
the class GiteaSCMSource method gitea.
/*package*/
Gitea gitea() throws AbortException {
GiteaServer server = GiteaServers.get().findServer(serverUrl);
if (server == null) {
throw new AbortException("Unknown server: " + serverUrl);
}
StandardCredentials credentials = credentials();
SCMSourceOwner owner = getOwner();
if (owner != null) {
CredentialsProvider.track(owner, credentials);
}
return Gitea.server(serverUrl).as(AuthenticationTokens.convert(GiteaAuth.class, credentials));
}
use of org.jenkinsci.plugin.gitea.servers.GiteaServer in project configuration-as-code-plugin by jenkinsci.
the class GiteaServerTest method configure_gitea.
@Test
@ConfiguredWithReadme("gitea/README.md")
public void configure_gitea() {
final GiteaServers configuration = GlobalConfiguration.all().get(GiteaServers.class);
assertEquals(configuration.getServers().size(), 1);
GiteaServer config = configuration.getServers().get(0);
assertEquals("https://my-scm-url", config.getServerUrl());
assertEquals("<my-credential-id>", config.getCredentialsId());
assertEquals("scm", config.getDisplayName());
assertTrue(config.isManageHooks());
}
use of org.jenkinsci.plugin.gitea.servers.GiteaServer in project gitea-plugin by jenkinsci.
the class GiteaSCMNavigator method gitea.
private Gitea gitea(SCMSourceOwner owner) throws AbortException {
GiteaServer server = GiteaServers.get().findServer(serverUrl);
if (server == null) {
throw new AbortException("Unknown server: " + serverUrl);
}
StandardCredentials credentials = credentials(owner);
CredentialsProvider.track(owner, credentials);
return Gitea.server(serverUrl).as(AuthenticationTokens.convert(GiteaAuth.class, credentials));
}
use of org.jenkinsci.plugin.gitea.servers.GiteaServer 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 org.jenkinsci.plugin.gitea.servers.GiteaServer 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;
}
}
}
}
Aggregations