Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions backend/src/lib/api-docs/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2640,6 +2640,9 @@ export const AppConnections = {
VERCEL: {
apiToken: "The API token used to authenticate with Vercel."
},
TRAVISCI: {
apiToken: "The API token used to authenticate with Travis CI."
},
CAMUNDA: {
clientId: "The client ID used to authenticate with Camunda.",
clientSecret: "The client secret used to authenticate with Camunda."
Expand Down Expand Up @@ -3080,6 +3083,12 @@ export const SecretSyncs = {
projectId: "The ID of the project on the external Infisical instance to sync secrets to.",
environment: "The environment slug on the external Infisical instance to sync secrets to.",
secretPath: "The secret path on the external Infisical instance to sync secrets to."
},
TRAVIS_CI: {
repositoryId: "The ID of the Travis CI repository to sync secrets to.",
repositorySlug: "The slug (owner/repo) of the Travis CI repository to sync secrets to.",
branch:
"The branch of the Travis CI repository to sync secrets to. If omitted, secrets sync to the repository-level scope."
}
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ export const registerAppConnectionEndpoints = <T extends TAppConnection, I exten
[AppConnection.MsSql]: "MsSql",
[AppConnection.MySql]: "MySql",
[AppConnection.OracleDB]: "OracleDb",
[AppConnection.MongoDB]: "MongoDb"
[AppConnection.MongoDB]: "MongoDb",
[AppConnection.TravisCI]: "TravisCI"
};
const appNameForOpId =
specialCases[app] ??
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,10 @@ import {
SanitizedTerraformCloudConnectionSchema,
TerraformCloudConnectionListItemSchema
} from "@app/services/app-connection/terraform-cloud";
import {
SanitizedTravisCIConnectionSchema,
TravisCIConnectionListItemSchema
} from "@app/services/app-connection/travis-ci";
import { SanitizedVenafiConnectionSchema, VenafiConnectionListItemSchema } from "@app/services/app-connection/venafi";
import { SanitizedVercelConnectionSchema, VercelConnectionListItemSchema } from "@app/services/app-connection/vercel";
import {
Expand Down Expand Up @@ -232,8 +236,9 @@ const SanitizedAppConnectionSchema = z.union([
...SanitizedAzureEntraIdConnectionSchema.options,
...SanitizedVenafiConnectionSchema.options,
...SanitizedExternalInfisicalConnectionSchema.options,
...SanitizedNetScalerConnectionSchema.options,
...SanitizedDopplerConnectionSchema.options,
...SanitizedNetScalerConnectionSchema.options
...SanitizedTravisCIConnectionSchema.options
]);

const AppConnectionOptionsSchema = z.discriminatedUnion("app", [
Expand Down Expand Up @@ -293,7 +298,8 @@ const AppConnectionOptionsSchema = z.discriminatedUnion("app", [
ExternalInfisicalConnectionListItemSchema,
DopplerConnectionListItemSchema,
NetScalerConnectionListItemSchema,
AnthropicConnectionListItemSchema
AnthropicConnectionListItemSchema,
TravisCIConnectionListItemSchema
]);

export const registerAppConnectionRouter = async (server: FastifyZodProvider) => {
Expand Down
4 changes: 3 additions & 1 deletion backend/src/server/routes/v1/app-connection-routers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import { registerSshConnectionRouter } from "./ssh-connection-router";
import { registerSupabaseConnectionRouter } from "./supabase-connection-router";
import { registerTeamCityConnectionRouter } from "./teamcity-connection-router";
import { registerTerraformCloudConnectionRouter } from "./terraform-cloud-router";
import { registerTravisCIConnectionRouter } from "./travis-ci-connection-router";
import { registerVenafiConnectionRouter } from "./venafi-connection-router";
import { registerVercelConnectionRouter } from "./vercel-connection-router";
import { registerWindmillConnectionRouter } from "./windmill-connection-router";
Expand Down Expand Up @@ -118,5 +119,6 @@ export const APP_CONNECTION_REGISTER_ROUTER_MAP: Record<AppConnection, (server:
[AppConnection.ExternalInfisical]: registerExternalInfisicalConnectionRouter,
[AppConnection.Doppler]: registerDopplerConnectionRouter,
[AppConnection.NetScaler]: registerNetScalerConnectionRouter,
[AppConnection.Anthropic]: registerAnthropicConnectionRouter
[AppConnection.Anthropic]: registerAnthropicConnectionRouter,
[AppConnection.TravisCI]: registerTravisCIConnectionRouter
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import z from "zod";

import { readLimit } from "@app/server/config/rateLimiter";
import { verifyAuth } from "@app/server/plugins/auth/verify-auth";
import { AppConnection } from "@app/services/app-connection/app-connection-enums";
import {
CreateTravisCIConnectionSchema,
SanitizedTravisCIConnectionSchema,
UpdateTravisCIConnectionSchema
} from "@app/services/app-connection/travis-ci";
import { AuthMode } from "@app/services/auth/auth-type";

import { registerAppConnectionEndpoints } from "./app-connection-endpoints";

export const registerTravisCIConnectionRouter = async (server: FastifyZodProvider) => {
registerAppConnectionEndpoints({
app: AppConnection.TravisCI,
server,
sanitizedResponseSchema: SanitizedTravisCIConnectionSchema,
createSchema: CreateTravisCIConnectionSchema,
updateSchema: UpdateTravisCIConnectionSchema
});

// The below endpoints are not exposed and for Infisical App use
server.route({
method: "GET",
url: `/:connectionId/repositories`,
config: {
rateLimit: readLimit
},
schema: {
operationId: "listTravisCIRepositories",
params: z.object({
connectionId: z.string().uuid()
}),
response: {
200: z
.object({
id: z.string(),
name: z.string(),
slug: z.string()
})
.array()
}
},
onRequest: verifyAuth([AuthMode.JWT]),
handler: async (req) => {
const { connectionId } = req.params;

const repositories = await server.services.appConnection.travisCI.listRepositories(connectionId, req.permission);

return repositories;
}
});

server.route({
method: "GET",
url: `/:connectionId/branches`,
config: {
rateLimit: readLimit
},
schema: {
operationId: "listTravisCIBranches",
params: z.object({
connectionId: z.string().uuid()
}),
querystring: z.object({
repositoryId: z.string().min(1, "Repository ID is required")
}),
response: {
200: z
.object({
name: z.string(),
isDefault: z.boolean()
})
.array()
}
},
onRequest: verifyAuth([AuthMode.JWT]),
handler: async (req) => {
const { connectionId } = req.params;
const { repositoryId } = req.query;

const branches = await server.services.appConnection.travisCI.listBranches(
connectionId,
repositoryId,
req.permission
);

return branches;
}
});
};
4 changes: 3 additions & 1 deletion backend/src/server/routes/v1/secret-sync-routers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import { registerRenderSyncRouter } from "./render-sync-router";
import { registerSupabaseSyncRouter } from "./supabase-sync-router";
import { registerTeamCitySyncRouter } from "./teamcity-sync-router";
import { registerTerraformCloudSyncRouter } from "./terraform-cloud-sync-router";
import { registerTravisCISyncRouter } from "./travis-ci-sync-router";
import { registerVercelSyncRouter } from "./vercel-sync-router";
import { registerWindmillSyncRouter } from "./windmill-sync-router";
import { registerZabbixSyncRouter } from "./zabbix-sync-router";
Expand Down Expand Up @@ -77,5 +78,6 @@ export const SECRET_SYNC_REGISTER_ROUTER_MAP: Record<SecretSync, (server: Fastif
[SecretSync.OctopusDeploy]: registerOctopusDeploySyncRouter,
[SecretSync.CircleCI]: registerCircleCISyncRouter,
[SecretSync.AzureEntraIdScim]: registerAzureEntraIdScimSyncRouter,
[SecretSync.ExternalInfisical]: registerExternalInfisicalSyncRouter
[SecretSync.ExternalInfisical]: registerExternalInfisicalSyncRouter,
[SecretSync.TravisCI]: registerTravisCISyncRouter
};
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ export const registerSyncSecretsEndpoints = <T extends TSecretSync, I extends TS
const specialCases: Record<string, string> = {
[SecretSync.OnePass]: "OnePassword",
[SecretSync.GitHub]: "GitHub",
[SecretSync.GitLab]: "GitLab"
[SecretSync.GitLab]: "GitLab",
[SecretSync.TravisCI]: "TravisCI"
};
const destinationNameForOpId =
specialCases[destination] ??
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import { RenderSyncListItemSchema, RenderSyncSchema } from "@app/services/secret
import { SupabaseSyncListItemSchema, SupabaseSyncSchema } from "@app/services/secret-sync/supabase";
import { TeamCitySyncListItemSchema, TeamCitySyncSchema } from "@app/services/secret-sync/teamcity";
import { TerraformCloudSyncListItemSchema, TerraformCloudSyncSchema } from "@app/services/secret-sync/terraform-cloud";
import { TravisCISyncListItemSchema, TravisCISyncSchema } from "@app/services/secret-sync/travis-ci";
import { VercelSyncListItemSchema, VercelSyncSchema } from "@app/services/secret-sync/vercel";
import { WindmillSyncListItemSchema, WindmillSyncSchema } from "@app/services/secret-sync/windmill";
import { ZabbixSyncListItemSchema, ZabbixSyncSchema } from "@app/services/secret-sync/zabbix";
Expand Down Expand Up @@ -104,7 +105,8 @@ const SecretSyncSchema = z.discriminatedUnion("destination", [
OctopusDeploySyncSchema,
CircleCISyncSchema,
AzureEntraIdScimSyncSchema,
ExternalInfisicalSyncSchema
ExternalInfisicalSyncSchema,
TravisCISyncSchema
]);

const SecretSyncOptionsSchema = z.discriminatedUnion("destination", [
Expand Down Expand Up @@ -144,7 +146,8 @@ const SecretSyncOptionsSchema = z.discriminatedUnion("destination", [
OctopusDeploySyncListItemSchema,
CircleCISyncListItemSchema,
AzureEntraIdScimSyncListItemSchema,
ExternalInfisicalSyncListItemSchema
ExternalInfisicalSyncListItemSchema,
TravisCISyncListItemSchema
]);

export const registerSecretSyncRouter = async (server: FastifyZodProvider) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { SecretSync } from "@app/services/secret-sync/secret-sync-enums";
import {
CreateTravisCISyncSchema,
TravisCISyncSchema,
UpdateTravisCISyncSchema
} from "@app/services/secret-sync/travis-ci";

import { registerSyncSecretsEndpoints } from "./secret-sync-endpoints";

export const registerTravisCISyncRouter = async (server: FastifyZodProvider) =>
registerSyncSecretsEndpoints({
destination: SecretSync.TravisCI,
server,
responseSchema: TravisCISyncSchema,
createSchema: CreateTravisCISyncSchema,
updateSchema: UpdateTravisCISyncSchema
});
3 changes: 2 additions & 1 deletion backend/src/services/app-connection/app-connection-enums.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ export enum AppConnection {
ExternalInfisical = "external-infisical",
Doppler = "doppler",
NetScaler = "netscaler",
Anthropic = "anthropic"
Anthropic = "anthropic",
TravisCI = "travis-ci"
}

export enum AWSRegion {
Expand Down
13 changes: 11 additions & 2 deletions backend/src/services/app-connection/app-connection-fns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,11 @@ import {
TerraformCloudConnectionMethod,
validateTerraformCloudConnectionCredentials
} from "./terraform-cloud";
import {
getTravisCIConnectionListItem,
TravisCIConnectionMethod,
validateTravisCIConnectionCredentials
} from "./travis-ci";
import { getVenafiConnectionListItem, validateVenafiConnectionCredentials, VenafiConnectionMethod } from "./venafi";
import { VercelConnectionMethod } from "./vercel";
import { getVercelConnectionListItem, validateVercelConnectionCredentials } from "./vercel/vercel-connection-fns";
Expand Down Expand Up @@ -294,7 +299,8 @@ export const listAppConnectionOptions = (projectType?: ProjectType) => {
getVenafiConnectionListItem(),
getExternalInfisicalConnectionListItem(),
getDopplerConnectionListItem(),
getNetScalerConnectionListItem()
getNetScalerConnectionListItem(),
getTravisCIConnectionListItem()
]
.filter((option) => {
switch (projectType) {
Expand Down Expand Up @@ -441,6 +447,7 @@ export const validateAppConnectionCredentials = async (
[AppConnection.AzureEntraId]: validateAzureEntraIdConnectionCredentials as TAppConnectionCredentialsValidator,
[AppConnection.Venafi]: validateVenafiConnectionCredentials as TAppConnectionCredentialsValidator,
[AppConnection.NetScaler]: validateNetScalerConnectionCredentials as TAppConnectionCredentialsValidator,
[AppConnection.TravisCI]: validateTravisCIConnectionCredentials as TAppConnectionCredentialsValidator,
[AppConnection.ExternalInfisical]: ((config: TAppConnectionConfig) =>
validateExternalInfisicalConnectionCredentials(
config as TExternalInfisicalConnectionConfig,
Expand Down Expand Up @@ -493,6 +500,7 @@ export const getAppConnectionMethodName = (method: TAppConnection["method"]) =>
case LaravelForgeConnectionMethod.ApiToken:
case DbtConnectionMethod.ApiToken:
case CircleCIConnectionMethod.ApiToken:
case TravisCIConnectionMethod.ApiToken:
return "API Token";
case DNSMadeEasyConnectionMethod.APIKeySecret:
return "API Key & Secret";
Expand Down Expand Up @@ -652,8 +660,9 @@ export const TRANSITION_CONNECTION_CREDENTIALS_TO_PLATFORM: Record<
[AppConnection.AzureEntraId]: platformManagedCredentialsNotSupported,
[AppConnection.Venafi]: platformManagedCredentialsNotSupported,
[AppConnection.ExternalInfisical]: platformManagedCredentialsNotSupported,
[AppConnection.NetScaler]: platformManagedCredentialsNotSupported,
[AppConnection.Doppler]: platformManagedCredentialsNotSupported,
[AppConnection.NetScaler]: platformManagedCredentialsNotSupported
[AppConnection.TravisCI]: platformManagedCredentialsNotSupported
};

export const enterpriseAppCheck = async (
Expand Down
6 changes: 4 additions & 2 deletions backend/src/services/app-connection/app-connection-maps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ export const APP_CONNECTION_NAME_MAP: Record<AppConnection, string> = {
[AppConnection.ExternalInfisical]: "Infisical",
[AppConnection.Doppler]: "Doppler",
[AppConnection.NetScaler]: "NetScaler",
[AppConnection.Anthropic]: "Anthropic"
[AppConnection.Anthropic]: "Anthropic",
[AppConnection.TravisCI]: "Travis CI"
};

export const APP_CONNECTION_PLAN_MAP: Record<AppConnection, AppConnectionPlanType> = {
Expand Down Expand Up @@ -117,5 +118,6 @@ export const APP_CONNECTION_PLAN_MAP: Record<AppConnection, AppConnectionPlanTyp
[AppConnection.ExternalInfisical]: AppConnectionPlanType.Regular,
[AppConnection.Doppler]: AppConnectionPlanType.Regular,
[AppConnection.NetScaler]: AppConnectionPlanType.Regular,
[AppConnection.Anthropic]: AppConnectionPlanType.Regular
[AppConnection.Anthropic]: AppConnectionPlanType.Regular,
[AppConnection.TravisCI]: AppConnectionPlanType.Regular
};
8 changes: 6 additions & 2 deletions backend/src/services/app-connection/app-connection-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ import { ValidateTeamCityConnectionCredentialsSchema } from "./teamcity";
import { teamcityConnectionService } from "./teamcity/teamcity-connection-service";
import { ValidateTerraformCloudConnectionCredentialsSchema } from "./terraform-cloud";
import { terraformCloudConnectionService } from "./terraform-cloud/terraform-cloud-connection-service";
import { ValidateTravisCIConnectionCredentialsSchema } from "./travis-ci";
import { travisCIConnectionService } from "./travis-ci/travis-ci-connection-service";
import { ValidateVenafiConnectionCredentialsSchema } from "./venafi/venafi-connection-schema";
import { venafiConnectionService } from "./venafi/venafi-connection-service";
import { ValidateVercelConnectionCredentialsSchema } from "./vercel";
Expand Down Expand Up @@ -222,7 +224,8 @@ const VALIDATE_APP_CONNECTION_CREDENTIALS_MAP: Record<AppConnection, TValidateAp
[AppConnection.ExternalInfisical]: ValidateExternalInfisicalConnectionCredentialsSchema,
[AppConnection.Doppler]: ValidateDopplerConnectionCredentialsSchema,
[AppConnection.NetScaler]: ValidateNetScalerConnectionCredentialsSchema,
[AppConnection.Anthropic]: ValidateAnthropicConnectionCredentialsSchema
[AppConnection.Anthropic]: ValidateAnthropicConnectionCredentialsSchema,
[AppConnection.TravisCI]: ValidateTravisCIConnectionCredentialsSchema
};

export const appConnectionServiceFactory = ({
Expand Down Expand Up @@ -1101,6 +1104,7 @@ export const appConnectionServiceFactory = ({
dbt: dbtConnectionService(connectAppConnectionById),
circleci: circleciConnectionService(connectAppConnectionById),
azureEntraId: azureEntraIdConnectionService(connectAppConnectionById, appConnectionDAL, kmsService),
doppler: dopplerConnectionService(connectAppConnectionById)
doppler: dopplerConnectionService(connectAppConnectionById),
travisCI: travisCIConnectionService(connectAppConnectionById)
};
};
Loading
Loading