在VSTS生成过程中,是否可以将类似于VSTS File Transform的内容应用于Azure函数?
我有一个Azure Function应用程序,每个部署环境(开发,测试,生产)都具有一个功能。这些功能几乎相同,除了需要根据每个特定的部署更新以下值:
这些值的代码概述,请注意“ Dev”前缀:
public static class DevFunction {
[FunctionName("DevFunction")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(...)] HttpRequestMessage request,
[ServiceBus("devQueueName", ...] ICollector<string> outputBus,
TraceWriter log)
{
log.Info("Starting DevFunction");
... // Do work
}
}
我想将这些功能整合为一个功能,并使用类似于VSTS File Transform的功能在给定部署的构建过程中更新上述信息。我目前有三个独立的VS项目,每个项目都有自己的功能,可以部署到每个单独的环境中。这里有更好的选择吗?
答案 0 :(得分:1)
当前,Azure Functions不支持标准的配置/设置转换。但是,有多种变通方法可用于根据部署环境转换功能:
理想情况下,Azure将添加对等效功能的标准web.config的支持。从这个GitHub thread:
[2017年6月19日] ...对于功能而言,今天没有等效的web.config文件。 我们计划解决此问题,这是我们将其移植到.NET Core的一部分。
对于我的情况,使用preprocessor directives最终是最简单的解决方案。每个构建配置都对应一个部署。例如:
#if RELEASE
[FunctionName("ReleaseFunction")]
#elif AZURETEST
[FunctionName("TestFunction")]
#else
[FunctionName("DevFunction")]
#endif
在每个VSTS构建的“构建解决方案”步骤中指定了构建配置。显然,此代码很丑陋,可能难以维护,具体取决于所需的转换次数。
也可以从相同的GitHub thread中,在功能应用程序的根目录中创建自定义设置文件,然后根据需要进行读取:
var settingsPath = Path.Combine(executionContext.FunctionAppDirectory, "settings.json");
dynamic settings = JsonConvert.DeserializeObject(File.ReadAllText(settingsPath));
var myConfigValue = (string)settings.Values.MyConfigValue;
请注意,这不适用于转换FunctionName
,并且可能需要runtime bindings来转换输入/输出绑定(例如原始问题中的ServiceBus绑定)。
编写一个在功能文件上执行原始文本转换的PowerShell脚本。在构建解决方案之前,添加一个运行脚本的VSTS构建步骤。转换所需的任何值都可以在Function App的全局Application Settings中定义。
从GitHub thread开始,也许可以使用ARM模板来完成此操作。
[2017年8月10日]我的CI / CD设置使用ARM模板通过以下功能部署功能应用程序: 适当的应用程序设置。这些ARM模板在源代码控制中 并连接了CD,所以当我需要添加新的应用程序设置时,我只是 将更改提交到ARM模板。
答案 1 :(得分:0)
没有内置任务可以执行此操作,但是有些扩展可以更新JSON文件,例如Replace Tokens,Tokenizer,您也可以对其进行编程(例如PowerShell)