Сценарий сборки 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__11.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__91.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, добавьте эти пакеты в качестве зависимостей (так же, как это делает оригинальный плагин).