Azure Web作业运行一次

时间:2016-09-01 05:25:40

标签: entity-framework azure-webjobs continuous-deployment ef-migrations azure-deployment

我想在部署时使用Azure Web作业运行一次(从Github继续部署)。在我的控制台应用程序中,我只需打印一行并退出。我选择连续计划:

namespace MyApp.Deployment
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Performing EF Migrations at " + DateTime.Now.ToLongDateString());
            //run EF migrations here.
            //Can't run migrations in my web service App_Start because web service connects as a limited SQL user.
            Console.WriteLine("Migrations complete");
        }
    }
}

但azure只是在1分钟间隔后继续运行此应用程序。有没有告诉azure不要重启它?

部署后是否有更好的方法立即运行PS1脚本?

3 个答案:

答案 0 :(得分:1)

我能够通过以下方式实现这一目标:

  1. 将控制台应用程序创建为Web作业,并将其设置为使用手动触发器。在我的例子中,控制台应用程序只是创建一个DbMigrator,设置连接字符串(来自环境变量),然后调用Update()。

  2. 使用新的Web作业部署应用程序。登录kudu控制台,确定your_console_app.exe的路径。然后创建一个自定义kudu deploy.cmd,并确保在KuduSync部分之后调用您的Web作业。

  3. 下次部署时,您的控制台应用程序将在构建和部署所有文件后运行,您可以在Kudu或azure门户中查看输出。

  4. 希望这有助于某人。

答案 1 :(得分:0)

部署后似乎无法运行一次webjob。他们最接近的是使用WebJobs REST api在部署期间触发webjob(通过deploy.cmd),但这不起作用,因为网站(包括webjobs)在部署期间关闭。

答案 2 :(得分:0)

  1. 将您的控制台应用部署为具有空时间表的触发式网络作业。

  2. 使用 kudu API 从 CI/CD 管道启动 webjob。使用以下脚本为它使用 PowerShell 任务:

    $kuduApiAuthorisationToken ="Basic {0}" -f 
    [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f 
    $env:Username, $env:Password)))
    
    $kuduApiUrl = 
    "https://$env:WebAppName.scm.azurewebsites.net/api/triggeredwebjobs/DbUp/run"
    
     Invoke-RestMethod -Uri $kuduApiUrl -Headers 
     @{"Authorization"=$kuduApiAuthorisationToken;"If-Match"="*"}  -Method POST 
     -ContentType "application/json"
    

您可以从应用发布配置文件中获取用户名和密码。 -ContentType "application/json 很重要。没有它你会得到误导性的 403 - 应用程序已停止

无论 Web 应用处于停止状态还是正在运行,此解决方案都有效。