Сценарий сборки Cake, вызывающий AWS.ElasticBeanstalk DescribeEnvironments(), выбрасывающий MissingMethodException

Это очень конкретная ошибка, я провел последние несколько дней, расследуя ее, но зашел в тупик.

Задача в моем скрипте сборки тортов - проверить, готова ли среда эластичных бобов. Мы использовали это дополнение ( https://github.com/mathieukempe/Cake.AWS.ElasticBeanstalk). Я разветвил репозиторий, чтобы добавить реализацию DescribeEnvironments(). Код надстройки работает, если я запускаю его непосредственно в консольном приложении. Однако, когда я запускаю его из скрипта сборки торта, он выдает System.MissingMethodException: Method not found: 'System.String Amazon.Runtime.Internal.Util.StringUtils.FromDateTimeToISO8601(System.DateTime)' и, к сожалению, я думаю, что я единственный человек в Интернете, имеющий эту проблему.

Ниже приведена задача, выполняемая моим скриптом для торта:

Task("CheckEBEnvironment")
.Does((context) => {
    var settings = CreateElasticBeanstalkSettings();
    if (context.ApplicationVersionReady(settings, ebApplication, ebEnvironment, ebVersion)) {
        Information("Environment ready.");
        isReady = true;
    } else {
        Information("Environment not ready...");
    } 
});

и ниже код дополнения:

[CakeAliasCategory("AWS")]
[CakeNamespaceImport("Amazon")]
[CakeNamespaceImport("Amazon.ElasticBeanstalk")]
public static class ElasticBeanstalkAliases
{
    private static IElasticBeanstalkManager CreateManager(this ICakeContext context)
    {
        return new ElasticBeanstalkManager(context.Environment, context.Log);
    }

    // ...

    [CakeMethodAlias]
    [CakeAliasCategory("ElasticBeanstalk")]
    public static bool ApplicationVersionReady(this ICakeContext context, ElasticBeanstalkSettings settings, string applicationName, string environmentName, string versionLabel)
    {
        var manager = context.CreateManager();
        return manager.ApplicationVersionReady(settings, applicationName, environmentName, versionLabel);
    }
}

Вот реализация:

public class ElasticBeanstalkManager : IElasticBeanstalkManager
{
    private readonly ICakeEnvironment _Environment;
    private readonly ICakeLog _Log;

    /// <summary>
    /// If the manager should output progrtess events to the cake log
    /// </summary>
    public bool LogProgress { get; set; }

    public ElasticBeanstalkManager(ICakeEnvironment environment, ICakeLog log)
    {
        if (environment == null)
        {
            throw new ArgumentNullException("environment");
        }
        if (log == null)
        {
            throw new ArgumentNullException("log");
        }

        _Environment = environment;
        _Log = log;

        this.LogProgress = true;
    }

    //Request
    private AmazonElasticBeanstalkClient GetClient(ElasticBeanstalkSettings settings)
    {
        if (settings == null)
        {
            throw new ArgumentNullException("settings");
        }

        if (settings.Region == null)
        {
            throw new ArgumentNullException("settings.Region");
        }

        if (settings.Credentials == null)
        {
            if (String.IsNullOrEmpty(settings.AccessKey))
            {
                throw new ArgumentNullException("settings.AccessKey");
            }
            if (String.IsNullOrEmpty(settings.SecretKey))
            {
                throw new ArgumentNullException("settings.SecretKey");
            }

            return new AmazonElasticBeanstalkClient(settings.AccessKey, settings.SecretKey, settings.Region);
        }
        else
        {
            return new AmazonElasticBeanstalkClient(settings.Credentials, settings.Region);
        }
    }

    public bool ApplicationVersionReady(ElasticBeanstalkSettings settings, string applicationName, string environmentName, string versionLabel)
    {
        if (string.IsNullOrEmpty(applicationName))
        {
            throw new ArgumentNullException(nameof(applicationName));
        }

        if (string.IsNullOrEmpty(environmentName))
        {
            throw new ArgumentNullException(nameof(environmentName));
        }

        if (string.IsNullOrEmpty(versionLabel))
        {
            throw new ArgumentNullException(nameof(versionLabel));
        }

        var client = GetClient(settings);
        var status = client.DescribeEnvironmentsAsync(new DescribeEnvironmentsRequest
        {
            ApplicationName = applicationName,
            EnvironmentNames = new List<string>(new[] {environmentName}),
            VersionLabel = versionLabel,
            IncludeDeleted = false,
        }).Result.Environments[0].Status.Value;

        return status == "Ready";
    }
}

Вот полное сообщение об исключении:

System.AggregateException: произошла одна или несколько ошибок. ---> System.MissingMethodException: метод не найден: 'System.String Amazon.Runtime.Internal.Util.StringUtils.FromDateTimeToISO8601(System.DateTime)'. в Amazon.ElasticBeanstalk.Model.Internal. Amazon.Runtime.Internal.CallbackHandler.d__9 1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Amazon.Runtime.Internal.ErrorCallbackHandler.<InvokeAsync>d__5 1.MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в Amazon.Runtime.Internal.MetricsHandler.d__1 1.MoveNext() --- End of inner exception stack trace --- at System.Threading.Tasks.Task 1.GetResultCore (Boolean waitCompletionNotification) в Cake.AWS.ElasticBeanstalk.ElasticBeanstalkManager.ApplicationVersionReady(ElasticBeanstalkSettings, String applicationName, String environmentName, String versionLabel) <контекстная точка> <исключение_0> (вкл. 0)> в конце 0 0) System.MissingMethodException: метод не найден: 'System.String Amazon.Runtime.Internal.Util.StringUtils.FromDateTimeToISO8601(System.DateTime)'. в Amazon.ElasticBeanstalk.Model.Internal. Amazon.Runtime.Internal.CallbackHandler.d__9 1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Amazon.Runtime.Internal.ErrorCallbackHandler.<InvokeAsync>d__5 1.MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в Amazon.Runtime.Internal.MetricsHandler.d__1`1.MoveNext() <---

Я предполагаю, что контекст торта где-то устанавливает дату по запросу, который находится в формате, который Amazon не может обработать. Если у кого-то есть какие-либо идеи или они сталкиваются с подобной проблемой, я был бы очень благодарен.

2 ответа

Решение

Я разобрался в проблеме. Я использовал два дополнения, во-первых, Cake.AWS.S3 второй Cake.AWS.ElasticBeanstalk и так как плагин S3 был определен первым, когда торт должен был ссылаться на AWSSDK.Core.dll, он будет использовать.dll, предоставленный плагином S3, который оказался более старой версией, чем ожидал плагин ElasticBeanstalk, в результате чего он вызывает метод, который не существует

Если я просто определю Cake.AWS.ElasticBeanstalk Аддин сначала это работает. Я могу отправить запрос на обновление для обновления S3 дополнения AWSSDK.Core.dll

Я предполагаю, что вам не хватает некоторых зависимостей.

Как говорится в ошибке, метод Amazon.Runtime.Internal.Util.StringUtils.FromDateTimeToISO8601(System.DateTime) не может быть найден. Если посмотреть на упомянутое вами дополнение Cake, на nuget.org видно, что оно имеет некоторые зависимости от AWSSDK.Core а также AWSSDK.ElasticBeanstalk пакеты. И на первом проекте github вы можете видеть, что именно здесь реализован метод.

Поэтому я предполагаю, что вы не указываете эти зависимости при сборке вашего разветвленного надстройки, и поэтому возникает ошибка. Если вы создаете пакет nuget, добавьте эти пакеты в качестве зависимостей (так же, как это делает оригинальный плагин).

Другие вопросы по тегам