若要將應用程序開發(fā)的生成和測試階段自動化,可以使用持續(xù)集成和部署 (CI/CD) 管道乳规。 本教程介紹如何在 Azure VM 上創(chuàng)建 CI/CD 管道形葬,包括如何:
創(chuàng)建 Jenkins VM
安裝并配置 Jenkins
創(chuàng)建 GitHub 與 Jenkins 之間的 Webhook 集成
通過 GitHub 提交創(chuàng)建并觸發(fā) Jenkins 生成作業(yè)
創(chuàng)建應用的 Docker 映像
驗證 GitHub 提交是否生成新的 Docker 映像并更新正在運行的應用
Note
在 Azure 中國區(qū)使用 Azure CLI 2.0 之前,請先運行az cloud set -n AzureChinaCloud來改變云環(huán)境暮的。如果想切回國際版 Azure笙以,請再次運行az cloud set -n AzureCloud。
如果選擇在本地安裝并使用 CLI冻辩,本教程要求運行 Azure CLI 2.0.4 或更高版本猖腕。 運行az --version即可查找版本拆祈。 如果需要進行安裝或升級,請參閱安裝 Azure CLI 2.0倘感。
創(chuàng)建 Jenkins 實例
在有關如何在首次啟動時自定義 Linux 虛擬機的上一個教程中放坏,你已了解如何使用 cloud-init 自動執(zhí)行 VM 自定義。 本教程使用 cloud-init 文件在 VM 上安裝 Jenkins 和 Docker老玛。
在當前 shell 中淤年,創(chuàng)建名為“cloud-init.txt”的文件并粘貼下面的配置。 請確保已正確復制整個 cloud-init 文件逻炊,尤其是第一行:
yaml復制
#cloud-configpackage_upgrade:truewrite_files:- path:/etc/systemd/system/docker.service.d/docker.confcontent:|
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd- path:/etc/docker/daemon.jsoncontent:|
{
"hosts": ["fd://","tcp://127.0.0.1:2375"]
}runcmd:-wget-q-O-https://jenkins-ci.org/debian/jenkins-ci.org.key| apt-key add -
- sh -c 'echo deb http://pkg.jenkins-ci.org/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
- apt-get update && apt-get install jenkins -y
- curl -sSL https://get.docker.com/ | sh
- usermod -aG docker azureuser
- usermod -aG docker jenkins
- service jenkins restart
Note
在 Azure 中國區(qū)使用 Azure CLI 2.0 之前,請先運行az cloud set -n AzureChinaCloud來改變云環(huán)境犁享。如果想切回國際版 Azure余素,請再次運行az cloud set -n AzureCloud。
使用az group create創(chuàng)建資源組炊昆,然后才能創(chuàng)建 VM桨吊。 以下示例在chinaeast位置創(chuàng)建名為myResourceGroupJenkins的資源組:
Azure CLI復制
azgroupcreate--namemyResourceGroupJenkins--locationchinaeast
現(xiàn)在,請使用az vm create創(chuàng)建 VM凤巨。 使用--custom-data參數(shù)傳入 cloud-init 配置文件视乐。 如果已將cloud-init-jenkins.txt文件保存在現(xiàn)有工作目錄的外部,請?zhí)峁┰撐募耐暾窂健?/p>
Azure CLI復制
azvmcreate--resource-groupmyResourceGroupJenkins \--namemyVM \--imageUbuntuLTS \--admin-usernameazureuser \--generate-ssh-keys\--custom-datacloud-init-jenkins.txt
創(chuàng)建并配置 VM 需要幾分鐘的時間敢茁。
若要允許 Web 流量抵達 VM佑淀,請使用az vm open-port為 Jenkins 流量打開端口8080,并為用于運行示例應用的 Node.js 應用打開端口1337:
Azure CLI復制
azvmopen-port--resource-groupmyResourceGroupJenkins--namemyVM--port8080--priority1001azvmopen-port--resource-groupmyResourceGroupJenkins--namemyVM--port1337--priority1002
配置 Jenkins
若要訪問 Jenkins 實例彰檬,請獲取 VM 的公共 IP 地址:
Azure CLI復制
azvmshow--resource-groupmyResourceGroupJenkins--namemyVM-d--query[publicIps]--otsv
出于安全考慮伸刃,需要輸入 VM 上某個文本文件中存儲的初始管理員密碼來啟動 Jenkins 安裝。 使用上一步驟中獲取的公共 IP 地址通過 SSH 連接到 VM:
bash復制
ssh azureuser@
查看并復制 Jenkins 安裝程序的initialAdminPassword:
bash復制
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
如果文件尚不可用逢倍,請再等待幾分鐘捧颅,以便 cloud-init 完成 Jenkins 和 Docker 安裝。
現(xiàn)在较雕,請打開 Web 瀏覽器并轉到http://:8080碉哑。 按如下所示完成初始 Jenkins 安裝:
輸入在上一步驟從 VM 獲取的initialAdminPassword。
選擇“選擇要安裝的插件”
在頂部文本框中搜索 GitHub亮蒋,選擇“GitHub 插件”扣典,然后選擇“安裝”
若要創(chuàng)建 Jenkins 用戶帳戶,請根據(jù)需要填寫表單慎玖。 從安全角度講激捏,應該創(chuàng)建這第一個 Jenkins 用戶,而不要繼續(xù)使用默認管理員帳戶凄吏。
完成后远舅,選擇“開始使用 Jenkins”
創(chuàng)建 GitHub Webhook
若要配置與 GitHub 的集成闰蛔,請從 Azure 示例存儲庫中打開Node.js Hello World 示例應用。 若要將存儲庫分叉到自己的 GitHub 帳戶图柏,請選擇右上角的“分叉”按鈕序六。
在創(chuàng)建的分叉中創(chuàng)建 Webhook:
選擇“設置”,然后在左側選擇“集成和服務”蚤吹。
選擇“添加服務”例诀,并在篩選框中輸入 Jenkins。
選擇“Jenkins (GitHub 插件)”
對于“Jenkins 掛鉤 URL”裁着,請輸入http://:8080/github-webhook/繁涂。 請確保包含尾部的 /
選擇“添加服務”
創(chuàng)建 Jenkins 作業(yè)
若要讓 Jenkins 對 GitHub 中的事件(例如提交代碼)做出響應,請創(chuàng)建 Jenkins 作業(yè)二驰。
在 Jenkins 網(wǎng)站中的主頁上扔罪,選擇“創(chuàng)建新作業(yè)”:
輸入HelloWorld作為作業(yè)名稱。 選擇“自由風格項目”桶雀,然后選擇“確定”矿酵。
在“常規(guī)”部分下面,選擇“GitHub”項目并輸入分叉的存儲庫的 URL矗积,例如https://github.com/iainfoulds/nodejs-docs-hello-world
在“源代碼管理”部分下面全肮,選擇“Git”并輸入分叉的存儲庫.git的 URL,例如https://github.com/iainfoulds/nodejs-docs-hello-world.git
在“生成觸發(fā)器”部分下面棘捣,選擇“用于 GITscm 輪詢的 GitHub 掛鉤觸發(fā)器”辜腺。
在“生成”部分下面,選擇“添加生成步驟”乍恐。 選擇“執(zhí)行 shell”哪自,然后在命令窗口中輸入echo "Testing"。
選擇作業(yè)窗口底部的“保存”禁熏。
測試 GitHub 集成
若要測試 GitHub 與 Jenkins 的集成壤巷,請?zhí)峤环植嬷械母摹?/p>
返回到 GitHub Web UI,選擇分叉的存儲庫瞧毙,然后選擇“index.js”文件胧华。 選擇鉛筆圖標編輯該文件,使第 6 行的內容如下:
NodeJS復制
response.end("Hello World!");
若要提交更改宙彪,請選擇底部的“提交更改”按鈕矩动。
在 Jenkins 中,作業(yè)頁左下角的“生成歷史記錄”部分下面啟動了一個新的生成释漆。 選擇生成號鏈接悲没,并選擇左側的“控制臺輸出”。 從 GitHub 提取代碼以及生成操作將消息Testing輸出到控制臺時男图,可以查看 Jenkins 執(zhí)行的步驟示姿。 每次在 GitHub 中提交內容時甜橱,Webhook 將以此方式訪問 Jenkins 并觸發(fā)新的生成。
定義 Docker 生成映像
為了查看基于 GitHub 提交內容運行的 Node.js 應用栈戳,讓我們生成一個 Docker 映像用于運行該應用岂傲。 該映像是從定義如何配置運行應用的容器的 Dockerfile 生成的。
通過 SSH 連接到 VM 后子檀,請切換到根據(jù)上一步驟創(chuàng)建的作業(yè)命名的 Jenkins 工作區(qū)目錄镊掖。 在本示例中,該目錄名為HelloWorld褂痰。
bash復制
cd/var/lib/jenkins/workspace/HelloWorld
使用sudo sensible-editor Dockerfile在此工作區(qū)目錄中創(chuàng)建一個文件并粘貼以下內容亩进。 請確保已正確復制整個 Dockerfile,尤其是第一行:
yaml復制
FROMnode:alpineEXPOSE1337WORKDIR/var/wwwCOPYpackage.json/var/www/RUNnpminstallCOPYindex.js/var/www/
此 Dockerfile 使用基本 Node.js 映像(該映像使用 Alpine Linux)缩歪,公開運行 Hello World 應用的端口 1337归薛,然后復制應用文件并初始化應用。
創(chuàng)建 Jenkins 生成規(guī)則
在上一步驟中驶冒,已創(chuàng)建一個可將消息輸出到控制臺的基本 Jenkins 生成規(guī)則苟翻。 讓我們創(chuàng)建生成步驟以使用 Dockerfile 并運行應用韵卤。
返回到 Jenkins 實例骗污,選擇上一步驟創(chuàng)建的作業(yè)。 選擇左側的“配置”沈条,并向下滾動到“生成”部分:
刪除現(xiàn)有的echo "Test"生成步驟需忿。 選擇現(xiàn)有生成步驟框右上角的紅叉。
選擇“添加生成步驟”蜡歹,然后選擇“執(zhí)行 shell”
在“命令”框中輸入以下 Docker 命令屋厘,然后選擇“保存”:
bash復制
docker build --tag helloworld:$BUILD_NUMBER.docker stop helloworld && docker rm helloworlddocker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBERnode /var/www/index.js &
Docker 生成步驟將創(chuàng)建一個映像,并使用 Jenkins 生成編號對其進行標記月而,以便可以維護映像的歷史記錄汗洒。 運行應用的任何現(xiàn)有容器將會停止,隨后被刪除父款。 然后溢谤,將使用該映像啟動新的容器,并基于 GitHub 中的最新提交內容運行 Node.js 應用憨攒。
測試管道
若要查看整個管道的工作狀況世杀,請再次在分叉的 GitHub 存儲庫中編輯 index.js 文件,并選擇“提交更改”肝集。 將會基于 GitHub 的 Webhook 在 Jenkins 中啟動新作業(yè)瞻坝。 創(chuàng)建 Docker 映像并在新容器中啟動應用需要幾秒鐘時間。
如果需要杏瞻,請再次獲取 VM 的公共 IP 地址:
Azure CLI復制
azvmshow--resource-groupmyResourceGroupJenkins--namemyVM-d--query[publicIps]--otsv
打開 Web 瀏覽器并輸入http://:1337所刀。 將顯示你的 Node.js 應用衙荐,其中反映了 GitHub 分叉中的最新提交內容,如下所示:
現(xiàn)在勉痴,請再次在 GitHub 中編輯index.js赫模,然后提交更改。 等待幾秒鐘讓作業(yè)在 Jenkins 中完成蒸矛,然后刷新 Web 瀏覽器查看新容器中運行的應用的更新版本瀑罗,如下所示:
后續(xù)步驟
在本教程中,你已將 GitHub 配置為每次提交代碼后運行 Jenkins 生成作業(yè)雏掠,然后部署了一個 Docker 容器用于測試應用斩祭。 你已了解如何:
創(chuàng)建 Jenkins VM
安裝并配置 Jenkins
創(chuàng)建 GitHub 與 Jenkins 之間的 Webhook 集成
通過 GitHub 提交創(chuàng)建并觸發(fā) Jenkins 生成作業(yè)
創(chuàng)建應用的 Docker 映像
驗證 GitHub 提交是否生成新的 Docker 映像并更新正在運行的應用
轉到下一教程,詳細了解如何將 Jenkins 與 Visual Studio Team Services 集成乡话。
立即訪問http://market.azure.cn