如何使用 Jenkins、GitHub 和 Docker 在 Azure 中的 Linux VM 上创建开发基础结构
若要将应用程序开发的生成和测试阶段自动化,可以使用持续集成和部署 (CI/CD) 管道。 本教程介绍如何在 Azure VM 上创建 CI/CD 管道,包括如何:
- 创建 Jenkins VM
- 安装并配置 Jenkins
- 创建 GitHub 与 Jenkins 之间的 Webhook 集成
- 通过 GitHub 提交创建并触发 Jenkins 生成作业
- 创建应用的 Docker 映像
- 验证 GitHub 提交是否生成新的 Docker 映像并更新正在运行的应用
Note
在 Azure 中国区使用 Azure CLI 2.0 之前,请先运行 az cloud set -n AzureChinaCloud 来改变云环境。如果想切回国际版 Azure,请再次运行 az cloud set -n AzureCloud。
如果选择在本地安装并使用 CLI,本教程要求运行 Azure CLI 2.0.4 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI 2.0。
创建 Jenkins 实例
在有关如何在首次启动时自定义 Linux 虚拟机的上一个教程中,你已了解如何使用 cloud-init 自动执行 VM 自定义。 本教程使用 cloud-init 文件在 VM 上安装 Jenkins 和 Docker。
在当前 shell 中,创建名为“cloud-init.txt”的文件并粘贴下面的配置。 请确保已正确复制整个 cloud-init 文件,尤其是第一行:
#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 restart
Note
在 Azure 中国区使用 Azure CLI 2.0 之前,请先运行 az cloud set -n AzureChinaCloud 来改变云环境。如果想切回国际版 Azure,请再次运行 az cloud set -n AzureCloud。
使用 az group create 创建资源组,然后才能创建 VM。 以下示例在 chinaeast 位置创建名为 myResourceGroupJenkins 的资源组:
az group create --name myResourceGroupJenkins --location chinaeast
现在,请使用 az vm create 创建 VM。 使用 --custom-data 参数传入 cloud-init 配置文件。 如果已将 cloud-init-jenkins.txt 文件保存在现有工作目录的外部,请提供该文件的完整路径。
az vm create --resource-group myResourceGroupJenkins \
--name myVM \
--image UbuntuLTS \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data cloud-init-jenkins.txt
创建并配置 VM 需要几分钟的时间。
若要允许 Web 流量抵达 VM,请使用 az vm open-port 为 Jenkins 流量打开端口 8080,并为用于运行示例应用的 Node.js 应用打开端口 1337:
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
若要访问 Jenkins 实例,请获取 VM 的公共 IP 地址:
az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv
出于安全考虑,需要输入 VM 上某个文本文件中存储的初始管理员密码来启动 Jenkins 安装。 使用上一步骤中获取的公共 IP 地址通过 SSH 连接到 VM:
ssh azureuser@<publicIps>
查看并复制 Jenkins 安装程序的 initialAdminPassword:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
如果文件尚不可用,请再等待几分钟,以便 cloud-init 完成 Jenkins 和 Docker 安装。
现在,请打开 Web 浏览器并转到 http://<publicIps>:8080。 按如下所示完成初始 Jenkins 安装:
- 输入在上一步骤从 VM 获取的 initialAdminPassword。
- 选择“选择要安装的插件”
- 在顶部文本框中搜索 GitHub,选择“GitHub 插件”,然后选择“安装”
- 若要创建 Jenkins 用户帐户,请根据需要填写表单。 从安全角度讲,应该创建这第一个 Jenkins 用户,而不要继续使用默认管理员帐户。
- 完成后,选择“开始使用 Jenkins”
创建 GitHub Webhook
若要配置与 GitHub 的集成,请从 Azure 示例存储库中打开 Node.js Hello World 示例应用。 若要将存储库分叉到自己的 GitHub 帐户,请选择右上角的“分叉”按钮。
在创建的分叉中创建 Webhook:
- 选择“设置”,然后在左侧选择“集成和服务”。
- 选择“添加服务”,并在筛选框中输入 Jenkins。
- 选择“Jenkins (GitHub 插件)”
- 对于“Jenkins 挂钩 URL”,请输入
http://<publicIps>:8080/github-webhook/。 请确保包含尾部的 / - 选择“添加服务”

