使用VSTS将Angular2应用程序从GitHub部署到Azure的WebApp

目标

以下是创建前端应用程序的Angular2,将源代码保存在GitHub上,并解释一系列操作步骤以利用Azure的PaaS服务App Service来托管应用程序。

以下是使用的服务。

    • GitHub/git

 

    • Angular2

 

    • NPM

 

    • Azure App Service

 

    Visual Studio Team Services (VSTS) – 別名Visual Studio Online

准备Angular2应用程序的源代码。

在GitHub上创建一个分支。

在这个阶段,我们将创建一个存储Angular 2应用程序源代码的仓库和分支。但是,如果已经存在一个仓库和分支,您也可以使用现有的,那么您可以跳过这一步。

我使用了一个名为demo的现有Git仓库。我在其中创建了一个名为angular2-demo的新分支。虽然分支名称可以是master,但为了避免混淆,我决定将其命名为angular2-demo。

在本地的demo仓库中移动到以下命令后,执行。

切换到并创建名为angular2-demo的新分支

在本地的demo存储库中创建了一个新的angular2-demo分支。
接下来,我们将创建一个angular的HelloWorld应用程序。

使用 Angular CLI 制作一个简单的 HelloWorld 应用程序。

假设Angular CLI已经安装好了,我们继续进行下去。

首先要创建一个应用程序。使用以下命令生成应用程序。

ng new helloworld –使用内联样式 –使用内联模板 –跳过测试

上述命令中的 “–inline-style –inline-template –skiptest” 是选项,用于阻止组件的样式和HTML模板分别生成。只用 “ng new helloworld” 也可以,但为了尽可能明了,我们决定限制生成的文件数量。

以下是命令执行的结果。

image.png

现在,Angular应用的准备工作已经完成。接下来,将HelloWorld应用程序的源代码暂时保存在GitHub仓库中。

暂时将其推送至GitHub仓库。

在这个阶段,先将文件添加到Git仓库并进行提交,然后再进行推送(关于git add和git commit命令的详细说明请省略)。
由于angular2-demo分支仅存在于本地,所以下面的推送命令将在GitHub仓库中创建angular2-demo分支,并上传上一步创建的HelloWorld应用程序的源代码。

推送代码到远程仓库的angular2-demo分支,并设置为上游分支。

现在已经完成了源代码的基础。从这里开始,我们将逐步进行一些变更。

将web.config添加到项目中

在Azure的Web App中,必须添加一个特定于.NET的配置文件,称为web.config。请参考下方的屏幕截图,将web.config文件添加到HelloWorld应用程序中。

image.png

这里是web.config的内容。

<configuration>
    <system.webServer>
        <rewrite>
        <rules>
            <rule name="redirect all requests" stopProcessing="true">
                <match url="^(.*)$" ignoreCase="false" />
                <conditions logicalGrouping="MatchAll">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
                </conditions>
                <action type="Rewrite" url="index.html" appendQueryString="true" />
            </rule>
        </rules>
    </rewrite>
    </system.webServer>
</configuration>

此web.config文件已配置为将所有针对Azure Web App的HTTP请求重定向到index.html文件。该index.html文件是Angular应用的主体。

接下来,需要进行设置以确保在构建时正确地复制此web.config文件。

修改angular-cli.json文件,以便复制web.config文件。

angular-cli.json是指定使用Angular CLI(ng命令)时的各种设置的文件。
通过在此添加web.config作为静态资源,可以将其配置为构建时的分发的一部分。

请根据下方的屏幕截图进行更改。

image.png

现在,构建后,web.config文件将被复制到应用程序的根文件夹中。

然后,我们将添加一个新的生产环境构建脚本(命令)。

将用于生产环境的构建脚本添加到package.json中。

这一步骤并非必需,完全可以使用已定义的名为build的脚本,没有任何问题。然而,为了在稍后设置VSTS构建定义时更加清晰明了,我们将另外设置一个新的命令,与已经设置的命令不同。

