持續(xù)集成 (CI) 和持續(xù)部署 (CD) 是一個(gè)管道,可以通過它生成、發(fā)布和部署代碼把跨。 Team Services 針對(duì)到 Azure 的部署提供了一組完整的功能完備的 CI/CD 自動(dòng)化工具场勤。 Jenkins 是一個(gè)流行的基于 CI/CD 服務(wù)器的第三方工具,也提供 CI/CD 自動(dòng)化功能纲堵。 可以組合使用以上兩者來自定義如何提供云應(yīng)用或服務(wù)。
本教程使用 Jenkins 生成一個(gè)Node.js web 應(yīng)用闰渔,并使用 Visual Studio Team Services 將其部署到包含 Linux 虛擬機(jī)的部署組席函。
你將執(zhí)行以下任務(wù):
采用 Jenkins 生成應(yīng)用
為 Team Services 集成配置 Jenkins
為 Azure 虛擬機(jī)創(chuàng)建部署組
創(chuàng)建對(duì) VM 進(jìn)行配置并部署應(yīng)用的發(fā)布定義
開始之前
需要具有對(duì) Jenkins 帳戶的訪問權(quán)限。 如果尚未創(chuàng)建 Jenkins 服務(wù)器冈涧,請(qǐng)參閱Jenkins 文檔茂附。
登錄到 Team Services 帳戶 (https://{youraccount}.visualstudio.com)。 可以獲取免費(fèi) Team Services 帳戶督弓。
Note
有關(guān)詳細(xì)信息营曼,請(qǐng)參閱連接到 Team Services。
在 Team Services 帳戶中創(chuàng)建個(gè)人訪問令牌 (PAT)(如果尚沒有該令牌)愚隧。 Jenkins 需要使用此信息來訪問 Team Services 帳戶蒂阱。 請(qǐng)參閱如何創(chuàng)建用于 Team Services 和 TFS 的個(gè)人訪問令牌來了解如何生成該令牌。
獲取示例應(yīng)用
需要部署 Git 存儲(chǔ)庫(kù)中存儲(chǔ)的一個(gè)應(yīng)用狂塘。 對(duì)于本教程录煤,建議使用GitHub 中提供的此示例應(yīng)用。
創(chuàng)建此應(yīng)用的一個(gè)分支并記下位置 (URL) 以便在本教程的后續(xù)步驟中使用荞胡。
使此分支成為公共的以方便在后面連接到 GitHub妈踊。
Note
有關(guān)詳細(xì)信息,請(qǐng)參閱創(chuàng)建存儲(chǔ)庫(kù)分支和使專用存儲(chǔ)庫(kù)成為公共的泪漂。
Note
此應(yīng)用是使用Yeoman構(gòu)建的廊营;它使用了Express歪泳、bower和grunt;它以某些npm程序包作為依賴項(xiàng)露筒。 示例應(yīng)用包含一組Azure 資源管理器模板呐伞,它們用來為 Azure 上的部署動(dòng)態(tài)創(chuàng)建虛擬機(jī)。Team Services 發(fā)布定義中的任務(wù)會(huì)使用這些模板慎式。 主模板創(chuàng)建一個(gè)網(wǎng)絡(luò)安全組伶氢、一臺(tái)虛擬機(jī)和一個(gè)虛擬網(wǎng)絡(luò)。 它分配一個(gè)公共 IP 地址并打開入站端口 80瞬捕。 它還會(huì)添加一個(gè)標(biāo)記,部署組會(huì)使用該標(biāo)記來選擇要接收部署的計(jì)算機(jī)舵抹。
示例還包含一個(gè)用來設(shè)置 Nginx 并部署應(yīng)用的腳本肪虎。 它在每臺(tái)虛擬機(jī)上執(zhí)行。 具體而言惧蛹,該腳本會(huì)安裝 Node扇救、Nginx 和 PM2,配置 Nginx 和 PM2香嗓,并啟動(dòng) Node 應(yīng)用迅腔。
配置 Jenkins 插件
首先,必須為NodeJS和與 Team Services 的集成配置兩個(gè) Jenkins 插件靠娱。
打開 Jenkins 帳戶并選擇“管理 Jenkins”沧烈。
在“管理 Jenkins”頁(yè)中,選擇“管理插件”像云。
對(duì)列表進(jìn)行篩選以找到“NodeJS”插件锌雀,安裝該插件且不重啟。
對(duì)列表進(jìn)行篩選以找到“Team Foundation Server”插件并安裝它迅诬。 (此插件同時(shí)適用于 Team Services 和 Team Foundation Server腋逆。)不需要重啟 Jenkins。
為 Node.js 配置 Jenkins 生成
在 Jenkins 中侈贷,創(chuàng)建一個(gè)新的生成項(xiàng)目并如下所述對(duì)其進(jìn)行配置:
在“常規(guī)”選項(xiàng)卡中惩歉,為生成項(xiàng)目輸入一個(gè)名稱。
在“源代碼管理”選項(xiàng)卡中俏蛮,選擇“Git”并輸入包含應(yīng)用代碼的存儲(chǔ)庫(kù)和分支的詳細(xì)信息撑蚌。
Note
如果存儲(chǔ)庫(kù)不是公共的,請(qǐng)選擇“添加”并提供用于連接到它的憑據(jù)搏屑。
在“生成觸發(fā)器”選項(xiàng)卡中锨并,選擇“輪詢 SCM”并輸入計(jì)劃H/03 * * * *以便每三分鐘輪詢一次 Git 存儲(chǔ)庫(kù)來查詢更改。
在“生成環(huán)境”選項(xiàng)卡中睬棚,選擇“提供節(jié)點(diǎn)和 npm bin/ 文件路徑”并輸入NodeJS作為 Node JS 安裝值第煮。 將“npmrc 文件”保留設(shè)置為“使用系統(tǒng)默認(rèn)值”解幼。
在“生成”選項(xiàng)卡中,輸入命令npm install以確保更新所有依賴項(xiàng)包警。
為 Team Services 集成配置 Jenkins
在“生成后操作”選項(xiàng)卡中撵摆,對(duì)于“要存檔的文件”,輸入**/*以包括所有文件害晦。
對(duì)于“TFS/Team Services 中的觸發(fā)器發(fā)布”特铝,輸入帳戶的完整 URL(例如https://your-account-name.visualstudio.com)、項(xiàng)目名稱壹瘟、(以后創(chuàng)建的)發(fā)布定義的名稱鲫剿,以及用于連接到帳戶的憑據(jù)。 需要使用之前創(chuàng)建的用戶名和 PAT稻轨。
保存生成項(xiàng)目灵莲。
創(chuàng)建 Jenkins 服務(wù)終結(jié)點(diǎn)
服務(wù)終結(jié)點(diǎn)允許 Team Services 連接到 Jenkins。
在 Team Services 中打開“服務(wù)”頁(yè)面殴俱,打開“新建服務(wù)終結(jié)點(diǎn)”列表政冻,并選擇“Jenkins”。
輸入用來引用此連接的名稱线欲。
輸入 Jenkins 服務(wù)器的 URL明场,并選中“接受不受信任的 SSL 證書”選項(xiàng)。
輸入 Jenkins 帳戶的用戶名和密碼李丰。
選擇“驗(yàn)證連接”來檢查信息是否正確苦锨。
選擇“確定”以創(chuàng)建服務(wù)終結(jié)點(diǎn)。
創(chuàng)建部署組
需要一個(gè)部署組來包含虛擬機(jī)趴泌。
打開“生成和發(fā)布”中心的“發(fā)布”選項(xiàng)卡逆屡,打開“部署組”選項(xiàng)卡并選擇“+ 新建”。
為部署組輸入名稱和可選說明踱讨。 選擇“創(chuàng)建”魏蔗。
Azure 資源組部署任務(wù)會(huì)在它運(yùn)行時(shí)使用 Azure 資源管理器模板創(chuàng)建并注冊(cè) VM。 你不需要自己創(chuàng)建并注冊(cè)虛擬機(jī)痹筛。
創(chuàng)建發(fā)布定義
發(fā)布定義指定 Team Services 在部署應(yīng)用時(shí)執(zhí)行的流程莺治。 若要在 Team Services 中創(chuàng)建發(fā)布定義,請(qǐng)執(zhí)行以下操作:
打開“生成和發(fā)布”中心的“生成”選項(xiàng)卡帚稠,打開發(fā)布定義列表中的+下拉列表谣旁,并選擇“創(chuàng)建發(fā)布定義”。&
選擇“空”模板并選擇“下一步”滋早。
在“項(xiàng)目”部分中榄审,單擊“鏈接一個(gè)項(xiàng)目”并選擇“Jenkins”。 選擇自己的 Jenkins 服務(wù)終結(jié)點(diǎn)連接杆麸。 然后搁进,選擇 Jenkins 源作業(yè)并選擇“創(chuàng)建”浪感。
在新的發(fā)布定義中,選擇“+ 添加任務(wù)”并向默認(rèn)環(huán)境中添加一個(gè)Azure 資源組部署任務(wù)饼问。
選擇“+ 添加任務(wù)”鏈接旁邊的下拉箭頭并向定義中添加一個(gè)部署組階段影兽。
在任務(wù)目錄中,打開“實(shí)用工具”部分并添加“Shell 腳本”任務(wù)的一個(gè)實(shí)例莱革。
Azure 資源組部署任務(wù)中使用的參數(shù)模板設(shè)置用來連接到 VM 的管理員密碼峻堰。 通過變量$(adminpassword)提供此密碼:
打開“變量”選項(xiàng)卡,在“變量”部分中盅视,輸入名稱adminpassword捐名。
輸入管理員密碼。
選擇值文本框旁邊的“掛鎖”圖標(biāo)來保護(hù)密碼闹击。
配置 Azure 資源組部署任務(wù)
Azure 資源組部署任務(wù)用來創(chuàng)建部署組镶蹋。 請(qǐng)如下所述對(duì)其進(jìn)行配置:
Azure 訂閱:從“可用 Azure 服務(wù)連接”下的列表中選擇一個(gè)連接。 如果沒有顯示任何連接拇砰,則依次選擇“管理”梅忌、“新建服務(wù)終結(jié)點(diǎn)”和“Azure 資源管理器”狰腌,并根據(jù)提示進(jìn)行操作除破。 返回到發(fā)布定義,刷新“AzureRM 訂閱”列表并選擇已創(chuàng)建的連接琼腔。
資源組:輸入之前創(chuàng)建的資源組的名稱瑰枫。
位置:為部署選擇區(qū)域。
模板位置:URL of the file
模板鏈接:{your-git-repo}/ARM-Templates/UbuntuWeb1.json
模板參數(shù)鏈接:{your-git-repo}/ARM-Templates/UbuntuWeb1.parameters.json
替代模板參數(shù):替代值的列表丹莲,例如:-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光坝。
對(duì)于 {占位符},請(qǐng)插入自己的具體值甥材。
啟用先決條件:Configure with Deployment Group agent
TFS/VSTS 終結(jié)點(diǎn):選擇“添加”盯另,并在“添加新的 Team Foundation Server/Team Services 連接”對(duì)話框中,選擇“基于令牌的身份驗(yàn)證”洲赵。 輸入連接名稱和團(tuán)隊(duì)項(xiàng)目的 URL鸳惯。 然后,生成并輸入個(gè)人訪問令牌 (PAT)來對(duì)項(xiàng)目團(tuán)隊(duì)的連接進(jìn)行身份驗(yàn)證叠萍。
團(tuán)隊(duì)項(xiàng)目:選擇當(dāng)前的項(xiàng)目芝发。
部署組:輸入用于資源組參數(shù)的同一部署組名稱。
Azure 資源組部署任務(wù)的默認(rèn)設(shè)置是用于創(chuàng)建或更新資源苛谷,并且以增量方式執(zhí)行該操作辅鲸。 該任務(wù)在它首次運(yùn)行時(shí)創(chuàng)建 VM,之后只是對(duì)它們進(jìn)行更新腹殿。
配置 Shell 腳本任務(wù)
Shell 腳本任務(wù)用來為在每臺(tái)服務(wù)器上安裝 Node.js 并啟動(dòng)該應(yīng)用的腳本提供配置独悴。 請(qǐng)如下所述對(duì)其進(jìn)行配置:
腳本路徑:$(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh
指定工作目錄:Checked
工作目錄:$(System.DefaultWorkingDirectory)/Fabrikam-Node
重命名并保存發(fā)布定義
將發(fā)布定義的名稱編輯為在 Jenkins 的生成的“生成后操作”選項(xiàng)卡中指定的名稱例书。 Jenkins 要求此名稱能夠在源項(xiàng)目更新時(shí)觸發(fā)新的發(fā)布。
(可選)通過單擊環(huán)境名稱來更改該名稱绵患。
選擇“保存”蜂莉,并選擇“確定”。
啟動(dòng)手動(dòng)部署
選擇“+ 發(fā)布”并選擇“創(chuàng)建發(fā)布”汤纸。
在突出顯示的下拉列表中選擇已完成的生成治泥,并選擇“創(chuàng)建”。
選擇彈出消息中的發(fā)布鏈接筏勒。 例如:“發(fā)布Release-1已創(chuàng)建移迫。”
打開“日志”選項(xiàng)卡以查看發(fā)布控制臺(tái)輸出管行。
在瀏覽器中厨埋,打開已添加到部署組的服務(wù)器之一的 URL。 例如捐顷,輸入http://{your-server-ip-address}
啟動(dòng) CI/CD 部署
在發(fā)布定義中荡陷,在 Azure 資源組部署任務(wù)的設(shè)置的“控制選項(xiàng)”部分中取消選中“已啟用”復(fù)選框。 對(duì)于到現(xiàn)有部署組的將來部署迅涮,不需要重新執(zhí)行此任務(wù)废赞。
轉(zhuǎn)到源 Git 存儲(chǔ)庫(kù)并修改文件app/views/index.jade中h1標(biāo)題的內(nèi)容。
提交更改叮姑。
幾分鐘后唉地,會(huì)在 Team Services 或 TFS 的“發(fā)布”頁(yè)面中看到新創(chuàng)建的發(fā)布。 打開此發(fā)布可以看到部署正在進(jìn)行传透。 祝賀你耘沼!
后續(xù)步驟
在本教程中,你已使用 Jenkins 生成和用于發(fā)布的 Team Services 實(shí)現(xiàn)了到 Azure 的應(yīng)用部署自動(dòng)化朱盐。 你已了解如何:
采用 Jenkins 生成應(yīng)用
為 Team Services 集成配置 Jenkins
為 Azure 虛擬機(jī)創(chuàng)建部署組
創(chuàng)建對(duì) VM 進(jìn)行配置并部署應(yīng)用的發(fā)布定義
轉(zhuǎn)到下一教程群嗤,詳細(xì)了解如何部署 LAMP(Linux、Apache兵琳、MySQL 和 PHP)堆棧狂秘。
立即訪問http://market.azure.cn