使用 Jenkins 和 Team Services 將應(yīng)用部署到 Linux VM

持續(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歪泳、bowergrunt;它以某些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.jadeh1標(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市闰围,隨后出現(xiàn)的幾起案子赃绊,更是在濱河造成了極大的恐慌,老刑警劉巖羡榴,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碧查,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忠售,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門传惠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稻扬,你說我怎么就攤上這事卦方。” “怎么了泰佳?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵盼砍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我逝她,道長(zhǎng)浇坐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任黔宛,我火速辦了婚禮近刘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臀晃。我一直安慰自己觉渴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布徽惋。 她就那樣靜靜地躺著案淋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寂曹。 梳的紋絲不亂的頭發(fā)上哎迄,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天回右,我揣著相機(jī)與錄音隆圆,去河邊找鬼。 笑死翔烁,一個(gè)胖子當(dāng)著我的面吹牛渺氧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹬屹,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼侣背,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了慨默?” 一聲冷哼從身側(cè)響起贩耐,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厦取,沒想到半個(gè)月后潮太,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年铡买,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了更鲁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奇钞,死狀恐怖澡为,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情景埃,我是刑警寧澤媒至,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站谷徙,受9級(jí)特大地震影響塘慕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒂胞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一图呢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骗随,春花似錦蛤织、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涨椒,卻和暖如春摊鸡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚕冬。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工免猾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人囤热。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓猎提,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親旁蔼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锨苏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容