重要
虽然许多 Azure 服务都有 Jenkins 插件,但截至 2024 年 2 月 29 日,这些插件中的大多数都终止了支持。 Azure CLI 是目前建议将 Jenkins 与 Azure 服务集成的方法。 有关详细信息,请参阅 适用于 Azure 的 Jenkins 插件文章。
若要自动执行应用程序开发的生成和测试阶段,可以使用持续集成和部署(CI/CD)管道。 在本教程中,将在 Azure VM 上创建 CI/CD 管道,包括如何:
- 创建 Jenkins VM
- 安装和配置 Jenkins
- 在 GitHub 和 Jenkins 之间创建 Webhook 连接
- 从 GitHub 提交中创建和触发 Jenkins 构建任务
- 为应用创建 Docker 映像
- 验证 GitHub 提交生成新的 Docker 映像并更新正在运行的应用
本教程使用 Azure Cloud Shell 中的 CLI,该 CLI 会不断更新到最新版本。 若要打开 Cloud Shell,请从任何代码块的顶部选择“试一试” 。
如果选择在本地安装并使用 CLI,本教程要求运行 Azure CLI 2.0.30 或更高版本。 运行 az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
创建 Jenkins 实例
在上一篇有关如何 在首次启动时自定义 Linux 虚拟机的教程中,你学习了如何使用 cloud-init 自动执行 VM 自定义。 本教程使用 cloud-init 文件在 VM 上安装 Jenkins 和 Docker。 Jenkins 是一种常用的开源自动化服务器,可与 Azure 无缝集成,以实现持续集成(CI)和持续交付(CD)。 有关如何使用 Jenkins 的更多教程,请参阅 Azure 中心的 Jenkins。
在当前 shell 中,创建名为 cloud-init-jenkins.txt 的文件并粘贴以下配置。 例如,在不处于本地计算机上的 Cloud Shell 中创建文件。 输入 sensible-editor cloud-init-jenkins.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:
- apt install openjdk-8-jre-headless -y
- wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
- sh -c 'echo deb https://pkg.jenkins.io/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
使用 az group create 创建资源组,才能创建 VM。 以下示例在 eastus 位置创建名为 myResourceGroupJenkins 的资源组:
az group create --name myResourceGroupJenkins --___location eastus
现在,请使用 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>
使用 service
以下命令验证 Jenkins 是否正在运行:
$ service jenkins status
● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (exited) since Tue 2019-02-12 16:16:11 UTC; 55s ago
Docs: man:systemd-sysv-generator(8)
Tasks: 0 (limit: 4103)
CGroup: /system.slice/jenkins.service
Feb 12 16:16:10 myVM systemd[1]: Starting LSB: Start Jenkins at boot time...
...
查看 Jenkins 安装中的 initialAdminPassword
并复制它:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
如果文件尚不可用,请等待几分钟,让 cloud-init 完成 Jenkins 和 Docker 安装。
现在打开 Web 浏览器并转到 http://<publicIps>:8080
。 完成初始 Jenkins 设置,如下所示:
- 选择要安装的插件
- 在顶部的文本框中搜索 GitHub 。 选中 GitHub 的框,然后选择“安装”
- 创建第一个管理员用户。 输入用户名(例如 管理员),然后提供自己的安全密码。 最后,键入全名和电子邮件地址。
- 选择“ 保存并完成”
- Jenkins 准备就绪后,选择“开始使用 Jenkins”
- 如果 Web 浏览器在开始使用 Jenkins 时显示空白页,请重启 Jenkins 服务。 在 SSH 会话中键入
sudo service jenkins restart
,然后刷新 Web 浏览器。
- 如果 Web 浏览器在开始使用 Jenkins 时显示空白页,请重启 Jenkins 服务。 在 SSH 会话中键入
- 如果需要,请使用创建的用户名和密码登录到 Jenkins。
创建 GitHub Webhook
若要配置与 GitHub 的集成,请从 Azure 示例存储库打开 Node.js Hello World 示例应用 。 若要将存储库分叉到你自己的 GitHub 帐户,请选择右上角的 分支 按钮。
在您创建的 Fork 中创建 Webhook:
- 选择 “设置”,然后选择左侧的 Webhook 。
- 选择 “添加 Webhook”,然后在筛选器框中输入 Jenkins 。
- 对于 有效负载 URL,请输入
http://<publicIps>:8080/github-webhook/
。 请确保包含尾随 / - 对于 内容类型,请选择 application/x-www-form-urlencoded。
- 对于 要触发此 Webhook 的事件,请选择 “仅推送事件”。
- 将 “活动” 选项框设置为选中。
- 单击“添加 Webhook” 。
创建 Jenkins 作业
若要让 Jenkins 响应 GitHub 中的事件(例如提交代码),请创建 Jenkins 作业。 使用自己的 GitHub 分支的 URL。
在 Jenkins 网站中,从主页中选择“ 创建新作业 ”:
- 输入 HelloWorld 作为作业名称。 选择 Freestyle 项目,然后选择“ 确定”。
- 在 “常规 ”部分下,选择 GitHub 项目 并输入分叉存储库 URL,例如
https://github.com/cynthn/nodejs-docs-hello-world
- 在 “源代码管理 ”部分下,选择 “Git”,输入分叉存储库 .git URL,例如
https://github.com/cynthn/nodejs-docs-hello-world.git
- 在“ 生成触发器 ”部分下, 为 GITscm 轮询选择 GitHub 挂钩触发器。
- 在“ 生成 ”部分下,选择 “添加生成”步骤。 选择 “执行 shell”,然后在命令窗口中输入
echo "Test"
。 - 选择作业窗口底部的 “保存 ”。
测试 GitHub 集成
若要测试 GitHub 与 Jenkins 的集成,请在分支中提交更改。
返回 GitHub Web UI,选择分叉存储库,然后选择 index.js 文件。 选择铅笔图标以编辑此文件,使第 6 行显示以下内容:
response.end("Hello World!");
若要提交更改,请选择底部的 “提交更改 ”按钮。
在 Jenkins 中,新的构建将在您的作业页面左下角的 “生成历史记录” 部分开始。 选择生成号链接,然后选择左侧的 控制台输出 。 你可以查看 Jenkins 执行的步骤,因为代码是从 GitHub 拉取的,生成作会将消息 Test
输出到控制台。 每次在 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 使用 Alpine Linux 的基本 Node.js 映像,暴露 Hello World 应用程序运行的端口 1337,然后复制应用程序文件并进行初始化。
创建 Jenkins 生成规则
在上一步中,你创建了一个将消息输出到控制台的基本 Jenkins 生成规则。 让我们创建构建步骤来使用我们的 Dockerfile 并运行应用程序。
返回 Jenkins 实例,选择在上一步中创建的作业。 在左侧选择“ 配置 ”,向下滚动到 “生成 ”部分:
删除现有
echo "Test"
构建步骤。 选择现有生成步骤框右上角的红十字。选择添加构建步骤,然后选择执行 shell
在 “命令 ”框中,输入以下 Docker 命令,然后选择“ 保存” :
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 文件,然后提交更改。 在 Jenkins 中基于 GitHub 的 webhook 启动一个新任务。 创建 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 与 Azure DevOps Services 集成。