Azure网站的自定义部署

时间:2015-02-06 13:09:31

标签: python azure deployment automation gulp

我最近开始使用Gulp.js将我的所有CSS和JavaScript打包成单个文件,然后将其包含在我的网络应用中。我的网络应用程序是用Python编写的(使用 Flask )。

我显然不想使用git跟踪Gulp输出CSS和JS文件(因为他们正在构建输出文件)。

我使用push to deploy将我的网站部署到Azure网站。也就是说,我只是运行git push azure master,Azure自动确定我使用Python,设置virtualenv,安装pip依赖项等等。 This article describes how to set this up

这个过程很有效,但是现在我已经开始使用Gulp了,我想确保每当我部署网站时,也会在服务器端生成连接的JavaScript和CSS文件。

此外,在将来,我希望Azure在部署时运行所有测试,并且只有在它们全部通过时才能成功部署。

可悲的是,我还没有找到满意的解决方案,因为我无法在Azure的自动部署过程中添加自定义步骤。

我尝试使用Kudu编写自定义部署脚本(由this blog post建议),但这样做会禁用Azure通常执行的所有自动步骤;运行azure site deploymentscript --python只会生成一个非常基本的Kudu部署文件,该文件不会处理web.config文件中的读取,设置virtualenv或安装依赖项。我自己没有找到关于如何做到这一点的文件;我使用了默认的自动Azure部署脚本(当我推送代码时会生成服务器端,所以我自己无法访问它),因为其他类似virtualenv和pip依赖的东西都没有被处理。

是否有可用的解决方法,以便我可以在正确部署Flask的同时自定义我的部署脚本(例如运行Gulp)?

1 个答案:

答案 0 :(得分:7)

由于Kudu是开源的并且可以在GitHub上使用,因此我在其问题跟踪器(link, for anyone interested)中提出了这个问题。代码所有者非常有帮助,并指出了我的解决方案。

  1. 访问网站的Kudu服务:yourwebsite.scm.azurewebsites.net
  2. 点击工具>下载部署脚本并获取为您的代码生成的部署脚本Azure(这不仅限于Flask应用程序)。
  3. (可选)脚本是Windows批处理脚本。我把它移植到Bash,因为我对它更熟悉,Azure网站也支持它。
  4. 根据自己的喜好添加自定义内容:使用Gulp / Grunt构建内容,运行测试并使部署失败(退出非零错误代码),如果有任何失败等等。您还应该记住首先检查Gulp / Grunt之类的内容是否正确使用npm和相应的package.json文件安装。
    • 请注意,在KuduSync有机会从存储库中复制新文件之前,您应该只将部署标记为失败,否则它们最终会在您的Web根文件夹中结束,即使例如你的测试失败了。
  5. 这是我的代码处理Gulp.js的片段,供所有感兴趣的人使用。查看azure site deploymentscript --node生成的脚本,了解如何选择正确的Node和npm版本的示例:

    selectNodeVersion
    echo "Invoking \"$NPM_CMD install\"..."
    eval $NPM_CMD install
    exitWithMessageOnError "Could not run 'npm install'.  Do you have the necessary privileges?"
    echo "Finished npm install."
    
    # The path doesn't seem to get set OK.  Use this hack to run gulp.
    GULP="node_modules/gulp/bin/gulp.js"
    
    echo "Running gulp..."
    "$GULP" production
    exitWithMessageOnError "Could not run 'gulp'.  Did 'npm install' run OK?"
    echo "Finished gulp."
    

    不要忘记实际添加一个包含所有必需的Gulp依赖项的package.json文件到您的项目中。 Azure提供Node.js(和npm)但不提供Gulp.js.希望这有帮助!

    P.S。:请注意,整个过程有点过时,完全正确的方法是使用持续集成代理。