教程:使用 Jenkins 从 GitHub 部署到 Azure Kubernetes 服务

重要

虽然许多 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 中更新应用程序。

先决条件

若要完成本教程,需要以下各项:

准备应用程序

在本文中,您将使用一个示例 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 投票应用程序,如以下示例所示:

在 AKS 中运行的 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 和值。

    Jenkins 环境变量

  • 完成后,选择页面底部的 “保存 ”。

为 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 项目

在 Jenkins 门户的主页中,选择位于左侧的新项

  1. 输入 azure-vote 作为作业名称。 选择 Freestyle 项目,然后选择“ 确定”

  2. “常规 ”部分下,选择 GitHub 项目 并输入分叉存储库 URL,例如 https://github.com/<your-github-account>/azure-voting-app-redis

  3. “源代码管理 ”部分下,选择 “Git”,输入分叉存储库 .git URL,例如 https://github.com/<your-github-account>/azure-voting-app-redis.git

  4. 在“ 生成触发器 ”部分下, 为 GITscm 轮询选择 GitHub 挂钩触发器

  5. “生成环境”下,选择“使用机密文本或文件

  6. “绑定”下,选择“ 添加>用户名和密码”(已分隔)

    • 输入ACR_ID用户名变量ACR_PASSWORD密码变量

      Jenkins 绑定

  7. 选择添加类型为执行 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
    
  8. 添加另一个生成步骤,类型为执行 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
    
  9. 完成后,单击“ 保存”。

测试 Jenkins 构建

在基于 GitHub 提交自动化作业之前,请手动测试 Jenkins 构建。

此构建可验证该作业是否已正确配置。 它确认正确的 Kubernetes 身份验证文件已正确设置,并且身份验证能够与 ACR 正常配合使用。

在项目的左侧菜单中,选择“ 立即生成”。

Jenkins 测试生成

第一个构建所需的时间更长,因为要将 Docker 映像层拉取到 Jenkins 服务器。

构建执行以下任务:

  1. 克隆 GitHub 存储库
  2. 生成新的容器映像
  3. 将容器映像推送到 ACR 注册表
  4. 更新 AKS 部署使用的映像

由于尚未对应用程序代码进行更改,因此 Web UI 保持不变。

生成作业完成后,选择生成历史记录下的 生成 #1 。 选择 控制台输出 并查看生成过程的输出。 最后一行应指示成功生成。

创建 GitHub Webhook

成功完成手动生成后,现在将 GitHub 集成到 Jenkins 生成中。 每次将代码提交到 GitHub 时,使用 Webhook 运行 Jenkins 生成作业。

若要创建 GitHub Webhook,请完成以下步骤:

  1. 在 Web 浏览器中打开您的派生 GitHub 仓库。

  2. 选择 “设置”,然后选择左侧的 Webhook

  3. 选择 添加 Webhook。 对于有效负载 URL,请输入http://<publicIp:8080>/github-webhook/,其中<publicIp>是 Jenkins 服务器的 IP 地址。 请确保包含尾随 /。 保留内容类型的其他默认值,并在 推送 事件时触发。

  4. 选择“添加 Webhook” 。

    为 Jenkins 创建 GitHub Webhook

测试完整的 CI/CD 管道

现在可以测试整个 CI/CD 管道。 当你将代码提交推送到 GitHub 时,会发生以下步骤:

  1. GitHub Webhook 通知 Jenkins。
  2. Jenkins 启动生成作业,并从 GitHub 拉取最新代码提交。
  3. Docker 构建使用更新的代码启动,并用最新的构建号标记新的容器镜像。
  4. 此新容器映像将推送到 Azure 容器注册表。
  5. 在 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 浏览器。 将显示所做的更改,如以下示例所示:

由 Jenkins 构建作业更新的 AKS 中 Azure 示例投票

后续步骤