创建 Jenkins 作业
若要让 Jenkins 对 GitHub 中的事件(例如提交代码)做出响应,请创建 Jenkins 作业。
在 Jenkins 网站中的主页上,选择“创建新作业”:
- 输入 HelloWorld 作为作业名称。 选择“自由风格项目”,然后选择“确定”。
- 在“常规”部分下面,选择“GitHub”项目并输入分叉的存储库的 URL,例如 https://github.com/iainfoulds/nodejs-docs-hello-world
- 在“源代码管理”部分下面,选择“Git”并输入分叉的存储库 .git 的 URL,例如 https://github.com/iainfoulds/nodejs-docs-hello-world.git
- 在“生成触发器”部分下面,选择“用于 GITscm 轮询的 GitHub 挂钩触发器”。
- 在“生成”部分下面,选择“添加生成步骤”。 选择“执行 shell”,然后在命令窗口中输入
echo "Testing"。 - 选择作业窗口底部的“保存”。
测试 GitHub 集成
若要测试 GitHub 与 Jenkins 的集成,请提交分叉中的更改。
返回到 GitHub Web UI,选择分叉的存储库,然后选择“index.js”文件。 选择铅笔图标编辑该文件,使第 6 行的内容如下:
response.end("Hello World!");
若要提交更改,请选择底部的“提交更改”按钮。
在 Jenkins 中,作业页左下角的“生成历史记录”部分下面启动了一个新的生成。 选择生成号链接,并选择左侧的“控制台输出”。 从 GitHub 提取代码以及生成操作将消息 Testing 输出到控制台时,可以查看 Jenkins 执行的步骤。 每次在 GitHub 中提交内容时,Webhook 将以此方式访问 Jenkins 并触发新的生成。
定义 Docker 生成映像
为了查看基于 GitHub 提交内容运行的 Node.js 应用,让我们生成一个 Docker 映像用于运行该应用。 该映像是从定义如何配置运行应用的容器的 Dockerfile 生成的。
通过 SSH 连接到 VM 后,请切换到根据上一步骤创建的作业命名的 Jenkins 工作区目录。 在本示例中,该目录名为 HelloWorld。
cd /var/lib/jenkins/workspace/HelloWorld
使用 sudo sensible-editor Dockerfile 在此工作区目录中创建一个文件并粘贴以下内容。 请确保已正确复制整个 Dockerfile,尤其是第一行:
FROM node:alpine
EXPOSE 1337
WORKDIR /var/www
COPY package.json /var/www/
RUN npm install
COPY index.js /var/www/
此 Dockerfile 使用基本 Node.js 映像(该映像使用 Alpine Linux),公开运行 Hello World 应用的端口 1337,然后复制应用文件并初始化应用。
创建 Jenkins 生成规则
在上一步骤中,已创建一个可将消息输出到控制台的基本 Jenkins 生成规则。 让我们创建生成步骤以使用 Dockerfile 并运行应用。
返回到 Jenkins 实例,选择上一步骤创建的作业。 选择左侧的“配置”,并向下滚动到“生成”部分:
- 删除现有的
echo "Test"生成步骤。 选择现有生成步骤框右上角的红叉。 - 选择“添加生成步骤”,然后选择“执行 shell”
在“命令”框中输入以下 Docker 命令,然后选择“保存”:
bash复制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 生成步骤将创建一个映像,并使用 Jenkins 生成编号对其进行标记,以便可以维护映像的历史记录。 运行应用的任何现有容器将会停止,随后被删除。 然后,将使用该映像启动新的容器,并基于 GitHub 中的最新提交内容运行 Node.js 应用。
测试管道
若要查看整个管道的工作状况,请再次在分叉的 GitHub 存储库中编辑 index.js 文件,并选择“提交更改”。 将会基于 GitHub 的 Webhook 在 Jenkins 中启动新作业。 创建 Docker 映像并在新容器中启动应用需要几秒钟时间。
如果需要,请再次获取 VM 的公共 IP 地址:
az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv
打开 Web 浏览器并输入 http://<publicIps>:1337。 将显示你的 Node.js 应用,其中反映了 GitHub 分叉中的最新提交内容,如下所示:

现在,请再次在 GitHub 中编辑 index.js,然后提交更改。 等待几秒钟让作业在 Jenkins 中完成,然后刷新 Web 浏览器查看新容器中运行的应用的更新版本,如下所示:

