void PublishToJira(string token, DeploymentEventType eventType, IDeployment deployment)
        {
            var envSettings =
                deploymentEnvironmentSettingsProvider
                .GetSettings <DeploymentEnvironmentSettingsMetadataProvider.JiraDeploymentEnvironmentSettings>(
                    JiraConfigurationStore.SingletonId, deployment.EnvironmentId) ?? new DeploymentEnvironmentSettingsMetadataProvider.JiraDeploymentEnvironmentSettings();
            var serverUri = serverConfigurationStore.GetServerUri()?.TrimEnd('/');

            if (string.IsNullOrWhiteSpace(serverUri))
            {
                log.Warn("To use Jira integration you must have the Octopus server's external url configured (see the Configuration/Nodes page)");
                return;
            }

            var project = projectStore.Get(deployment.ProjectId);
            var deploymentEnvironment = deploymentEnvironmentStore.Get(deployment.EnvironmentId);
            var release    = releaseStore.Get(deployment.ReleaseId);
            var serverTask = serverTaskStore.Get(deployment.TaskId);

            var data = new OctopusJiraPayloadData
            {
                InstallationId  = installationIdProvider.GetInstallationId().ToString(),
                BaseHostUrl     = store.GetBaseUrl(),
                DeploymentsInfo = new JiraPayloadData
                {
                    Deployments = new[]
 public override void BuildMappings(IResourceMappingsBuilder builder)
 {
     builder.Map <JiraConfigurationResource, JiraConfiguration>()
     .EnrichResource((model, resource) =>
     {
         resource.OctopusInstallationId = installationIdProvider.GetInstallationId().ToString();
         resource.OctopusServerUrl      = serverConfigurationStore.GetServerUri();
     });
     builder.Map <ReleaseNoteOptionsResource, ReleaseNoteOptions>();
 }
        public async Task PublishToJira(string eventType,
                                        DeploymentResource deployment,
                                        IJiraApiDeployment jiraApiDeployment,
                                        ITaskLog taskLog,
                                        CancellationToken cancellationToken)
        {
            if (JiraIntegrationUnavailable(deployment))
            {
                jiraApiDeployment.HandleJiraIntegrationIsUnavailable();
                return;
            }

            var serverUri = serverConfigurationStore.GetServerUri()?.TrimEnd('/');

            if (string.IsNullOrWhiteSpace(serverUri))
            {
                taskLog.Warn("To use Jira integration you must have the Octopus server's external url configured (see the Configuration/Nodes page)");
                return;
            }

            if (string.IsNullOrWhiteSpace(store.GetConnectAppUrl()) || string.IsNullOrWhiteSpace(store.GetConnectAppPassword()?.Value))
            {
                taskLog.Warn("Jira integration is enabled but settings are incomplete, ignoring deployment events");
                return;
            }

            var taskLogBlock = taskLogFactory.CreateBlock(taskLog, $"Sending Jira state update - {eventType}");

            // get token from connect App
            var token = await connectAppClient.GetAuthTokenFromConnectApp(taskLogBlock);

            if (token is null)
            {
                taskLogFactory.Finish(taskLogBlock);
                return;
            }

            var getDeploymentEnvironmentResponse = await mediator.Request(new GetDeploymentEnvironmentRequest(deployment.EnvironmentId), cancellationToken);

            var deploymentEnvironment = getDeploymentEnvironmentResponse.DeploymentEnvironment;
            var environmentSettings   =
                deploymentEnvironmentSettingsProvider
                .GetSettings <DeploymentEnvironmentSettingsMetadataProvider.JiraDeploymentEnvironmentSettings?>(
                    JiraConfigurationStore.SingletonId,
                    deployment.EnvironmentId.Value)
                ?? new DeploymentEnvironmentSettingsMetadataProvider.JiraDeploymentEnvironmentSettings();

            var data = await PrepareOctopusJiraPayload(
                eventType,
                serverUri,
                deployment,
                jiraApiDeployment,
                cancellationToken,
                deploymentEnvironment,
                environmentSettings);

            // Push data to Jira
            await SendToJira(
                token,
                data,
                deployment,
                taskLogBlock,
                deploymentEnvironment,
                environmentSettings);

            taskLogFactory.Finish(taskLogBlock);
        }