diff --git a/backend/src/services/secret-sync/octopus-deploy/octopus-deploy-sync-schemas.ts b/backend/src/services/secret-sync/octopus-deploy/octopus-deploy-sync-schemas.ts index 7750bbedaa..e51d5f85a0 100644 --- a/backend/src/services/secret-sync/octopus-deploy/octopus-deploy-sync-schemas.ts +++ b/backend/src/services/secret-sync/octopus-deploy/octopus-deploy-sync-schemas.ts @@ -18,10 +18,7 @@ export enum OctopusDeploySyncScope { const OctopusDeploySyncDestinationConfigBaseSchema = z.object({ spaceId: z.string().min(1, "Space ID is required").describe(SecretSyncs.DESTINATION_CONFIG.OCTOPUS_DEPLOY.spaceId), - spaceName: z - .string() - .min(1, "Space Name is required") - .describe(SecretSyncs.DESTINATION_CONFIG.OCTOPUS_DEPLOY.spaceName), + spaceName: z.string().optional().describe(SecretSyncs.DESTINATION_CONFIG.OCTOPUS_DEPLOY.spaceName), scope: z.nativeEnum(OctopusDeploySyncScope).default(OctopusDeploySyncScope.Project) }); @@ -34,10 +31,7 @@ export const OctopusDeploySyncDestinationConfigSchema = z.intersection( .string() .min(1, "Project ID is required") .describe(SecretSyncs.DESTINATION_CONFIG.OCTOPUS_DEPLOY.projectId), - projectName: z - .string() - .min(1, "Project Name is required") - .describe(SecretSyncs.DESTINATION_CONFIG.OCTOPUS_DEPLOY.projectName), + projectName: z.string().optional().describe(SecretSyncs.DESTINATION_CONFIG.OCTOPUS_DEPLOY.projectName), scopeValues: z .object({ environments: z.array(z.string()).optional(), diff --git a/docs/images/secret-syncs/octopus-deploy/select-option.png b/docs/images/secret-syncs/octopus-deploy/select-option.png new file mode 100644 index 0000000000..9bcc37abaa Binary files /dev/null and b/docs/images/secret-syncs/octopus-deploy/select-option.png differ diff --git a/docs/images/secret-syncs/octopus-deploy/sync-created.png b/docs/images/secret-syncs/octopus-deploy/sync-created.png new file mode 100644 index 0000000000..77eea8fff7 Binary files /dev/null and b/docs/images/secret-syncs/octopus-deploy/sync-created.png differ diff --git a/docs/images/secret-syncs/octopus-deploy/sync-destination-advanced.png b/docs/images/secret-syncs/octopus-deploy/sync-destination-advanced.png new file mode 100644 index 0000000000..3e4e7ee7c6 Binary files /dev/null and b/docs/images/secret-syncs/octopus-deploy/sync-destination-advanced.png differ diff --git a/docs/images/secret-syncs/octopus-deploy/sync-destination.png b/docs/images/secret-syncs/octopus-deploy/sync-destination.png new file mode 100644 index 0000000000..fde047b3d7 Binary files /dev/null and b/docs/images/secret-syncs/octopus-deploy/sync-destination.png differ diff --git a/docs/images/secret-syncs/octopus-deploy/sync-details.png b/docs/images/secret-syncs/octopus-deploy/sync-details.png new file mode 100644 index 0000000000..a16d6a1d23 Binary files /dev/null and b/docs/images/secret-syncs/octopus-deploy/sync-details.png differ diff --git a/docs/images/secret-syncs/octopus-deploy/sync-options.png b/docs/images/secret-syncs/octopus-deploy/sync-options.png new file mode 100644 index 0000000000..73ec52941a Binary files /dev/null and b/docs/images/secret-syncs/octopus-deploy/sync-options.png differ diff --git a/docs/images/secret-syncs/octopus-deploy/sync-review.png b/docs/images/secret-syncs/octopus-deploy/sync-review.png new file mode 100644 index 0000000000..9735209b57 Binary files /dev/null and b/docs/images/secret-syncs/octopus-deploy/sync-review.png differ diff --git a/docs/images/secret-syncs/octopus-deploy/sync-source.png b/docs/images/secret-syncs/octopus-deploy/sync-source.png new file mode 100644 index 0000000000..ae66a01d38 Binary files /dev/null and b/docs/images/secret-syncs/octopus-deploy/sync-source.png differ diff --git a/docs/integrations/secret-syncs/octopus-deploy.mdx b/docs/integrations/secret-syncs/octopus-deploy.mdx new file mode 100644 index 0000000000..fd9f22ca17 --- /dev/null +++ b/docs/integrations/secret-syncs/octopus-deploy.mdx @@ -0,0 +1,209 @@ +--- +title: "Octopus Deploy Sync" +description: "Learn how to configure an Octopus Deploy Sync for Infisical." +--- + +**Prerequisites:** + +- Create an [Octopus Deploy Connection](/integrations/app-connections/octopus-deploy) + + + + + + Navigate to **Project** > **Integrations** and select the **Secret Syncs** tab. Click on the **Add Sync** button. + + ![Secret Syncs Tab](/images/secret-syncs/general/secret-sync-tab.png) + + + ![Select Octopus Deploy](/images/secret-syncs/octopus-deploy/select-option.png) + + + Configure the **Source** from where secrets should be retrieved, then click **Next**. + + ![Configure Source](/images/secret-syncs/octopus-deploy/sync-source.png) + + - **Environment**: The project environment to retrieve secrets from. + - **Secret Path**: The folder path to retrieve secrets from. + + + If you need to sync secrets from multiple folder locations, check out [secret imports](/documentation/platform/secret-reference#secret-imports). + + + + Configure the **Destination** to where secrets should be deployed, then click **Next**. + + + The destination configuration is organized into two tabs: + + **General Tab:** + ![Configure Destination](/images/secret-syncs/octopus-deploy/sync-destination.png) + - **Octopus Deploy Connection**: The Octopus Deploy Connection to authenticate with. + - **Space**: The Octopus Deploy Space to sync secrets to. + - **Project**: The Octopus Deploy Project within the Space to sync secrets to. + + **Advanced Tab:** + ![Configure Destination Advanced](/images/secret-syncs/octopus-deploy/sync-destination-advanced.png) + The Advanced tab allows you to specify optional scope values to restrict where the synced variables are available within your Octopus Deploy project: + - **Environments**: Restrict variables to specific environments (e.g., Development, Staging, Production). + - **Target Tags**: Restrict variables to specific target tags (e.g., web-server, database). + - **Targets**: Restrict variables to specific deployment targets. + - **Processes**: Restrict variables to specific deployment processes. + - **Deployment Steps**: Restrict variables to specific deployment steps. + - **Channels**: Restrict variables to specific release channels. + + + + Configure the **Sync Options** to specify how secrets should be synced, then click **Next**. + + ![Configure Options](/images/secret-syncs/octopus-deploy/sync-options.png) + + - **Initial Sync Behavior**: Determines how Infisical should resolve the initial sync. + - **Overwrite Destination Secrets**: Removes any secrets at the destination endpoint not present in Infisical. + + Octopus Deploy does not support importing secrets. + + - **Key Schema**: Template that determines how secret names are transformed when syncing, using `{{secretKey}}` as a placeholder for the original secret name and `{{environment}}` for the environment. + + We highly recommend using a Key Schema to ensure that Infisical only manages the specific keys you intend, keeping everything else untouched. + + - **Auto-Sync Enabled**: If enabled, secrets will automatically be synced from the source location when changes occur. Disable to enforce manual syncing only. + - **Disable Secret Deletion**: If enabled, Infisical will not remove secrets from the sync destination. Enable this option if you intend to manage some secrets manually outside of Infisical. + + + Configure the **Details** of your Octopus Deploy Sync, then click **Next**. + + ![Configure Details](/images/secret-syncs/octopus-deploy/sync-details.png) + + - **Name**: The name of your sync. Must be slug-friendly. + - **Description**: An optional description for your sync. + + + Review your Octopus Deploy Sync configuration, then click **Create Sync**. + + ![Review Configuration](/images/secret-syncs/octopus-deploy/sync-review.png) + + + If enabled, your Octopus Deploy Sync will begin syncing your secrets to the destination endpoint. + + ![Sync Created](/images/secret-syncs/octopus-deploy/sync-created.png) + + + + + + + To create an **Octopus Deploy Sync**, make an API request to the [Create Octopus Deploy Sync](/api-reference/endpoints/secret-syncs/octopus-deploy/create) API endpoint. + + ### Sample request + + ```bash Request + curl --request POST \ + --url https://app.infisical.com/api/v1/secret-syncs/octopus-deploy \ + --header 'Content-Type: application/json' \ + --data '{ + "name": "my-octopus-deploy-sync", + "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", + "description": "sync to octopus deploy project", + "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", + "environment": "dev", + "secretPath": "/", + "isEnabled": true, + "isAutoSyncEnabled": true, + "syncOptions": { + "initialSyncBehavior": "overwrite-destination", + "disableSecretDeletion": false + }, + "destinationConfig": { + "spaceId": "Spaces-1", + "scope": "project", + "projectId": "Projects-123", + "scopeValues": { + "environments": ["Environments-1", "Environments-2"], + "roles": ["web-server"], + "channels": ["Channels-1"] + } + } + }' + ``` + + ### Sample response + + ```json Response + { + "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", + "name": "my-octopus-deploy-secret-sync", + "description": null, + "isAutoSyncEnabled": true, + "version": 1, + "projectId": "1e812ad3-e5df-4f1b-839d-13b4ef201840", + "folderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", + "connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", + "createdAt": "2025-12-12T09:44:59.023Z", + "updatedAt": "2025-12-12T09:44:59.023Z", + "syncStatus": "succeeded", + "lastSyncJobId": null, + "lastSyncMessage": null, + "lastSyncedAt": null, + "importStatus": null, + "lastImportJobId": null, + "lastImportMessage": null, + "lastImportedAt": null, + "removeStatus": null, + "lastRemoveJobId": null, + "lastRemoveMessage": null, + "lastRemovedAt": null, + "syncOptions": { + "initialSyncBehavior": "overwrite-destination", + "disableSecretDeletion": false + }, + "connection": { + "app": "octopus-deploy", + "name": "my-octopus-deploy-connection", + "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" + }, + "environment": { + "slug": "dev", + "name": "Development", + "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" + }, + "folder": { + "id": "ad9c26ed-a7ee-41f4-b883-8dd25736052a", + "path": "/" + }, + "destination": "octopus-deploy", + "destinationConfig": { + "spaceId": "Spaces-1", + "scope": "project", + "projectId": "Projects-1", + "scopeValues": { + "environments": [ + "Environments-1", + "Environments-2" + ], + "roles": [ + "sample-app-server" + ], + "machines": [ + "Machines-1", + "Machines-2" + ], + "processes": [ + "Runbooks-1", + "Runbooks-2" + ], + "actions": [ + "3c90c3cc-0d44-4b50-8888-8dd25736052a", + "3c90c3cc-0d44-4b50-8888-8dd25736052a" + ], + "channels": [ + "Channels-2", + "Channels-1" + ] + } + } + } + ``` + + + diff --git a/frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/OctopusDeploySyncFields.tsx b/frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/OctopusDeploySyncFields.tsx index c241ff08b0..14a0dda825 100644 --- a/frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/OctopusDeploySyncFields.tsx +++ b/frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/OctopusDeploySyncFields.tsx @@ -62,7 +62,9 @@ export const OctopusDeploySyncFields = () => { { setValue("destinationConfig.spaceId", ""); + setValue("destinationConfig.spaceName", ""); setValue("destinationConfig.projectId", ""); + setValue("destinationConfig.projectName", ""); setValue("destinationConfig.scopeValues", undefined); }} />