如何使用 Jenkins、GitHub 和 Docker 在 Azure 中的 Linux VM 上创建开发基础结构
若要將應(yīng)用程序開(kāi)發(fā)的生成和測(cè)試階段自動(dòng)化,可以使用持續(xù)集成和部署 (CI/CD) 管道。 本教程介紹如何在 Azure VM 上創(chuàng)建 CI/CD 管道,包括如何:
- 創(chuàng)建 Jenkins VM
- 安裝并配置 Jenkins
- 創(chuàng)建 GitHub 與 Jenkins 之間的 Webhook 集成
- 通過(guò) GitHub 提交創(chuàng)建并觸發(fā) Jenkins 生成作業(yè)
- 創(chuàng)建應(yīng)用的 Docker 映像
- 驗(yàn)證 GitHub 提交是否生成新的 Docker 映像并更新正在運(yùn)行的應(yīng)用
Note
在 Azure 中國(guó)區(qū)使用 Azure CLI 2.0 之前,請(qǐng)先運(yùn)行?az cloud set -n AzureChinaCloud?來(lái)改變?cè)骗h(huán)境。如果想切回國(guó)際版 Azure,請(qǐng)?jiān)俅芜\(yùn)行?az cloud set -n AzureCloud。
如果選擇在本地安裝并使用 CLI,本教程要求運(yùn)行 Azure CLI 2.0.4 或更高版本。 運(yùn)行?az --version?即可查找版本。 如果需要進(jìn)行安裝或升級(jí),請(qǐng)參閱安裝 Azure CLI 2.0。
創(chuàng)建 Jenkins 實(shí)例
在有關(guān)如何在首次啟動(dòng)時(shí)自定義 Linux 虛擬機(jī)的上一個(gè)教程中,你已了解如何使用 cloud-init 自動(dòng)執(zhí)行 VM 自定義。 本教程使用 cloud-init 文件在 VM 上安裝 Jenkins 和 Docker。
在當(dāng)前 shell 中,創(chuàng)建名為“cloud-init.txt”的文件并粘貼下面的配置。 請(qǐng)確保已正確復(fù)制整個(gè) cloud-init 文件,尤其是第一行:
yaml復(fù)制 #cloud-config package_upgrade: true write_files: - path: /etc/systemd/system/docker.service.d/docker.conf content: | [Service] ExecStart= ExecStart=/usr/bin/dockerd - path: /etc/docker/daemon.json content: | { "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 restartNote
在 Azure 中國(guó)區(qū)使用 Azure CLI 2.0 之前,請(qǐng)先運(yùn)行?az cloud set -n AzureChinaCloud?來(lái)改變?cè)骗h(huán)境。如果想切回國(guó)際版 Azure,請(qǐng)?jiān)俅芜\(yùn)行?az cloud set -n AzureCloud。
使用?az group create?創(chuàng)建資源組,然后才能創(chuàng)建 VM。 以下示例在?chinaeast?位置創(chuàng)建名為?myResourceGroupJenkins?的資源組:
Azure CLI復(fù)制 az group create --name myResourceGroupJenkins --location chinaeast現(xiàn)在,請(qǐng)使用?az vm create?創(chuàng)建 VM。 使用?--custom-data?參數(shù)傳入 cloud-init 配置文件。 如果已將?cloud-init-jenkins.txt?文件保存在現(xiàn)有工作目錄的外部,請(qǐng)?zhí)峁┰撐募耐暾窂健?/p> Azure CLI復(fù)制 az vm create --resource-group myResourceGroupJenkins \ --name myVM \ --image UbuntuLTS \ --admin-username azureuser \ --generate-ssh-keys \ --custom-data cloud-init-jenkins.txt
創(chuàng)建并配置 VM 需要幾分鐘的時(shí)間。
若要允許 Web 流量抵達(dá) VM,請(qǐng)使用?az vm open-port?為 Jenkins 流量打開(kāi)端口?8080,并為用于運(yùn)行示例應(yīng)用的 Node.js 應(yīng)用打開(kāi)端口?1337:
Azure CLI復(fù)制 az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001 az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002配置 Jenkins
若要訪問(wèn) Jenkins 實(shí)例,請(qǐng)獲取 VM 的公共 IP 地址:
Azure CLI復(fù)制 az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv出于安全考慮,需要輸入 VM 上某個(gè)文本文件中存儲(chǔ)的初始管理員密碼來(lái)啟動(dòng) Jenkins 安裝。 使用上一步驟中獲取的公共 IP 地址通過(guò) SSH 連接到 VM:
bash復(fù)制 ssh azureuser@<publicIps>查看并復(fù)制 Jenkins 安裝程序的?initialAdminPassword:
bash復(fù)制 sudo cat /var/lib/jenkins/secrets/initialAdminPassword如果文件尚不可用,請(qǐng)?jiān)俚却龓追昼?#xff0c;以便 cloud-init 完成 Jenkins 和 Docker 安裝。
現(xiàn)在,請(qǐng)打開(kāi) Web 瀏覽器并轉(zhuǎn)到?http://<publicIps>:8080。 按如下所示完成初始 Jenkins 安裝:
- 輸入在上一步驟從 VM 獲取的?initialAdminPassword。
- 選擇“選擇要安裝的插件”
- 在頂部文本框中搜索 GitHub,選擇“GitHub 插件”,然后選擇“安裝”
- 若要?jiǎng)?chuàng)建 Jenkins 用戶帳戶,請(qǐng)根據(jù)需要填寫表單。 從安全角度講,應(yīng)該創(chuàng)建這第一個(gè) Jenkins 用戶,而不要繼續(xù)使用默認(rèn)管理員帳戶。
- 完成后,選擇“開(kāi)始使用 Jenkins”
創(chuàng)建 GitHub Webhook
若要配置與 GitHub 的集成,請(qǐng)從 Azure 示例存儲(chǔ)庫(kù)中打開(kāi)?Node.js Hello World 示例應(yīng)用。 若要將存儲(chǔ)庫(kù)分叉到自己的 GitHub 帳戶,請(qǐng)選擇右上角的“分叉”按鈕。
在創(chuàng)建的分叉中創(chuàng)建 Webhook:
- 選擇“設(shè)置”,然后在左側(cè)選擇“集成和服務(wù)”。
- 選擇“添加服務(wù)”,并在篩選框中輸入 Jenkins。
- 選擇“Jenkins (GitHub 插件)”
- 對(duì)于“Jenkins 掛鉤 URL”,請(qǐng)輸入?http://<publicIps>:8080/github-webhook/。 請(qǐng)確保包含尾部的 /
- 選擇“添加服務(wù)”
創(chuàng)建 Jenkins 作業(yè)
若要讓 Jenkins 對(duì) GitHub 中的事件(例如提交代碼)做出響應(yīng),請(qǐng)創(chuàng)建 Jenkins 作業(yè)。
在 Jenkins 網(wǎng)站中的主頁(yè)上,選擇“創(chuàng)建新作業(yè)”:
- 輸入?HelloWorld?作為作業(yè)名稱。 選擇“自由風(fēng)格項(xiàng)目”,然后選擇“確定”。
- 在“常規(guī)”部分下面,選擇“GitHub”項(xiàng)目并輸入分叉的存儲(chǔ)庫(kù)的 URL,例如?https://github.com/iainfoulds/nodejs-docs-hello-world
- 在“源代碼管理”部分下面,選擇“Git”并輸入分叉的存儲(chǔ)庫(kù)?.git?的 URL,例如?https://github.com/iainfoulds/nodejs-docs-hello-world.git
- 在“生成觸發(fā)器”部分下面,選擇“用于 GITscm 輪詢的 GitHub 掛鉤觸發(fā)器”。
- 在“生成”部分下面,選擇“添加生成步驟”。 選擇“執(zhí)行 shell”,然后在命令窗口中輸入?echo "Testing"。
- 選擇作業(yè)窗口底部的“保存”。
測(cè)試 GitHub 集成
若要測(cè)試 GitHub 與 Jenkins 的集成,請(qǐng)?zhí)峤环植嬷械母摹?/p>
返回到 GitHub Web UI,選擇分叉的存儲(chǔ)庫(kù),然后選擇“index.js”文件。 選擇鉛筆圖標(biāo)編輯該文件,使第 6 行的內(nèi)容如下:
NodeJS復(fù)制 response.end("Hello World!");若要提交更改,請(qǐng)選擇底部的“提交更改”按鈕。
在 Jenkins 中,作業(yè)頁(yè)左下角的“生成歷史記錄”部分下面啟動(dòng)了一個(gè)新的生成。 選擇生成號(hào)鏈接,并選擇左側(cè)的“控制臺(tái)輸出”。 從 GitHub 提取代碼以及生成操作將消息?Testing?輸出到控制臺(tái)時(shí),可以查看 Jenkins 執(zhí)行的步驟。 每次在 GitHub 中提交內(nèi)容時(shí),Webhook 將以此方式訪問(wèn) Jenkins 并觸發(fā)新的生成。
定義 Docker 生成映像
為了查看基于 GitHub 提交內(nèi)容運(yùn)行的 Node.js 應(yīng)用,讓我們生成一個(gè) Docker 映像用于運(yùn)行該應(yīng)用。 該映像是從定義如何配置運(yùn)行應(yīng)用的容器的 Dockerfile 生成的。
通過(guò) SSH 連接到 VM 后,請(qǐng)切換到根據(jù)上一步驟創(chuàng)建的作業(yè)命名的 Jenkins 工作區(qū)目錄。 在本示例中,該目錄名為?HelloWorld。
bash復(fù)制 cd /var/lib/jenkins/workspace/HelloWorld使用?sudo sensible-editor Dockerfile?在此工作區(qū)目錄中創(chuàng)建一個(gè)文件并粘貼以下內(nèi)容。 請(qǐng)確保已正確復(fù)制整個(gè) Dockerfile,尤其是第一行:
yaml復(fù)制 FROM node:alpineEXPOSE 1337WORKDIR /var/www COPY package.json /var/www/ RUN npm install COPY index.js /var/www/此 Dockerfile 使用基本 Node.js 映像(該映像使用 Alpine Linux),公開(kāi)運(yùn)行 Hello World 應(yīng)用的端口 1337,然后復(fù)制應(yīng)用文件并初始化應(yīng)用。
創(chuàng)建 Jenkins 生成規(guī)則
在上一步驟中,已創(chuàng)建一個(gè)可將消息輸出到控制臺(tái)的基本 Jenkins 生成規(guī)則。 讓我們創(chuàng)建生成步驟以使用 Dockerfile 并運(yùn)行應(yīng)用。
返回到 Jenkins 實(shí)例,選擇上一步驟創(chuàng)建的作業(yè)。 選擇左側(cè)的“配置”,并向下滾動(dòng)到“生成”部分:
- 刪除現(xiàn)有的?echo "Test"?生成步驟。 選擇現(xiàn)有生成步驟框右上角的紅叉。
- 選擇“添加生成步驟”,然后選擇“執(zhí)行 shell”
-
在“命令”框中輸入以下 Docker 命令,然后選擇“保存”:
bash復(fù)制 docker build --tag helloworld:$BUILD_NUMBER . docker stop helloworld && docker rm helloworld docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &
Docker 生成步驟將創(chuàng)建一個(gè)映像,并使用 Jenkins 生成編號(hào)對(duì)其進(jìn)行標(biāo)記,以便可以維護(hù)映像的歷史記錄。 運(yùn)行應(yīng)用的任何現(xiàn)有容器將會(huì)停止,隨后被刪除。 然后,將使用該映像啟動(dòng)新的容器,并基于 GitHub 中的最新提交內(nèi)容運(yùn)行 Node.js 應(yīng)用。
測(cè)試管道
若要查看整個(gè)管道的工作狀況,請(qǐng)?jiān)俅卧诜植娴?GitHub 存儲(chǔ)庫(kù)中編輯 index.js 文件,并選擇“提交更改”。 將會(huì)基于 GitHub 的 Webhook 在 Jenkins 中啟動(dòng)新作業(yè)。 創(chuàng)建 Docker 映像并在新容器中啟動(dòng)應(yīng)用需要幾秒鐘時(shí)間。
如果需要,請(qǐng)?jiān)俅潍@取 VM 的公共 IP 地址:
Azure CLI復(fù)制 az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv打開(kāi) Web 瀏覽器并輸入?http://<publicIps>:1337。 將顯示你的 Node.js 應(yīng)用,其中反映了 GitHub 分叉中的最新提交內(nèi)容,如下所示:
現(xiàn)在,請(qǐng)?jiān)俅卧?GitHub 中編輯?index.js,然后提交更改。 等待幾秒鐘讓作業(yè)在 Jenkins 中完成,然后刷新 Web 瀏覽器查看新容器中運(yùn)行的應(yīng)用的更新版本,如下所示:
后續(xù)步驟
在本教程中,你已將 GitHub 配置為每次提交代碼后運(yùn)行 Jenkins 生成作業(yè),然后部署了一個(gè) Docker 容器用于測(cè)試應(yīng)用。 你已了解如何:
- 創(chuàng)建 Jenkins VM
- 安裝并配置 Jenkins
- 創(chuàng)建 GitHub 與 Jenkins 之間的 Webhook 集成
- 通過(guò) GitHub 提交創(chuàng)建并觸發(fā) Jenkins 生成作業(yè)
- 創(chuàng)建應(yīng)用的 Docker 映像
- 驗(yàn)證 GitHub 提交是否生成新的 Docker 映像并更新正在運(yùn)行的應(yīng)用
轉(zhuǎn)到下一教程,詳細(xì)了解如何將 Jenkins 與 Visual Studio Team Services 集成。
使用 Jenkin? ? ? ? ?
立即訪問(wèn)http://market.azure.cn
轉(zhuǎn)載于:https://www.cnblogs.com/zangdalei/p/7845310.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的如何使用 Jenkins、GitHub 和 Docker 在 Azure 中的 Linux VM 上创建开发基础结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三维卷积神经网络预测MNIST数字详解
- 下一篇: 集合:set