Skip to content

Commit f0e4e7d

Browse files
feat: [CI-7838]: Add support for custom API URL in Gitlab Connector (#47106)
* feat: [CI-7838]: Add support for custom API URL in Gitlab Connector * feat: [CI-7838]: Add support for git status on PR * feat: [CI-7838]: Fix git status for account connector * feat: [CI-7838]: Fix git status for account connector * fix --------- Co-authored-by: Dev Mittal <[email protected]>
1 parent 3f8a2ba commit f0e4e7d

File tree

8 files changed

+142
-7
lines changed

8 files changed

+142
-7
lines changed

260-delegate/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
build.number=79107
1+
build.number=79108

332-ci-manager/service/src/main/java/io/harness/ci/execution/execution/GitBuildStatusUtility.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,17 @@
3535
import io.harness.ci.states.codebase.CodeBaseTaskStepParameters;
3636
import io.harness.delegate.beans.ci.pod.ConnectorDetails;
3737
import io.harness.delegate.beans.connector.ConnectorType;
38+
import io.harness.delegate.beans.connector.scm.GitAuthType;
39+
import io.harness.delegate.beans.connector.scm.gitlab.GitlabConnectorDTO;
40+
import io.harness.delegate.beans.connector.scm.gitlab.GitlabTokenSpecDTO;
3841
import io.harness.delegate.task.ci.CIBuildStatusPushParameters;
3942
import io.harness.delegate.task.ci.GitSCMType;
4043
import io.harness.encryption.Scope;
4144
import io.harness.exception.ngexception.CIStageExecutionException;
4245
import io.harness.git.GitClientHelper;
4346
import io.harness.git.checks.GitStatusCheckHelper;
4447
import io.harness.git.checks.GitStatusCheckParams;
48+
import io.harness.gitsync.beans.GitRepositoryDTO;
4549
import io.harness.ng.core.NGAccess;
4650
import io.harness.plancreator.steps.common.StageElementParameters;
4751
import io.harness.pms.contracts.ambiance.Ambiance;
@@ -215,6 +219,34 @@ private GitStatusCheckParams convertParams(CIBuildStatusPushParameters params) {
215219
.build();
216220
}
217221

222+
private GitRepositoryDTO getRepositoryFromApiUrl(ConnectorDetails gitConnector, String url) {
223+
if (gitConnector.getConnectorConfig() instanceof GitlabConnectorDTO) {
224+
GitlabConnectorDTO gitlabConnectorDTO = (GitlabConnectorDTO) gitConnector.getConnectorConfig();
225+
226+
if (!GitAuthType.HTTP.equals(gitlabConnectorDTO.getAuthentication().getAuthType())
227+
|| gitlabConnectorDTO.getApiAccess() == null
228+
|| !(gitlabConnectorDTO.getApiAccess().getSpec() instanceof GitlabTokenSpecDTO)) {
229+
return null;
230+
}
231+
GitlabTokenSpecDTO gitlabTokenSpecDTO = (GitlabTokenSpecDTO) gitlabConnectorDTO.getApiAccess().getSpec();
232+
String apiUrl = gitlabTokenSpecDTO.getApiUrl();
233+
if (StringUtils.isBlank(apiUrl)) {
234+
return null;
235+
}
236+
url = StringUtils.removeEnd(url, PATH_SEPARATOR);
237+
apiUrl = StringUtils.removeEnd(apiUrl, PATH_SEPARATOR) + PATH_SEPARATOR;
238+
String ownerAndRepo = StringUtils.removeStart(url, apiUrl);
239+
ownerAndRepo = StringUtils.removeEnd(ownerAndRepo, ".git");
240+
if (ownerAndRepo.contains("/")) {
241+
String[] parts = ownerAndRepo.split("/");
242+
String repo = parts[parts.length - 1];
243+
String owner = StringUtils.removeEnd(ownerAndRepo, "/" + repo);
244+
return GitRepositoryDTO.builder().name(repo).org(owner).build();
245+
}
246+
}
247+
return null;
248+
}
249+
218250
public CIBuildStatusPushParameters getCIBuildStatusPushParams(
219251
Ambiance ambiance, BuildStatusUpdateParameter buildStatusUpdateParameter, Status status, String commitSha) {
220252
NGAccess ngAccess = AmbianceUtils.getNgAccess(ambiance);
@@ -229,6 +261,12 @@ public CIBuildStatusPushParameters getCIBuildStatusPushParams(
229261
String finalRepo = GitClientHelper.getGitRepo(url);
230262
String ownerName = GitClientHelper.getGitOwner(url, false);
231263

264+
GitRepositoryDTO gitRepositoryDTO = getRepositoryFromApiUrl(gitConnector, url);
265+
if (gitRepositoryDTO != null) {
266+
finalRepo = gitRepositoryDTO.getName();
267+
ownerName = gitRepositoryDTO.getOrg();
268+
}
269+
232270
GitSCMType gitSCMType = retrieveSCMType(gitConnector);
233271

234272
String detailsUrl = getBuildDetailsUrl(ambiance);

930-delegate-tasks/src/main/java/io/harness/delegate/task/gitapi/client/impl/GitlabApiClient.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131
import io.harness.delegate.task.gitpolling.github.GitHubPollingDelegateRequest;
3232
import io.harness.exception.GitClientException;
3333
import io.harness.exception.InvalidRequestException;
34+
import io.harness.git.GitClientHelper;
3435
import io.harness.gitpolling.github.GitPollingWebhookData;
36+
import io.harness.impl.scm.ScmGitProviderMapper;
3537
import io.harness.logging.CommandExecutionStatus;
3638
import io.harness.security.encryption.SecretDecryptionService;
3739

@@ -73,7 +75,8 @@ public DelegateResponseData mergePR(GitApiTaskParams gitApiTaskParams) {
7375
}
7476
GitlabConnectorDTO gitConfigDTO = (GitlabConnectorDTO) gitConnector.getConnectorConfig();
7577
String token = retrieveAuthToken(gitConnector);
76-
String gitApiURL = getGitApiURL(gitConfigDTO.getUrl());
78+
String gitApiURL =
79+
GitClientHelper.getGitlabApiURL(gitConfigDTO.getUrl(), ScmGitProviderMapper.getGitlabApiUrl(gitConfigDTO));
7780
String slug = gitApiTaskParams.getSlug();
7881
String prNumber = gitApiTaskParams.getPrNumber();
7982
boolean deleteSourceBranch = gitApiTaskParams.isDeleteSourceBranch();

933-ci-commons/src/main/java/io/harness/git/checks/GitStatusCheckHelper.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import io.harness.exception.ConnectorNotFoundException;
3434
import io.harness.git.GitClientHelper;
3535
import io.harness.git.GitTokenRetriever;
36+
import io.harness.impl.scm.ScmGitProviderMapper;
3637

3738
import com.google.inject.Inject;
3839
import com.google.inject.Singleton;
@@ -209,8 +210,10 @@ private boolean sendBuildStatusToGitLab(GitStatusCheckParams gitStatusCheckParam
209210

210211
return Failsafe.with(retryPolicy)
211212
.get(()
212-
-> gitlabService.sendStatus(
213-
GitlabConfig.builder().gitlabUrl(getGitlabApiURL(gitConfigDTO.getUrl())).build(),
213+
-> gitlabService.sendStatus(GitlabConfig.builder()
214+
.gitlabUrl(getGitlabApiURL(gitConfigDTO.getUrl(),
215+
ScmGitProviderMapper.getGitlabApiUrl(gitConfigDTO)))
216+
.build(),
214217
gitStatusCheckParams.getUserName(), token, null, gitStatusCheckParams.getSha(),
215218
gitStatusCheckParams.getOwner(), gitStatusCheckParams.getRepo(), bodyObjectMap));
216219
} else {
@@ -317,9 +320,11 @@ private static String fetchCustomBitbucketDomain(String url, String domain) {
317320
return domain + customEndpoint;
318321
}
319322

320-
private String getGitlabApiURL(String url) {
323+
private String getGitlabApiURL(String url, String apiUrl) {
321324
if (url.contains("gitlab.com")) {
322325
return GITLAB_API_URL;
326+
} else if (!StringUtils.isBlank(apiUrl)) {
327+
return StringUtils.stripEnd(apiUrl, "/") + "/api/";
323328
} else {
324329
String domain = GitClientHelper.getGitSCM(url);
325330
return "https://" + domain + "/api/";

952-scm-java-client/src/main/java/io/harness/impl/scm/ScmGitProviderHelper.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static io.harness.annotations.dev.HarnessTeam.DX;
1111

1212
import io.harness.annotations.dev.OwnedBy;
13+
import io.harness.delegate.beans.connector.scm.GitAuthType;
1314
import io.harness.delegate.beans.connector.scm.ScmConnector;
1415
import io.harness.delegate.beans.connector.scm.azurerepo.AzureRepoConnectorDTO;
1516
import io.harness.delegate.beans.connector.scm.bitbucket.BitbucketConnectorDTO;
@@ -32,7 +33,7 @@ public String getSlug(ScmConnector scmConnector) {
3233
if (scmConnector instanceof GithubConnectorDTO) {
3334
return getSlugFromUrl(((GithubConnectorDTO) scmConnector).getUrl());
3435
} else if (scmConnector instanceof GitlabConnectorDTO) {
35-
return getSlugFromUrl(((GitlabConnectorDTO) scmConnector).getUrl());
36+
return getSlugFromUrlForGitlab((GitlabConnectorDTO) scmConnector);
3637
} else if (scmConnector instanceof BitbucketConnectorDTO) {
3738
return getSlugFromUrlForBitbucket(((BitbucketConnectorDTO) scmConnector).getUrl());
3839
} else if (scmConnector instanceof AzureRepoConnectorDTO) {
@@ -53,6 +54,19 @@ private String getSlugFromUrl(String url) {
5354
return ownerName + "/" + repoName;
5455
}
5556

57+
private String getSlugFromUrlForGitlab(GitlabConnectorDTO gitlabConnectorDTO) {
58+
String url = gitlabConnectorDTO.getUrl();
59+
String apiUrl = ScmGitProviderMapper.getGitlabApiUrl(gitlabConnectorDTO);
60+
if (!StringUtils.isBlank(apiUrl) && gitlabConnectorDTO.getAuthentication().getAuthType() == GitAuthType.HTTP) {
61+
apiUrl = StringUtils.stripEnd(apiUrl, "/") + "/";
62+
String slug = StringUtils.removeStart(url, apiUrl);
63+
return StringUtils.removeEnd(slug, ".git");
64+
}
65+
String repoName = gitClientHelper.getGitRepo(url);
66+
String ownerName = gitClientHelper.getGitOwner(url, false);
67+
return ownerName + "/" + repoName;
68+
}
69+
5670
private String getSlugFromUrlForBitbucket(String url) {
5771
String repoName = gitClientHelper.getGitRepo(url);
5872
String ownerName = gitClientHelper.getGitOwner(url, false);

952-scm-java-client/src/main/java/io/harness/impl/scm/ScmGitProviderMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ private String getOauthToken(GithubConnectorDTO githubConnector) {
259259
return String.valueOf(githubOauthDTO.getTokenRef().getDecryptedValue());
260260
}
261261

262-
private String getGitlabApiUrl(GitlabConnectorDTO gitlabConnector) {
262+
public static String getGitlabApiUrl(GitlabConnectorDTO gitlabConnector) {
263263
if (gitlabConnector.getApiAccess() == null || gitlabConnector.getApiAccess().getSpec() == null) {
264264
// not expected
265265
return null;

952-scm-java-client/src/test/java/io/harness/impl/scm/ScmServiceClientImplTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static io.harness.rule.OwnerRule.ADITHYA;
1717
import static io.harness.rule.OwnerRule.BHAVYA;
1818
import static io.harness.rule.OwnerRule.DEEPAK;
19+
import static io.harness.rule.OwnerRule.DEV_MITTAL;
1920
import static io.harness.rule.OwnerRule.MEET;
2021
import static io.harness.rule.OwnerRule.MOHIT_GARG;
2122

@@ -50,13 +51,17 @@
5051
import io.harness.connector.ConnectorInfoDTO;
5152
import io.harness.constants.Constants;
5253
import io.harness.data.structure.UUIDGenerator;
54+
import io.harness.delegate.beans.connector.scm.GitAuthType;
5355
import io.harness.delegate.beans.connector.scm.GitConnectionType;
5456
import io.harness.delegate.beans.connector.scm.ScmConnector;
5557
import io.harness.delegate.beans.connector.scm.bitbucket.BitbucketApiAccessDTO;
5658
import io.harness.delegate.beans.connector.scm.bitbucket.BitbucketConnectorDTO;
5759
import io.harness.delegate.beans.connector.scm.github.GithubApiAccessDTO;
5860
import io.harness.delegate.beans.connector.scm.github.GithubConnectorDTO;
61+
import io.harness.delegate.beans.connector.scm.gitlab.GitlabApiAccessDTO;
62+
import io.harness.delegate.beans.connector.scm.gitlab.GitlabAuthenticationDTO;
5963
import io.harness.delegate.beans.connector.scm.gitlab.GitlabConnectorDTO;
64+
import io.harness.delegate.beans.connector.scm.gitlab.GitlabTokenSpecDTO;
6065
import io.harness.exception.InvalidRequestException;
6166
import io.harness.exception.UnexpectedException;
6267
import io.harness.product.ci.scm.proto.Commit;
@@ -513,6 +518,45 @@ public void testGetBatchFile() {
513518
assertThat(gitFileResponse.getObjectId()).isEqualTo(objectId);
514519
}
515520

521+
@Test
522+
@Owner(developers = DEV_MITTAL)
523+
@Category(UnitTests.class)
524+
public void testGetSlugGitlab() {
525+
ScmGitProviderHelper helper = new ScmGitProviderHelper();
526+
GitlabConnectorDTO gitlabConnectorDTO =
527+
GitlabConnectorDTO.builder()
528+
.url("http://34.170.133.206/gitlab/gitlab-instance-9ca8a1ea/subgroup/repo1.git")
529+
.authentication(GitlabAuthenticationDTO.builder().authType(GitAuthType.HTTP).build())
530+
.apiAccess(GitlabApiAccessDTO.builder()
531+
.spec(GitlabTokenSpecDTO.builder().apiUrl("http://34.170.133.206/gitlab/").build())
532+
.build())
533+
.build();
534+
String slug = helper.getSlug(gitlabConnectorDTO);
535+
assertEquals(slug, "gitlab-instance-9ca8a1ea/subgroup/repo1");
536+
537+
gitlabConnectorDTO.setUrl("http://34.170.133.206/gitlab/gitlab-instance-9ca8a1ea/repo1.git");
538+
slug = helper.getSlug(gitlabConnectorDTO);
539+
assertEquals(slug, "gitlab-instance-9ca8a1ea/repo1");
540+
541+
gitlabConnectorDTO.setUrl("[email protected]:gitlab-instance-9ca8a1ea/subgroup/repo1.git");
542+
gitlabConnectorDTO.setAuthentication(GitlabAuthenticationDTO.builder().authType(GitAuthType.SSH).build());
543+
slug = helper.getSlug(gitlabConnectorDTO);
544+
assertEquals(slug, "gitlab-instance-9ca8a1ea/subgroup/repo1");
545+
546+
gitlabConnectorDTO.setUrl("[email protected]:gitlab-instance-9ca8a1ea/repo1.git");
547+
slug = helper.getSlug(gitlabConnectorDTO);
548+
assertEquals(slug, "gitlab-instance-9ca8a1ea/repo1");
549+
550+
gitlabConnectorDTO.setApiAccess(
551+
GitlabApiAccessDTO.builder().spec(GitlabTokenSpecDTO.builder().apiUrl("").build()).build());
552+
slug = helper.getSlug(gitlabConnectorDTO);
553+
assertEquals(slug, "gitlab-instance-9ca8a1ea/repo1");
554+
555+
gitlabConnectorDTO.setUrl("http://34.170.133.206/gitlab/gitlab-instance-9ca8a1ea/repo1.git");
556+
slug = helper.getSlug(gitlabConnectorDTO);
557+
assertEquals(slug, "gitlab/gitlab-instance-9ca8a1ea/repo1");
558+
}
559+
516560
private GitFileDetails getGitFileDetailsDefault() {
517561
return GitFileDetails.builder()
518562
.filePath(filepath)

954-connector-beans/src/main/java/io/harness/delegate/beans/connector/scm/gitlab/GitlabConnectorDTO.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import lombok.EqualsAndHashCode;
4545
import lombok.NoArgsConstructor;
4646
import lombok.experimental.FieldDefaults;
47+
import org.apache.commons.lang3.StringUtils;
4748
import org.hibernate.validator.constraints.NotBlank;
4849

4950
@Data
@@ -130,6 +131,11 @@ public String getGitConnectionUrl(GitRepositoryDTO gitRepositoryDTO) {
130131
@Override
131132
public GitRepositoryDTO getGitRepositoryDetails() {
132133
if (GitConnectionType.REPO.equals(connectionType)) {
134+
GitRepositoryDTO gitRepositoryDTO = getRepositoryFromApiUrl();
135+
if (gitRepositoryDTO != null) {
136+
return gitRepositoryDTO;
137+
}
138+
133139
return GitRepositoryDTO.builder()
134140
.name(GitClientHelper.getGitRepo(url))
135141
.org(GitClientHelper.getGitOwner(url, false))
@@ -165,4 +171,29 @@ public ConnectorConfigOutcomeDTO toOutcome() {
165171
.executeOnDelegate(this.executeOnDelegate)
166172
.build();
167173
}
174+
175+
private GitRepositoryDTO getRepositoryFromApiUrl() {
176+
if (!GitConnectionType.REPO.equals(connectionType) || !GitAuthType.HTTP.equals(authentication.getAuthType())) {
177+
return null;
178+
}
179+
if (apiAccess == null || !(apiAccess.getSpec() instanceof GitlabTokenSpecDTO)) {
180+
return null;
181+
}
182+
GitlabTokenSpecDTO gitlabTokenSpecDTO = (GitlabTokenSpecDTO) apiAccess.getSpec();
183+
String apiUrl = gitlabTokenSpecDTO.getApiUrl();
184+
if (StringUtils.isBlank(apiUrl)) {
185+
return null;
186+
}
187+
apiUrl = StringUtils.removeEnd(apiUrl, "/") + "/";
188+
String ownerAndRepo = StringUtils.removeStart(url, apiUrl);
189+
ownerAndRepo = StringUtils.removeEnd(ownerAndRepo, ".git");
190+
if (ownerAndRepo.contains("/")) {
191+
String[] parts = ownerAndRepo.split("/");
192+
String repo = parts[parts.length - 1];
193+
String owner = StringUtils.removeEnd(ownerAndRepo, "/" + repo);
194+
return GitRepositoryDTO.builder().name(repo).org(owner).build();
195+
}
196+
197+
return null;
198+
}
168199
}

0 commit comments

Comments
 (0)