重要
虽然许多 Azure 服务都有 Jenkins 插件,但截至 2024 年 2 月 29 日,这些插件中的大多数都终止了支持。 Azure CLI 是目前建议将 Jenkins 与 Azure 服务集成的方法。 有关详细信息,请参阅 适用于 Azure 的 Jenkins 插件文章。
本教程通过在 Jenkins 中设置持续集成(CI)和持续部署(CD),将示例应用从 GitHub 部署到 Azure Kubernetes 服务(AKS) 群集。
在本教程中,你将完成以下任务:
- 将示例 Azure 投票应用部署到 AKS 群集。
- 创建基本的 Jenkins 项目。
- 为 Jenkins 设置凭据以与 ACR 交互。
- 创建用于自动生成的 Jenkins 生成作业和 GitHub Webhook。
- 测试 CI/CD 管道,以基于 GitHub 提交的代码在 AKS 中更新应用程序。
先决条件
若要完成本教程,需要以下各项:
基本了解 Kubernetes、Git、CI/CD 和容器镜像
Azure 容器注册表(ACR)注册表、ACR 登录服务器名称和 AKS 群集配置为使用 ACR 注册表进行身份验证。
部署到 Azure 虚拟机的 Jenkins 控制器 。
已安装并配置 Azure CLI 2.0.46 或更高版本。 运行
az --version即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。在开发系统上安装 Docker
在开发系统上安装的 GitHub 帐户、GitHub 个人访问令牌和 Git 客户端
如果你提供自己的 Jenkins 实例,而不是此示例脚本方式来部署 Jenkins,则 Jenkins 实例需要 安装并配置 Docker 并配置kubectl。
准备应用程序
在本文中,您将使用一个示例 Azure 投票应用程序,此应用程序包含一个 Web 界面,并使用 Redis 来进行临时数据存储。
在集成 Jenkins 和 AKS 进行自动部署之前,请先手动准备 Azure 投票应用程序并将其部署到 AKS 群集。 此手动部署使您能够看到应用程序正在运行。
注释
示例 Azure 投票应用程序使用计划要在 Linux 节点上运行的 Linux Pod。 本文中概述的流也适用于在 Windows Server 节点上计划的 Windows Server Pod。
为示例应用程序创建以下 GitHub 存储库分支 - https://github.com/Azure-Samples/azure-voting-app-redis。 若要将存储库分叉到你自己的 GitHub 帐户,请选择右上角的 分支 按钮。
将 fork 克隆到您的开发系统。 克隆此存储库时,请确保使用分支的 URL:
git clone https://github.com/<your-github-account>/azure-voting-app-redis.git
更改为克隆的派生库目录:
cd azure-voting-app-redis
若要创建示例应用程序所需的容器映像,请通过 docker-compose.yaml 文件进行操作:
docker-compose up -d
拉取所需的基础映像并生成应用程序容器。 然后,可以使用 docker images 命令查看创建的映像。 已下载或创建三个映像。 该 azure-vote-front 映像包含应用程序,并将 nginx-flask 映像用作基础。 该 redis 映像用于启动 Redis 实例:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
azure-vote-front latest 9cc914e25834 40 seconds ago 694MB
redis latest a1b99da73d05 7 days ago 106MB
tiangolo/uwsgi-nginx-flask flask 788ca94b2313 9 months ago 694MB
登录到 Azure 容器注册表。
az acr login -n <acrLoginServer>
将 <acrLoginServer> 替换为您的 ACR 登录服务器。
使用 docker tag 命令使用 ACR 登录服务器名称和版本号 v1标记映像。 使用在上一步中获取的你自己的 <acrLoginServer> 名称:
docker tag azure-vote-front <acrLoginServer>/azure-vote-front:v1
最后,将 azure-vote-front 映像推送到 ACR 注册表。 再次,将 <acrLoginServer> 替换为您自己的 ACR 注册表的登录服务器名称,例如 myacrregistry.azurecr.io:
docker push <acrLoginServer>/azure-vote-front:v1
将示例应用程序部署到 AKS
若要将示例应用程序部署到 AKS 群集,可以使用 Azure 投票存储库存储库根目录中的 Kubernetes 清单文件。 使用编辑器(如 azure-vote-all-in-one-redis.yaml)打开vi清单文件。 将microsoft替换为您的ACR登录服务器名称。 此值位于清单文件 的第 60 行:
containers:
- name: azure-vote-front
image: azuredocs/azure-vote-front
接下来,使用 kubectl apply 命令将应用程序部署到 AKS 群集:
kubectl apply -f azure-vote-all-in-one-redis.yaml
创建 Kubernetes 负载均衡器服务以向 Internet 公开应用程序。 此流程可能需要几分钟的时间。 若要监视负载均衡器部署的进度,请使用 kubectl get service 命令和 --watch 参数。
$ kubectl get service azure-vote-front --watch
EXTERNAL-IP 地址从挂起更改为 IP 地址后,使用Control + C来停止 kubectl 监视过程。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
若要查看应用程序的运行情况,请打开 Web 浏览器以访问服务的外部 IP 地址。 将显示 Azure 投票应用程序,如以下示例所示:
配置 Jenkins 控制器
应用以下更改以从 Jenkins 控制器启用 AKS 部署:
打开端口 80 入站。
az vm open-port \
--resource-group <Resource_Group_name> \
--name <Jenkins_Controller_VM> \
--port 80 --priority 1020
将 <Resource_Group_name> 和 <Jenkins_Controller_VM> 替换为相应的值。
通过 SSH 连接到 Jenkins 控制器
ssh azureuser@<PublicIPAddress>
将 <PublicIPAddress> 替换为 Jenkins 控制器的 IP 地址。
安装并登录到 AzCLI
curl -L https://aka.ms/InstallAzureCli | bash
az login
注释
若要手动安装 AzCLI,请按照以下 说明作。
安装 Docker
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -;
sudo apt-key fingerprint 0EBFCD88;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable";
sudo apt-get update;
sudo apt-get install docker-ce -y;
安装 Kubectl 并连接到 AKS
sudo az aks install-cli
sudo az aks get-credentials --resource-group <Resource_Group> --name <AKS_Name>
将 <Resource_Group> 和 <AKS_Name> 替换为相应的值。
配置访问权限
sudo usermod -aG docker jenkins;
sudo usermod -aG docker azureuser;
sudo touch /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion;
sudo service jenkins restart;
sudo cp ~/.kube/config /var/lib/jenkins/.kube/
sudo chmod 777 /var/lib/jenkins/
sudo chmod 777 /var/lib/jenkins/config
创建 Jenkins 环境变量
Jenkins 环境变量用于保存 ACR 登录服务器名称。 此变量在 Jenkins 生成作业期间引用。 若要创建此环境变量,请完成以下步骤:
在 Jenkins 门户的左侧,选择“管理 Jenkins>配置系统”
在 “全局属性”下,选择 “环境变量”。 添加一个变量,其中包含 ACR 登录服务器的名称
ACR_LOGINSERVER和值。
完成后,选择页面底部的 “保存 ”。
为 ACR 创建 Jenkins 凭据
在 CI/CD 过程中,Jenkins 会基于应用程序更新生成新的容器映像,然后需要将这些映像 推送 到 ACR 注册表。
若要允许 Jenkins 将更新的容器映像推送到 ACR,需要指定 ACR 的凭据。
若要分离角色和权限,请使用对 ACR 注册表的 参与者 权限为 Jenkins 配置服务主体。
为 Jenkins 创建服务主体以使用 ACR
首先,使用 az ad sp create-for-rbac 命令创建服务主体:
az ad sp create-for-rbac
此命令会生成类似于以下示例的输出:
{
"appId": "<app-ID>",
"displayName": "azure-cli-2018-09-28-22-19-34",
"name": "http://azure-cli-2018-09-28-22-19-34",
"password": "<password>",
"tenant": "<tenant-ID>"
}
记下 appId 和 密码。 以下步骤使用这些值在 Jenkins 中配置凭据资源。
使用 az acr show 命令获取 ACR 注册表的资源 ID,并将其存储为变量。
ACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query "id" --output tsv)
将 <Resource_Group> 和 <acrLoginServer> 替换为相应的值。
创建角色分配以将服务主体 参与者 权限分配给 ACR 注册表。
az role assignment create --assignee <appID> --role Contributor --scope $ACR_ID
将 <appId> 替换为在执行先前命令以创建服务主体时输出的值。
在 Jenkins 中为 ACR 服务主体创建凭据资源
在 Azure 中创建的角色分配后,现在将 ACR 凭据存储在 Jenkins 凭据对象中。 在 Jenkins 构建作业期间引用这些凭据。
返回 Jenkins 门户左侧,选择管理 Jenkins>管理凭据>Jenkins 商店>全局凭据(无限制)>添加凭据
确保凭据类型为 具有密码的用户名 ,并输入以下项:
- 用户名 - 为使用 ACR 注册表进行身份验证而创建的服务主体的 appId 。
- 密码 - 为使用 ACR 注册表进行身份验证而创建的服务主体 的密码 。
- ID - 凭据标识符,如 acr-credentials
完成后,凭证表单如下例所示:
选择 “确定 ”并返回到 Jenkins 门户。
创建 Jenkins 项目
在 Jenkins 门户的主页中,选择位于左侧的新项。
输入 azure-vote 作为作业名称。 选择 Freestyle 项目,然后选择“ 确定”
在 “常规 ”部分下,选择 GitHub 项目 并输入分叉存储库 URL,例如 https://github.com/<your-github-account>/azure-voting-app-redis
在 “源代码管理 ”部分下,选择 “Git”,输入分叉存储库
.gitURL,例如 https://github.com/<your-github-account>/azure-voting-app-redis.git在“ 生成触发器 ”部分下, 为 GITscm 轮询选择 GitHub 挂钩触发器
在“生成环境”下,选择“使用机密文本或文件”
在 “绑定”下,选择“ 添加>用户名和密码”(已分隔)
输入
ACR_ID用户名变量和ACR_PASSWORD密码变量
选择添加类型为执行 shell的生成步骤,并使用以下文本。 此脚本生成新的容器映像并将其推送到 ACR 注册表。
# Build new image and push to ACR. WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}" docker build -t $WEB_IMAGE_NAME ./azure-vote docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD} docker push $WEB_IMAGE_NAME添加另一个生成步骤,类型为执行 shell,并使用以下文本。 此脚本使用 ACR 中的新容器映像更新 AKS 中的应用程序部署。
# Update kubernetes deployment with new image. WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}" kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME完成后,单击“ 保存”。
测试 Jenkins 构建
在基于 GitHub 提交自动化作业之前,请手动测试 Jenkins 构建。
此构建可验证该作业是否已正确配置。 它确认正确的 Kubernetes 身份验证文件已正确设置,并且身份验证能够与 ACR 正常配合使用。
在项目的左侧菜单中,选择“ 立即生成”。
第一个构建所需的时间更长,因为要将 Docker 映像层拉取到 Jenkins 服务器。
构建执行以下任务:
- 克隆 GitHub 存储库
- 生成新的容器映像
- 将容器映像推送到 ACR 注册表
- 更新 AKS 部署使用的映像
由于尚未对应用程序代码进行更改,因此 Web UI 保持不变。
生成作业完成后,选择生成历史记录下的 生成 #1 。 选择 控制台输出 并查看生成过程的输出。 最后一行应指示成功生成。
创建 GitHub Webhook
成功完成手动生成后,现在将 GitHub 集成到 Jenkins 生成中。 每次将代码提交到 GitHub 时,使用 Webhook 运行 Jenkins 生成作业。
若要创建 GitHub Webhook,请完成以下步骤:
在 Web 浏览器中打开您的派生 GitHub 仓库。
选择 “设置”,然后选择左侧的 Webhook 。
选择 添加 Webhook。 对于有效负载 URL,请输入
http://<publicIp:8080>/github-webhook/,其中<publicIp>是 Jenkins 服务器的 IP 地址。 请确保包含尾随/。 保留内容类型的其他默认值,并在 推送 事件时触发。选择“添加 Webhook” 。
测试完整的 CI/CD 管道
现在可以测试整个 CI/CD 管道。 当你将代码提交推送到 GitHub 时,会发生以下步骤:
- GitHub Webhook 通知 Jenkins。
- Jenkins 启动生成作业,并从 GitHub 拉取最新代码提交。
- Docker 构建使用更新的代码启动,并用最新的构建号标记新的容器镜像。
- 此新容器映像将推送到 Azure 容器注册表。
- 在 Azure Kubernetes 服务上运行的应用程序使用 Azure 容器注册表中的最新映像进行更新。
在开发计算机上,使用代码编辑器打开克隆的应用程序。 在 /azure-vote/azure-vote 目录下,打开名为 config_file.cfg 的文件。 将此文件中的投票值更新为猫和狗以外的其他内容,如以下示例所示:
# UI Configurations
TITLE = 'Azure Voting App'
VOTE1VALUE = 'Blue'
VOTE2VALUE = 'Purple'
SHOWHOST = 'false'
更新后,保存文件,提交更改,并将其推送到 GitHub 存储库的分支。 GitHub Webhook 在 Jenkins 中触发新的生成作业。 在 Jenkins Web 仪表板中,监视生成过程。 拉取最新代码、创建和推送更新的映像并在 AKS 中部署更新的应用程序需要几秒钟时间。
生成完成后,刷新示例 Azure 投票应用程序的 Web 浏览器。 将显示所做的更改,如以下示例所示: