持续集成 (CI) 和持续部署 (CD) 是一个管道,可以通过它生成、发布和部署代码。 Team Services 针对到 Azure 的部署提供了一组完整的功能完备的 CI/CD 自动化工具。 Jenkins 是一个流行的基于 CI/CD 服务器的第三方工具,也提供 CI/CD 自动化功能。 可以组合使用以上两者来自定义如何提供云应用或服务。

本教程使用 Jenkins 生成一个 Node.js web 应用,并使用 Visual Studio Team Services 将其部署到包含 Linux 虚拟机的部署组

你将执行以下任务:

  • 采用 Jenkins 生成应用
  • 为 Team Services 集成配置 Jenkins
  • 为 Azure 虚拟机创建部署组
  • 创建对 VM 进行配置并部署应用的发布定义

开始之前

获取示例应用

需要部署 Git 存储库中存储的一个应用。 对于本教程,建议使用 GitHub 中提供的此示例应用

  1. 创建此应用的一个分支并记下位置 (URL) 以便在本教程的后续步骤中使用。

  2. 使此分支成为公共的以方便在后面连接到 GitHub。

Note

有关详细信息,请参阅创建存储库分支使专用存储库成为公共的

Note

此应用是使用 Yeoman 构建的;它使用了 Express、bower 和 grunt;它以某些 npm 程序包作为依赖项。 示例应用包含一组 Azure 资源管理器模板,它们用来为 Azure 上的部署动态创建虚拟机。 Team Services 发布定义中的任务会使用这些模板。 主模板创建一个网络安全组、一台虚拟机和一个虚拟网络。 它分配一个公共 IP 地址并打开入站端口 80。 它还会添加一个标记,部署组会使用该标记来选择要接收部署的计算机。

示例还包含一个用来设置 Nginx 并部署应用的脚本。 它在每台虚拟机上执行。 具体而言,该脚本会安装 Node、Nginx 和 PM2,配置 Nginx 和 PM2,并启动 Node 应用。

配置 Jenkins 插件

首先,必须为 NodeJS 和与 Team Services 的集成配置两个 Jenkins 插件。

  1. 打开 Jenkins 帐户并选择“管理 Jenkins”。

  2. 在“管理 Jenkins”页中,选择“管理插件”。

  3. 对列表进行筛选以找到“NodeJS”插件,安装该插件且不重启。

  4. 对列表进行筛选以找到“Team Foundation Server”插件并安装它。 (此插件同时适用于 Team Services 和 Team Foundation Server。)不需要重启 Jenkins。

为 Node.js 配置 Jenkins 生成

在 Jenkins 中,创建一个新的生成项目并如下所述对其进行配置:

  1. 在“常规”选项卡中,为生成项目输入一个名称。

  2. 在“源代码管理”选项卡中,选择“Git”并输入包含应用代码的存储库和分支的详细信息。

    Note

    如果存储库不是公共的,请选择“添加”并提供用于连接到它的凭据。

  3. 在“生成触发器”选项卡中,选择“轮询 SCM”并输入计划 H/03 * * * * 以便每三分钟轮询一次 Git 存储库来查询更改。

  4. 在“生成环境”选项卡中,选择“提供节点和 npm bin/ 文件路径”并输入 NodeJS 作为 Node JS 安装值。 将“npmrc 文件”保留设置为“使用系统默认值”。

  5. 在“生成”选项卡中,输入命令 npm install 以确保更新所有依赖项。