根据以下屏幕截图为参考,我们将添加一个名为build-prod的新的npm命令脚本。

image.png

我們通過添加-prod選項來生成用於生產環境的代碼。

接下来,执行新增的build-prodscript并确认生成的代码。

在本地执行生产环境的构建脚本,以确认输出。

请按照上述步骤手动执行预先设定的`build-prod`命令。

运行“npm run build-prod”的构建命令。

image.png

在上面的屏幕截图中,可以看到一个名为dist的文件夹已被创建。这是存储生产环境文件的文件夹。请记住,在后续配置VSTS的构建定义时,这将再次提到,请牢记。

接下来,暂时将正式环境放一边,先确认本地开发环境。

在本地开发和运行HelloWorld应用程序。

使用Angular CLI创建Angular应用程序的开发非常简单。只需执行以下命令即可。

npm 启动

image.png

使用Angular CLI进行构建后,将输出保存在内存中,并运行轻量级的Web服务器来托管HelloWorld应用程序。Angular CLI的命令`ng serve`执行这个一系列的操作,对应于`start`脚本(请在`package.json`中搜索`”start”`)。

当在浏览器中请求localhost:4200时,将加载HelloWorld应用程序的页面。

image.png

那么,我们来仿照开发循环,加入一些简单的更改来看看。

image.png

由于ng serve的作用,它可以自动检测到文件的更改并自动进行构建。

image.png

可以确认变更已经生效。

这样,Angular2的HelloWorld应用程序就完成了。我将更改推送到GitHub仓库。

推送 Git

接下来,我们将创建一个用于托管HelloWorld应用的Azure App Service。

准备Angular2应用程序的主机

创建Azure App Service

可以重新利用现有的Azure App Service,因此此步骤是可选的。我使用个人Hotmail地址创建了一个免费的Azure订阅,创建了一个名为tw-angular01的App Service。

暂不详述此任务的详细信息。下方的截图是在本文中使用的App Service。关于App Service Plan,由于Angular应用是静态应用程序,所以免费版(与其他用户共享的较弱虚拟机)已足够。

image.png

现在可以准备好作为部署目标的Azure App Service。

接下来,我们将进入一系列关于设置Visual Studio Team Services(VSTS)构建定义的工作。首先,我们要开始设置VSTS与GitHub的协作。

准备用于托管部署Angular2应用的构建定义。

设置 Service Endpoint 以连接 GitHub 的 VSTS。

在这一系列步骤中有两个前提条件。

    1. 我已经拥有VSTS(以前被称为Visual Studio Online)的账户。

 

    我已经在VSTS内创建了想要使用的项目。

VSTS以前又称为Visual Studio Online。如果您还没有账户,可以使用Microsoft帐户(例如:hotmail、outlook.com)等邮箱地址来新建一个账户。
关于项目,可以是现有的项目,也可以是默认提供的项目,但我创建了一个名为samples的项目。

VSTS的网址:https://www.visualstudio.com/vso/

一旦准备好VSTS项目后,按照以下截图的参考,我们将进入GitHub服务连接的新建界面。

image.png

请在新的服务终端点下拉菜单中选择GitHub。

image.png

如果这样做,就会显示下面这样的对话框。

image.png

按下「授权」按钮,根据指示在单一登录中授予权限。
连接名称可以任意,但我选择了“githubyoshiwatanabe”,因为我将在以后再次使用它,所以选择了一个易于理解的名称。

使用这个创建了VSTS和GitHub之间协作所需的服务连接(服务端点)。

然后创建VSTS的构建定义。

创建新的VSTS构建定义

我不会详细介绍如何创建VSTS的新建构建定义。当您选择顶部的Build & Release菜单时,您会知道如何操作。我给它起了一个名字叫samples-angular-cli-CI。

因为我们将在下面详细解释,所以现在即使是空的状态也可以添加到构建定义中的步骤中。

只要在构建定义列表中显示与下面的屏幕截图类似的状态,就表示已完成。