后续步骤
在本教程中,你已将 GitHub 配置为每次提交代码后运行 Jenkins 生成作业,然后部署了一个 Docker 容器用于测试应用。 你已了解如何:
- 创建 Jenkins VM
- 安装并配置 Jenkins
- 创建 GitHub 与 Jenkins 之间的 Webhook 集成
- 通过 GitHub 提交创建并触发 Jenkins 生成作业
- 创建应用的 Docker 映像
- 验证 GitHub 提交是否生成新的 Docker 映像并更新正在运行的应用
转到下一教程,详细了解如何将 Jenkins 与 Visual Studio Team Services 集成。
立即访问http://market.azure.cn
如何使用 Jenkins、GitHub 和 Docker 在 Azure 中的 Linux VM 上创建开发基础结构的更多相关文章
- 在 Azure 中的 Linux VM 上创建 MongoDB、Express、AngularJS 和 Node.js (MEAN) 堆栈
本教程介绍如何在 Azure 中的 Linux VM 上实现 MongoDB.Express.AngularJS 和 Node.js (MEAN) 堆栈. 通过创建的 MEAN 堆栈,可以在数据库中添 ...
- 使用 Puppet 在 Windows Azure 中配备 Linux 和 Windows 环境
发布于 2013-12-11 作者 Ross Gardler 微软开放技术有限公司 (MS Open Tech) 很高兴地宣布发行新的 Windows Azure Puppet 模块.通过这个模 ...
- 在 Azure 中的 Linux 虚拟机上使用 SSL 证书保护 Web 服务器
若要保护 Web 服务器,可以使用安全套接字层 (SSL) 证书来加密 Web 流量. 这些 SSL 证书可存储在 Azure Key Vault 中,并可安全部署到 Azure 中的 Linux 虚 ...
- 如何监视和更新 Azure 中的 Linux 虚拟机
为确保 Azure 中的虚拟机 (VM) 正常运行,可以查看启动诊断.性能指标,并管理程序包更新. 本教程介绍如何执行下列操作: 在 VM 上启用启动诊断 查看启动诊断 在 VM 上启用诊断扩展 基于 ...
- 在 Azure 中备份 Linux 虚拟机
可以通过定期创建备份来保护数据. Azure 备份可创建恢复点,这些恢复点存储在异地冗余的恢复保管库中. 从恢复点还原时,可以还原整个 VM,或只是还原特定的文件. 本文介绍如何将单个文件还原到运行 ...
- 如何在 Azure 中的 Linux 经典虚拟机上设置终结点
在 Azure 中使用经典部署模型创建的所有 Linux 虚拟机都可以通过专用网络通道与同一云服务或虚拟网络中的其他虚拟机自动通信. 但是,Internet 或其他虚拟网络中的计算机需要终结点将入站网 ...
- 使用 Jenkins 和 Team Services 将应用部署到 Linux VM
持续集成 (CI) 和持续部署 (CD) 是一个管道,可以通过它生成.发布和部署代码. Team Services 针对到 Azure 的部署提供了一组完整的功能完备的 CI/CD 自动化工具. Je ...
- 使用 HPC Pack 为 Azure 中的 Windows HPC 工作负荷创建和管理群集的选项
利用 Microsoft HPC Pack 和 Azure 的计算与基础结构服务,创建和管理基于云的高性能计算 (HPC) 群集. HPC Pack 是在 Azure 和 Windows Server ...
- 如何在 Azure 中均衡 Linux 虚拟机负载以创建高可用性应用程序
负载均衡通过将传入请求分布到多个虚拟机来提供更高级别的可用性. 本教程介绍了 Azure 负载均衡器的不同组件,这些组件用于分发流量和提供高可用性. 你将学习如何执行以下操作: 创建 Azure 负载 ...
随机推荐
- springboot-19-整合dubbox
springboot 整合dubbox 1, 没了,,, 2, 安装zookeeper 可见: http://www.cnblogs.com/wenbronk/p/6636926.html 2.1 下 ...
- Windows 查看程序占用的端口
一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知 ...
- IDEA在当前类中查找方法快捷键--转
https://blog.csdn.net/weixin_40739833/article/details/81298472 IDEA工具是当前类中查找一个方法快捷键: Ctrl + F12 例如在 ...
- 169.254地址无网关信息 ----- 解决方案 启动DHCP服务
169.254.X.X是Windows操作系统在DHCP信息租用失败时自动给客户机分配的IP地址,.看到地址的时候没有网关. 解决方案 启动DHCP服务 1. 首先确认 路由器 DHCP 服务已 ...
- IE浏览器版本的判断
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 && userAgent.indexOf(; //判断是否IE< ...
- Node.js函数
Node.js 函数 在JavaScript中,一个函数可以作为另一个函数的参数.我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数. Node.js中函数的使用与Javascrip ...
- [C#]INI文件控制类
INI文件常用于保存各类设置或本地化文本,大概格式如下: [Section] key=value 然而.NET框架似乎并没有提供一个实用的工具来操作它,或许是因为MS想让我们都使用Settings类控 ...
- c#之new关键词——隐藏基类方法
当从基类继承了一个(非抽象成员时),也就继承了父类的实现代码.如果是virtual成员,可以override:另外一种方法也能隐藏父类的实现代码(虚成员和非虚成员都可使用):定义与父类相同的方法名,加 ...
- BZOJ2227 [Zjoi2011]看电影(movie)
Description \(k\)个座位,\(n\)个人依次过来,每人随机从\(k\)个座位中选择一个,并从它开始不停向后走直到遇到空座位坐下.求所有人都能坐下的概率(即没有人走到第\(k+1\)个位 ...
- js-权威指南学习笔记16
1.元素的style属性可以用来设置样式,但是不适合用来查询样式(只能查询到内联样式). 2.CSS里的层叠指示了应用于文档中任何给定元素的样式规则是各个来源的层叠效果:Web浏览器的默认样式表.文档 ...