为 Team Services 集成配置 Jenkins

  1. 在“生成后操作”选项卡中,对于“要存档的文件”,输入 **/* 以包括所有文件。

  2. 对于“TFS/Team Services 中的触发器发布”,输入帐户的完整 URL(例如 https://your-account-name.visualstudio.com)、项目名称、(以后创建的)发布定义的名称,以及用于连接到帐户的凭据。 需要使用之前创建的用户名和 PAT。

  3. 保存生成项目。

创建 Jenkins 服务终结点

服务终结点允许 Team Services 连接到 Jenkins。

  1. 在 Team Services 中打开“服务”页面,打开“新建服务终结点”列表,并选择“Jenkins”。

  2. 输入用来引用此连接的名称。

  3. 输入 Jenkins 服务器的 URL,并选中“接受不受信任的 SSL 证书”选项。

  4. 输入 Jenkins 帐户的用户名和密码。

  5. 选择“验证连接”来检查信息是否正确。

  6. 选择“确定”以创建服务终结点。

创建部署组

需要一个部署组来包含虚拟机。

  1. 打开“生成和发布”中心的“发布”选项卡,打开“部署组”选项卡并选择“+ 新建”。

  2. 为部署组输入名称和可选说明。 选择“创建”。

Azure 资源组部署任务会在它运行时使用 Azure 资源管理器模板创建并注册 VM。 你不需要自己创建并注册虚拟机。

创建发布定义

发布定义指定 Team Services 在部署应用时执行的流程。 若要在 Team Services 中创建发布定义,请执行以下操作:

  1. 打开“生成和发布”中心的“生成”选项卡,打开发布定义列表中的 + 下拉列表,并选择“创建发布定义”。&

  2. 选择“空”模板并选择“下一步”。

  3. 在“项目”部分中,单击“链接一个项目”并选择“Jenkins”。 选择自己的 Jenkins 服务终结点连接。 然后,选择 Jenkins 源作业并选择“创建”。

  4. 在新的发布定义中,选择“+ 添加任务”并向默认环境中添加一个Azure 资源组部署任务。

  5. 选择“+ 添加任务”链接旁边的下拉箭头并向定义中添加一个部署组阶段。

  6. 在任务目录中,打开“实用工具”部分并添加“Shell 脚本”任务的一个实例。

  7. Azure 资源组部署任务中使用的参数模板设置用来连接到 VM 的管理员密码。 通过变量 $(adminpassword) 提供此密码:

    • 打开“变量”选项卡,在“变量”部分中,输入名称 adminpassword

    • 输入管理员密码。

    • 选择值文本框旁边的“挂锁”图标来保护密码。

配置 Azure 资源组部署任务

Azure 资源组部署任务用来创建部署组。 请如下所述对其进行配置:

  • Azure 订阅:从“可用 Azure 服务连接”下的列表中选择一个连接。 如果没有显示任何连接,则依次选择“管理”、“新建服务终结点”和“Azure 资源管理器”,并根据提示进行操作。 返回到发布定义,刷新“AzureRM 订阅”列表并选择已创建的连接。

  • 资源组:输入之前创建的资源组的名称。

  • 位置:为部署选择区域。

  • 模板位置:URL of the file

  • 模板链接:{your-git-repo}/ARM-Templates/UbuntuWeb1.json

  • 模板参数链接:{your-git-repo}/ARM-Templates/UbuntuWeb1.parameters.json

  • 替代模板参数:替代值的列表,例如:-location {location} -virtualMachineName {machine] -virtualMachineSize Standard_DS1_v2 -adminUsername {username} -virtualNetworkName fabrikam-node-rg-vnet -networkInterfaceName fabrikam-node-websvr1 -networkSecurityGroupName fabrikam-node-websvr1-nsg -adminPassword $(adminpassword) -diagnosticsStorageAccountName fabrikamnodewebsvr1 -diagnosticsStorageAccountId Microsoft.Storage/storageAccounts/fabrikamnodewebsvr1 -diagnosticsStorageAccountType Standard_LRS -addressPrefix 172.16.8.0/24 -subnetName default -subnetPrefix 172.16.8.0/24 -publicIpAddressName fabrikam-node-websvr1-ip -publicIpAddressType Dynamic
    对于 {占位符},请插入自己的具体值。

  • 启用先决条件:Configure with Deployment Group agent

  • TFS/VSTS 终结点:选择“添加”,并在“添加新的 Team Foundation Server/Team Services 连接”对话框中,选择“基于令牌的身份验证”。 输入连接名称和团队项目的 URL。 然后,生成并输入个人访问令牌 (PAT) 来对项目团队的连接进行身份验证。

  • 团队项目:选择当前的项目。

  • 部署组:输入用于资源组参数的同一部署组名称。

Azure 资源组部署任务的默认设置是用于创建或更新资源,并且以增量方式执行该操作。 该任务在它首次运行时创建 VM,之后只是对它们进行更新。

配置 Shell 脚本任务

Shell 脚本任务用来为在每台服务器上安装 Node.js 并启动该应用的脚本提供配置。 请如下所述对其进行配置:

  • 脚本路径:$(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh

  • 指定工作目录:Checked

  • 工作目录:$(System.DefaultWorkingDirectory)/Fabrikam-Node

重命名并保存发布定义

  1. 将发布定义的名称编辑为在 Jenkins 的生成的“生成后操作”选项卡中指定的名称。 Jenkins 要求此名称能够在源项目更新时触发新的发布。

  2. (可选)通过单击环境名称来更改该名称。

  3. 选择“保存”,并选择“确定”。

启动手动部署

  1. 选择“+ 发布”并选择“创建发布”。

  2. 在突出显示的下拉列表中选择已完成的生成,并选择“创建”。

  3. 选择弹出消息中的发布链接。 例如:“发布 Release-1 已创建。”

  4. 打开“日志”选项卡以查看发布控制台输出。

  5. 在浏览器中,打开已添加到部署组的服务器之一的 URL。 例如,输入 http://{your-server-ip-address}

启动 CI/CD 部署

  1. 在发布定义中,在 Azure 资源组部署任务的设置的“控制选项”部分中取消选中“已启用”复选框。 对于到现有部署组的将来部署,不需要重新执行此任务。

  2. 转到源 Git 存储库并修改文件 app/views/index.jade 中 h1 标题的内容。

  3. 提交更改。

  4. 几分钟后,会在 Team Services 或 TFS 的“发布”页面中看到新创建的发布。 打开此发布可以看到部署正在进行。 祝贺你!

后续步骤

在本教程中,你已使用 Jenkins 生成和用于发布的 Team Services 实现了到 Azure 的应用部署自动化。 你已了解如何:

  • 采用 Jenkins 生成应用
  • 为 Team Services 集成配置 Jenkins
  • 为 Azure 虚拟机创建部署组
  • 创建对 VM 进行配置并部署应用的发布定义

转到下一教程,详细了解如何部署 LAMP(Linux、Apache、MySQL 和 PHP)堆栈。

立即访问http://market.azure.cn

使用 Jenkins 和 Team Services 将应用部署到 Linux VM的更多相关文章

  1. 使用 Visual Studio Team Services 和 IIS 创建持续集成管道

    若要将应用程序开发的生成.测试和部署阶段自动化,可以使用持续集成和部署 (CI/CD) 管道. 本教程介绍如何在 Azure 中使用 Visual Studio Team Services 和 Win ...

  2. Team Services 自动化部署项目

    一.创建Team Services账号 直接使用vs的账号即可,TS上集成了Git.把项目导入到Git中. 使用前提:有自己的服务器,把项目自动化部署到服务器上. 二.创建一个新的定义 三.选择种类( ...

  3. 使用Visual Studio Team Services持续集成(三)——使用工件

    使用Visual Studio Team Services持续集成(三)--使用工件 工件是应用程序的可部署组件.Visual Studio Team Services有能力在构建过程中显式地管理工件 ...

  4. 使用Visual Studio Team Services持续集成(二)——为构建定义属性

    使用Visual Studio Team Services持续集成(二)--为构建定义属性 1.从VSTS帐户进入到Build 2.编辑构建定义并单击Options Description:如果这里明 ...

  5. 使用Visual Studio Team Services持续集成(一)——构建ASP.NET Core

    使用Visual Studio Team Services持续集成(一)--构建ASP.NET Core 概述 持续集成(CI)是将代码尽可能频繁地集成到共享仓库中的过程.在代码集成期间,构建中断或测 ...

  6. Continuous Integration for iOS Apps with Visual Studio Team Services

    原文引用自:https://blog.xamarin.com/continuous-integration-for-ios-apps-with-visual-studio-team-services/ ...

  7. Visual Studio Team Services持续集成到Github仓库

    Devops如何用VSTS持续集成到Github仓库!   工欲善其事,必先利其器.在开始正式的教程之前我们先来聊聊准备工作. 管理工具会VSTS. 代码管理会用GITHUB. 服务器会用Azure. ...

  8. Team Services and Team Foundation Server官方资料入口

    Team Foundation Server msdn 中文文档入口 Team Services or Team Foundation Server www.visualstudio.com 英文文档 ...

  9. Visual Studio Team Services 帐户管理操作

    Visual Studio Team Services 网址: https://www.visualstudio.com/ 1.登陆 2.登陆后新建账户 3.删除团队项目 (1)点击自己的Visual ...

随机推荐

  1. Android4.0 Launcher 源码分析3——WorkSpace结构(滑动)

    3.WorkSpace结构(滑动) 桌面的左右滑动功能主要是在PagedView类中实现的,而WorkSpace是PagedView类的子类,所以会继承PagedView中的方法.当我们的手指点击Wo ...

  2. JavacProcessingEnvironment类解读

    JavacProcessingEnvironment类的继承体系如下: 其中含有很多内部类,最重要的是迭代注解处理器相关的类,如下:

  3. saltstack快速入门

    SALTSTACK是什么? Salt是一种和以往不同的基础设施管理方法,它是建立在大规模系统高速通讯能力可以大幅提升的想法上.这种方法使得Salt成为一个强大的能够解决基础设施中许多特定问题的多任务系 ...

  4. mysql RC下不存在则插入

    mysql版本:5.7 目的:在RC下,name列上仅有key索引,并发插入name时不出现重复数据 RC不加gap lock,并且复合select语句是不加锁的快照读,导致两个事务同时进行都可插入, ...

  5. Nodejs学习笔记(十三)—PM2

    简介 PM2 pm2是一个内置负载均衡的node.js应用进程管理器(也支持Windows),其它的类似功能也有不少,但是感觉pm2功能更强,更值的推荐 GitHub地址:https://github ...

  6. [笔记] Fiddler 抓包工具的使用

    目录 Filler 的特点 Fidder工具的下载安装 Fidder 证书安装 Fiddler工作原理 Fidder 常见的命令和按钮 Fiddler 各种疑难杂症 Fillder 的特点 Fidde ...

  7. oracle 一对多数据分页查询筛选

    今天项目测试运行的时候,遇到了一个奇怪的问题,这个问题说起来按sql语法的话是没有错误的 但是呢按照我们的业务来做区分就有些逻辑上的错误了, 下面请听我慢慢道来,在数据库中有两个数据, 先来看下第一次 ...

  8. python实现float/double的0x转化

    1. 问题引出 最近遇到了一个小问题,即: 读取文本文件的内容,然后将文件中出现的数字(包括double, int, float等)转化为16进制0x存储 原本以为非常简单的内容,然后就着手去写了py ...

  9. win10 uwp 让焦点在点击在页面空白处时回到textbox中

    在网上 有一个大神问我这样的问题:在做UWP的项目,怎么能让焦点在点击在页面空白处时回到textbox中? 虽然我的小伙伴认为他这是一个 xy 问题,但是我还是回答他这个问题. 首先需要知道什么是空白 ...

  10. IList,ICollection,IEnumerable,IEnumerator,IQueryable

    http://www.cnblogs.com/edison1105/archive/2012/07/30/2616082.html 1.首先看一个简单的例子 int[] myArray = { 1, ...