代码之家  ›  专栏  ›  技术社区  ›  sheamus

Azure Web作业运行一次

  •  3
  • sheamus  · 技术社区  · 8 年前

    我想在部署时使用Azure Web Job运行一次(从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 回复  |  直到 8 年前
        1
  •  1
  •   sheamus    8 年前

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

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

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

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

    希望这对某人有所帮助。

        2
  •  0
  •   sheamus    8 年前

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

        3
  •  0
  •   BorisDotNet    3 年前
    1. 将控制台应用程序部署为带有空计划的触发式Web作业。

    2. 使用kudu API从CI/CD管道启动Web作业。将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-app已经停止

    无论web应用程序是否停止或正在运行,此解决方案都有效。