image.png

接下来,您需要根据下面的屏幕截图,按照顺序设置一个包含三个构建步骤的构建定义。

image.png

首先,在构建定义中指定从哪里下载源代码。

构建定义中的”Get Source”步骤使用GitHub。

在这里,我们将使用先前设置的VSTS和GitHub进行协作的服务连接。

在选择源代码时,您可以选择GitHub,并指定存储库和分支。这里指定了一个名为angular2-demo的分支,但您也可以选择其他分支,如master等(当然,前提是在该分支上有angular2应用程序)。

image.png

下面是从相关的GitHub仓库和分支的角度来看的。为了以防万一,我会先确认一下内容。

image.png

从这里开始,我们将逐步设置三个构建步骤。首先是下载npm包的步骤。

设置第一个npm安装步骤

参考以下屏幕截图,设置执行npm install命令的步骤。需要注意的是,在Working folder with package.json(包含package.json的工作文件夹)字段中指定正确的路径。

image.png

接下来,我们将添加构建HelloWorld的步骤。

设置第二个npm自定义步骤

Angular应用可以通过执行npm的脚本来构建。通过选择自定义命令,可以执行任意的脚本。在这里,我们通过运行之前配置的build-prod脚本来生成生产环境的输出。

image.png

以下是package.json中的build-prod脚本,确保它等同于Angular CLI命令ng build -prod。

image.png

这样就设置了一个操作步骤,即从GitHub下载源代码,然后安装npm包,最后构建HelloWorld应用程序。

最后只需将构建好的HelloWorld应用部署到Azure的App Service上。

最后一步是设置将应用部署到Azure App Service。

选择正确的Azure订阅并指定所需的应用服务。在“Package or Folder”字段中,特别注意指定helloworld/dist文件夹。确保该文件夹包含名为“dist”的子文件夹。此文件夹会在执行ng build时自动生成。如果在本地执行ng serve,则不会生成此文件夹(而是将构建文件保存在内存中)。

image.png

这样就完成了构建定义的创建。接下来只需要将构建定义排入队列,让构建代理执行即可。

将构建定义排入队列中

在建筑定义界面上选择队列按钮。

image.png

选择托管主机作为代理。同时,指定之前用过的angular2-demo分支作为配置。

image.png

以下是屏幕截图,显示了建筑物已经排队等待的状态。

image.png

以下是建筑成功的样子。

image.png

由于已成功完成最后一步(部署到Azure Web App),因此在这个阶段,HelloWorld应用应该已经被部署到Azure Web App,并且可以显示出来。

展示Azure Web Service的URL

如果你想要展示HelloWorld应用,你可以从Azure App Service的页面上获取URL。如果你不知道URL是什么,可以按照以下步骤进行操作。

image.png

在浏览器中加载URL页面。

image.png

顺利显示了。通过GitHub仓库进行构建和部署成功了。

尽管这样设置已经完成,但如果在GitHub分支上进行更改(通过推送或拉取请求),让我们自动进行构建→部署的持续集成设置吧。

将连续集成选项设为开启。

回到构建定义,从触发器设置中将连续集成启用。

image.png

在HelloWorld应用程序的源代码中,我稍作更改。以下是在页面消息中添加了”with CI”这个字符串。

image.png

最后,在Git中,执行add、commit和push操作。

image.png

查看构建定义的这个阶段,可以自动确认有新的构建已经排队等候。

image.png

我会等待编译完成后的合适时间重新加载页面。

image.png

可以看到已经反映了推送的内容。通过这个机制,我们将HelloWorld应用程序的更改自动化为仅针对GitHub分支的更改。

实际页面:http://tw-angular01.azurewebsites.net/

总结

尽管有点长,但是您可以使用Azure来托管Angular2的前端应用程序,就像这样。可能还有其他更简单的方法,但是如果您进行了设置,包括持续集成,那么部署过程将完全自动化,因此我认为这是值得设置的。

bannerAds