コード例 #1
0
        public async Task AutoDeployAsync([NotNull] IReadOnlyCollection <PackageVersion> packageIdentifiers)
        {
            if (packageIdentifiers == null)
            {
                throw new ArgumentNullException(nameof(packageIdentifiers));
            }

            _logger.Information("Received hook for packages {Packages}", string.Join(", ", packageIdentifiers.Select(p => p.ToString())));

            IReadOnlyCollection <DeploymentTarget> deploymentTargets =
                (await _targetSource.GetDeploymentTargetsAsync(CancellationToken.None))
                .SafeToReadOnlyCollection();

            DeploymentTarget[] withAutoDeploy = deploymentTargets.Where(t => t.AutoDeployEnabled).ToArray();

            if (!withAutoDeploy.Any())
            {
                _logger.Information("No target has auto deploy enabled");
            }
            else
            {
                foreach (DeploymentTarget deploymentTarget in withAutoDeploy)
                {
                    foreach (PackageVersion packageIdentifier in packageIdentifiers)
                    {
                        if (deploymentTarget.PackageId.Equals(
                                packageIdentifier.PackageId,
                                StringComparison.OrdinalIgnoreCase))
                        {
                            bool allowDeployment =
                                !packageIdentifier.Version.IsPrerelease || deploymentTarget.AllowPreRelease;

                            if (allowDeployment)
                            {
                                AppVersion metadata = await _monitoringService.GetAppMetadataAsync(
                                    deploymentTarget,
                                    CancellationToken.None);

                                if (metadata.SemanticVersion != null)
                                {
                                    if (packageIdentifier.Version > metadata.SemanticVersion)
                                    {
                                        _logger.Information("Auto deploying package {PackageIdentifier} to target {Name} from web hook", packageIdentifier, deploymentTarget.Name);

                                        DeploymentTaskResult result =
                                            await
                                            _deploymentService.ExecuteDeploymentAsync(
                                                new DeploymentTask(
                                                    $"{packageIdentifier.PackageId}, {packageIdentifier.Version.ToNormalizedString()}",
                                                    deploymentTarget.Id, Guid.NewGuid()
                                                    ),
                                                _logger,
                                                CancellationToken.None);

                                        _logger.Information("Deployed package {PackageIdentifier} to target {Name} from web hook with result {Result}", packageIdentifier, deploymentTarget.Name, result);
                                    }
                                    else
                                    {
                                        _logger.Information("Auto deployment skipped for {PackageIdentifier} since deployed version is higher {V}", packageIdentifier, metadata.SemanticVersion.ToNormalizedString());
                                    }
                                }
                                else
                                {
                                    _logger.Information("Auto deployment skipped for {PackageIdentifier} since the target version could not be determined", packageIdentifier);
                                }
                            }
                            else
                            {
                                _logger.Information("Auto deployment skipped for {PackageIdentifier} since the target does not allow pre-release", packageIdentifier);
                            }
                        }
                        else
                        {
                            _logger.Information("No package id matched {PackageIdentifier} for target {Name}", packageIdentifier, deploymentTarget.Name);
                        }
                    }
                }
            }
        }