重要
虽然许多 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”,输入分叉存储库
.git
URL,例如 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 浏览器。 将显示所做的更改,如以下示例所示: